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 Panorama SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2019-07-24@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-panorama)
+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.Panorama](http://hackage.haskell.org/package/amazonka-panorama/docs/Amazonka-Panorama.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-panorama` 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-panorama.cabal b/amazonka-panorama.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-panorama.cabal
@@ -0,0 +1,180 @@
+cabal-version:      2.2
+name:               amazonka-panorama
+version:            2.0
+synopsis:           Amazon Panorama 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 @2019-07-24@ 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.Panorama.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.Panorama" 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-panorama
+
+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.Panorama
+    Amazonka.Panorama.CreateApplicationInstance
+    Amazonka.Panorama.CreateJobForDevices
+    Amazonka.Panorama.CreateNodeFromTemplateJob
+    Amazonka.Panorama.CreatePackage
+    Amazonka.Panorama.CreatePackageImportJob
+    Amazonka.Panorama.DeleteDevice
+    Amazonka.Panorama.DeletePackage
+    Amazonka.Panorama.DeregisterPackageVersion
+    Amazonka.Panorama.DescribeApplicationInstance
+    Amazonka.Panorama.DescribeApplicationInstanceDetails
+    Amazonka.Panorama.DescribeDevice
+    Amazonka.Panorama.DescribeDeviceJob
+    Amazonka.Panorama.DescribeNode
+    Amazonka.Panorama.DescribeNodeFromTemplateJob
+    Amazonka.Panorama.DescribePackage
+    Amazonka.Panorama.DescribePackageImportJob
+    Amazonka.Panorama.DescribePackageVersion
+    Amazonka.Panorama.Lens
+    Amazonka.Panorama.ListApplicationInstanceDependencies
+    Amazonka.Panorama.ListApplicationInstanceNodeInstances
+    Amazonka.Panorama.ListApplicationInstances
+    Amazonka.Panorama.ListDevices
+    Amazonka.Panorama.ListDevicesJobs
+    Amazonka.Panorama.ListNodeFromTemplateJobs
+    Amazonka.Panorama.ListNodes
+    Amazonka.Panorama.ListPackageImportJobs
+    Amazonka.Panorama.ListPackages
+    Amazonka.Panorama.ListTagsForResource
+    Amazonka.Panorama.ProvisionDevice
+    Amazonka.Panorama.RegisterPackageVersion
+    Amazonka.Panorama.RemoveApplicationInstance
+    Amazonka.Panorama.SignalApplicationInstanceNodeInstances
+    Amazonka.Panorama.TagResource
+    Amazonka.Panorama.Types
+    Amazonka.Panorama.Types.AlternateSoftwareMetadata
+    Amazonka.Panorama.Types.ApplicationInstance
+    Amazonka.Panorama.Types.ApplicationInstanceHealthStatus
+    Amazonka.Panorama.Types.ApplicationInstanceStatus
+    Amazonka.Panorama.Types.ConnectionType
+    Amazonka.Panorama.Types.DesiredState
+    Amazonka.Panorama.Types.Device
+    Amazonka.Panorama.Types.DeviceAggregatedStatus
+    Amazonka.Panorama.Types.DeviceBrand
+    Amazonka.Panorama.Types.DeviceConnectionStatus
+    Amazonka.Panorama.Types.DeviceJob
+    Amazonka.Panorama.Types.DeviceJobConfig
+    Amazonka.Panorama.Types.DeviceReportedStatus
+    Amazonka.Panorama.Types.DeviceStatus
+    Amazonka.Panorama.Types.DeviceType
+    Amazonka.Panorama.Types.EthernetPayload
+    Amazonka.Panorama.Types.EthernetStatus
+    Amazonka.Panorama.Types.Job
+    Amazonka.Panorama.Types.JobResourceTags
+    Amazonka.Panorama.Types.JobResourceType
+    Amazonka.Panorama.Types.JobType
+    Amazonka.Panorama.Types.LatestDeviceJob
+    Amazonka.Panorama.Types.ListDevicesSortBy
+    Amazonka.Panorama.Types.ManifestOverridesPayload
+    Amazonka.Panorama.Types.ManifestPayload
+    Amazonka.Panorama.Types.NetworkConnectionStatus
+    Amazonka.Panorama.Types.NetworkPayload
+    Amazonka.Panorama.Types.NetworkStatus
+    Amazonka.Panorama.Types.Node
+    Amazonka.Panorama.Types.NodeCategory
+    Amazonka.Panorama.Types.NodeFromTemplateJob
+    Amazonka.Panorama.Types.NodeFromTemplateJobStatus
+    Amazonka.Panorama.Types.NodeInputPort
+    Amazonka.Panorama.Types.NodeInstance
+    Amazonka.Panorama.Types.NodeInstanceStatus
+    Amazonka.Panorama.Types.NodeInterface
+    Amazonka.Panorama.Types.NodeOutputPort
+    Amazonka.Panorama.Types.NodeSignal
+    Amazonka.Panorama.Types.NodeSignalValue
+    Amazonka.Panorama.Types.NtpPayload
+    Amazonka.Panorama.Types.NtpStatus
+    Amazonka.Panorama.Types.OTAJobConfig
+    Amazonka.Panorama.Types.OutPutS3Location
+    Amazonka.Panorama.Types.PackageImportJob
+    Amazonka.Panorama.Types.PackageImportJobInputConfig
+    Amazonka.Panorama.Types.PackageImportJobOutput
+    Amazonka.Panorama.Types.PackageImportJobOutputConfig
+    Amazonka.Panorama.Types.PackageImportJobStatus
+    Amazonka.Panorama.Types.PackageImportJobType
+    Amazonka.Panorama.Types.PackageListItem
+    Amazonka.Panorama.Types.PackageObject
+    Amazonka.Panorama.Types.PackageVersionInputConfig
+    Amazonka.Panorama.Types.PackageVersionOutputConfig
+    Amazonka.Panorama.Types.PackageVersionStatus
+    Amazonka.Panorama.Types.PortType
+    Amazonka.Panorama.Types.ReportedRuntimeContextState
+    Amazonka.Panorama.Types.S3Location
+    Amazonka.Panorama.Types.SortOrder
+    Amazonka.Panorama.Types.StaticIpConnectionInfo
+    Amazonka.Panorama.Types.StatusFilter
+    Amazonka.Panorama.Types.StorageLocation
+    Amazonka.Panorama.Types.TemplateType
+    Amazonka.Panorama.Types.UpdateProgress
+    Amazonka.Panorama.UntagResource
+    Amazonka.Panorama.UpdateDeviceMetadata
+    Amazonka.Panorama.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-panorama-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.Panorama
+    Test.Amazonka.Panorama
+    Test.Amazonka.Panorama.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-panorama
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateApplicationInstance.yaml b/fixture/CreateApplicationInstance.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateApplicationInstance.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/CreateApplicationInstanceResponse.proto b/fixture/CreateApplicationInstanceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateApplicationInstanceResponse.proto
diff --git a/fixture/CreateJobForDevices.yaml b/fixture/CreateJobForDevices.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateJobForDevices.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/CreateJobForDevicesResponse.proto b/fixture/CreateJobForDevicesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateJobForDevicesResponse.proto
diff --git a/fixture/CreateNodeFromTemplateJob.yaml b/fixture/CreateNodeFromTemplateJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateNodeFromTemplateJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/CreateNodeFromTemplateJobResponse.proto b/fixture/CreateNodeFromTemplateJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateNodeFromTemplateJobResponse.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/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/CreatePackageImportJob.yaml b/fixture/CreatePackageImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePackageImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/CreatePackageImportJobResponse.proto b/fixture/CreatePackageImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePackageImportJobResponse.proto
diff --git a/fixture/CreatePackageResponse.proto b/fixture/CreatePackageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePackageResponse.proto
diff --git a/fixture/DeleteDevice.yaml b/fixture/DeleteDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DeleteDeviceResponse.proto b/fixture/DeleteDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDeviceResponse.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/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DeregisterPackageVersion.yaml b/fixture/DeregisterPackageVersion.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeregisterPackageVersion.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DeregisterPackageVersionResponse.proto b/fixture/DeregisterPackageVersionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeregisterPackageVersionResponse.proto
diff --git a/fixture/DescribeApplicationInstance.yaml b/fixture/DescribeApplicationInstance.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeApplicationInstance.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DescribeApplicationInstanceDetails.yaml b/fixture/DescribeApplicationInstanceDetails.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeApplicationInstanceDetails.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DescribeApplicationInstanceDetailsResponse.proto b/fixture/DescribeApplicationInstanceDetailsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeApplicationInstanceDetailsResponse.proto
diff --git a/fixture/DescribeApplicationInstanceResponse.proto b/fixture/DescribeApplicationInstanceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeApplicationInstanceResponse.proto
diff --git a/fixture/DescribeDevice.yaml b/fixture/DescribeDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DescribeDeviceJob.yaml b/fixture/DescribeDeviceJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDeviceJob.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DescribeDeviceJobResponse.proto b/fixture/DescribeDeviceJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDeviceJobResponse.proto
diff --git a/fixture/DescribeDeviceResponse.proto b/fixture/DescribeDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDeviceResponse.proto
diff --git a/fixture/DescribeNode.yaml b/fixture/DescribeNode.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeNode.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DescribeNodeFromTemplateJob.yaml b/fixture/DescribeNodeFromTemplateJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeNodeFromTemplateJob.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DescribeNodeFromTemplateJobResponse.proto b/fixture/DescribeNodeFromTemplateJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeNodeFromTemplateJobResponse.proto
diff --git a/fixture/DescribeNodeResponse.proto b/fixture/DescribeNodeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeNodeResponse.proto
diff --git a/fixture/DescribePackage.yaml b/fixture/DescribePackage.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePackage.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DescribePackageImportJob.yaml b/fixture/DescribePackageImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePackageImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DescribePackageImportJobResponse.proto b/fixture/DescribePackageImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePackageImportJobResponse.proto
diff --git a/fixture/DescribePackageResponse.proto b/fixture/DescribePackageResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePackageResponse.proto
diff --git a/fixture/DescribePackageVersion.yaml b/fixture/DescribePackageVersion.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePackageVersion.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/DescribePackageVersionResponse.proto b/fixture/DescribePackageVersionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePackageVersionResponse.proto
diff --git a/fixture/ListApplicationInstanceDependencies.yaml b/fixture/ListApplicationInstanceDependencies.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListApplicationInstanceDependencies.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListApplicationInstanceDependenciesResponse.proto b/fixture/ListApplicationInstanceDependenciesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListApplicationInstanceDependenciesResponse.proto
diff --git a/fixture/ListApplicationInstanceNodeInstances.yaml b/fixture/ListApplicationInstanceNodeInstances.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListApplicationInstanceNodeInstances.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListApplicationInstanceNodeInstancesResponse.proto b/fixture/ListApplicationInstanceNodeInstancesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListApplicationInstanceNodeInstancesResponse.proto
diff --git a/fixture/ListApplicationInstances.yaml b/fixture/ListApplicationInstances.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListApplicationInstances.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListApplicationInstancesResponse.proto b/fixture/ListApplicationInstancesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListApplicationInstancesResponse.proto
diff --git a/fixture/ListDevices.yaml b/fixture/ListDevices.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDevices.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListDevicesJobs.yaml b/fixture/ListDevicesJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDevicesJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListDevicesJobsResponse.proto b/fixture/ListDevicesJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDevicesJobsResponse.proto
diff --git a/fixture/ListDevicesResponse.proto b/fixture/ListDevicesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDevicesResponse.proto
diff --git a/fixture/ListNodeFromTemplateJobs.yaml b/fixture/ListNodeFromTemplateJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListNodeFromTemplateJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListNodeFromTemplateJobsResponse.proto b/fixture/ListNodeFromTemplateJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListNodeFromTemplateJobsResponse.proto
diff --git a/fixture/ListNodes.yaml b/fixture/ListNodes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListNodes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListNodesResponse.proto b/fixture/ListNodesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListNodesResponse.proto
diff --git a/fixture/ListPackageImportJobs.yaml b/fixture/ListPackageImportJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPackageImportJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListPackageImportJobsResponse.proto b/fixture/ListPackageImportJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPackageImportJobsResponse.proto
diff --git a/fixture/ListPackages.yaml b/fixture/ListPackages.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPackages.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListPackagesResponse.proto b/fixture/ListPackagesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPackagesResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/ProvisionDevice.yaml b/fixture/ProvisionDevice.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ProvisionDevice.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/ProvisionDeviceResponse.proto b/fixture/ProvisionDeviceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ProvisionDeviceResponse.proto
diff --git a/fixture/RegisterPackageVersion.yaml b/fixture/RegisterPackageVersion.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RegisterPackageVersion.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/RegisterPackageVersionResponse.proto b/fixture/RegisterPackageVersionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RegisterPackageVersionResponse.proto
diff --git a/fixture/RemoveApplicationInstance.yaml b/fixture/RemoveApplicationInstance.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveApplicationInstance.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/RemoveApplicationInstanceResponse.proto b/fixture/RemoveApplicationInstanceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveApplicationInstanceResponse.proto
diff --git a/fixture/SignalApplicationInstanceNodeInstances.yaml b/fixture/SignalApplicationInstanceNodeInstances.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SignalApplicationInstanceNodeInstances.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/SignalApplicationInstanceNodeInstancesResponse.proto b/fixture/SignalApplicationInstanceNodeInstancesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SignalApplicationInstanceNodeInstancesResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateDeviceMetadata.yaml b/fixture/UpdateDeviceMetadata.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDeviceMetadata.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/panorama/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  panorama.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/UpdateDeviceMetadataResponse.proto b/fixture/UpdateDeviceMetadataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDeviceMetadataResponse.proto
diff --git a/gen/Amazonka/Panorama.hs b/gen/Amazonka/Panorama.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama.hs
@@ -0,0 +1,550 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.Panorama
+-- 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 @2019-07-24@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- AWS Panorama
+--
+-- __Overview__
+--
+-- This is the /AWS Panorama API Reference/. For an introduction to the
+-- service, see
+-- <https://docs.aws.amazon.com/panorama/latest/dev/panorama-welcome.html What is AWS Panorama?>
+-- in the /AWS Panorama Developer Guide/.
+module Amazonka.Panorama
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateApplicationInstance
+    CreateApplicationInstance (CreateApplicationInstance'),
+    newCreateApplicationInstance,
+    CreateApplicationInstanceResponse (CreateApplicationInstanceResponse'),
+    newCreateApplicationInstanceResponse,
+
+    -- ** CreateJobForDevices
+    CreateJobForDevices (CreateJobForDevices'),
+    newCreateJobForDevices,
+    CreateJobForDevicesResponse (CreateJobForDevicesResponse'),
+    newCreateJobForDevicesResponse,
+
+    -- ** CreateNodeFromTemplateJob
+    CreateNodeFromTemplateJob (CreateNodeFromTemplateJob'),
+    newCreateNodeFromTemplateJob,
+    CreateNodeFromTemplateJobResponse (CreateNodeFromTemplateJobResponse'),
+    newCreateNodeFromTemplateJobResponse,
+
+    -- ** CreatePackage
+    CreatePackage (CreatePackage'),
+    newCreatePackage,
+    CreatePackageResponse (CreatePackageResponse'),
+    newCreatePackageResponse,
+
+    -- ** CreatePackageImportJob
+    CreatePackageImportJob (CreatePackageImportJob'),
+    newCreatePackageImportJob,
+    CreatePackageImportJobResponse (CreatePackageImportJobResponse'),
+    newCreatePackageImportJobResponse,
+
+    -- ** DeleteDevice
+    DeleteDevice (DeleteDevice'),
+    newDeleteDevice,
+    DeleteDeviceResponse (DeleteDeviceResponse'),
+    newDeleteDeviceResponse,
+
+    -- ** DeletePackage
+    DeletePackage (DeletePackage'),
+    newDeletePackage,
+    DeletePackageResponse (DeletePackageResponse'),
+    newDeletePackageResponse,
+
+    -- ** DeregisterPackageVersion
+    DeregisterPackageVersion (DeregisterPackageVersion'),
+    newDeregisterPackageVersion,
+    DeregisterPackageVersionResponse (DeregisterPackageVersionResponse'),
+    newDeregisterPackageVersionResponse,
+
+    -- ** DescribeApplicationInstance
+    DescribeApplicationInstance (DescribeApplicationInstance'),
+    newDescribeApplicationInstance,
+    DescribeApplicationInstanceResponse (DescribeApplicationInstanceResponse'),
+    newDescribeApplicationInstanceResponse,
+
+    -- ** DescribeApplicationInstanceDetails
+    DescribeApplicationInstanceDetails (DescribeApplicationInstanceDetails'),
+    newDescribeApplicationInstanceDetails,
+    DescribeApplicationInstanceDetailsResponse (DescribeApplicationInstanceDetailsResponse'),
+    newDescribeApplicationInstanceDetailsResponse,
+
+    -- ** DescribeDevice
+    DescribeDevice (DescribeDevice'),
+    newDescribeDevice,
+    DescribeDeviceResponse (DescribeDeviceResponse'),
+    newDescribeDeviceResponse,
+
+    -- ** DescribeDeviceJob
+    DescribeDeviceJob (DescribeDeviceJob'),
+    newDescribeDeviceJob,
+    DescribeDeviceJobResponse (DescribeDeviceJobResponse'),
+    newDescribeDeviceJobResponse,
+
+    -- ** DescribeNode
+    DescribeNode (DescribeNode'),
+    newDescribeNode,
+    DescribeNodeResponse (DescribeNodeResponse'),
+    newDescribeNodeResponse,
+
+    -- ** DescribeNodeFromTemplateJob
+    DescribeNodeFromTemplateJob (DescribeNodeFromTemplateJob'),
+    newDescribeNodeFromTemplateJob,
+    DescribeNodeFromTemplateJobResponse (DescribeNodeFromTemplateJobResponse'),
+    newDescribeNodeFromTemplateJobResponse,
+
+    -- ** DescribePackage
+    DescribePackage (DescribePackage'),
+    newDescribePackage,
+    DescribePackageResponse (DescribePackageResponse'),
+    newDescribePackageResponse,
+
+    -- ** DescribePackageImportJob
+    DescribePackageImportJob (DescribePackageImportJob'),
+    newDescribePackageImportJob,
+    DescribePackageImportJobResponse (DescribePackageImportJobResponse'),
+    newDescribePackageImportJobResponse,
+
+    -- ** DescribePackageVersion
+    DescribePackageVersion (DescribePackageVersion'),
+    newDescribePackageVersion,
+    DescribePackageVersionResponse (DescribePackageVersionResponse'),
+    newDescribePackageVersionResponse,
+
+    -- ** ListApplicationInstanceDependencies
+    ListApplicationInstanceDependencies (ListApplicationInstanceDependencies'),
+    newListApplicationInstanceDependencies,
+    ListApplicationInstanceDependenciesResponse (ListApplicationInstanceDependenciesResponse'),
+    newListApplicationInstanceDependenciesResponse,
+
+    -- ** ListApplicationInstanceNodeInstances
+    ListApplicationInstanceNodeInstances (ListApplicationInstanceNodeInstances'),
+    newListApplicationInstanceNodeInstances,
+    ListApplicationInstanceNodeInstancesResponse (ListApplicationInstanceNodeInstancesResponse'),
+    newListApplicationInstanceNodeInstancesResponse,
+
+    -- ** ListApplicationInstances
+    ListApplicationInstances (ListApplicationInstances'),
+    newListApplicationInstances,
+    ListApplicationInstancesResponse (ListApplicationInstancesResponse'),
+    newListApplicationInstancesResponse,
+
+    -- ** ListDevices
+    ListDevices (ListDevices'),
+    newListDevices,
+    ListDevicesResponse (ListDevicesResponse'),
+    newListDevicesResponse,
+
+    -- ** ListDevicesJobs
+    ListDevicesJobs (ListDevicesJobs'),
+    newListDevicesJobs,
+    ListDevicesJobsResponse (ListDevicesJobsResponse'),
+    newListDevicesJobsResponse,
+
+    -- ** ListNodeFromTemplateJobs
+    ListNodeFromTemplateJobs (ListNodeFromTemplateJobs'),
+    newListNodeFromTemplateJobs,
+    ListNodeFromTemplateJobsResponse (ListNodeFromTemplateJobsResponse'),
+    newListNodeFromTemplateJobsResponse,
+
+    -- ** ListNodes
+    ListNodes (ListNodes'),
+    newListNodes,
+    ListNodesResponse (ListNodesResponse'),
+    newListNodesResponse,
+
+    -- ** ListPackageImportJobs
+    ListPackageImportJobs (ListPackageImportJobs'),
+    newListPackageImportJobs,
+    ListPackageImportJobsResponse (ListPackageImportJobsResponse'),
+    newListPackageImportJobsResponse,
+
+    -- ** ListPackages
+    ListPackages (ListPackages'),
+    newListPackages,
+    ListPackagesResponse (ListPackagesResponse'),
+    newListPackagesResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** ProvisionDevice
+    ProvisionDevice (ProvisionDevice'),
+    newProvisionDevice,
+    ProvisionDeviceResponse (ProvisionDeviceResponse'),
+    newProvisionDeviceResponse,
+
+    -- ** RegisterPackageVersion
+    RegisterPackageVersion (RegisterPackageVersion'),
+    newRegisterPackageVersion,
+    RegisterPackageVersionResponse (RegisterPackageVersionResponse'),
+    newRegisterPackageVersionResponse,
+
+    -- ** RemoveApplicationInstance
+    RemoveApplicationInstance (RemoveApplicationInstance'),
+    newRemoveApplicationInstance,
+    RemoveApplicationInstanceResponse (RemoveApplicationInstanceResponse'),
+    newRemoveApplicationInstanceResponse,
+
+    -- ** SignalApplicationInstanceNodeInstances
+    SignalApplicationInstanceNodeInstances (SignalApplicationInstanceNodeInstances'),
+    newSignalApplicationInstanceNodeInstances,
+    SignalApplicationInstanceNodeInstancesResponse (SignalApplicationInstanceNodeInstancesResponse'),
+    newSignalApplicationInstanceNodeInstancesResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateDeviceMetadata
+    UpdateDeviceMetadata (UpdateDeviceMetadata'),
+    newUpdateDeviceMetadata,
+    UpdateDeviceMetadataResponse (UpdateDeviceMetadataResponse'),
+    newUpdateDeviceMetadataResponse,
+
+    -- * Types
+
+    -- ** ApplicationInstanceHealthStatus
+    ApplicationInstanceHealthStatus (..),
+
+    -- ** ApplicationInstanceStatus
+    ApplicationInstanceStatus (..),
+
+    -- ** ConnectionType
+    ConnectionType (..),
+
+    -- ** DesiredState
+    DesiredState (..),
+
+    -- ** DeviceAggregatedStatus
+    DeviceAggregatedStatus (..),
+
+    -- ** DeviceBrand
+    DeviceBrand (..),
+
+    -- ** DeviceConnectionStatus
+    DeviceConnectionStatus (..),
+
+    -- ** DeviceReportedStatus
+    DeviceReportedStatus (..),
+
+    -- ** DeviceStatus
+    DeviceStatus (..),
+
+    -- ** DeviceType
+    DeviceType (..),
+
+    -- ** JobResourceType
+    JobResourceType (..),
+
+    -- ** JobType
+    JobType (..),
+
+    -- ** ListDevicesSortBy
+    ListDevicesSortBy (..),
+
+    -- ** NetworkConnectionStatus
+    NetworkConnectionStatus (..),
+
+    -- ** NodeCategory
+    NodeCategory (..),
+
+    -- ** NodeFromTemplateJobStatus
+    NodeFromTemplateJobStatus (..),
+
+    -- ** NodeInstanceStatus
+    NodeInstanceStatus (..),
+
+    -- ** NodeSignalValue
+    NodeSignalValue (..),
+
+    -- ** PackageImportJobStatus
+    PackageImportJobStatus (..),
+
+    -- ** PackageImportJobType
+    PackageImportJobType (..),
+
+    -- ** PackageVersionStatus
+    PackageVersionStatus (..),
+
+    -- ** PortType
+    PortType (..),
+
+    -- ** SortOrder
+    SortOrder (..),
+
+    -- ** StatusFilter
+    StatusFilter (..),
+
+    -- ** TemplateType
+    TemplateType (..),
+
+    -- ** UpdateProgress
+    UpdateProgress (..),
+
+    -- ** AlternateSoftwareMetadata
+    AlternateSoftwareMetadata (AlternateSoftwareMetadata'),
+    newAlternateSoftwareMetadata,
+
+    -- ** ApplicationInstance
+    ApplicationInstance (ApplicationInstance'),
+    newApplicationInstance,
+
+    -- ** Device
+    Device (Device'),
+    newDevice,
+
+    -- ** DeviceJob
+    DeviceJob (DeviceJob'),
+    newDeviceJob,
+
+    -- ** DeviceJobConfig
+    DeviceJobConfig (DeviceJobConfig'),
+    newDeviceJobConfig,
+
+    -- ** EthernetPayload
+    EthernetPayload (EthernetPayload'),
+    newEthernetPayload,
+
+    -- ** EthernetStatus
+    EthernetStatus (EthernetStatus'),
+    newEthernetStatus,
+
+    -- ** Job
+    Job (Job'),
+    newJob,
+
+    -- ** JobResourceTags
+    JobResourceTags (JobResourceTags'),
+    newJobResourceTags,
+
+    -- ** LatestDeviceJob
+    LatestDeviceJob (LatestDeviceJob'),
+    newLatestDeviceJob,
+
+    -- ** ManifestOverridesPayload
+    ManifestOverridesPayload (ManifestOverridesPayload'),
+    newManifestOverridesPayload,
+
+    -- ** ManifestPayload
+    ManifestPayload (ManifestPayload'),
+    newManifestPayload,
+
+    -- ** NetworkPayload
+    NetworkPayload (NetworkPayload'),
+    newNetworkPayload,
+
+    -- ** NetworkStatus
+    NetworkStatus (NetworkStatus'),
+    newNetworkStatus,
+
+    -- ** Node
+    Node (Node'),
+    newNode,
+
+    -- ** NodeFromTemplateJob
+    NodeFromTemplateJob (NodeFromTemplateJob'),
+    newNodeFromTemplateJob,
+
+    -- ** NodeInputPort
+    NodeInputPort (NodeInputPort'),
+    newNodeInputPort,
+
+    -- ** NodeInstance
+    NodeInstance (NodeInstance'),
+    newNodeInstance,
+
+    -- ** NodeInterface
+    NodeInterface (NodeInterface'),
+    newNodeInterface,
+
+    -- ** NodeOutputPort
+    NodeOutputPort (NodeOutputPort'),
+    newNodeOutputPort,
+
+    -- ** NodeSignal
+    NodeSignal (NodeSignal'),
+    newNodeSignal,
+
+    -- ** NtpPayload
+    NtpPayload (NtpPayload'),
+    newNtpPayload,
+
+    -- ** NtpStatus
+    NtpStatus (NtpStatus'),
+    newNtpStatus,
+
+    -- ** OTAJobConfig
+    OTAJobConfig (OTAJobConfig'),
+    newOTAJobConfig,
+
+    -- ** OutPutS3Location
+    OutPutS3Location (OutPutS3Location'),
+    newOutPutS3Location,
+
+    -- ** PackageImportJob
+    PackageImportJob (PackageImportJob'),
+    newPackageImportJob,
+
+    -- ** PackageImportJobInputConfig
+    PackageImportJobInputConfig (PackageImportJobInputConfig'),
+    newPackageImportJobInputConfig,
+
+    -- ** PackageImportJobOutput
+    PackageImportJobOutput (PackageImportJobOutput'),
+    newPackageImportJobOutput,
+
+    -- ** PackageImportJobOutputConfig
+    PackageImportJobOutputConfig (PackageImportJobOutputConfig'),
+    newPackageImportJobOutputConfig,
+
+    -- ** PackageListItem
+    PackageListItem (PackageListItem'),
+    newPackageListItem,
+
+    -- ** PackageObject
+    PackageObject (PackageObject'),
+    newPackageObject,
+
+    -- ** PackageVersionInputConfig
+    PackageVersionInputConfig (PackageVersionInputConfig'),
+    newPackageVersionInputConfig,
+
+    -- ** PackageVersionOutputConfig
+    PackageVersionOutputConfig (PackageVersionOutputConfig'),
+    newPackageVersionOutputConfig,
+
+    -- ** ReportedRuntimeContextState
+    ReportedRuntimeContextState (ReportedRuntimeContextState'),
+    newReportedRuntimeContextState,
+
+    -- ** S3Location
+    S3Location (S3Location'),
+    newS3Location,
+
+    -- ** StaticIpConnectionInfo
+    StaticIpConnectionInfo (StaticIpConnectionInfo'),
+    newStaticIpConnectionInfo,
+
+    -- ** StorageLocation
+    StorageLocation (StorageLocation'),
+    newStorageLocation,
+  )
+where
+
+import Amazonka.Panorama.CreateApplicationInstance
+import Amazonka.Panorama.CreateJobForDevices
+import Amazonka.Panorama.CreateNodeFromTemplateJob
+import Amazonka.Panorama.CreatePackage
+import Amazonka.Panorama.CreatePackageImportJob
+import Amazonka.Panorama.DeleteDevice
+import Amazonka.Panorama.DeletePackage
+import Amazonka.Panorama.DeregisterPackageVersion
+import Amazonka.Panorama.DescribeApplicationInstance
+import Amazonka.Panorama.DescribeApplicationInstanceDetails
+import Amazonka.Panorama.DescribeDevice
+import Amazonka.Panorama.DescribeDeviceJob
+import Amazonka.Panorama.DescribeNode
+import Amazonka.Panorama.DescribeNodeFromTemplateJob
+import Amazonka.Panorama.DescribePackage
+import Amazonka.Panorama.DescribePackageImportJob
+import Amazonka.Panorama.DescribePackageVersion
+import Amazonka.Panorama.Lens
+import Amazonka.Panorama.ListApplicationInstanceDependencies
+import Amazonka.Panorama.ListApplicationInstanceNodeInstances
+import Amazonka.Panorama.ListApplicationInstances
+import Amazonka.Panorama.ListDevices
+import Amazonka.Panorama.ListDevicesJobs
+import Amazonka.Panorama.ListNodeFromTemplateJobs
+import Amazonka.Panorama.ListNodes
+import Amazonka.Panorama.ListPackageImportJobs
+import Amazonka.Panorama.ListPackages
+import Amazonka.Panorama.ListTagsForResource
+import Amazonka.Panorama.ProvisionDevice
+import Amazonka.Panorama.RegisterPackageVersion
+import Amazonka.Panorama.RemoveApplicationInstance
+import Amazonka.Panorama.SignalApplicationInstanceNodeInstances
+import Amazonka.Panorama.TagResource
+import Amazonka.Panorama.Types
+import Amazonka.Panorama.UntagResource
+import Amazonka.Panorama.UpdateDeviceMetadata
+import Amazonka.Panorama.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 'Panorama'.
+
+-- $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/Panorama/CreateApplicationInstance.hs b/gen/Amazonka/Panorama/CreateApplicationInstance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/CreateApplicationInstance.hs
@@ -0,0 +1,281 @@
+{-# 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.Panorama.CreateApplicationInstance
+-- 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 application instance and deploys it to a device.
+module Amazonka.Panorama.CreateApplicationInstance
+  ( -- * Creating a Request
+    CreateApplicationInstance (..),
+    newCreateApplicationInstance,
+
+    -- * Request Lenses
+    createApplicationInstance_applicationInstanceIdToReplace,
+    createApplicationInstance_description,
+    createApplicationInstance_manifestOverridesPayload,
+    createApplicationInstance_name,
+    createApplicationInstance_runtimeRoleArn,
+    createApplicationInstance_tags,
+    createApplicationInstance_defaultRuntimeContextDevice,
+    createApplicationInstance_manifestPayload,
+
+    -- * Destructuring the Response
+    CreateApplicationInstanceResponse (..),
+    newCreateApplicationInstanceResponse,
+
+    -- * Response Lenses
+    createApplicationInstanceResponse_httpStatus,
+    createApplicationInstanceResponse_applicationInstanceId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateApplicationInstance' smart constructor.
+data CreateApplicationInstance = CreateApplicationInstance'
+  { -- | The ID of an application instance to replace with the new instance.
+    applicationInstanceIdToReplace :: Prelude.Maybe Prelude.Text,
+    -- | A description for the application instance.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Setting overrides for the application manifest.
+    manifestOverridesPayload :: Prelude.Maybe ManifestOverridesPayload,
+    -- | A name for the application instance.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of a runtime role for the application instance.
+    runtimeRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | Tags for the application instance.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A device\'s ID.
+    defaultRuntimeContextDevice :: Prelude.Text,
+    -- | The application\'s manifest document.
+    manifestPayload :: ManifestPayload
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateApplicationInstance' 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:
+--
+-- 'applicationInstanceIdToReplace', 'createApplicationInstance_applicationInstanceIdToReplace' - The ID of an application instance to replace with the new instance.
+--
+-- 'description', 'createApplicationInstance_description' - A description for the application instance.
+--
+-- 'manifestOverridesPayload', 'createApplicationInstance_manifestOverridesPayload' - Setting overrides for the application manifest.
+--
+-- 'name', 'createApplicationInstance_name' - A name for the application instance.
+--
+-- 'runtimeRoleArn', 'createApplicationInstance_runtimeRoleArn' - The ARN of a runtime role for the application instance.
+--
+-- 'tags', 'createApplicationInstance_tags' - Tags for the application instance.
+--
+-- 'defaultRuntimeContextDevice', 'createApplicationInstance_defaultRuntimeContextDevice' - A device\'s ID.
+--
+-- 'manifestPayload', 'createApplicationInstance_manifestPayload' - The application\'s manifest document.
+newCreateApplicationInstance ::
+  -- | 'defaultRuntimeContextDevice'
+  Prelude.Text ->
+  -- | 'manifestPayload'
+  ManifestPayload ->
+  CreateApplicationInstance
+newCreateApplicationInstance
+  pDefaultRuntimeContextDevice_
+  pManifestPayload_ =
+    CreateApplicationInstance'
+      { applicationInstanceIdToReplace =
+          Prelude.Nothing,
+        description = Prelude.Nothing,
+        manifestOverridesPayload = Prelude.Nothing,
+        name = Prelude.Nothing,
+        runtimeRoleArn = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        defaultRuntimeContextDevice =
+          pDefaultRuntimeContextDevice_,
+        manifestPayload = pManifestPayload_
+      }
+
+-- | The ID of an application instance to replace with the new instance.
+createApplicationInstance_applicationInstanceIdToReplace :: Lens.Lens' CreateApplicationInstance (Prelude.Maybe Prelude.Text)
+createApplicationInstance_applicationInstanceIdToReplace = Lens.lens (\CreateApplicationInstance' {applicationInstanceIdToReplace} -> applicationInstanceIdToReplace) (\s@CreateApplicationInstance' {} a -> s {applicationInstanceIdToReplace = a} :: CreateApplicationInstance)
+
+-- | A description for the application instance.
+createApplicationInstance_description :: Lens.Lens' CreateApplicationInstance (Prelude.Maybe Prelude.Text)
+createApplicationInstance_description = Lens.lens (\CreateApplicationInstance' {description} -> description) (\s@CreateApplicationInstance' {} a -> s {description = a} :: CreateApplicationInstance)
+
+-- | Setting overrides for the application manifest.
+createApplicationInstance_manifestOverridesPayload :: Lens.Lens' CreateApplicationInstance (Prelude.Maybe ManifestOverridesPayload)
+createApplicationInstance_manifestOverridesPayload = Lens.lens (\CreateApplicationInstance' {manifestOverridesPayload} -> manifestOverridesPayload) (\s@CreateApplicationInstance' {} a -> s {manifestOverridesPayload = a} :: CreateApplicationInstance)
+
+-- | A name for the application instance.
+createApplicationInstance_name :: Lens.Lens' CreateApplicationInstance (Prelude.Maybe Prelude.Text)
+createApplicationInstance_name = Lens.lens (\CreateApplicationInstance' {name} -> name) (\s@CreateApplicationInstance' {} a -> s {name = a} :: CreateApplicationInstance)
+
+-- | The ARN of a runtime role for the application instance.
+createApplicationInstance_runtimeRoleArn :: Lens.Lens' CreateApplicationInstance (Prelude.Maybe Prelude.Text)
+createApplicationInstance_runtimeRoleArn = Lens.lens (\CreateApplicationInstance' {runtimeRoleArn} -> runtimeRoleArn) (\s@CreateApplicationInstance' {} a -> s {runtimeRoleArn = a} :: CreateApplicationInstance)
+
+-- | Tags for the application instance.
+createApplicationInstance_tags :: Lens.Lens' CreateApplicationInstance (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createApplicationInstance_tags = Lens.lens (\CreateApplicationInstance' {tags} -> tags) (\s@CreateApplicationInstance' {} a -> s {tags = a} :: CreateApplicationInstance) Prelude.. Lens.mapping Lens.coerced
+
+-- | A device\'s ID.
+createApplicationInstance_defaultRuntimeContextDevice :: Lens.Lens' CreateApplicationInstance Prelude.Text
+createApplicationInstance_defaultRuntimeContextDevice = Lens.lens (\CreateApplicationInstance' {defaultRuntimeContextDevice} -> defaultRuntimeContextDevice) (\s@CreateApplicationInstance' {} a -> s {defaultRuntimeContextDevice = a} :: CreateApplicationInstance)
+
+-- | The application\'s manifest document.
+createApplicationInstance_manifestPayload :: Lens.Lens' CreateApplicationInstance ManifestPayload
+createApplicationInstance_manifestPayload = Lens.lens (\CreateApplicationInstance' {manifestPayload} -> manifestPayload) (\s@CreateApplicationInstance' {} a -> s {manifestPayload = a} :: CreateApplicationInstance)
+
+instance Core.AWSRequest CreateApplicationInstance where
+  type
+    AWSResponse CreateApplicationInstance =
+      CreateApplicationInstanceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateApplicationInstanceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "ApplicationInstanceId")
+      )
+
+instance Prelude.Hashable CreateApplicationInstance where
+  hashWithSalt _salt CreateApplicationInstance' {..} =
+    _salt
+      `Prelude.hashWithSalt` applicationInstanceIdToReplace
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` manifestOverridesPayload
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` runtimeRoleArn
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` defaultRuntimeContextDevice
+      `Prelude.hashWithSalt` manifestPayload
+
+instance Prelude.NFData CreateApplicationInstance where
+  rnf CreateApplicationInstance' {..} =
+    Prelude.rnf applicationInstanceIdToReplace
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf manifestOverridesPayload
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf runtimeRoleArn
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf defaultRuntimeContextDevice
+      `Prelude.seq` Prelude.rnf manifestPayload
+
+instance Data.ToHeaders CreateApplicationInstance where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateApplicationInstance where
+  toJSON CreateApplicationInstance' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ApplicationInstanceIdToReplace" Data..=)
+              Prelude.<$> applicationInstanceIdToReplace,
+            ("Description" Data..=) Prelude.<$> description,
+            ("ManifestOverridesPayload" Data..=)
+              Prelude.<$> manifestOverridesPayload,
+            ("Name" Data..=) Prelude.<$> name,
+            ("RuntimeRoleArn" Data..=)
+              Prelude.<$> runtimeRoleArn,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ( "DefaultRuntimeContextDevice"
+                  Data..= defaultRuntimeContextDevice
+              ),
+            Prelude.Just
+              ("ManifestPayload" Data..= manifestPayload)
+          ]
+      )
+
+instance Data.ToPath CreateApplicationInstance where
+  toPath = Prelude.const "/application-instances"
+
+instance Data.ToQuery CreateApplicationInstance where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateApplicationInstanceResponse' smart constructor.
+data CreateApplicationInstanceResponse = CreateApplicationInstanceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The application instance\'s ID.
+    applicationInstanceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateApplicationInstanceResponse' 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', 'createApplicationInstanceResponse_httpStatus' - The response's http status code.
+--
+-- 'applicationInstanceId', 'createApplicationInstanceResponse_applicationInstanceId' - The application instance\'s ID.
+newCreateApplicationInstanceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'applicationInstanceId'
+  Prelude.Text ->
+  CreateApplicationInstanceResponse
+newCreateApplicationInstanceResponse
+  pHttpStatus_
+  pApplicationInstanceId_ =
+    CreateApplicationInstanceResponse'
+      { httpStatus =
+          pHttpStatus_,
+        applicationInstanceId =
+          pApplicationInstanceId_
+      }
+
+-- | The response's http status code.
+createApplicationInstanceResponse_httpStatus :: Lens.Lens' CreateApplicationInstanceResponse Prelude.Int
+createApplicationInstanceResponse_httpStatus = Lens.lens (\CreateApplicationInstanceResponse' {httpStatus} -> httpStatus) (\s@CreateApplicationInstanceResponse' {} a -> s {httpStatus = a} :: CreateApplicationInstanceResponse)
+
+-- | The application instance\'s ID.
+createApplicationInstanceResponse_applicationInstanceId :: Lens.Lens' CreateApplicationInstanceResponse Prelude.Text
+createApplicationInstanceResponse_applicationInstanceId = Lens.lens (\CreateApplicationInstanceResponse' {applicationInstanceId} -> applicationInstanceId) (\s@CreateApplicationInstanceResponse' {} a -> s {applicationInstanceId = a} :: CreateApplicationInstanceResponse)
+
+instance
+  Prelude.NFData
+    CreateApplicationInstanceResponse
+  where
+  rnf CreateApplicationInstanceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf applicationInstanceId
diff --git a/gen/Amazonka/Panorama/CreateJobForDevices.hs b/gen/Amazonka/Panorama/CreateJobForDevices.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/CreateJobForDevices.hs
@@ -0,0 +1,200 @@
+{-# 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.Panorama.CreateJobForDevices
+-- 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 job to run on one or more devices. A job can update a
+-- device\'s software or reboot it.
+module Amazonka.Panorama.CreateJobForDevices
+  ( -- * Creating a Request
+    CreateJobForDevices (..),
+    newCreateJobForDevices,
+
+    -- * Request Lenses
+    createJobForDevices_deviceJobConfig,
+    createJobForDevices_deviceIds,
+    createJobForDevices_jobType,
+
+    -- * Destructuring the Response
+    CreateJobForDevicesResponse (..),
+    newCreateJobForDevicesResponse,
+
+    -- * Response Lenses
+    createJobForDevicesResponse_httpStatus,
+    createJobForDevicesResponse_jobs,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateJobForDevices' smart constructor.
+data CreateJobForDevices = CreateJobForDevices'
+  { -- | Configuration settings for a software update job.
+    deviceJobConfig :: Prelude.Maybe DeviceJobConfig,
+    -- | IDs of target devices.
+    deviceIds :: Prelude.NonEmpty Prelude.Text,
+    -- | The type of job to run.
+    jobType :: JobType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateJobForDevices' 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:
+--
+-- 'deviceJobConfig', 'createJobForDevices_deviceJobConfig' - Configuration settings for a software update job.
+--
+-- 'deviceIds', 'createJobForDevices_deviceIds' - IDs of target devices.
+--
+-- 'jobType', 'createJobForDevices_jobType' - The type of job to run.
+newCreateJobForDevices ::
+  -- | 'deviceIds'
+  Prelude.NonEmpty Prelude.Text ->
+  -- | 'jobType'
+  JobType ->
+  CreateJobForDevices
+newCreateJobForDevices pDeviceIds_ pJobType_ =
+  CreateJobForDevices'
+    { deviceJobConfig =
+        Prelude.Nothing,
+      deviceIds = Lens.coerced Lens.# pDeviceIds_,
+      jobType = pJobType_
+    }
+
+-- | Configuration settings for a software update job.
+createJobForDevices_deviceJobConfig :: Lens.Lens' CreateJobForDevices (Prelude.Maybe DeviceJobConfig)
+createJobForDevices_deviceJobConfig = Lens.lens (\CreateJobForDevices' {deviceJobConfig} -> deviceJobConfig) (\s@CreateJobForDevices' {} a -> s {deviceJobConfig = a} :: CreateJobForDevices)
+
+-- | IDs of target devices.
+createJobForDevices_deviceIds :: Lens.Lens' CreateJobForDevices (Prelude.NonEmpty Prelude.Text)
+createJobForDevices_deviceIds = Lens.lens (\CreateJobForDevices' {deviceIds} -> deviceIds) (\s@CreateJobForDevices' {} a -> s {deviceIds = a} :: CreateJobForDevices) Prelude.. Lens.coerced
+
+-- | The type of job to run.
+createJobForDevices_jobType :: Lens.Lens' CreateJobForDevices JobType
+createJobForDevices_jobType = Lens.lens (\CreateJobForDevices' {jobType} -> jobType) (\s@CreateJobForDevices' {} a -> s {jobType = a} :: CreateJobForDevices)
+
+instance Core.AWSRequest CreateJobForDevices where
+  type
+    AWSResponse CreateJobForDevices =
+      CreateJobForDevicesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateJobForDevicesResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Jobs" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable CreateJobForDevices where
+  hashWithSalt _salt CreateJobForDevices' {..} =
+    _salt
+      `Prelude.hashWithSalt` deviceJobConfig
+      `Prelude.hashWithSalt` deviceIds
+      `Prelude.hashWithSalt` jobType
+
+instance Prelude.NFData CreateJobForDevices where
+  rnf CreateJobForDevices' {..} =
+    Prelude.rnf deviceJobConfig
+      `Prelude.seq` Prelude.rnf deviceIds
+      `Prelude.seq` Prelude.rnf jobType
+
+instance Data.ToHeaders CreateJobForDevices where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateJobForDevices where
+  toJSON CreateJobForDevices' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DeviceJobConfig" Data..=)
+              Prelude.<$> deviceJobConfig,
+            Prelude.Just ("DeviceIds" Data..= deviceIds),
+            Prelude.Just ("JobType" Data..= jobType)
+          ]
+      )
+
+instance Data.ToPath CreateJobForDevices where
+  toPath = Prelude.const "/jobs"
+
+instance Data.ToQuery CreateJobForDevices where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateJobForDevicesResponse' smart constructor.
+data CreateJobForDevicesResponse = CreateJobForDevicesResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of jobs.
+    jobs :: [Job]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateJobForDevicesResponse' 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', 'createJobForDevicesResponse_httpStatus' - The response's http status code.
+--
+-- 'jobs', 'createJobForDevicesResponse_jobs' - A list of jobs.
+newCreateJobForDevicesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateJobForDevicesResponse
+newCreateJobForDevicesResponse pHttpStatus_ =
+  CreateJobForDevicesResponse'
+    { httpStatus =
+        pHttpStatus_,
+      jobs = Prelude.mempty
+    }
+
+-- | The response's http status code.
+createJobForDevicesResponse_httpStatus :: Lens.Lens' CreateJobForDevicesResponse Prelude.Int
+createJobForDevicesResponse_httpStatus = Lens.lens (\CreateJobForDevicesResponse' {httpStatus} -> httpStatus) (\s@CreateJobForDevicesResponse' {} a -> s {httpStatus = a} :: CreateJobForDevicesResponse)
+
+-- | A list of jobs.
+createJobForDevicesResponse_jobs :: Lens.Lens' CreateJobForDevicesResponse [Job]
+createJobForDevicesResponse_jobs = Lens.lens (\CreateJobForDevicesResponse' {jobs} -> jobs) (\s@CreateJobForDevicesResponse' {} a -> s {jobs = a} :: CreateJobForDevicesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData CreateJobForDevicesResponse where
+  rnf CreateJobForDevicesResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf jobs
diff --git a/gen/Amazonka/Panorama/CreateNodeFromTemplateJob.hs b/gen/Amazonka/Panorama/CreateNodeFromTemplateJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/CreateNodeFromTemplateJob.hs
@@ -0,0 +1,271 @@
+{-# 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.Panorama.CreateNodeFromTemplateJob
+-- 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 camera stream node.
+module Amazonka.Panorama.CreateNodeFromTemplateJob
+  ( -- * Creating a Request
+    CreateNodeFromTemplateJob (..),
+    newCreateNodeFromTemplateJob,
+
+    -- * Request Lenses
+    createNodeFromTemplateJob_jobTags,
+    createNodeFromTemplateJob_nodeDescription,
+    createNodeFromTemplateJob_nodeName,
+    createNodeFromTemplateJob_outputPackageName,
+    createNodeFromTemplateJob_outputPackageVersion,
+    createNodeFromTemplateJob_templateParameters,
+    createNodeFromTemplateJob_templateType,
+
+    -- * Destructuring the Response
+    CreateNodeFromTemplateJobResponse (..),
+    newCreateNodeFromTemplateJobResponse,
+
+    -- * Response Lenses
+    createNodeFromTemplateJobResponse_httpStatus,
+    createNodeFromTemplateJobResponse_jobId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateNodeFromTemplateJob' smart constructor.
+data CreateNodeFromTemplateJob = CreateNodeFromTemplateJob'
+  { -- | Tags for the job.
+    jobTags :: Prelude.Maybe [JobResourceTags],
+    -- | A description for the node.
+    nodeDescription :: Prelude.Maybe Prelude.Text,
+    -- | A name for the node.
+    nodeName :: Prelude.Text,
+    -- | An output package name for the node.
+    outputPackageName :: Prelude.Text,
+    -- | An output package version for the node.
+    outputPackageVersion :: Prelude.Text,
+    -- | Template parameters for the node.
+    templateParameters :: Prelude.HashMap Prelude.Text (Data.Sensitive Prelude.Text),
+    -- | The type of node.
+    templateType :: TemplateType
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateNodeFromTemplateJob' 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:
+--
+-- 'jobTags', 'createNodeFromTemplateJob_jobTags' - Tags for the job.
+--
+-- 'nodeDescription', 'createNodeFromTemplateJob_nodeDescription' - A description for the node.
+--
+-- 'nodeName', 'createNodeFromTemplateJob_nodeName' - A name for the node.
+--
+-- 'outputPackageName', 'createNodeFromTemplateJob_outputPackageName' - An output package name for the node.
+--
+-- 'outputPackageVersion', 'createNodeFromTemplateJob_outputPackageVersion' - An output package version for the node.
+--
+-- 'templateParameters', 'createNodeFromTemplateJob_templateParameters' - Template parameters for the node.
+--
+-- 'templateType', 'createNodeFromTemplateJob_templateType' - The type of node.
+newCreateNodeFromTemplateJob ::
+  -- | 'nodeName'
+  Prelude.Text ->
+  -- | 'outputPackageName'
+  Prelude.Text ->
+  -- | 'outputPackageVersion'
+  Prelude.Text ->
+  -- | 'templateType'
+  TemplateType ->
+  CreateNodeFromTemplateJob
+newCreateNodeFromTemplateJob
+  pNodeName_
+  pOutputPackageName_
+  pOutputPackageVersion_
+  pTemplateType_ =
+    CreateNodeFromTemplateJob'
+      { jobTags =
+          Prelude.Nothing,
+        nodeDescription = Prelude.Nothing,
+        nodeName = pNodeName_,
+        outputPackageName = pOutputPackageName_,
+        outputPackageVersion = pOutputPackageVersion_,
+        templateParameters = Prelude.mempty,
+        templateType = pTemplateType_
+      }
+
+-- | Tags for the job.
+createNodeFromTemplateJob_jobTags :: Lens.Lens' CreateNodeFromTemplateJob (Prelude.Maybe [JobResourceTags])
+createNodeFromTemplateJob_jobTags = Lens.lens (\CreateNodeFromTemplateJob' {jobTags} -> jobTags) (\s@CreateNodeFromTemplateJob' {} a -> s {jobTags = a} :: CreateNodeFromTemplateJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | A description for the node.
+createNodeFromTemplateJob_nodeDescription :: Lens.Lens' CreateNodeFromTemplateJob (Prelude.Maybe Prelude.Text)
+createNodeFromTemplateJob_nodeDescription = Lens.lens (\CreateNodeFromTemplateJob' {nodeDescription} -> nodeDescription) (\s@CreateNodeFromTemplateJob' {} a -> s {nodeDescription = a} :: CreateNodeFromTemplateJob)
+
+-- | A name for the node.
+createNodeFromTemplateJob_nodeName :: Lens.Lens' CreateNodeFromTemplateJob Prelude.Text
+createNodeFromTemplateJob_nodeName = Lens.lens (\CreateNodeFromTemplateJob' {nodeName} -> nodeName) (\s@CreateNodeFromTemplateJob' {} a -> s {nodeName = a} :: CreateNodeFromTemplateJob)
+
+-- | An output package name for the node.
+createNodeFromTemplateJob_outputPackageName :: Lens.Lens' CreateNodeFromTemplateJob Prelude.Text
+createNodeFromTemplateJob_outputPackageName = Lens.lens (\CreateNodeFromTemplateJob' {outputPackageName} -> outputPackageName) (\s@CreateNodeFromTemplateJob' {} a -> s {outputPackageName = a} :: CreateNodeFromTemplateJob)
+
+-- | An output package version for the node.
+createNodeFromTemplateJob_outputPackageVersion :: Lens.Lens' CreateNodeFromTemplateJob Prelude.Text
+createNodeFromTemplateJob_outputPackageVersion = Lens.lens (\CreateNodeFromTemplateJob' {outputPackageVersion} -> outputPackageVersion) (\s@CreateNodeFromTemplateJob' {} a -> s {outputPackageVersion = a} :: CreateNodeFromTemplateJob)
+
+-- | Template parameters for the node.
+createNodeFromTemplateJob_templateParameters :: Lens.Lens' CreateNodeFromTemplateJob (Prelude.HashMap Prelude.Text Prelude.Text)
+createNodeFromTemplateJob_templateParameters = Lens.lens (\CreateNodeFromTemplateJob' {templateParameters} -> templateParameters) (\s@CreateNodeFromTemplateJob' {} a -> s {templateParameters = a} :: CreateNodeFromTemplateJob) Prelude.. Lens.coerced
+
+-- | The type of node.
+createNodeFromTemplateJob_templateType :: Lens.Lens' CreateNodeFromTemplateJob TemplateType
+createNodeFromTemplateJob_templateType = Lens.lens (\CreateNodeFromTemplateJob' {templateType} -> templateType) (\s@CreateNodeFromTemplateJob' {} a -> s {templateType = a} :: CreateNodeFromTemplateJob)
+
+instance Core.AWSRequest CreateNodeFromTemplateJob where
+  type
+    AWSResponse CreateNodeFromTemplateJob =
+      CreateNodeFromTemplateJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateNodeFromTemplateJobResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "JobId")
+      )
+
+instance Prelude.Hashable CreateNodeFromTemplateJob where
+  hashWithSalt _salt CreateNodeFromTemplateJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` jobTags
+      `Prelude.hashWithSalt` nodeDescription
+      `Prelude.hashWithSalt` nodeName
+      `Prelude.hashWithSalt` outputPackageName
+      `Prelude.hashWithSalt` outputPackageVersion
+      `Prelude.hashWithSalt` templateParameters
+      `Prelude.hashWithSalt` templateType
+
+instance Prelude.NFData CreateNodeFromTemplateJob where
+  rnf CreateNodeFromTemplateJob' {..} =
+    Prelude.rnf jobTags
+      `Prelude.seq` Prelude.rnf nodeDescription
+      `Prelude.seq` Prelude.rnf nodeName
+      `Prelude.seq` Prelude.rnf outputPackageName
+      `Prelude.seq` Prelude.rnf outputPackageVersion
+      `Prelude.seq` Prelude.rnf templateParameters
+      `Prelude.seq` Prelude.rnf templateType
+
+instance Data.ToHeaders CreateNodeFromTemplateJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateNodeFromTemplateJob where
+  toJSON CreateNodeFromTemplateJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("JobTags" Data..=) Prelude.<$> jobTags,
+            ("NodeDescription" Data..=)
+              Prelude.<$> nodeDescription,
+            Prelude.Just ("NodeName" Data..= nodeName),
+            Prelude.Just
+              ("OutputPackageName" Data..= outputPackageName),
+            Prelude.Just
+              ( "OutputPackageVersion"
+                  Data..= outputPackageVersion
+              ),
+            Prelude.Just
+              ("TemplateParameters" Data..= templateParameters),
+            Prelude.Just ("TemplateType" Data..= templateType)
+          ]
+      )
+
+instance Data.ToPath CreateNodeFromTemplateJob where
+  toPath = Prelude.const "/packages/template-job"
+
+instance Data.ToQuery CreateNodeFromTemplateJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateNodeFromTemplateJobResponse' smart constructor.
+data CreateNodeFromTemplateJobResponse = CreateNodeFromTemplateJobResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The job\'s ID.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateNodeFromTemplateJobResponse' 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', 'createNodeFromTemplateJobResponse_httpStatus' - The response's http status code.
+--
+-- 'jobId', 'createNodeFromTemplateJobResponse_jobId' - The job\'s ID.
+newCreateNodeFromTemplateJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'jobId'
+  Prelude.Text ->
+  CreateNodeFromTemplateJobResponse
+newCreateNodeFromTemplateJobResponse
+  pHttpStatus_
+  pJobId_ =
+    CreateNodeFromTemplateJobResponse'
+      { httpStatus =
+          pHttpStatus_,
+        jobId = pJobId_
+      }
+
+-- | The response's http status code.
+createNodeFromTemplateJobResponse_httpStatus :: Lens.Lens' CreateNodeFromTemplateJobResponse Prelude.Int
+createNodeFromTemplateJobResponse_httpStatus = Lens.lens (\CreateNodeFromTemplateJobResponse' {httpStatus} -> httpStatus) (\s@CreateNodeFromTemplateJobResponse' {} a -> s {httpStatus = a} :: CreateNodeFromTemplateJobResponse)
+
+-- | The job\'s ID.
+createNodeFromTemplateJobResponse_jobId :: Lens.Lens' CreateNodeFromTemplateJobResponse Prelude.Text
+createNodeFromTemplateJobResponse_jobId = Lens.lens (\CreateNodeFromTemplateJobResponse' {jobId} -> jobId) (\s@CreateNodeFromTemplateJobResponse' {} a -> s {jobId = a} :: CreateNodeFromTemplateJobResponse)
+
+instance
+  Prelude.NFData
+    CreateNodeFromTemplateJobResponse
+  where
+  rnf CreateNodeFromTemplateJobResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf jobId
diff --git a/gen/Amazonka/Panorama/CreatePackage.hs b/gen/Amazonka/Panorama/CreatePackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/CreatePackage.hs
@@ -0,0 +1,209 @@
+{-# 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.Panorama.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 and storage location in an Amazon S3 access point.
+module Amazonka.Panorama.CreatePackage
+  ( -- * Creating a Request
+    CreatePackage (..),
+    newCreatePackage,
+
+    -- * Request Lenses
+    createPackage_tags,
+    createPackage_packageName,
+
+    -- * Destructuring the Response
+    CreatePackageResponse (..),
+    newCreatePackageResponse,
+
+    -- * Response Lenses
+    createPackageResponse_arn,
+    createPackageResponse_packageId,
+    createPackageResponse_httpStatus,
+    createPackageResponse_storageLocation,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreatePackage' smart constructor.
+data CreatePackage = CreatePackage'
+  { -- | Tags for the package.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A name for the package.
+    packageName :: Prelude.Text
+  }
+  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:
+--
+-- 'tags', 'createPackage_tags' - Tags for the package.
+--
+-- 'packageName', 'createPackage_packageName' - A name for the package.
+newCreatePackage ::
+  -- | 'packageName'
+  Prelude.Text ->
+  CreatePackage
+newCreatePackage pPackageName_ =
+  CreatePackage'
+    { tags = Prelude.Nothing,
+      packageName = pPackageName_
+    }
+
+-- | Tags for the package.
+createPackage_tags :: Lens.Lens' CreatePackage (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createPackage_tags = Lens.lens (\CreatePackage' {tags} -> tags) (\s@CreatePackage' {} a -> s {tags = a} :: CreatePackage) Prelude.. Lens.mapping Lens.coerced
+
+-- | A 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)
+
+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..?> "Arn")
+            Prelude.<*> (x Data..?> "PackageId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "StorageLocation")
+      )
+
+instance Prelude.Hashable CreatePackage where
+  hashWithSalt _salt CreatePackage' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` packageName
+
+instance Prelude.NFData CreatePackage where
+  rnf CreatePackage' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf packageName
+
+instance Data.ToHeaders CreatePackage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreatePackage where
+  toJSON CreatePackage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("PackageName" Data..= packageName)
+          ]
+      )
+
+instance Data.ToPath CreatePackage where
+  toPath = Prelude.const "/packages"
+
+instance Data.ToQuery CreatePackage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreatePackageResponse' smart constructor.
+data CreatePackageResponse = CreatePackageResponse'
+  { -- | The package\'s ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The package\'s ID.
+    packageId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The package\'s storage location.
+    storageLocation :: StorageLocation
+  }
+  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:
+--
+-- 'arn', 'createPackageResponse_arn' - The package\'s ARN.
+--
+-- 'packageId', 'createPackageResponse_packageId' - The package\'s ID.
+--
+-- 'httpStatus', 'createPackageResponse_httpStatus' - The response's http status code.
+--
+-- 'storageLocation', 'createPackageResponse_storageLocation' - The package\'s storage location.
+newCreatePackageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'storageLocation'
+  StorageLocation ->
+  CreatePackageResponse
+newCreatePackageResponse
+  pHttpStatus_
+  pStorageLocation_ =
+    CreatePackageResponse'
+      { arn = Prelude.Nothing,
+        packageId = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        storageLocation = pStorageLocation_
+      }
+
+-- | The package\'s ARN.
+createPackageResponse_arn :: Lens.Lens' CreatePackageResponse (Prelude.Maybe Prelude.Text)
+createPackageResponse_arn = Lens.lens (\CreatePackageResponse' {arn} -> arn) (\s@CreatePackageResponse' {} a -> s {arn = a} :: CreatePackageResponse)
+
+-- | The package\'s ID.
+createPackageResponse_packageId :: Lens.Lens' CreatePackageResponse (Prelude.Maybe Prelude.Text)
+createPackageResponse_packageId = Lens.lens (\CreatePackageResponse' {packageId} -> packageId) (\s@CreatePackageResponse' {} a -> s {packageId = 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)
+
+-- | The package\'s storage location.
+createPackageResponse_storageLocation :: Lens.Lens' CreatePackageResponse StorageLocation
+createPackageResponse_storageLocation = Lens.lens (\CreatePackageResponse' {storageLocation} -> storageLocation) (\s@CreatePackageResponse' {} a -> s {storageLocation = a} :: CreatePackageResponse)
+
+instance Prelude.NFData CreatePackageResponse where
+  rnf CreatePackageResponse' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf storageLocation
diff --git a/gen/Amazonka/Panorama/CreatePackageImportJob.hs b/gen/Amazonka/Panorama/CreatePackageImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/CreatePackageImportJob.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.Panorama.CreatePackageImportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Imports a node package.
+module Amazonka.Panorama.CreatePackageImportJob
+  ( -- * Creating a Request
+    CreatePackageImportJob (..),
+    newCreatePackageImportJob,
+
+    -- * Request Lenses
+    createPackageImportJob_jobTags,
+    createPackageImportJob_clientToken,
+    createPackageImportJob_inputConfig,
+    createPackageImportJob_jobType,
+    createPackageImportJob_outputConfig,
+
+    -- * Destructuring the Response
+    CreatePackageImportJobResponse (..),
+    newCreatePackageImportJobResponse,
+
+    -- * Response Lenses
+    createPackageImportJobResponse_httpStatus,
+    createPackageImportJobResponse_jobId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreatePackageImportJob' smart constructor.
+data CreatePackageImportJob = CreatePackageImportJob'
+  { -- | Tags for the package import job.
+    jobTags :: Prelude.Maybe [JobResourceTags],
+    -- | A client token for the package import job.
+    clientToken :: Prelude.Text,
+    -- | An input config for the package import job.
+    inputConfig :: PackageImportJobInputConfig,
+    -- | A job type for the package import job.
+    jobType :: PackageImportJobType,
+    -- | An output config for the package import job.
+    outputConfig :: PackageImportJobOutputConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePackageImportJob' 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:
+--
+-- 'jobTags', 'createPackageImportJob_jobTags' - Tags for the package import job.
+--
+-- 'clientToken', 'createPackageImportJob_clientToken' - A client token for the package import job.
+--
+-- 'inputConfig', 'createPackageImportJob_inputConfig' - An input config for the package import job.
+--
+-- 'jobType', 'createPackageImportJob_jobType' - A job type for the package import job.
+--
+-- 'outputConfig', 'createPackageImportJob_outputConfig' - An output config for the package import job.
+newCreatePackageImportJob ::
+  -- | 'clientToken'
+  Prelude.Text ->
+  -- | 'inputConfig'
+  PackageImportJobInputConfig ->
+  -- | 'jobType'
+  PackageImportJobType ->
+  -- | 'outputConfig'
+  PackageImportJobOutputConfig ->
+  CreatePackageImportJob
+newCreatePackageImportJob
+  pClientToken_
+  pInputConfig_
+  pJobType_
+  pOutputConfig_ =
+    CreatePackageImportJob'
+      { jobTags = Prelude.Nothing,
+        clientToken = pClientToken_,
+        inputConfig = pInputConfig_,
+        jobType = pJobType_,
+        outputConfig = pOutputConfig_
+      }
+
+-- | Tags for the package import job.
+createPackageImportJob_jobTags :: Lens.Lens' CreatePackageImportJob (Prelude.Maybe [JobResourceTags])
+createPackageImportJob_jobTags = Lens.lens (\CreatePackageImportJob' {jobTags} -> jobTags) (\s@CreatePackageImportJob' {} a -> s {jobTags = a} :: CreatePackageImportJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | A client token for the package import job.
+createPackageImportJob_clientToken :: Lens.Lens' CreatePackageImportJob Prelude.Text
+createPackageImportJob_clientToken = Lens.lens (\CreatePackageImportJob' {clientToken} -> clientToken) (\s@CreatePackageImportJob' {} a -> s {clientToken = a} :: CreatePackageImportJob)
+
+-- | An input config for the package import job.
+createPackageImportJob_inputConfig :: Lens.Lens' CreatePackageImportJob PackageImportJobInputConfig
+createPackageImportJob_inputConfig = Lens.lens (\CreatePackageImportJob' {inputConfig} -> inputConfig) (\s@CreatePackageImportJob' {} a -> s {inputConfig = a} :: CreatePackageImportJob)
+
+-- | A job type for the package import job.
+createPackageImportJob_jobType :: Lens.Lens' CreatePackageImportJob PackageImportJobType
+createPackageImportJob_jobType = Lens.lens (\CreatePackageImportJob' {jobType} -> jobType) (\s@CreatePackageImportJob' {} a -> s {jobType = a} :: CreatePackageImportJob)
+
+-- | An output config for the package import job.
+createPackageImportJob_outputConfig :: Lens.Lens' CreatePackageImportJob PackageImportJobOutputConfig
+createPackageImportJob_outputConfig = Lens.lens (\CreatePackageImportJob' {outputConfig} -> outputConfig) (\s@CreatePackageImportJob' {} a -> s {outputConfig = a} :: CreatePackageImportJob)
+
+instance Core.AWSRequest CreatePackageImportJob where
+  type
+    AWSResponse CreatePackageImportJob =
+      CreatePackageImportJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreatePackageImportJobResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "JobId")
+      )
+
+instance Prelude.Hashable CreatePackageImportJob where
+  hashWithSalt _salt CreatePackageImportJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` jobTags
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` inputConfig
+      `Prelude.hashWithSalt` jobType
+      `Prelude.hashWithSalt` outputConfig
+
+instance Prelude.NFData CreatePackageImportJob where
+  rnf CreatePackageImportJob' {..} =
+    Prelude.rnf jobTags
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf inputConfig
+      `Prelude.seq` Prelude.rnf jobType
+      `Prelude.seq` Prelude.rnf outputConfig
+
+instance Data.ToHeaders CreatePackageImportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreatePackageImportJob where
+  toJSON CreatePackageImportJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("JobTags" Data..=) Prelude.<$> jobTags,
+            Prelude.Just ("ClientToken" Data..= clientToken),
+            Prelude.Just ("InputConfig" Data..= inputConfig),
+            Prelude.Just ("JobType" Data..= jobType),
+            Prelude.Just ("OutputConfig" Data..= outputConfig)
+          ]
+      )
+
+instance Data.ToPath CreatePackageImportJob where
+  toPath = Prelude.const "/packages/import-jobs"
+
+instance Data.ToQuery CreatePackageImportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreatePackageImportJobResponse' smart constructor.
+data CreatePackageImportJobResponse = CreatePackageImportJobResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The job\'s ID.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePackageImportJobResponse' 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', 'createPackageImportJobResponse_httpStatus' - The response's http status code.
+--
+-- 'jobId', 'createPackageImportJobResponse_jobId' - The job\'s ID.
+newCreatePackageImportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'jobId'
+  Prelude.Text ->
+  CreatePackageImportJobResponse
+newCreatePackageImportJobResponse
+  pHttpStatus_
+  pJobId_ =
+    CreatePackageImportJobResponse'
+      { httpStatus =
+          pHttpStatus_,
+        jobId = pJobId_
+      }
+
+-- | The response's http status code.
+createPackageImportJobResponse_httpStatus :: Lens.Lens' CreatePackageImportJobResponse Prelude.Int
+createPackageImportJobResponse_httpStatus = Lens.lens (\CreatePackageImportJobResponse' {httpStatus} -> httpStatus) (\s@CreatePackageImportJobResponse' {} a -> s {httpStatus = a} :: CreatePackageImportJobResponse)
+
+-- | The job\'s ID.
+createPackageImportJobResponse_jobId :: Lens.Lens' CreatePackageImportJobResponse Prelude.Text
+createPackageImportJobResponse_jobId = Lens.lens (\CreatePackageImportJobResponse' {jobId} -> jobId) (\s@CreatePackageImportJobResponse' {} a -> s {jobId = a} :: CreatePackageImportJobResponse)
+
+instance
+  Prelude.NFData
+    CreatePackageImportJobResponse
+  where
+  rnf CreatePackageImportJobResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf jobId
diff --git a/gen/Amazonka/Panorama/DeleteDevice.hs b/gen/Amazonka/Panorama/DeleteDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DeleteDevice.hs
@@ -0,0 +1,155 @@
+{-# 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.Panorama.DeleteDevice
+-- 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 a device.
+module Amazonka.Panorama.DeleteDevice
+  ( -- * Creating a Request
+    DeleteDevice (..),
+    newDeleteDevice,
+
+    -- * Request Lenses
+    deleteDevice_deviceId,
+
+    -- * Destructuring the Response
+    DeleteDeviceResponse (..),
+    newDeleteDeviceResponse,
+
+    -- * Response Lenses
+    deleteDeviceResponse_deviceId,
+    deleteDeviceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteDevice' smart constructor.
+data DeleteDevice = DeleteDevice'
+  { -- | The device\'s ID.
+    deviceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDevice' 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:
+--
+-- 'deviceId', 'deleteDevice_deviceId' - The device\'s ID.
+newDeleteDevice ::
+  -- | 'deviceId'
+  Prelude.Text ->
+  DeleteDevice
+newDeleteDevice pDeviceId_ =
+  DeleteDevice' {deviceId = pDeviceId_}
+
+-- | The device\'s ID.
+deleteDevice_deviceId :: Lens.Lens' DeleteDevice Prelude.Text
+deleteDevice_deviceId = Lens.lens (\DeleteDevice' {deviceId} -> deviceId) (\s@DeleteDevice' {} a -> s {deviceId = a} :: DeleteDevice)
+
+instance Core.AWSRequest DeleteDevice where
+  type AWSResponse DeleteDevice = DeleteDeviceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteDeviceResponse'
+            Prelude.<$> (x Data..?> "DeviceId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteDevice where
+  hashWithSalt _salt DeleteDevice' {..} =
+    _salt `Prelude.hashWithSalt` deviceId
+
+instance Prelude.NFData DeleteDevice where
+  rnf DeleteDevice' {..} = Prelude.rnf deviceId
+
+instance Data.ToHeaders DeleteDevice where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteDevice where
+  toPath DeleteDevice' {..} =
+    Prelude.mconcat ["/devices/", Data.toBS deviceId]
+
+instance Data.ToQuery DeleteDevice where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDeviceResponse' smart constructor.
+data DeleteDeviceResponse = DeleteDeviceResponse'
+  { -- | The device\'s ID.
+    deviceId :: 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 'DeleteDeviceResponse' 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:
+--
+-- 'deviceId', 'deleteDeviceResponse_deviceId' - The device\'s ID.
+--
+-- 'httpStatus', 'deleteDeviceResponse_httpStatus' - The response's http status code.
+newDeleteDeviceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteDeviceResponse
+newDeleteDeviceResponse pHttpStatus_ =
+  DeleteDeviceResponse'
+    { deviceId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The device\'s ID.
+deleteDeviceResponse_deviceId :: Lens.Lens' DeleteDeviceResponse (Prelude.Maybe Prelude.Text)
+deleteDeviceResponse_deviceId = Lens.lens (\DeleteDeviceResponse' {deviceId} -> deviceId) (\s@DeleteDeviceResponse' {} a -> s {deviceId = a} :: DeleteDeviceResponse)
+
+-- | The response's http status code.
+deleteDeviceResponse_httpStatus :: Lens.Lens' DeleteDeviceResponse Prelude.Int
+deleteDeviceResponse_httpStatus = Lens.lens (\DeleteDeviceResponse' {httpStatus} -> httpStatus) (\s@DeleteDeviceResponse' {} a -> s {httpStatus = a} :: DeleteDeviceResponse)
+
+instance Prelude.NFData DeleteDeviceResponse where
+  rnf DeleteDeviceResponse' {..} =
+    Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/DeletePackage.hs b/gen/Amazonka/Panorama/DeletePackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DeletePackage.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.Panorama.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 a package.
+--
+-- To delete a package, you need permission to call @s3:DeleteObject@ in
+-- addition to permissions for the AWS Panorama API.
+module Amazonka.Panorama.DeletePackage
+  ( -- * Creating a Request
+    DeletePackage (..),
+    newDeletePackage,
+
+    -- * Request Lenses
+    deletePackage_forceDelete,
+    deletePackage_packageId,
+
+    -- * Destructuring the Response
+    DeletePackageResponse (..),
+    newDeletePackageResponse,
+
+    -- * Response Lenses
+    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.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeletePackage' smart constructor.
+data DeletePackage = DeletePackage'
+  { -- | Delete the package even if it has artifacts stored in its access point.
+    -- Deletes the package\'s artifacts from Amazon S3.
+    forceDelete :: Prelude.Maybe Prelude.Bool,
+    -- | The package\'s ID.
+    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:
+--
+-- 'forceDelete', 'deletePackage_forceDelete' - Delete the package even if it has artifacts stored in its access point.
+-- Deletes the package\'s artifacts from Amazon S3.
+--
+-- 'packageId', 'deletePackage_packageId' - The package\'s ID.
+newDeletePackage ::
+  -- | 'packageId'
+  Prelude.Text ->
+  DeletePackage
+newDeletePackage pPackageId_ =
+  DeletePackage'
+    { forceDelete = Prelude.Nothing,
+      packageId = pPackageId_
+    }
+
+-- | Delete the package even if it has artifacts stored in its access point.
+-- Deletes the package\'s artifacts from Amazon S3.
+deletePackage_forceDelete :: Lens.Lens' DeletePackage (Prelude.Maybe Prelude.Bool)
+deletePackage_forceDelete = Lens.lens (\DeletePackage' {forceDelete} -> forceDelete) (\s@DeletePackage' {} a -> s {forceDelete = a} :: DeletePackage)
+
+-- | The package\'s ID.
+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.receiveEmpty
+      ( \s h x ->
+          DeletePackageResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeletePackage where
+  hashWithSalt _salt DeletePackage' {..} =
+    _salt
+      `Prelude.hashWithSalt` forceDelete
+      `Prelude.hashWithSalt` packageId
+
+instance Prelude.NFData DeletePackage where
+  rnf DeletePackage' {..} =
+    Prelude.rnf forceDelete
+      `Prelude.seq` Prelude.rnf packageId
+
+instance Data.ToHeaders DeletePackage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeletePackage where
+  toPath DeletePackage' {..} =
+    Prelude.mconcat ["/packages/", Data.toBS packageId]
+
+instance Data.ToQuery DeletePackage where
+  toQuery DeletePackage' {..} =
+    Prelude.mconcat ["ForceDelete" Data.=: forceDelete]
+
+-- | /See:/ 'newDeletePackageResponse' smart constructor.
+data DeletePackageResponse = DeletePackageResponse'
+  { -- | 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:
+--
+-- 'httpStatus', 'deletePackageResponse_httpStatus' - The response's http status code.
+newDeletePackageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeletePackageResponse
+newDeletePackageResponse pHttpStatus_ =
+  DeletePackageResponse' {httpStatus = pHttpStatus_}
+
+-- | 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 httpStatus
diff --git a/gen/Amazonka/Panorama/DeregisterPackageVersion.hs b/gen/Amazonka/Panorama/DeregisterPackageVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DeregisterPackageVersion.hs
@@ -0,0 +1,221 @@
+{-# 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.Panorama.DeregisterPackageVersion
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deregisters a package version.
+module Amazonka.Panorama.DeregisterPackageVersion
+  ( -- * Creating a Request
+    DeregisterPackageVersion (..),
+    newDeregisterPackageVersion,
+
+    -- * Request Lenses
+    deregisterPackageVersion_ownerAccount,
+    deregisterPackageVersion_updatedLatestPatchVersion,
+    deregisterPackageVersion_packageId,
+    deregisterPackageVersion_packageVersion,
+    deregisterPackageVersion_patchVersion,
+
+    -- * Destructuring the Response
+    DeregisterPackageVersionResponse (..),
+    newDeregisterPackageVersionResponse,
+
+    -- * Response Lenses
+    deregisterPackageVersionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeregisterPackageVersion' smart constructor.
+data DeregisterPackageVersion = DeregisterPackageVersion'
+  { -- | An owner account.
+    ownerAccount :: Prelude.Maybe Prelude.Text,
+    -- | If the version was marked latest, the new version to maker as latest.
+    updatedLatestPatchVersion :: Prelude.Maybe Prelude.Text,
+    -- | A package ID.
+    packageId :: Prelude.Text,
+    -- | A package version.
+    packageVersion :: Prelude.Text,
+    -- | A patch version.
+    patchVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeregisterPackageVersion' 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:
+--
+-- 'ownerAccount', 'deregisterPackageVersion_ownerAccount' - An owner account.
+--
+-- 'updatedLatestPatchVersion', 'deregisterPackageVersion_updatedLatestPatchVersion' - If the version was marked latest, the new version to maker as latest.
+--
+-- 'packageId', 'deregisterPackageVersion_packageId' - A package ID.
+--
+-- 'packageVersion', 'deregisterPackageVersion_packageVersion' - A package version.
+--
+-- 'patchVersion', 'deregisterPackageVersion_patchVersion' - A patch version.
+newDeregisterPackageVersion ::
+  -- | 'packageId'
+  Prelude.Text ->
+  -- | 'packageVersion'
+  Prelude.Text ->
+  -- | 'patchVersion'
+  Prelude.Text ->
+  DeregisterPackageVersion
+newDeregisterPackageVersion
+  pPackageId_
+  pPackageVersion_
+  pPatchVersion_ =
+    DeregisterPackageVersion'
+      { ownerAccount =
+          Prelude.Nothing,
+        updatedLatestPatchVersion = Prelude.Nothing,
+        packageId = pPackageId_,
+        packageVersion = pPackageVersion_,
+        patchVersion = pPatchVersion_
+      }
+
+-- | An owner account.
+deregisterPackageVersion_ownerAccount :: Lens.Lens' DeregisterPackageVersion (Prelude.Maybe Prelude.Text)
+deregisterPackageVersion_ownerAccount = Lens.lens (\DeregisterPackageVersion' {ownerAccount} -> ownerAccount) (\s@DeregisterPackageVersion' {} a -> s {ownerAccount = a} :: DeregisterPackageVersion)
+
+-- | If the version was marked latest, the new version to maker as latest.
+deregisterPackageVersion_updatedLatestPatchVersion :: Lens.Lens' DeregisterPackageVersion (Prelude.Maybe Prelude.Text)
+deregisterPackageVersion_updatedLatestPatchVersion = Lens.lens (\DeregisterPackageVersion' {updatedLatestPatchVersion} -> updatedLatestPatchVersion) (\s@DeregisterPackageVersion' {} a -> s {updatedLatestPatchVersion = a} :: DeregisterPackageVersion)
+
+-- | A package ID.
+deregisterPackageVersion_packageId :: Lens.Lens' DeregisterPackageVersion Prelude.Text
+deregisterPackageVersion_packageId = Lens.lens (\DeregisterPackageVersion' {packageId} -> packageId) (\s@DeregisterPackageVersion' {} a -> s {packageId = a} :: DeregisterPackageVersion)
+
+-- | A package version.
+deregisterPackageVersion_packageVersion :: Lens.Lens' DeregisterPackageVersion Prelude.Text
+deregisterPackageVersion_packageVersion = Lens.lens (\DeregisterPackageVersion' {packageVersion} -> packageVersion) (\s@DeregisterPackageVersion' {} a -> s {packageVersion = a} :: DeregisterPackageVersion)
+
+-- | A patch version.
+deregisterPackageVersion_patchVersion :: Lens.Lens' DeregisterPackageVersion Prelude.Text
+deregisterPackageVersion_patchVersion = Lens.lens (\DeregisterPackageVersion' {patchVersion} -> patchVersion) (\s@DeregisterPackageVersion' {} a -> s {patchVersion = a} :: DeregisterPackageVersion)
+
+instance Core.AWSRequest DeregisterPackageVersion where
+  type
+    AWSResponse DeregisterPackageVersion =
+      DeregisterPackageVersionResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeregisterPackageVersionResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeregisterPackageVersion where
+  hashWithSalt _salt DeregisterPackageVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` ownerAccount
+      `Prelude.hashWithSalt` updatedLatestPatchVersion
+      `Prelude.hashWithSalt` packageId
+      `Prelude.hashWithSalt` packageVersion
+      `Prelude.hashWithSalt` patchVersion
+
+instance Prelude.NFData DeregisterPackageVersion where
+  rnf DeregisterPackageVersion' {..} =
+    Prelude.rnf ownerAccount
+      `Prelude.seq` Prelude.rnf updatedLatestPatchVersion
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf patchVersion
+
+instance Data.ToHeaders DeregisterPackageVersion where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeregisterPackageVersion where
+  toPath DeregisterPackageVersion' {..} =
+    Prelude.mconcat
+      [ "/packages/",
+        Data.toBS packageId,
+        "/versions/",
+        Data.toBS packageVersion,
+        "/patch/",
+        Data.toBS patchVersion
+      ]
+
+instance Data.ToQuery DeregisterPackageVersion where
+  toQuery DeregisterPackageVersion' {..} =
+    Prelude.mconcat
+      [ "OwnerAccount" Data.=: ownerAccount,
+        "UpdatedLatestPatchVersion"
+          Data.=: updatedLatestPatchVersion
+      ]
+
+-- | /See:/ 'newDeregisterPackageVersionResponse' smart constructor.
+data DeregisterPackageVersionResponse = DeregisterPackageVersionResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeregisterPackageVersionResponse' 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', 'deregisterPackageVersionResponse_httpStatus' - The response's http status code.
+newDeregisterPackageVersionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeregisterPackageVersionResponse
+newDeregisterPackageVersionResponse pHttpStatus_ =
+  DeregisterPackageVersionResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deregisterPackageVersionResponse_httpStatus :: Lens.Lens' DeregisterPackageVersionResponse Prelude.Int
+deregisterPackageVersionResponse_httpStatus = Lens.lens (\DeregisterPackageVersionResponse' {httpStatus} -> httpStatus) (\s@DeregisterPackageVersionResponse' {} a -> s {httpStatus = a} :: DeregisterPackageVersionResponse)
+
+instance
+  Prelude.NFData
+    DeregisterPackageVersionResponse
+  where
+  rnf DeregisterPackageVersionResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/DescribeApplicationInstance.hs b/gen/Amazonka/Panorama/DescribeApplicationInstance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DescribeApplicationInstance.hs
@@ -0,0 +1,343 @@
+{-# 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.Panorama.DescribeApplicationInstance
+-- 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 an application instance on a device.
+module Amazonka.Panorama.DescribeApplicationInstance
+  ( -- * Creating a Request
+    DescribeApplicationInstance (..),
+    newDescribeApplicationInstance,
+
+    -- * Request Lenses
+    describeApplicationInstance_applicationInstanceId,
+
+    -- * Destructuring the Response
+    DescribeApplicationInstanceResponse (..),
+    newDescribeApplicationInstanceResponse,
+
+    -- * Response Lenses
+    describeApplicationInstanceResponse_applicationInstanceId,
+    describeApplicationInstanceResponse_applicationInstanceIdToReplace,
+    describeApplicationInstanceResponse_arn,
+    describeApplicationInstanceResponse_createdTime,
+    describeApplicationInstanceResponse_defaultRuntimeContextDevice,
+    describeApplicationInstanceResponse_defaultRuntimeContextDeviceName,
+    describeApplicationInstanceResponse_description,
+    describeApplicationInstanceResponse_healthStatus,
+    describeApplicationInstanceResponse_lastUpdatedTime,
+    describeApplicationInstanceResponse_name,
+    describeApplicationInstanceResponse_runtimeContextStates,
+    describeApplicationInstanceResponse_runtimeRoleArn,
+    describeApplicationInstanceResponse_status,
+    describeApplicationInstanceResponse_statusDescription,
+    describeApplicationInstanceResponse_tags,
+    describeApplicationInstanceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeApplicationInstance' smart constructor.
+data DescribeApplicationInstance = DescribeApplicationInstance'
+  { -- | The application instance\'s ID.
+    applicationInstanceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeApplicationInstance' 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:
+--
+-- 'applicationInstanceId', 'describeApplicationInstance_applicationInstanceId' - The application instance\'s ID.
+newDescribeApplicationInstance ::
+  -- | 'applicationInstanceId'
+  Prelude.Text ->
+  DescribeApplicationInstance
+newDescribeApplicationInstance
+  pApplicationInstanceId_ =
+    DescribeApplicationInstance'
+      { applicationInstanceId =
+          pApplicationInstanceId_
+      }
+
+-- | The application instance\'s ID.
+describeApplicationInstance_applicationInstanceId :: Lens.Lens' DescribeApplicationInstance Prelude.Text
+describeApplicationInstance_applicationInstanceId = Lens.lens (\DescribeApplicationInstance' {applicationInstanceId} -> applicationInstanceId) (\s@DescribeApplicationInstance' {} a -> s {applicationInstanceId = a} :: DescribeApplicationInstance)
+
+instance Core.AWSRequest DescribeApplicationInstance where
+  type
+    AWSResponse DescribeApplicationInstance =
+      DescribeApplicationInstanceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeApplicationInstanceResponse'
+            Prelude.<$> (x Data..?> "ApplicationInstanceId")
+            Prelude.<*> (x Data..?> "ApplicationInstanceIdToReplace")
+            Prelude.<*> (x Data..?> "Arn")
+            Prelude.<*> (x Data..?> "CreatedTime")
+            Prelude.<*> (x Data..?> "DefaultRuntimeContextDevice")
+            Prelude.<*> (x Data..?> "DefaultRuntimeContextDeviceName")
+            Prelude.<*> (x Data..?> "Description")
+            Prelude.<*> (x Data..?> "HealthStatus")
+            Prelude.<*> (x Data..?> "LastUpdatedTime")
+            Prelude.<*> (x Data..?> "Name")
+            Prelude.<*> ( x
+                            Data..?> "RuntimeContextStates"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "RuntimeRoleArn")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (x Data..?> "StatusDescription")
+            Prelude.<*> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeApplicationInstance where
+  hashWithSalt _salt DescribeApplicationInstance' {..} =
+    _salt `Prelude.hashWithSalt` applicationInstanceId
+
+instance Prelude.NFData DescribeApplicationInstance where
+  rnf DescribeApplicationInstance' {..} =
+    Prelude.rnf applicationInstanceId
+
+instance Data.ToHeaders DescribeApplicationInstance where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeApplicationInstance where
+  toPath DescribeApplicationInstance' {..} =
+    Prelude.mconcat
+      [ "/application-instances/",
+        Data.toBS applicationInstanceId
+      ]
+
+instance Data.ToQuery DescribeApplicationInstance where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeApplicationInstanceResponse' smart constructor.
+data DescribeApplicationInstanceResponse = DescribeApplicationInstanceResponse'
+  { -- | The application instance\'s ID.
+    applicationInstanceId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the application instance that this instance replaced.
+    applicationInstanceIdToReplace :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | When the application instance was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | The device\'s ID.
+    defaultRuntimeContextDevice :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s bane.
+    defaultRuntimeContextDeviceName :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s health status.
+    healthStatus :: Prelude.Maybe ApplicationInstanceHealthStatus,
+    -- | The application instance was updated.
+    lastUpdatedTime :: Prelude.Maybe Data.POSIX,
+    -- | The application instance\'s name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s state.
+    runtimeContextStates :: Prelude.Maybe [ReportedRuntimeContextState],
+    -- | The application instance\'s runtime role ARN.
+    runtimeRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s status.
+    status :: Prelude.Maybe ApplicationInstanceStatus,
+    -- | The application instance\'s status description.
+    statusDescription :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s tags.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeApplicationInstanceResponse' 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:
+--
+-- 'applicationInstanceId', 'describeApplicationInstanceResponse_applicationInstanceId' - The application instance\'s ID.
+--
+-- 'applicationInstanceIdToReplace', 'describeApplicationInstanceResponse_applicationInstanceIdToReplace' - The ID of the application instance that this instance replaced.
+--
+-- 'arn', 'describeApplicationInstanceResponse_arn' - The application instance\'s ARN.
+--
+-- 'createdTime', 'describeApplicationInstanceResponse_createdTime' - When the application instance was created.
+--
+-- 'defaultRuntimeContextDevice', 'describeApplicationInstanceResponse_defaultRuntimeContextDevice' - The device\'s ID.
+--
+-- 'defaultRuntimeContextDeviceName', 'describeApplicationInstanceResponse_defaultRuntimeContextDeviceName' - The device\'s bane.
+--
+-- 'description', 'describeApplicationInstanceResponse_description' - The application instance\'s description.
+--
+-- 'healthStatus', 'describeApplicationInstanceResponse_healthStatus' - The application instance\'s health status.
+--
+-- 'lastUpdatedTime', 'describeApplicationInstanceResponse_lastUpdatedTime' - The application instance was updated.
+--
+-- 'name', 'describeApplicationInstanceResponse_name' - The application instance\'s name.
+--
+-- 'runtimeContextStates', 'describeApplicationInstanceResponse_runtimeContextStates' - The application instance\'s state.
+--
+-- 'runtimeRoleArn', 'describeApplicationInstanceResponse_runtimeRoleArn' - The application instance\'s runtime role ARN.
+--
+-- 'status', 'describeApplicationInstanceResponse_status' - The application instance\'s status.
+--
+-- 'statusDescription', 'describeApplicationInstanceResponse_statusDescription' - The application instance\'s status description.
+--
+-- 'tags', 'describeApplicationInstanceResponse_tags' - The application instance\'s tags.
+--
+-- 'httpStatus', 'describeApplicationInstanceResponse_httpStatus' - The response's http status code.
+newDescribeApplicationInstanceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeApplicationInstanceResponse
+newDescribeApplicationInstanceResponse pHttpStatus_ =
+  DescribeApplicationInstanceResponse'
+    { applicationInstanceId =
+        Prelude.Nothing,
+      applicationInstanceIdToReplace =
+        Prelude.Nothing,
+      arn = Prelude.Nothing,
+      createdTime = Prelude.Nothing,
+      defaultRuntimeContextDevice =
+        Prelude.Nothing,
+      defaultRuntimeContextDeviceName =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      healthStatus = Prelude.Nothing,
+      lastUpdatedTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      runtimeContextStates = Prelude.Nothing,
+      runtimeRoleArn = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusDescription = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The application instance\'s ID.
+describeApplicationInstanceResponse_applicationInstanceId :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceResponse_applicationInstanceId = Lens.lens (\DescribeApplicationInstanceResponse' {applicationInstanceId} -> applicationInstanceId) (\s@DescribeApplicationInstanceResponse' {} a -> s {applicationInstanceId = a} :: DescribeApplicationInstanceResponse)
+
+-- | The ID of the application instance that this instance replaced.
+describeApplicationInstanceResponse_applicationInstanceIdToReplace :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceResponse_applicationInstanceIdToReplace = Lens.lens (\DescribeApplicationInstanceResponse' {applicationInstanceIdToReplace} -> applicationInstanceIdToReplace) (\s@DescribeApplicationInstanceResponse' {} a -> s {applicationInstanceIdToReplace = a} :: DescribeApplicationInstanceResponse)
+
+-- | The application instance\'s ARN.
+describeApplicationInstanceResponse_arn :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceResponse_arn = Lens.lens (\DescribeApplicationInstanceResponse' {arn} -> arn) (\s@DescribeApplicationInstanceResponse' {} a -> s {arn = a} :: DescribeApplicationInstanceResponse)
+
+-- | When the application instance was created.
+describeApplicationInstanceResponse_createdTime :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.UTCTime)
+describeApplicationInstanceResponse_createdTime = Lens.lens (\DescribeApplicationInstanceResponse' {createdTime} -> createdTime) (\s@DescribeApplicationInstanceResponse' {} a -> s {createdTime = a} :: DescribeApplicationInstanceResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The device\'s ID.
+describeApplicationInstanceResponse_defaultRuntimeContextDevice :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceResponse_defaultRuntimeContextDevice = Lens.lens (\DescribeApplicationInstanceResponse' {defaultRuntimeContextDevice} -> defaultRuntimeContextDevice) (\s@DescribeApplicationInstanceResponse' {} a -> s {defaultRuntimeContextDevice = a} :: DescribeApplicationInstanceResponse)
+
+-- | The device\'s bane.
+describeApplicationInstanceResponse_defaultRuntimeContextDeviceName :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceResponse_defaultRuntimeContextDeviceName = Lens.lens (\DescribeApplicationInstanceResponse' {defaultRuntimeContextDeviceName} -> defaultRuntimeContextDeviceName) (\s@DescribeApplicationInstanceResponse' {} a -> s {defaultRuntimeContextDeviceName = a} :: DescribeApplicationInstanceResponse)
+
+-- | The application instance\'s description.
+describeApplicationInstanceResponse_description :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceResponse_description = Lens.lens (\DescribeApplicationInstanceResponse' {description} -> description) (\s@DescribeApplicationInstanceResponse' {} a -> s {description = a} :: DescribeApplicationInstanceResponse)
+
+-- | The application instance\'s health status.
+describeApplicationInstanceResponse_healthStatus :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe ApplicationInstanceHealthStatus)
+describeApplicationInstanceResponse_healthStatus = Lens.lens (\DescribeApplicationInstanceResponse' {healthStatus} -> healthStatus) (\s@DescribeApplicationInstanceResponse' {} a -> s {healthStatus = a} :: DescribeApplicationInstanceResponse)
+
+-- | The application instance was updated.
+describeApplicationInstanceResponse_lastUpdatedTime :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.UTCTime)
+describeApplicationInstanceResponse_lastUpdatedTime = Lens.lens (\DescribeApplicationInstanceResponse' {lastUpdatedTime} -> lastUpdatedTime) (\s@DescribeApplicationInstanceResponse' {} a -> s {lastUpdatedTime = a} :: DescribeApplicationInstanceResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The application instance\'s name.
+describeApplicationInstanceResponse_name :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceResponse_name = Lens.lens (\DescribeApplicationInstanceResponse' {name} -> name) (\s@DescribeApplicationInstanceResponse' {} a -> s {name = a} :: DescribeApplicationInstanceResponse)
+
+-- | The application instance\'s state.
+describeApplicationInstanceResponse_runtimeContextStates :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe [ReportedRuntimeContextState])
+describeApplicationInstanceResponse_runtimeContextStates = Lens.lens (\DescribeApplicationInstanceResponse' {runtimeContextStates} -> runtimeContextStates) (\s@DescribeApplicationInstanceResponse' {} a -> s {runtimeContextStates = a} :: DescribeApplicationInstanceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The application instance\'s runtime role ARN.
+describeApplicationInstanceResponse_runtimeRoleArn :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceResponse_runtimeRoleArn = Lens.lens (\DescribeApplicationInstanceResponse' {runtimeRoleArn} -> runtimeRoleArn) (\s@DescribeApplicationInstanceResponse' {} a -> s {runtimeRoleArn = a} :: DescribeApplicationInstanceResponse)
+
+-- | The application instance\'s status.
+describeApplicationInstanceResponse_status :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe ApplicationInstanceStatus)
+describeApplicationInstanceResponse_status = Lens.lens (\DescribeApplicationInstanceResponse' {status} -> status) (\s@DescribeApplicationInstanceResponse' {} a -> s {status = a} :: DescribeApplicationInstanceResponse)
+
+-- | The application instance\'s status description.
+describeApplicationInstanceResponse_statusDescription :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceResponse_statusDescription = Lens.lens (\DescribeApplicationInstanceResponse' {statusDescription} -> statusDescription) (\s@DescribeApplicationInstanceResponse' {} a -> s {statusDescription = a} :: DescribeApplicationInstanceResponse)
+
+-- | The application instance\'s tags.
+describeApplicationInstanceResponse_tags :: Lens.Lens' DescribeApplicationInstanceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+describeApplicationInstanceResponse_tags = Lens.lens (\DescribeApplicationInstanceResponse' {tags} -> tags) (\s@DescribeApplicationInstanceResponse' {} a -> s {tags = a} :: DescribeApplicationInstanceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeApplicationInstanceResponse_httpStatus :: Lens.Lens' DescribeApplicationInstanceResponse Prelude.Int
+describeApplicationInstanceResponse_httpStatus = Lens.lens (\DescribeApplicationInstanceResponse' {httpStatus} -> httpStatus) (\s@DescribeApplicationInstanceResponse' {} a -> s {httpStatus = a} :: DescribeApplicationInstanceResponse)
+
+instance
+  Prelude.NFData
+    DescribeApplicationInstanceResponse
+  where
+  rnf DescribeApplicationInstanceResponse' {..} =
+    Prelude.rnf applicationInstanceId
+      `Prelude.seq` Prelude.rnf applicationInstanceIdToReplace
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf defaultRuntimeContextDevice
+      `Prelude.seq` Prelude.rnf defaultRuntimeContextDeviceName
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf healthStatus
+      `Prelude.seq` Prelude.rnf lastUpdatedTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf runtimeContextStates
+      `Prelude.seq` Prelude.rnf runtimeRoleArn
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusDescription
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/DescribeApplicationInstanceDetails.hs b/gen/Amazonka/Panorama/DescribeApplicationInstanceDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DescribeApplicationInstanceDetails.hs
@@ -0,0 +1,280 @@
+{-# 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.Panorama.DescribeApplicationInstanceDetails
+-- 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 an application instance\'s configuration
+-- manifest.
+module Amazonka.Panorama.DescribeApplicationInstanceDetails
+  ( -- * Creating a Request
+    DescribeApplicationInstanceDetails (..),
+    newDescribeApplicationInstanceDetails,
+
+    -- * Request Lenses
+    describeApplicationInstanceDetails_applicationInstanceId,
+
+    -- * Destructuring the Response
+    DescribeApplicationInstanceDetailsResponse (..),
+    newDescribeApplicationInstanceDetailsResponse,
+
+    -- * Response Lenses
+    describeApplicationInstanceDetailsResponse_applicationInstanceId,
+    describeApplicationInstanceDetailsResponse_applicationInstanceIdToReplace,
+    describeApplicationInstanceDetailsResponse_createdTime,
+    describeApplicationInstanceDetailsResponse_defaultRuntimeContextDevice,
+    describeApplicationInstanceDetailsResponse_description,
+    describeApplicationInstanceDetailsResponse_manifestOverridesPayload,
+    describeApplicationInstanceDetailsResponse_manifestPayload,
+    describeApplicationInstanceDetailsResponse_name,
+    describeApplicationInstanceDetailsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeApplicationInstanceDetails' smart constructor.
+data DescribeApplicationInstanceDetails = DescribeApplicationInstanceDetails'
+  { -- | The application instance\'s ID.
+    applicationInstanceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeApplicationInstanceDetails' 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:
+--
+-- 'applicationInstanceId', 'describeApplicationInstanceDetails_applicationInstanceId' - The application instance\'s ID.
+newDescribeApplicationInstanceDetails ::
+  -- | 'applicationInstanceId'
+  Prelude.Text ->
+  DescribeApplicationInstanceDetails
+newDescribeApplicationInstanceDetails
+  pApplicationInstanceId_ =
+    DescribeApplicationInstanceDetails'
+      { applicationInstanceId =
+          pApplicationInstanceId_
+      }
+
+-- | The application instance\'s ID.
+describeApplicationInstanceDetails_applicationInstanceId :: Lens.Lens' DescribeApplicationInstanceDetails Prelude.Text
+describeApplicationInstanceDetails_applicationInstanceId = Lens.lens (\DescribeApplicationInstanceDetails' {applicationInstanceId} -> applicationInstanceId) (\s@DescribeApplicationInstanceDetails' {} a -> s {applicationInstanceId = a} :: DescribeApplicationInstanceDetails)
+
+instance
+  Core.AWSRequest
+    DescribeApplicationInstanceDetails
+  where
+  type
+    AWSResponse DescribeApplicationInstanceDetails =
+      DescribeApplicationInstanceDetailsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeApplicationInstanceDetailsResponse'
+            Prelude.<$> (x Data..?> "ApplicationInstanceId")
+            Prelude.<*> (x Data..?> "ApplicationInstanceIdToReplace")
+            Prelude.<*> (x Data..?> "CreatedTime")
+            Prelude.<*> (x Data..?> "DefaultRuntimeContextDevice")
+            Prelude.<*> (x Data..?> "Description")
+            Prelude.<*> (x Data..?> "ManifestOverridesPayload")
+            Prelude.<*> (x Data..?> "ManifestPayload")
+            Prelude.<*> (x Data..?> "Name")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribeApplicationInstanceDetails
+  where
+  hashWithSalt
+    _salt
+    DescribeApplicationInstanceDetails' {..} =
+      _salt `Prelude.hashWithSalt` applicationInstanceId
+
+instance
+  Prelude.NFData
+    DescribeApplicationInstanceDetails
+  where
+  rnf DescribeApplicationInstanceDetails' {..} =
+    Prelude.rnf applicationInstanceId
+
+instance
+  Data.ToHeaders
+    DescribeApplicationInstanceDetails
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToPath
+    DescribeApplicationInstanceDetails
+  where
+  toPath DescribeApplicationInstanceDetails' {..} =
+    Prelude.mconcat
+      [ "/application-instances/",
+        Data.toBS applicationInstanceId,
+        "/details"
+      ]
+
+instance
+  Data.ToQuery
+    DescribeApplicationInstanceDetails
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeApplicationInstanceDetailsResponse' smart constructor.
+data DescribeApplicationInstanceDetailsResponse = DescribeApplicationInstanceDetailsResponse'
+  { -- | The application instance\'s ID.
+    applicationInstanceId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the application instance that this instance replaced.
+    applicationInstanceIdToReplace :: Prelude.Maybe Prelude.Text,
+    -- | When the application instance was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | The application instance\'s default runtime context device.
+    defaultRuntimeContextDevice :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | Parameter overrides for the configuration manifest.
+    manifestOverridesPayload :: Prelude.Maybe ManifestOverridesPayload,
+    -- | The application instance\'s configuration manifest.
+    manifestPayload :: Prelude.Maybe ManifestPayload,
+    -- | The application instance\'s name.
+    name :: 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 'DescribeApplicationInstanceDetailsResponse' 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:
+--
+-- 'applicationInstanceId', 'describeApplicationInstanceDetailsResponse_applicationInstanceId' - The application instance\'s ID.
+--
+-- 'applicationInstanceIdToReplace', 'describeApplicationInstanceDetailsResponse_applicationInstanceIdToReplace' - The ID of the application instance that this instance replaced.
+--
+-- 'createdTime', 'describeApplicationInstanceDetailsResponse_createdTime' - When the application instance was created.
+--
+-- 'defaultRuntimeContextDevice', 'describeApplicationInstanceDetailsResponse_defaultRuntimeContextDevice' - The application instance\'s default runtime context device.
+--
+-- 'description', 'describeApplicationInstanceDetailsResponse_description' - The application instance\'s description.
+--
+-- 'manifestOverridesPayload', 'describeApplicationInstanceDetailsResponse_manifestOverridesPayload' - Parameter overrides for the configuration manifest.
+--
+-- 'manifestPayload', 'describeApplicationInstanceDetailsResponse_manifestPayload' - The application instance\'s configuration manifest.
+--
+-- 'name', 'describeApplicationInstanceDetailsResponse_name' - The application instance\'s name.
+--
+-- 'httpStatus', 'describeApplicationInstanceDetailsResponse_httpStatus' - The response's http status code.
+newDescribeApplicationInstanceDetailsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeApplicationInstanceDetailsResponse
+newDescribeApplicationInstanceDetailsResponse
+  pHttpStatus_ =
+    DescribeApplicationInstanceDetailsResponse'
+      { applicationInstanceId =
+          Prelude.Nothing,
+        applicationInstanceIdToReplace =
+          Prelude.Nothing,
+        createdTime = Prelude.Nothing,
+        defaultRuntimeContextDevice =
+          Prelude.Nothing,
+        description = Prelude.Nothing,
+        manifestOverridesPayload =
+          Prelude.Nothing,
+        manifestPayload =
+          Prelude.Nothing,
+        name = Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The application instance\'s ID.
+describeApplicationInstanceDetailsResponse_applicationInstanceId :: Lens.Lens' DescribeApplicationInstanceDetailsResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceDetailsResponse_applicationInstanceId = Lens.lens (\DescribeApplicationInstanceDetailsResponse' {applicationInstanceId} -> applicationInstanceId) (\s@DescribeApplicationInstanceDetailsResponse' {} a -> s {applicationInstanceId = a} :: DescribeApplicationInstanceDetailsResponse)
+
+-- | The ID of the application instance that this instance replaced.
+describeApplicationInstanceDetailsResponse_applicationInstanceIdToReplace :: Lens.Lens' DescribeApplicationInstanceDetailsResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceDetailsResponse_applicationInstanceIdToReplace = Lens.lens (\DescribeApplicationInstanceDetailsResponse' {applicationInstanceIdToReplace} -> applicationInstanceIdToReplace) (\s@DescribeApplicationInstanceDetailsResponse' {} a -> s {applicationInstanceIdToReplace = a} :: DescribeApplicationInstanceDetailsResponse)
+
+-- | When the application instance was created.
+describeApplicationInstanceDetailsResponse_createdTime :: Lens.Lens' DescribeApplicationInstanceDetailsResponse (Prelude.Maybe Prelude.UTCTime)
+describeApplicationInstanceDetailsResponse_createdTime = Lens.lens (\DescribeApplicationInstanceDetailsResponse' {createdTime} -> createdTime) (\s@DescribeApplicationInstanceDetailsResponse' {} a -> s {createdTime = a} :: DescribeApplicationInstanceDetailsResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The application instance\'s default runtime context device.
+describeApplicationInstanceDetailsResponse_defaultRuntimeContextDevice :: Lens.Lens' DescribeApplicationInstanceDetailsResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceDetailsResponse_defaultRuntimeContextDevice = Lens.lens (\DescribeApplicationInstanceDetailsResponse' {defaultRuntimeContextDevice} -> defaultRuntimeContextDevice) (\s@DescribeApplicationInstanceDetailsResponse' {} a -> s {defaultRuntimeContextDevice = a} :: DescribeApplicationInstanceDetailsResponse)
+
+-- | The application instance\'s description.
+describeApplicationInstanceDetailsResponse_description :: Lens.Lens' DescribeApplicationInstanceDetailsResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceDetailsResponse_description = Lens.lens (\DescribeApplicationInstanceDetailsResponse' {description} -> description) (\s@DescribeApplicationInstanceDetailsResponse' {} a -> s {description = a} :: DescribeApplicationInstanceDetailsResponse)
+
+-- | Parameter overrides for the configuration manifest.
+describeApplicationInstanceDetailsResponse_manifestOverridesPayload :: Lens.Lens' DescribeApplicationInstanceDetailsResponse (Prelude.Maybe ManifestOverridesPayload)
+describeApplicationInstanceDetailsResponse_manifestOverridesPayload = Lens.lens (\DescribeApplicationInstanceDetailsResponse' {manifestOverridesPayload} -> manifestOverridesPayload) (\s@DescribeApplicationInstanceDetailsResponse' {} a -> s {manifestOverridesPayload = a} :: DescribeApplicationInstanceDetailsResponse)
+
+-- | The application instance\'s configuration manifest.
+describeApplicationInstanceDetailsResponse_manifestPayload :: Lens.Lens' DescribeApplicationInstanceDetailsResponse (Prelude.Maybe ManifestPayload)
+describeApplicationInstanceDetailsResponse_manifestPayload = Lens.lens (\DescribeApplicationInstanceDetailsResponse' {manifestPayload} -> manifestPayload) (\s@DescribeApplicationInstanceDetailsResponse' {} a -> s {manifestPayload = a} :: DescribeApplicationInstanceDetailsResponse)
+
+-- | The application instance\'s name.
+describeApplicationInstanceDetailsResponse_name :: Lens.Lens' DescribeApplicationInstanceDetailsResponse (Prelude.Maybe Prelude.Text)
+describeApplicationInstanceDetailsResponse_name = Lens.lens (\DescribeApplicationInstanceDetailsResponse' {name} -> name) (\s@DescribeApplicationInstanceDetailsResponse' {} a -> s {name = a} :: DescribeApplicationInstanceDetailsResponse)
+
+-- | The response's http status code.
+describeApplicationInstanceDetailsResponse_httpStatus :: Lens.Lens' DescribeApplicationInstanceDetailsResponse Prelude.Int
+describeApplicationInstanceDetailsResponse_httpStatus = Lens.lens (\DescribeApplicationInstanceDetailsResponse' {httpStatus} -> httpStatus) (\s@DescribeApplicationInstanceDetailsResponse' {} a -> s {httpStatus = a} :: DescribeApplicationInstanceDetailsResponse)
+
+instance
+  Prelude.NFData
+    DescribeApplicationInstanceDetailsResponse
+  where
+  rnf DescribeApplicationInstanceDetailsResponse' {..} =
+    Prelude.rnf applicationInstanceId
+      `Prelude.seq` Prelude.rnf applicationInstanceIdToReplace
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf defaultRuntimeContextDevice
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf manifestOverridesPayload
+      `Prelude.seq` Prelude.rnf manifestPayload
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/DescribeDevice.hs b/gen/Amazonka/Panorama/DescribeDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DescribeDevice.hs
@@ -0,0 +1,395 @@
+{-# 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.Panorama.DescribeDevice
+-- 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 a device.
+module Amazonka.Panorama.DescribeDevice
+  ( -- * Creating a Request
+    DescribeDevice (..),
+    newDescribeDevice,
+
+    -- * Request Lenses
+    describeDevice_deviceId,
+
+    -- * Destructuring the Response
+    DescribeDeviceResponse (..),
+    newDescribeDeviceResponse,
+
+    -- * Response Lenses
+    describeDeviceResponse_alternateSoftwares,
+    describeDeviceResponse_arn,
+    describeDeviceResponse_brand,
+    describeDeviceResponse_createdTime,
+    describeDeviceResponse_currentNetworkingStatus,
+    describeDeviceResponse_currentSoftware,
+    describeDeviceResponse_description,
+    describeDeviceResponse_deviceAggregatedStatus,
+    describeDeviceResponse_deviceConnectionStatus,
+    describeDeviceResponse_deviceId,
+    describeDeviceResponse_latestAlternateSoftware,
+    describeDeviceResponse_latestDeviceJob,
+    describeDeviceResponse_latestSoftware,
+    describeDeviceResponse_leaseExpirationTime,
+    describeDeviceResponse_name,
+    describeDeviceResponse_networkingConfiguration,
+    describeDeviceResponse_provisioningStatus,
+    describeDeviceResponse_serialNumber,
+    describeDeviceResponse_tags,
+    describeDeviceResponse_type,
+    describeDeviceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeDevice' smart constructor.
+data DescribeDevice = DescribeDevice'
+  { -- | The device\'s ID.
+    deviceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDevice' 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:
+--
+-- 'deviceId', 'describeDevice_deviceId' - The device\'s ID.
+newDescribeDevice ::
+  -- | 'deviceId'
+  Prelude.Text ->
+  DescribeDevice
+newDescribeDevice pDeviceId_ =
+  DescribeDevice' {deviceId = pDeviceId_}
+
+-- | The device\'s ID.
+describeDevice_deviceId :: Lens.Lens' DescribeDevice Prelude.Text
+describeDevice_deviceId = Lens.lens (\DescribeDevice' {deviceId} -> deviceId) (\s@DescribeDevice' {} a -> s {deviceId = a} :: DescribeDevice)
+
+instance Core.AWSRequest DescribeDevice where
+  type
+    AWSResponse DescribeDevice =
+      DescribeDeviceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDeviceResponse'
+            Prelude.<$> ( x
+                            Data..?> "AlternateSoftwares"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "Arn")
+            Prelude.<*> (x Data..?> "Brand")
+            Prelude.<*> (x Data..?> "CreatedTime")
+            Prelude.<*> (x Data..?> "CurrentNetworkingStatus")
+            Prelude.<*> (x Data..?> "CurrentSoftware")
+            Prelude.<*> (x Data..?> "Description")
+            Prelude.<*> (x Data..?> "DeviceAggregatedStatus")
+            Prelude.<*> (x Data..?> "DeviceConnectionStatus")
+            Prelude.<*> (x Data..?> "DeviceId")
+            Prelude.<*> (x Data..?> "LatestAlternateSoftware")
+            Prelude.<*> (x Data..?> "LatestDeviceJob")
+            Prelude.<*> (x Data..?> "LatestSoftware")
+            Prelude.<*> (x Data..?> "LeaseExpirationTime")
+            Prelude.<*> (x Data..?> "Name")
+            Prelude.<*> (x Data..?> "NetworkingConfiguration")
+            Prelude.<*> (x Data..?> "ProvisioningStatus")
+            Prelude.<*> (x Data..?> "SerialNumber")
+            Prelude.<*> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "Type")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDevice where
+  hashWithSalt _salt DescribeDevice' {..} =
+    _salt `Prelude.hashWithSalt` deviceId
+
+instance Prelude.NFData DescribeDevice where
+  rnf DescribeDevice' {..} = Prelude.rnf deviceId
+
+instance Data.ToHeaders DescribeDevice where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeDevice where
+  toPath DescribeDevice' {..} =
+    Prelude.mconcat ["/devices/", Data.toBS deviceId]
+
+instance Data.ToQuery DescribeDevice where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDeviceResponse' smart constructor.
+data DescribeDeviceResponse = DescribeDeviceResponse'
+  { -- | Beta software releases available for the device.
+    alternateSoftwares :: Prelude.Maybe [AlternateSoftwareMetadata],
+    -- | The device\'s ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s maker.
+    brand :: Prelude.Maybe DeviceBrand,
+    -- | When the device was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | The device\'s networking status.
+    currentNetworkingStatus :: Prelude.Maybe NetworkStatus,
+    -- | The device\'s current software version.
+    currentSoftware :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | A device\'s aggregated status. Including the device\'s connection
+    -- status, provisioning status, and lease status.
+    deviceAggregatedStatus :: Prelude.Maybe DeviceAggregatedStatus,
+    -- | The device\'s connection status.
+    deviceConnectionStatus :: Prelude.Maybe DeviceConnectionStatus,
+    -- | The device\'s ID.
+    deviceId :: Prelude.Maybe Prelude.Text,
+    -- | The most recent beta software release.
+    latestAlternateSoftware :: Prelude.Maybe Prelude.Text,
+    -- | A device\'s latest job. Includes the target image version, and the job
+    -- status.
+    latestDeviceJob :: Prelude.Maybe LatestDeviceJob,
+    -- | The latest software version available for the device.
+    latestSoftware :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s lease expiration time.
+    leaseExpirationTime :: Prelude.Maybe Data.POSIX,
+    -- | The device\'s name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s networking configuration.
+    networkingConfiguration :: Prelude.Maybe NetworkPayload,
+    -- | The device\'s provisioning status.
+    provisioningStatus :: Prelude.Maybe DeviceStatus,
+    -- | The device\'s serial number.
+    serialNumber :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s tags.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The device\'s type.
+    type' :: Prelude.Maybe DeviceType,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDeviceResponse' 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:
+--
+-- 'alternateSoftwares', 'describeDeviceResponse_alternateSoftwares' - Beta software releases available for the device.
+--
+-- 'arn', 'describeDeviceResponse_arn' - The device\'s ARN.
+--
+-- 'brand', 'describeDeviceResponse_brand' - The device\'s maker.
+--
+-- 'createdTime', 'describeDeviceResponse_createdTime' - When the device was created.
+--
+-- 'currentNetworkingStatus', 'describeDeviceResponse_currentNetworkingStatus' - The device\'s networking status.
+--
+-- 'currentSoftware', 'describeDeviceResponse_currentSoftware' - The device\'s current software version.
+--
+-- 'description', 'describeDeviceResponse_description' - The device\'s description.
+--
+-- 'deviceAggregatedStatus', 'describeDeviceResponse_deviceAggregatedStatus' - A device\'s aggregated status. Including the device\'s connection
+-- status, provisioning status, and lease status.
+--
+-- 'deviceConnectionStatus', 'describeDeviceResponse_deviceConnectionStatus' - The device\'s connection status.
+--
+-- 'deviceId', 'describeDeviceResponse_deviceId' - The device\'s ID.
+--
+-- 'latestAlternateSoftware', 'describeDeviceResponse_latestAlternateSoftware' - The most recent beta software release.
+--
+-- 'latestDeviceJob', 'describeDeviceResponse_latestDeviceJob' - A device\'s latest job. Includes the target image version, and the job
+-- status.
+--
+-- 'latestSoftware', 'describeDeviceResponse_latestSoftware' - The latest software version available for the device.
+--
+-- 'leaseExpirationTime', 'describeDeviceResponse_leaseExpirationTime' - The device\'s lease expiration time.
+--
+-- 'name', 'describeDeviceResponse_name' - The device\'s name.
+--
+-- 'networkingConfiguration', 'describeDeviceResponse_networkingConfiguration' - The device\'s networking configuration.
+--
+-- 'provisioningStatus', 'describeDeviceResponse_provisioningStatus' - The device\'s provisioning status.
+--
+-- 'serialNumber', 'describeDeviceResponse_serialNumber' - The device\'s serial number.
+--
+-- 'tags', 'describeDeviceResponse_tags' - The device\'s tags.
+--
+-- 'type'', 'describeDeviceResponse_type' - The device\'s type.
+--
+-- 'httpStatus', 'describeDeviceResponse_httpStatus' - The response's http status code.
+newDescribeDeviceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDeviceResponse
+newDescribeDeviceResponse pHttpStatus_ =
+  DescribeDeviceResponse'
+    { alternateSoftwares =
+        Prelude.Nothing,
+      arn = Prelude.Nothing,
+      brand = Prelude.Nothing,
+      createdTime = Prelude.Nothing,
+      currentNetworkingStatus = Prelude.Nothing,
+      currentSoftware = Prelude.Nothing,
+      description = Prelude.Nothing,
+      deviceAggregatedStatus = Prelude.Nothing,
+      deviceConnectionStatus = Prelude.Nothing,
+      deviceId = Prelude.Nothing,
+      latestAlternateSoftware = Prelude.Nothing,
+      latestDeviceJob = Prelude.Nothing,
+      latestSoftware = Prelude.Nothing,
+      leaseExpirationTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      networkingConfiguration = Prelude.Nothing,
+      provisioningStatus = Prelude.Nothing,
+      serialNumber = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Beta software releases available for the device.
+describeDeviceResponse_alternateSoftwares :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe [AlternateSoftwareMetadata])
+describeDeviceResponse_alternateSoftwares = Lens.lens (\DescribeDeviceResponse' {alternateSoftwares} -> alternateSoftwares) (\s@DescribeDeviceResponse' {} a -> s {alternateSoftwares = a} :: DescribeDeviceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The device\'s ARN.
+describeDeviceResponse_arn :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.Text)
+describeDeviceResponse_arn = Lens.lens (\DescribeDeviceResponse' {arn} -> arn) (\s@DescribeDeviceResponse' {} a -> s {arn = a} :: DescribeDeviceResponse)
+
+-- | The device\'s maker.
+describeDeviceResponse_brand :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe DeviceBrand)
+describeDeviceResponse_brand = Lens.lens (\DescribeDeviceResponse' {brand} -> brand) (\s@DescribeDeviceResponse' {} a -> s {brand = a} :: DescribeDeviceResponse)
+
+-- | When the device was created.
+describeDeviceResponse_createdTime :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.UTCTime)
+describeDeviceResponse_createdTime = Lens.lens (\DescribeDeviceResponse' {createdTime} -> createdTime) (\s@DescribeDeviceResponse' {} a -> s {createdTime = a} :: DescribeDeviceResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The device\'s networking status.
+describeDeviceResponse_currentNetworkingStatus :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe NetworkStatus)
+describeDeviceResponse_currentNetworkingStatus = Lens.lens (\DescribeDeviceResponse' {currentNetworkingStatus} -> currentNetworkingStatus) (\s@DescribeDeviceResponse' {} a -> s {currentNetworkingStatus = a} :: DescribeDeviceResponse)
+
+-- | The device\'s current software version.
+describeDeviceResponse_currentSoftware :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.Text)
+describeDeviceResponse_currentSoftware = Lens.lens (\DescribeDeviceResponse' {currentSoftware} -> currentSoftware) (\s@DescribeDeviceResponse' {} a -> s {currentSoftware = a} :: DescribeDeviceResponse)
+
+-- | The device\'s description.
+describeDeviceResponse_description :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.Text)
+describeDeviceResponse_description = Lens.lens (\DescribeDeviceResponse' {description} -> description) (\s@DescribeDeviceResponse' {} a -> s {description = a} :: DescribeDeviceResponse)
+
+-- | A device\'s aggregated status. Including the device\'s connection
+-- status, provisioning status, and lease status.
+describeDeviceResponse_deviceAggregatedStatus :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe DeviceAggregatedStatus)
+describeDeviceResponse_deviceAggregatedStatus = Lens.lens (\DescribeDeviceResponse' {deviceAggregatedStatus} -> deviceAggregatedStatus) (\s@DescribeDeviceResponse' {} a -> s {deviceAggregatedStatus = a} :: DescribeDeviceResponse)
+
+-- | The device\'s connection status.
+describeDeviceResponse_deviceConnectionStatus :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe DeviceConnectionStatus)
+describeDeviceResponse_deviceConnectionStatus = Lens.lens (\DescribeDeviceResponse' {deviceConnectionStatus} -> deviceConnectionStatus) (\s@DescribeDeviceResponse' {} a -> s {deviceConnectionStatus = a} :: DescribeDeviceResponse)
+
+-- | The device\'s ID.
+describeDeviceResponse_deviceId :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.Text)
+describeDeviceResponse_deviceId = Lens.lens (\DescribeDeviceResponse' {deviceId} -> deviceId) (\s@DescribeDeviceResponse' {} a -> s {deviceId = a} :: DescribeDeviceResponse)
+
+-- | The most recent beta software release.
+describeDeviceResponse_latestAlternateSoftware :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.Text)
+describeDeviceResponse_latestAlternateSoftware = Lens.lens (\DescribeDeviceResponse' {latestAlternateSoftware} -> latestAlternateSoftware) (\s@DescribeDeviceResponse' {} a -> s {latestAlternateSoftware = a} :: DescribeDeviceResponse)
+
+-- | A device\'s latest job. Includes the target image version, and the job
+-- status.
+describeDeviceResponse_latestDeviceJob :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe LatestDeviceJob)
+describeDeviceResponse_latestDeviceJob = Lens.lens (\DescribeDeviceResponse' {latestDeviceJob} -> latestDeviceJob) (\s@DescribeDeviceResponse' {} a -> s {latestDeviceJob = a} :: DescribeDeviceResponse)
+
+-- | The latest software version available for the device.
+describeDeviceResponse_latestSoftware :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.Text)
+describeDeviceResponse_latestSoftware = Lens.lens (\DescribeDeviceResponse' {latestSoftware} -> latestSoftware) (\s@DescribeDeviceResponse' {} a -> s {latestSoftware = a} :: DescribeDeviceResponse)
+
+-- | The device\'s lease expiration time.
+describeDeviceResponse_leaseExpirationTime :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.UTCTime)
+describeDeviceResponse_leaseExpirationTime = Lens.lens (\DescribeDeviceResponse' {leaseExpirationTime} -> leaseExpirationTime) (\s@DescribeDeviceResponse' {} a -> s {leaseExpirationTime = a} :: DescribeDeviceResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The device\'s name.
+describeDeviceResponse_name :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.Text)
+describeDeviceResponse_name = Lens.lens (\DescribeDeviceResponse' {name} -> name) (\s@DescribeDeviceResponse' {} a -> s {name = a} :: DescribeDeviceResponse)
+
+-- | The device\'s networking configuration.
+describeDeviceResponse_networkingConfiguration :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe NetworkPayload)
+describeDeviceResponse_networkingConfiguration = Lens.lens (\DescribeDeviceResponse' {networkingConfiguration} -> networkingConfiguration) (\s@DescribeDeviceResponse' {} a -> s {networkingConfiguration = a} :: DescribeDeviceResponse)
+
+-- | The device\'s provisioning status.
+describeDeviceResponse_provisioningStatus :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe DeviceStatus)
+describeDeviceResponse_provisioningStatus = Lens.lens (\DescribeDeviceResponse' {provisioningStatus} -> provisioningStatus) (\s@DescribeDeviceResponse' {} a -> s {provisioningStatus = a} :: DescribeDeviceResponse)
+
+-- | The device\'s serial number.
+describeDeviceResponse_serialNumber :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe Prelude.Text)
+describeDeviceResponse_serialNumber = Lens.lens (\DescribeDeviceResponse' {serialNumber} -> serialNumber) (\s@DescribeDeviceResponse' {} a -> s {serialNumber = a} :: DescribeDeviceResponse)
+
+-- | The device\'s tags.
+describeDeviceResponse_tags :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+describeDeviceResponse_tags = Lens.lens (\DescribeDeviceResponse' {tags} -> tags) (\s@DescribeDeviceResponse' {} a -> s {tags = a} :: DescribeDeviceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The device\'s type.
+describeDeviceResponse_type :: Lens.Lens' DescribeDeviceResponse (Prelude.Maybe DeviceType)
+describeDeviceResponse_type = Lens.lens (\DescribeDeviceResponse' {type'} -> type') (\s@DescribeDeviceResponse' {} a -> s {type' = a} :: DescribeDeviceResponse)
+
+-- | The response's http status code.
+describeDeviceResponse_httpStatus :: Lens.Lens' DescribeDeviceResponse Prelude.Int
+describeDeviceResponse_httpStatus = Lens.lens (\DescribeDeviceResponse' {httpStatus} -> httpStatus) (\s@DescribeDeviceResponse' {} a -> s {httpStatus = a} :: DescribeDeviceResponse)
+
+instance Prelude.NFData DescribeDeviceResponse where
+  rnf DescribeDeviceResponse' {..} =
+    Prelude.rnf alternateSoftwares
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf brand
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf currentNetworkingStatus
+      `Prelude.seq` Prelude.rnf currentSoftware
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf deviceAggregatedStatus
+      `Prelude.seq` Prelude.rnf deviceConnectionStatus
+      `Prelude.seq` Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf latestAlternateSoftware
+      `Prelude.seq` Prelude.rnf latestDeviceJob
+      `Prelude.seq` Prelude.rnf latestSoftware
+      `Prelude.seq` Prelude.rnf leaseExpirationTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf networkingConfiguration
+      `Prelude.seq` Prelude.rnf provisioningStatus
+      `Prelude.seq` Prelude.rnf serialNumber
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/DescribeDeviceJob.hs b/gen/Amazonka/Panorama/DescribeDeviceJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DescribeDeviceJob.hs
@@ -0,0 +1,254 @@
+{-# 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.Panorama.DescribeDeviceJob
+-- 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 a device job.
+module Amazonka.Panorama.DescribeDeviceJob
+  ( -- * Creating a Request
+    DescribeDeviceJob (..),
+    newDescribeDeviceJob,
+
+    -- * Request Lenses
+    describeDeviceJob_jobId,
+
+    -- * Destructuring the Response
+    DescribeDeviceJobResponse (..),
+    newDescribeDeviceJobResponse,
+
+    -- * Response Lenses
+    describeDeviceJobResponse_createdTime,
+    describeDeviceJobResponse_deviceArn,
+    describeDeviceJobResponse_deviceId,
+    describeDeviceJobResponse_deviceName,
+    describeDeviceJobResponse_deviceType,
+    describeDeviceJobResponse_imageVersion,
+    describeDeviceJobResponse_jobId,
+    describeDeviceJobResponse_jobType,
+    describeDeviceJobResponse_status,
+    describeDeviceJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeDeviceJob' smart constructor.
+data DescribeDeviceJob = DescribeDeviceJob'
+  { -- | The job\'s ID.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDeviceJob' 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:
+--
+-- 'jobId', 'describeDeviceJob_jobId' - The job\'s ID.
+newDescribeDeviceJob ::
+  -- | 'jobId'
+  Prelude.Text ->
+  DescribeDeviceJob
+newDescribeDeviceJob pJobId_ =
+  DescribeDeviceJob' {jobId = pJobId_}
+
+-- | The job\'s ID.
+describeDeviceJob_jobId :: Lens.Lens' DescribeDeviceJob Prelude.Text
+describeDeviceJob_jobId = Lens.lens (\DescribeDeviceJob' {jobId} -> jobId) (\s@DescribeDeviceJob' {} a -> s {jobId = a} :: DescribeDeviceJob)
+
+instance Core.AWSRequest DescribeDeviceJob where
+  type
+    AWSResponse DescribeDeviceJob =
+      DescribeDeviceJobResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDeviceJobResponse'
+            Prelude.<$> (x Data..?> "CreatedTime")
+            Prelude.<*> (x Data..?> "DeviceArn")
+            Prelude.<*> (x Data..?> "DeviceId")
+            Prelude.<*> (x Data..?> "DeviceName")
+            Prelude.<*> (x Data..?> "DeviceType")
+            Prelude.<*> (x Data..?> "ImageVersion")
+            Prelude.<*> (x Data..?> "JobId")
+            Prelude.<*> (x Data..?> "JobType")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDeviceJob where
+  hashWithSalt _salt DescribeDeviceJob' {..} =
+    _salt `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData DescribeDeviceJob where
+  rnf DescribeDeviceJob' {..} = Prelude.rnf jobId
+
+instance Data.ToHeaders DescribeDeviceJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeDeviceJob where
+  toPath DescribeDeviceJob' {..} =
+    Prelude.mconcat ["/jobs/", Data.toBS jobId]
+
+instance Data.ToQuery DescribeDeviceJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDeviceJobResponse' smart constructor.
+data DescribeDeviceJobResponse = DescribeDeviceJobResponse'
+  { -- | When the job was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | The device\'s ARN.
+    deviceArn :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s ID.
+    deviceId :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s name.
+    deviceName :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s type.
+    deviceType :: Prelude.Maybe DeviceType,
+    -- | For an OTA job, the target version of the device software.
+    imageVersion :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s ID.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s type.
+    jobType :: Prelude.Maybe JobType,
+    -- | The job\'s status.
+    status :: Prelude.Maybe UpdateProgress,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDeviceJobResponse' 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:
+--
+-- 'createdTime', 'describeDeviceJobResponse_createdTime' - When the job was created.
+--
+-- 'deviceArn', 'describeDeviceJobResponse_deviceArn' - The device\'s ARN.
+--
+-- 'deviceId', 'describeDeviceJobResponse_deviceId' - The device\'s ID.
+--
+-- 'deviceName', 'describeDeviceJobResponse_deviceName' - The device\'s name.
+--
+-- 'deviceType', 'describeDeviceJobResponse_deviceType' - The device\'s type.
+--
+-- 'imageVersion', 'describeDeviceJobResponse_imageVersion' - For an OTA job, the target version of the device software.
+--
+-- 'jobId', 'describeDeviceJobResponse_jobId' - The job\'s ID.
+--
+-- 'jobType', 'describeDeviceJobResponse_jobType' - The job\'s type.
+--
+-- 'status', 'describeDeviceJobResponse_status' - The job\'s status.
+--
+-- 'httpStatus', 'describeDeviceJobResponse_httpStatus' - The response's http status code.
+newDescribeDeviceJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDeviceJobResponse
+newDescribeDeviceJobResponse pHttpStatus_ =
+  DescribeDeviceJobResponse'
+    { createdTime =
+        Prelude.Nothing,
+      deviceArn = Prelude.Nothing,
+      deviceId = Prelude.Nothing,
+      deviceName = Prelude.Nothing,
+      deviceType = Prelude.Nothing,
+      imageVersion = Prelude.Nothing,
+      jobId = Prelude.Nothing,
+      jobType = Prelude.Nothing,
+      status = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | When the job was created.
+describeDeviceJobResponse_createdTime :: Lens.Lens' DescribeDeviceJobResponse (Prelude.Maybe Prelude.UTCTime)
+describeDeviceJobResponse_createdTime = Lens.lens (\DescribeDeviceJobResponse' {createdTime} -> createdTime) (\s@DescribeDeviceJobResponse' {} a -> s {createdTime = a} :: DescribeDeviceJobResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The device\'s ARN.
+describeDeviceJobResponse_deviceArn :: Lens.Lens' DescribeDeviceJobResponse (Prelude.Maybe Prelude.Text)
+describeDeviceJobResponse_deviceArn = Lens.lens (\DescribeDeviceJobResponse' {deviceArn} -> deviceArn) (\s@DescribeDeviceJobResponse' {} a -> s {deviceArn = a} :: DescribeDeviceJobResponse)
+
+-- | The device\'s ID.
+describeDeviceJobResponse_deviceId :: Lens.Lens' DescribeDeviceJobResponse (Prelude.Maybe Prelude.Text)
+describeDeviceJobResponse_deviceId = Lens.lens (\DescribeDeviceJobResponse' {deviceId} -> deviceId) (\s@DescribeDeviceJobResponse' {} a -> s {deviceId = a} :: DescribeDeviceJobResponse)
+
+-- | The device\'s name.
+describeDeviceJobResponse_deviceName :: Lens.Lens' DescribeDeviceJobResponse (Prelude.Maybe Prelude.Text)
+describeDeviceJobResponse_deviceName = Lens.lens (\DescribeDeviceJobResponse' {deviceName} -> deviceName) (\s@DescribeDeviceJobResponse' {} a -> s {deviceName = a} :: DescribeDeviceJobResponse)
+
+-- | The device\'s type.
+describeDeviceJobResponse_deviceType :: Lens.Lens' DescribeDeviceJobResponse (Prelude.Maybe DeviceType)
+describeDeviceJobResponse_deviceType = Lens.lens (\DescribeDeviceJobResponse' {deviceType} -> deviceType) (\s@DescribeDeviceJobResponse' {} a -> s {deviceType = a} :: DescribeDeviceJobResponse)
+
+-- | For an OTA job, the target version of the device software.
+describeDeviceJobResponse_imageVersion :: Lens.Lens' DescribeDeviceJobResponse (Prelude.Maybe Prelude.Text)
+describeDeviceJobResponse_imageVersion = Lens.lens (\DescribeDeviceJobResponse' {imageVersion} -> imageVersion) (\s@DescribeDeviceJobResponse' {} a -> s {imageVersion = a} :: DescribeDeviceJobResponse)
+
+-- | The job\'s ID.
+describeDeviceJobResponse_jobId :: Lens.Lens' DescribeDeviceJobResponse (Prelude.Maybe Prelude.Text)
+describeDeviceJobResponse_jobId = Lens.lens (\DescribeDeviceJobResponse' {jobId} -> jobId) (\s@DescribeDeviceJobResponse' {} a -> s {jobId = a} :: DescribeDeviceJobResponse)
+
+-- | The job\'s type.
+describeDeviceJobResponse_jobType :: Lens.Lens' DescribeDeviceJobResponse (Prelude.Maybe JobType)
+describeDeviceJobResponse_jobType = Lens.lens (\DescribeDeviceJobResponse' {jobType} -> jobType) (\s@DescribeDeviceJobResponse' {} a -> s {jobType = a} :: DescribeDeviceJobResponse)
+
+-- | The job\'s status.
+describeDeviceJobResponse_status :: Lens.Lens' DescribeDeviceJobResponse (Prelude.Maybe UpdateProgress)
+describeDeviceJobResponse_status = Lens.lens (\DescribeDeviceJobResponse' {status} -> status) (\s@DescribeDeviceJobResponse' {} a -> s {status = a} :: DescribeDeviceJobResponse)
+
+-- | The response's http status code.
+describeDeviceJobResponse_httpStatus :: Lens.Lens' DescribeDeviceJobResponse Prelude.Int
+describeDeviceJobResponse_httpStatus = Lens.lens (\DescribeDeviceJobResponse' {httpStatus} -> httpStatus) (\s@DescribeDeviceJobResponse' {} a -> s {httpStatus = a} :: DescribeDeviceJobResponse)
+
+instance Prelude.NFData DescribeDeviceJobResponse where
+  rnf DescribeDeviceJobResponse' {..} =
+    Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf deviceArn
+      `Prelude.seq` Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf deviceName
+      `Prelude.seq` Prelude.rnf deviceType
+      `Prelude.seq` Prelude.rnf imageVersion
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobType
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/DescribeNode.hs b/gen/Amazonka/Panorama/DescribeNode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DescribeNode.hs
@@ -0,0 +1,367 @@
+{-# 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.Panorama.DescribeNode
+-- 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 a node.
+module Amazonka.Panorama.DescribeNode
+  ( -- * Creating a Request
+    DescribeNode (..),
+    newDescribeNode,
+
+    -- * Request Lenses
+    describeNode_ownerAccount,
+    describeNode_nodeId,
+
+    -- * Destructuring the Response
+    DescribeNodeResponse (..),
+    newDescribeNodeResponse,
+
+    -- * Response Lenses
+    describeNodeResponse_assetName,
+    describeNodeResponse_packageArn,
+    describeNodeResponse_httpStatus,
+    describeNodeResponse_category,
+    describeNodeResponse_createdTime,
+    describeNodeResponse_description,
+    describeNodeResponse_lastUpdatedTime,
+    describeNodeResponse_name,
+    describeNodeResponse_nodeId,
+    describeNodeResponse_nodeInterface,
+    describeNodeResponse_ownerAccount,
+    describeNodeResponse_packageId,
+    describeNodeResponse_packageName,
+    describeNodeResponse_packageVersion,
+    describeNodeResponse_patchVersion,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeNode' smart constructor.
+data DescribeNode = DescribeNode'
+  { -- | The account ID of the node\'s owner.
+    ownerAccount :: Prelude.Maybe Prelude.Text,
+    -- | The node\'s ID.
+    nodeId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeNode' 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:
+--
+-- 'ownerAccount', 'describeNode_ownerAccount' - The account ID of the node\'s owner.
+--
+-- 'nodeId', 'describeNode_nodeId' - The node\'s ID.
+newDescribeNode ::
+  -- | 'nodeId'
+  Prelude.Text ->
+  DescribeNode
+newDescribeNode pNodeId_ =
+  DescribeNode'
+    { ownerAccount = Prelude.Nothing,
+      nodeId = pNodeId_
+    }
+
+-- | The account ID of the node\'s owner.
+describeNode_ownerAccount :: Lens.Lens' DescribeNode (Prelude.Maybe Prelude.Text)
+describeNode_ownerAccount = Lens.lens (\DescribeNode' {ownerAccount} -> ownerAccount) (\s@DescribeNode' {} a -> s {ownerAccount = a} :: DescribeNode)
+
+-- | The node\'s ID.
+describeNode_nodeId :: Lens.Lens' DescribeNode Prelude.Text
+describeNode_nodeId = Lens.lens (\DescribeNode' {nodeId} -> nodeId) (\s@DescribeNode' {} a -> s {nodeId = a} :: DescribeNode)
+
+instance Core.AWSRequest DescribeNode where
+  type AWSResponse DescribeNode = DescribeNodeResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeNodeResponse'
+            Prelude.<$> (x Data..?> "AssetName")
+            Prelude.<*> (x Data..?> "PackageArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "Category")
+            Prelude.<*> (x Data..:> "CreatedTime")
+            Prelude.<*> (x Data..:> "Description")
+            Prelude.<*> (x Data..:> "LastUpdatedTime")
+            Prelude.<*> (x Data..:> "Name")
+            Prelude.<*> (x Data..:> "NodeId")
+            Prelude.<*> (x Data..:> "NodeInterface")
+            Prelude.<*> (x Data..:> "OwnerAccount")
+            Prelude.<*> (x Data..:> "PackageId")
+            Prelude.<*> (x Data..:> "PackageName")
+            Prelude.<*> (x Data..:> "PackageVersion")
+            Prelude.<*> (x Data..:> "PatchVersion")
+      )
+
+instance Prelude.Hashable DescribeNode where
+  hashWithSalt _salt DescribeNode' {..} =
+    _salt
+      `Prelude.hashWithSalt` ownerAccount
+      `Prelude.hashWithSalt` nodeId
+
+instance Prelude.NFData DescribeNode where
+  rnf DescribeNode' {..} =
+    Prelude.rnf ownerAccount
+      `Prelude.seq` Prelude.rnf nodeId
+
+instance Data.ToHeaders DescribeNode where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeNode where
+  toPath DescribeNode' {..} =
+    Prelude.mconcat ["/nodes/", Data.toBS nodeId]
+
+instance Data.ToQuery DescribeNode where
+  toQuery DescribeNode' {..} =
+    Prelude.mconcat
+      ["OwnerAccount" Data.=: ownerAccount]
+
+-- | /See:/ 'newDescribeNodeResponse' smart constructor.
+data DescribeNodeResponse = DescribeNodeResponse'
+  { -- | The node\'s asset name.
+    assetName :: Prelude.Maybe Prelude.Text,
+    -- | The node\'s ARN.
+    packageArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The node\'s category.
+    category :: NodeCategory,
+    -- | When the node was created.
+    createdTime :: Data.POSIX,
+    -- | The node\'s description.
+    description :: Prelude.Text,
+    -- | When the node was updated.
+    lastUpdatedTime :: Data.POSIX,
+    -- | The node\'s name.
+    name :: Prelude.Text,
+    -- | The node\'s ID.
+    nodeId :: Prelude.Text,
+    -- | The node\'s interface.
+    nodeInterface :: NodeInterface,
+    -- | The account ID of the node\'s owner.
+    ownerAccount :: Prelude.Text,
+    -- | The node\'s package ID.
+    packageId :: Prelude.Text,
+    -- | The node\'s package name.
+    packageName :: Prelude.Text,
+    -- | The node\'s package version.
+    packageVersion :: Prelude.Text,
+    -- | The node\'s patch version.
+    patchVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeNodeResponse' 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:
+--
+-- 'assetName', 'describeNodeResponse_assetName' - The node\'s asset name.
+--
+-- 'packageArn', 'describeNodeResponse_packageArn' - The node\'s ARN.
+--
+-- 'httpStatus', 'describeNodeResponse_httpStatus' - The response's http status code.
+--
+-- 'category', 'describeNodeResponse_category' - The node\'s category.
+--
+-- 'createdTime', 'describeNodeResponse_createdTime' - When the node was created.
+--
+-- 'description', 'describeNodeResponse_description' - The node\'s description.
+--
+-- 'lastUpdatedTime', 'describeNodeResponse_lastUpdatedTime' - When the node was updated.
+--
+-- 'name', 'describeNodeResponse_name' - The node\'s name.
+--
+-- 'nodeId', 'describeNodeResponse_nodeId' - The node\'s ID.
+--
+-- 'nodeInterface', 'describeNodeResponse_nodeInterface' - The node\'s interface.
+--
+-- 'ownerAccount', 'describeNodeResponse_ownerAccount' - The account ID of the node\'s owner.
+--
+-- 'packageId', 'describeNodeResponse_packageId' - The node\'s package ID.
+--
+-- 'packageName', 'describeNodeResponse_packageName' - The node\'s package name.
+--
+-- 'packageVersion', 'describeNodeResponse_packageVersion' - The node\'s package version.
+--
+-- 'patchVersion', 'describeNodeResponse_patchVersion' - The node\'s patch version.
+newDescribeNodeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'category'
+  NodeCategory ->
+  -- | 'createdTime'
+  Prelude.UTCTime ->
+  -- | 'description'
+  Prelude.Text ->
+  -- | 'lastUpdatedTime'
+  Prelude.UTCTime ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'nodeId'
+  Prelude.Text ->
+  -- | 'nodeInterface'
+  NodeInterface ->
+  -- | 'ownerAccount'
+  Prelude.Text ->
+  -- | 'packageId'
+  Prelude.Text ->
+  -- | 'packageName'
+  Prelude.Text ->
+  -- | 'packageVersion'
+  Prelude.Text ->
+  -- | 'patchVersion'
+  Prelude.Text ->
+  DescribeNodeResponse
+newDescribeNodeResponse
+  pHttpStatus_
+  pCategory_
+  pCreatedTime_
+  pDescription_
+  pLastUpdatedTime_
+  pName_
+  pNodeId_
+  pNodeInterface_
+  pOwnerAccount_
+  pPackageId_
+  pPackageName_
+  pPackageVersion_
+  pPatchVersion_ =
+    DescribeNodeResponse'
+      { assetName = Prelude.Nothing,
+        packageArn = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        category = pCategory_,
+        createdTime = Data._Time Lens.# pCreatedTime_,
+        description = pDescription_,
+        lastUpdatedTime =
+          Data._Time Lens.# pLastUpdatedTime_,
+        name = pName_,
+        nodeId = pNodeId_,
+        nodeInterface = pNodeInterface_,
+        ownerAccount = pOwnerAccount_,
+        packageId = pPackageId_,
+        packageName = pPackageName_,
+        packageVersion = pPackageVersion_,
+        patchVersion = pPatchVersion_
+      }
+
+-- | The node\'s asset name.
+describeNodeResponse_assetName :: Lens.Lens' DescribeNodeResponse (Prelude.Maybe Prelude.Text)
+describeNodeResponse_assetName = Lens.lens (\DescribeNodeResponse' {assetName} -> assetName) (\s@DescribeNodeResponse' {} a -> s {assetName = a} :: DescribeNodeResponse)
+
+-- | The node\'s ARN.
+describeNodeResponse_packageArn :: Lens.Lens' DescribeNodeResponse (Prelude.Maybe Prelude.Text)
+describeNodeResponse_packageArn = Lens.lens (\DescribeNodeResponse' {packageArn} -> packageArn) (\s@DescribeNodeResponse' {} a -> s {packageArn = a} :: DescribeNodeResponse)
+
+-- | The response's http status code.
+describeNodeResponse_httpStatus :: Lens.Lens' DescribeNodeResponse Prelude.Int
+describeNodeResponse_httpStatus = Lens.lens (\DescribeNodeResponse' {httpStatus} -> httpStatus) (\s@DescribeNodeResponse' {} a -> s {httpStatus = a} :: DescribeNodeResponse)
+
+-- | The node\'s category.
+describeNodeResponse_category :: Lens.Lens' DescribeNodeResponse NodeCategory
+describeNodeResponse_category = Lens.lens (\DescribeNodeResponse' {category} -> category) (\s@DescribeNodeResponse' {} a -> s {category = a} :: DescribeNodeResponse)
+
+-- | When the node was created.
+describeNodeResponse_createdTime :: Lens.Lens' DescribeNodeResponse Prelude.UTCTime
+describeNodeResponse_createdTime = Lens.lens (\DescribeNodeResponse' {createdTime} -> createdTime) (\s@DescribeNodeResponse' {} a -> s {createdTime = a} :: DescribeNodeResponse) Prelude.. Data._Time
+
+-- | The node\'s description.
+describeNodeResponse_description :: Lens.Lens' DescribeNodeResponse Prelude.Text
+describeNodeResponse_description = Lens.lens (\DescribeNodeResponse' {description} -> description) (\s@DescribeNodeResponse' {} a -> s {description = a} :: DescribeNodeResponse)
+
+-- | When the node was updated.
+describeNodeResponse_lastUpdatedTime :: Lens.Lens' DescribeNodeResponse Prelude.UTCTime
+describeNodeResponse_lastUpdatedTime = Lens.lens (\DescribeNodeResponse' {lastUpdatedTime} -> lastUpdatedTime) (\s@DescribeNodeResponse' {} a -> s {lastUpdatedTime = a} :: DescribeNodeResponse) Prelude.. Data._Time
+
+-- | The node\'s name.
+describeNodeResponse_name :: Lens.Lens' DescribeNodeResponse Prelude.Text
+describeNodeResponse_name = Lens.lens (\DescribeNodeResponse' {name} -> name) (\s@DescribeNodeResponse' {} a -> s {name = a} :: DescribeNodeResponse)
+
+-- | The node\'s ID.
+describeNodeResponse_nodeId :: Lens.Lens' DescribeNodeResponse Prelude.Text
+describeNodeResponse_nodeId = Lens.lens (\DescribeNodeResponse' {nodeId} -> nodeId) (\s@DescribeNodeResponse' {} a -> s {nodeId = a} :: DescribeNodeResponse)
+
+-- | The node\'s interface.
+describeNodeResponse_nodeInterface :: Lens.Lens' DescribeNodeResponse NodeInterface
+describeNodeResponse_nodeInterface = Lens.lens (\DescribeNodeResponse' {nodeInterface} -> nodeInterface) (\s@DescribeNodeResponse' {} a -> s {nodeInterface = a} :: DescribeNodeResponse)
+
+-- | The account ID of the node\'s owner.
+describeNodeResponse_ownerAccount :: Lens.Lens' DescribeNodeResponse Prelude.Text
+describeNodeResponse_ownerAccount = Lens.lens (\DescribeNodeResponse' {ownerAccount} -> ownerAccount) (\s@DescribeNodeResponse' {} a -> s {ownerAccount = a} :: DescribeNodeResponse)
+
+-- | The node\'s package ID.
+describeNodeResponse_packageId :: Lens.Lens' DescribeNodeResponse Prelude.Text
+describeNodeResponse_packageId = Lens.lens (\DescribeNodeResponse' {packageId} -> packageId) (\s@DescribeNodeResponse' {} a -> s {packageId = a} :: DescribeNodeResponse)
+
+-- | The node\'s package name.
+describeNodeResponse_packageName :: Lens.Lens' DescribeNodeResponse Prelude.Text
+describeNodeResponse_packageName = Lens.lens (\DescribeNodeResponse' {packageName} -> packageName) (\s@DescribeNodeResponse' {} a -> s {packageName = a} :: DescribeNodeResponse)
+
+-- | The node\'s package version.
+describeNodeResponse_packageVersion :: Lens.Lens' DescribeNodeResponse Prelude.Text
+describeNodeResponse_packageVersion = Lens.lens (\DescribeNodeResponse' {packageVersion} -> packageVersion) (\s@DescribeNodeResponse' {} a -> s {packageVersion = a} :: DescribeNodeResponse)
+
+-- | The node\'s patch version.
+describeNodeResponse_patchVersion :: Lens.Lens' DescribeNodeResponse Prelude.Text
+describeNodeResponse_patchVersion = Lens.lens (\DescribeNodeResponse' {patchVersion} -> patchVersion) (\s@DescribeNodeResponse' {} a -> s {patchVersion = a} :: DescribeNodeResponse)
+
+instance Prelude.NFData DescribeNodeResponse where
+  rnf DescribeNodeResponse' {..} =
+    Prelude.rnf assetName
+      `Prelude.seq` Prelude.rnf packageArn
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf category
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf lastUpdatedTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf nodeId
+      `Prelude.seq` Prelude.rnf nodeInterface
+      `Prelude.seq` Prelude.rnf ownerAccount
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf patchVersion
diff --git a/gen/Amazonka/Panorama/DescribeNodeFromTemplateJob.hs b/gen/Amazonka/Panorama/DescribeNodeFromTemplateJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DescribeNodeFromTemplateJob.hs
@@ -0,0 +1,330 @@
+{-# 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.Panorama.DescribeNodeFromTemplateJob
+-- 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 a job to create a camera stream node.
+module Amazonka.Panorama.DescribeNodeFromTemplateJob
+  ( -- * Creating a Request
+    DescribeNodeFromTemplateJob (..),
+    newDescribeNodeFromTemplateJob,
+
+    -- * Request Lenses
+    describeNodeFromTemplateJob_jobId,
+
+    -- * Destructuring the Response
+    DescribeNodeFromTemplateJobResponse (..),
+    newDescribeNodeFromTemplateJobResponse,
+
+    -- * Response Lenses
+    describeNodeFromTemplateJobResponse_jobTags,
+    describeNodeFromTemplateJobResponse_nodeDescription,
+    describeNodeFromTemplateJobResponse_httpStatus,
+    describeNodeFromTemplateJobResponse_createdTime,
+    describeNodeFromTemplateJobResponse_jobId,
+    describeNodeFromTemplateJobResponse_lastUpdatedTime,
+    describeNodeFromTemplateJobResponse_nodeName,
+    describeNodeFromTemplateJobResponse_outputPackageName,
+    describeNodeFromTemplateJobResponse_outputPackageVersion,
+    describeNodeFromTemplateJobResponse_status,
+    describeNodeFromTemplateJobResponse_statusMessage,
+    describeNodeFromTemplateJobResponse_templateParameters,
+    describeNodeFromTemplateJobResponse_templateType,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeNodeFromTemplateJob' smart constructor.
+data DescribeNodeFromTemplateJob = DescribeNodeFromTemplateJob'
+  { -- | The job\'s ID.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeNodeFromTemplateJob' 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:
+--
+-- 'jobId', 'describeNodeFromTemplateJob_jobId' - The job\'s ID.
+newDescribeNodeFromTemplateJob ::
+  -- | 'jobId'
+  Prelude.Text ->
+  DescribeNodeFromTemplateJob
+newDescribeNodeFromTemplateJob pJobId_ =
+  DescribeNodeFromTemplateJob' {jobId = pJobId_}
+
+-- | The job\'s ID.
+describeNodeFromTemplateJob_jobId :: Lens.Lens' DescribeNodeFromTemplateJob Prelude.Text
+describeNodeFromTemplateJob_jobId = Lens.lens (\DescribeNodeFromTemplateJob' {jobId} -> jobId) (\s@DescribeNodeFromTemplateJob' {} a -> s {jobId = a} :: DescribeNodeFromTemplateJob)
+
+instance Core.AWSRequest DescribeNodeFromTemplateJob where
+  type
+    AWSResponse DescribeNodeFromTemplateJob =
+      DescribeNodeFromTemplateJobResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeNodeFromTemplateJobResponse'
+            Prelude.<$> (x Data..?> "JobTags" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NodeDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "CreatedTime")
+            Prelude.<*> (x Data..:> "JobId")
+            Prelude.<*> (x Data..:> "LastUpdatedTime")
+            Prelude.<*> (x Data..:> "NodeName")
+            Prelude.<*> (x Data..:> "OutputPackageName")
+            Prelude.<*> (x Data..:> "OutputPackageVersion")
+            Prelude.<*> (x Data..:> "Status")
+            Prelude.<*> (x Data..:> "StatusMessage")
+            Prelude.<*> ( x
+                            Data..?> "TemplateParameters"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:> "TemplateType")
+      )
+
+instance Prelude.Hashable DescribeNodeFromTemplateJob where
+  hashWithSalt _salt DescribeNodeFromTemplateJob' {..} =
+    _salt `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData DescribeNodeFromTemplateJob where
+  rnf DescribeNodeFromTemplateJob' {..} =
+    Prelude.rnf jobId
+
+instance Data.ToHeaders DescribeNodeFromTemplateJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeNodeFromTemplateJob where
+  toPath DescribeNodeFromTemplateJob' {..} =
+    Prelude.mconcat
+      ["/packages/template-job/", Data.toBS jobId]
+
+instance Data.ToQuery DescribeNodeFromTemplateJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeNodeFromTemplateJobResponse' smart constructor.
+data DescribeNodeFromTemplateJobResponse = DescribeNodeFromTemplateJobResponse'
+  { -- | The job\'s tags.
+    jobTags :: Prelude.Maybe [JobResourceTags],
+    -- | The node\'s description.
+    nodeDescription :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | When the job was created.
+    createdTime :: Data.POSIX,
+    -- | The job\'s ID.
+    jobId :: Prelude.Text,
+    -- | When the job was updated.
+    lastUpdatedTime :: Data.POSIX,
+    -- | The node\'s name.
+    nodeName :: Prelude.Text,
+    -- | The job\'s output package name.
+    outputPackageName :: Prelude.Text,
+    -- | The job\'s output package version.
+    outputPackageVersion :: Prelude.Text,
+    -- | The job\'s status.
+    status :: NodeFromTemplateJobStatus,
+    -- | The job\'s status message.
+    statusMessage :: Prelude.Text,
+    -- | The job\'s template parameters.
+    templateParameters :: Prelude.HashMap Prelude.Text (Data.Sensitive Prelude.Text),
+    -- | The job\'s template type.
+    templateType :: TemplateType
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeNodeFromTemplateJobResponse' 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:
+--
+-- 'jobTags', 'describeNodeFromTemplateJobResponse_jobTags' - The job\'s tags.
+--
+-- 'nodeDescription', 'describeNodeFromTemplateJobResponse_nodeDescription' - The node\'s description.
+--
+-- 'httpStatus', 'describeNodeFromTemplateJobResponse_httpStatus' - The response's http status code.
+--
+-- 'createdTime', 'describeNodeFromTemplateJobResponse_createdTime' - When the job was created.
+--
+-- 'jobId', 'describeNodeFromTemplateJobResponse_jobId' - The job\'s ID.
+--
+-- 'lastUpdatedTime', 'describeNodeFromTemplateJobResponse_lastUpdatedTime' - When the job was updated.
+--
+-- 'nodeName', 'describeNodeFromTemplateJobResponse_nodeName' - The node\'s name.
+--
+-- 'outputPackageName', 'describeNodeFromTemplateJobResponse_outputPackageName' - The job\'s output package name.
+--
+-- 'outputPackageVersion', 'describeNodeFromTemplateJobResponse_outputPackageVersion' - The job\'s output package version.
+--
+-- 'status', 'describeNodeFromTemplateJobResponse_status' - The job\'s status.
+--
+-- 'statusMessage', 'describeNodeFromTemplateJobResponse_statusMessage' - The job\'s status message.
+--
+-- 'templateParameters', 'describeNodeFromTemplateJobResponse_templateParameters' - The job\'s template parameters.
+--
+-- 'templateType', 'describeNodeFromTemplateJobResponse_templateType' - The job\'s template type.
+newDescribeNodeFromTemplateJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'createdTime'
+  Prelude.UTCTime ->
+  -- | 'jobId'
+  Prelude.Text ->
+  -- | 'lastUpdatedTime'
+  Prelude.UTCTime ->
+  -- | 'nodeName'
+  Prelude.Text ->
+  -- | 'outputPackageName'
+  Prelude.Text ->
+  -- | 'outputPackageVersion'
+  Prelude.Text ->
+  -- | 'status'
+  NodeFromTemplateJobStatus ->
+  -- | 'statusMessage'
+  Prelude.Text ->
+  -- | 'templateType'
+  TemplateType ->
+  DescribeNodeFromTemplateJobResponse
+newDescribeNodeFromTemplateJobResponse
+  pHttpStatus_
+  pCreatedTime_
+  pJobId_
+  pLastUpdatedTime_
+  pNodeName_
+  pOutputPackageName_
+  pOutputPackageVersion_
+  pStatus_
+  pStatusMessage_
+  pTemplateType_ =
+    DescribeNodeFromTemplateJobResponse'
+      { jobTags =
+          Prelude.Nothing,
+        nodeDescription = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        createdTime =
+          Data._Time Lens.# pCreatedTime_,
+        jobId = pJobId_,
+        lastUpdatedTime =
+          Data._Time Lens.# pLastUpdatedTime_,
+        nodeName = pNodeName_,
+        outputPackageName =
+          pOutputPackageName_,
+        outputPackageVersion =
+          pOutputPackageVersion_,
+        status = pStatus_,
+        statusMessage = pStatusMessage_,
+        templateParameters = Prelude.mempty,
+        templateType = pTemplateType_
+      }
+
+-- | The job\'s tags.
+describeNodeFromTemplateJobResponse_jobTags :: Lens.Lens' DescribeNodeFromTemplateJobResponse (Prelude.Maybe [JobResourceTags])
+describeNodeFromTemplateJobResponse_jobTags = Lens.lens (\DescribeNodeFromTemplateJobResponse' {jobTags} -> jobTags) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {jobTags = a} :: DescribeNodeFromTemplateJobResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The node\'s description.
+describeNodeFromTemplateJobResponse_nodeDescription :: Lens.Lens' DescribeNodeFromTemplateJobResponse (Prelude.Maybe Prelude.Text)
+describeNodeFromTemplateJobResponse_nodeDescription = Lens.lens (\DescribeNodeFromTemplateJobResponse' {nodeDescription} -> nodeDescription) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {nodeDescription = a} :: DescribeNodeFromTemplateJobResponse)
+
+-- | The response's http status code.
+describeNodeFromTemplateJobResponse_httpStatus :: Lens.Lens' DescribeNodeFromTemplateJobResponse Prelude.Int
+describeNodeFromTemplateJobResponse_httpStatus = Lens.lens (\DescribeNodeFromTemplateJobResponse' {httpStatus} -> httpStatus) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {httpStatus = a} :: DescribeNodeFromTemplateJobResponse)
+
+-- | When the job was created.
+describeNodeFromTemplateJobResponse_createdTime :: Lens.Lens' DescribeNodeFromTemplateJobResponse Prelude.UTCTime
+describeNodeFromTemplateJobResponse_createdTime = Lens.lens (\DescribeNodeFromTemplateJobResponse' {createdTime} -> createdTime) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {createdTime = a} :: DescribeNodeFromTemplateJobResponse) Prelude.. Data._Time
+
+-- | The job\'s ID.
+describeNodeFromTemplateJobResponse_jobId :: Lens.Lens' DescribeNodeFromTemplateJobResponse Prelude.Text
+describeNodeFromTemplateJobResponse_jobId = Lens.lens (\DescribeNodeFromTemplateJobResponse' {jobId} -> jobId) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {jobId = a} :: DescribeNodeFromTemplateJobResponse)
+
+-- | When the job was updated.
+describeNodeFromTemplateJobResponse_lastUpdatedTime :: Lens.Lens' DescribeNodeFromTemplateJobResponse Prelude.UTCTime
+describeNodeFromTemplateJobResponse_lastUpdatedTime = Lens.lens (\DescribeNodeFromTemplateJobResponse' {lastUpdatedTime} -> lastUpdatedTime) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {lastUpdatedTime = a} :: DescribeNodeFromTemplateJobResponse) Prelude.. Data._Time
+
+-- | The node\'s name.
+describeNodeFromTemplateJobResponse_nodeName :: Lens.Lens' DescribeNodeFromTemplateJobResponse Prelude.Text
+describeNodeFromTemplateJobResponse_nodeName = Lens.lens (\DescribeNodeFromTemplateJobResponse' {nodeName} -> nodeName) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {nodeName = a} :: DescribeNodeFromTemplateJobResponse)
+
+-- | The job\'s output package name.
+describeNodeFromTemplateJobResponse_outputPackageName :: Lens.Lens' DescribeNodeFromTemplateJobResponse Prelude.Text
+describeNodeFromTemplateJobResponse_outputPackageName = Lens.lens (\DescribeNodeFromTemplateJobResponse' {outputPackageName} -> outputPackageName) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {outputPackageName = a} :: DescribeNodeFromTemplateJobResponse)
+
+-- | The job\'s output package version.
+describeNodeFromTemplateJobResponse_outputPackageVersion :: Lens.Lens' DescribeNodeFromTemplateJobResponse Prelude.Text
+describeNodeFromTemplateJobResponse_outputPackageVersion = Lens.lens (\DescribeNodeFromTemplateJobResponse' {outputPackageVersion} -> outputPackageVersion) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {outputPackageVersion = a} :: DescribeNodeFromTemplateJobResponse)
+
+-- | The job\'s status.
+describeNodeFromTemplateJobResponse_status :: Lens.Lens' DescribeNodeFromTemplateJobResponse NodeFromTemplateJobStatus
+describeNodeFromTemplateJobResponse_status = Lens.lens (\DescribeNodeFromTemplateJobResponse' {status} -> status) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {status = a} :: DescribeNodeFromTemplateJobResponse)
+
+-- | The job\'s status message.
+describeNodeFromTemplateJobResponse_statusMessage :: Lens.Lens' DescribeNodeFromTemplateJobResponse Prelude.Text
+describeNodeFromTemplateJobResponse_statusMessage = Lens.lens (\DescribeNodeFromTemplateJobResponse' {statusMessage} -> statusMessage) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {statusMessage = a} :: DescribeNodeFromTemplateJobResponse)
+
+-- | The job\'s template parameters.
+describeNodeFromTemplateJobResponse_templateParameters :: Lens.Lens' DescribeNodeFromTemplateJobResponse (Prelude.HashMap Prelude.Text Prelude.Text)
+describeNodeFromTemplateJobResponse_templateParameters = Lens.lens (\DescribeNodeFromTemplateJobResponse' {templateParameters} -> templateParameters) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {templateParameters = a} :: DescribeNodeFromTemplateJobResponse) Prelude.. Lens.coerced
+
+-- | The job\'s template type.
+describeNodeFromTemplateJobResponse_templateType :: Lens.Lens' DescribeNodeFromTemplateJobResponse TemplateType
+describeNodeFromTemplateJobResponse_templateType = Lens.lens (\DescribeNodeFromTemplateJobResponse' {templateType} -> templateType) (\s@DescribeNodeFromTemplateJobResponse' {} a -> s {templateType = a} :: DescribeNodeFromTemplateJobResponse)
+
+instance
+  Prelude.NFData
+    DescribeNodeFromTemplateJobResponse
+  where
+  rnf DescribeNodeFromTemplateJobResponse' {..} =
+    Prelude.rnf jobTags
+      `Prelude.seq` Prelude.rnf nodeDescription
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf lastUpdatedTime
+      `Prelude.seq` Prelude.rnf nodeName
+      `Prelude.seq` Prelude.rnf outputPackageName
+      `Prelude.seq` Prelude.rnf outputPackageVersion
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
+      `Prelude.seq` Prelude.rnf templateParameters
+      `Prelude.seq` Prelude.rnf templateType
diff --git a/gen/Amazonka/Panorama/DescribePackage.hs b/gen/Amazonka/Panorama/DescribePackage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DescribePackage.hs
@@ -0,0 +1,265 @@
+{-# 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.Panorama.DescribePackage
+-- 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 a package.
+module Amazonka.Panorama.DescribePackage
+  ( -- * Creating a Request
+    DescribePackage (..),
+    newDescribePackage,
+
+    -- * Request Lenses
+    describePackage_packageId,
+
+    -- * Destructuring the Response
+    DescribePackageResponse (..),
+    newDescribePackageResponse,
+
+    -- * Response Lenses
+    describePackageResponse_readAccessPrincipalArns,
+    describePackageResponse_writeAccessPrincipalArns,
+    describePackageResponse_httpStatus,
+    describePackageResponse_arn,
+    describePackageResponse_createdTime,
+    describePackageResponse_packageId,
+    describePackageResponse_packageName,
+    describePackageResponse_storageLocation,
+    describePackageResponse_tags,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribePackage' smart constructor.
+data DescribePackage = DescribePackage'
+  { -- | The package\'s ID.
+    packageId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePackage' 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', 'describePackage_packageId' - The package\'s ID.
+newDescribePackage ::
+  -- | 'packageId'
+  Prelude.Text ->
+  DescribePackage
+newDescribePackage pPackageId_ =
+  DescribePackage' {packageId = pPackageId_}
+
+-- | The package\'s ID.
+describePackage_packageId :: Lens.Lens' DescribePackage Prelude.Text
+describePackage_packageId = Lens.lens (\DescribePackage' {packageId} -> packageId) (\s@DescribePackage' {} a -> s {packageId = a} :: DescribePackage)
+
+instance Core.AWSRequest DescribePackage where
+  type
+    AWSResponse DescribePackage =
+      DescribePackageResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribePackageResponse'
+            Prelude.<$> ( x
+                            Data..?> "ReadAccessPrincipalArns"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..?> "WriteAccessPrincipalArns"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "Arn")
+            Prelude.<*> (x Data..:> "CreatedTime")
+            Prelude.<*> (x Data..:> "PackageId")
+            Prelude.<*> (x Data..:> "PackageName")
+            Prelude.<*> (x Data..:> "StorageLocation")
+            Prelude.<*> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable DescribePackage where
+  hashWithSalt _salt DescribePackage' {..} =
+    _salt `Prelude.hashWithSalt` packageId
+
+instance Prelude.NFData DescribePackage where
+  rnf DescribePackage' {..} = Prelude.rnf packageId
+
+instance Data.ToHeaders DescribePackage where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribePackage where
+  toPath DescribePackage' {..} =
+    Prelude.mconcat
+      ["/packages/metadata/", Data.toBS packageId]
+
+instance Data.ToQuery DescribePackage where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribePackageResponse' smart constructor.
+data DescribePackageResponse = DescribePackageResponse'
+  { -- | ARNs of accounts that have read access to the package.
+    readAccessPrincipalArns :: Prelude.Maybe [Prelude.Text],
+    -- | ARNs of accounts that have write access to the package.
+    writeAccessPrincipalArns :: Prelude.Maybe [Prelude.Text],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The package\'s ARN.
+    arn :: Prelude.Text,
+    -- | When the package was created.
+    createdTime :: Data.POSIX,
+    -- | The package\'s ID.
+    packageId :: Prelude.Text,
+    -- | The package\'s name.
+    packageName :: Prelude.Text,
+    -- | The package\'s storage location.
+    storageLocation :: StorageLocation,
+    -- | The package\'s tags.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePackageResponse' 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:
+--
+-- 'readAccessPrincipalArns', 'describePackageResponse_readAccessPrincipalArns' - ARNs of accounts that have read access to the package.
+--
+-- 'writeAccessPrincipalArns', 'describePackageResponse_writeAccessPrincipalArns' - ARNs of accounts that have write access to the package.
+--
+-- 'httpStatus', 'describePackageResponse_httpStatus' - The response's http status code.
+--
+-- 'arn', 'describePackageResponse_arn' - The package\'s ARN.
+--
+-- 'createdTime', 'describePackageResponse_createdTime' - When the package was created.
+--
+-- 'packageId', 'describePackageResponse_packageId' - The package\'s ID.
+--
+-- 'packageName', 'describePackageResponse_packageName' - The package\'s name.
+--
+-- 'storageLocation', 'describePackageResponse_storageLocation' - The package\'s storage location.
+--
+-- 'tags', 'describePackageResponse_tags' - The package\'s tags.
+newDescribePackageResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'createdTime'
+  Prelude.UTCTime ->
+  -- | 'packageId'
+  Prelude.Text ->
+  -- | 'packageName'
+  Prelude.Text ->
+  -- | 'storageLocation'
+  StorageLocation ->
+  DescribePackageResponse
+newDescribePackageResponse
+  pHttpStatus_
+  pArn_
+  pCreatedTime_
+  pPackageId_
+  pPackageName_
+  pStorageLocation_ =
+    DescribePackageResponse'
+      { readAccessPrincipalArns =
+          Prelude.Nothing,
+        writeAccessPrincipalArns = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        arn = pArn_,
+        createdTime = Data._Time Lens.# pCreatedTime_,
+        packageId = pPackageId_,
+        packageName = pPackageName_,
+        storageLocation = pStorageLocation_,
+        tags = Prelude.mempty
+      }
+
+-- | ARNs of accounts that have read access to the package.
+describePackageResponse_readAccessPrincipalArns :: Lens.Lens' DescribePackageResponse (Prelude.Maybe [Prelude.Text])
+describePackageResponse_readAccessPrincipalArns = Lens.lens (\DescribePackageResponse' {readAccessPrincipalArns} -> readAccessPrincipalArns) (\s@DescribePackageResponse' {} a -> s {readAccessPrincipalArns = a} :: DescribePackageResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | ARNs of accounts that have write access to the package.
+describePackageResponse_writeAccessPrincipalArns :: Lens.Lens' DescribePackageResponse (Prelude.Maybe [Prelude.Text])
+describePackageResponse_writeAccessPrincipalArns = Lens.lens (\DescribePackageResponse' {writeAccessPrincipalArns} -> writeAccessPrincipalArns) (\s@DescribePackageResponse' {} a -> s {writeAccessPrincipalArns = a} :: DescribePackageResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describePackageResponse_httpStatus :: Lens.Lens' DescribePackageResponse Prelude.Int
+describePackageResponse_httpStatus = Lens.lens (\DescribePackageResponse' {httpStatus} -> httpStatus) (\s@DescribePackageResponse' {} a -> s {httpStatus = a} :: DescribePackageResponse)
+
+-- | The package\'s ARN.
+describePackageResponse_arn :: Lens.Lens' DescribePackageResponse Prelude.Text
+describePackageResponse_arn = Lens.lens (\DescribePackageResponse' {arn} -> arn) (\s@DescribePackageResponse' {} a -> s {arn = a} :: DescribePackageResponse)
+
+-- | When the package was created.
+describePackageResponse_createdTime :: Lens.Lens' DescribePackageResponse Prelude.UTCTime
+describePackageResponse_createdTime = Lens.lens (\DescribePackageResponse' {createdTime} -> createdTime) (\s@DescribePackageResponse' {} a -> s {createdTime = a} :: DescribePackageResponse) Prelude.. Data._Time
+
+-- | The package\'s ID.
+describePackageResponse_packageId :: Lens.Lens' DescribePackageResponse Prelude.Text
+describePackageResponse_packageId = Lens.lens (\DescribePackageResponse' {packageId} -> packageId) (\s@DescribePackageResponse' {} a -> s {packageId = a} :: DescribePackageResponse)
+
+-- | The package\'s name.
+describePackageResponse_packageName :: Lens.Lens' DescribePackageResponse Prelude.Text
+describePackageResponse_packageName = Lens.lens (\DescribePackageResponse' {packageName} -> packageName) (\s@DescribePackageResponse' {} a -> s {packageName = a} :: DescribePackageResponse)
+
+-- | The package\'s storage location.
+describePackageResponse_storageLocation :: Lens.Lens' DescribePackageResponse StorageLocation
+describePackageResponse_storageLocation = Lens.lens (\DescribePackageResponse' {storageLocation} -> storageLocation) (\s@DescribePackageResponse' {} a -> s {storageLocation = a} :: DescribePackageResponse)
+
+-- | The package\'s tags.
+describePackageResponse_tags :: Lens.Lens' DescribePackageResponse (Prelude.HashMap Prelude.Text Prelude.Text)
+describePackageResponse_tags = Lens.lens (\DescribePackageResponse' {tags} -> tags) (\s@DescribePackageResponse' {} a -> s {tags = a} :: DescribePackageResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData DescribePackageResponse where
+  rnf DescribePackageResponse' {..} =
+    Prelude.rnf readAccessPrincipalArns
+      `Prelude.seq` Prelude.rnf writeAccessPrincipalArns
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf storageLocation
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/Panorama/DescribePackageImportJob.hs b/gen/Amazonka/Panorama/DescribePackageImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DescribePackageImportJob.hs
@@ -0,0 +1,312 @@
+{-# 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.Panorama.DescribePackageImportJob
+-- 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 a package import job.
+module Amazonka.Panorama.DescribePackageImportJob
+  ( -- * Creating a Request
+    DescribePackageImportJob (..),
+    newDescribePackageImportJob,
+
+    -- * Request Lenses
+    describePackageImportJob_jobId,
+
+    -- * Destructuring the Response
+    DescribePackageImportJobResponse (..),
+    newDescribePackageImportJobResponse,
+
+    -- * Response Lenses
+    describePackageImportJobResponse_clientToken,
+    describePackageImportJobResponse_jobTags,
+    describePackageImportJobResponse_httpStatus,
+    describePackageImportJobResponse_createdTime,
+    describePackageImportJobResponse_inputConfig,
+    describePackageImportJobResponse_jobId,
+    describePackageImportJobResponse_jobType,
+    describePackageImportJobResponse_lastUpdatedTime,
+    describePackageImportJobResponse_output,
+    describePackageImportJobResponse_outputConfig,
+    describePackageImportJobResponse_status,
+    describePackageImportJobResponse_statusMessage,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribePackageImportJob' smart constructor.
+data DescribePackageImportJob = DescribePackageImportJob'
+  { -- | The job\'s ID.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePackageImportJob' 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:
+--
+-- 'jobId', 'describePackageImportJob_jobId' - The job\'s ID.
+newDescribePackageImportJob ::
+  -- | 'jobId'
+  Prelude.Text ->
+  DescribePackageImportJob
+newDescribePackageImportJob pJobId_ =
+  DescribePackageImportJob' {jobId = pJobId_}
+
+-- | The job\'s ID.
+describePackageImportJob_jobId :: Lens.Lens' DescribePackageImportJob Prelude.Text
+describePackageImportJob_jobId = Lens.lens (\DescribePackageImportJob' {jobId} -> jobId) (\s@DescribePackageImportJob' {} a -> s {jobId = a} :: DescribePackageImportJob)
+
+instance Core.AWSRequest DescribePackageImportJob where
+  type
+    AWSResponse DescribePackageImportJob =
+      DescribePackageImportJobResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribePackageImportJobResponse'
+            Prelude.<$> (x Data..?> "ClientToken")
+            Prelude.<*> (x Data..?> "JobTags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "CreatedTime")
+            Prelude.<*> (x Data..:> "InputConfig")
+            Prelude.<*> (x Data..:> "JobId")
+            Prelude.<*> (x Data..:> "JobType")
+            Prelude.<*> (x Data..:> "LastUpdatedTime")
+            Prelude.<*> (x Data..:> "Output")
+            Prelude.<*> (x Data..:> "OutputConfig")
+            Prelude.<*> (x Data..:> "Status")
+            Prelude.<*> (x Data..:> "StatusMessage")
+      )
+
+instance Prelude.Hashable DescribePackageImportJob where
+  hashWithSalt _salt DescribePackageImportJob' {..} =
+    _salt `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData DescribePackageImportJob where
+  rnf DescribePackageImportJob' {..} = Prelude.rnf jobId
+
+instance Data.ToHeaders DescribePackageImportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribePackageImportJob where
+  toPath DescribePackageImportJob' {..} =
+    Prelude.mconcat
+      ["/packages/import-jobs/", Data.toBS jobId]
+
+instance Data.ToQuery DescribePackageImportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribePackageImportJobResponse' smart constructor.
+data DescribePackageImportJobResponse = DescribePackageImportJobResponse'
+  { -- | The job\'s client token.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s tags.
+    jobTags :: Prelude.Maybe [JobResourceTags],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | When the job was created.
+    createdTime :: Data.POSIX,
+    -- | The job\'s input config.
+    inputConfig :: PackageImportJobInputConfig,
+    -- | The job\'s ID.
+    jobId :: Prelude.Text,
+    -- | The job\'s type.
+    jobType :: PackageImportJobType,
+    -- | When the job was updated.
+    lastUpdatedTime :: Data.POSIX,
+    -- | The job\'s output.
+    output :: PackageImportJobOutput,
+    -- | The job\'s output config.
+    outputConfig :: PackageImportJobOutputConfig,
+    -- | The job\'s status.
+    status :: PackageImportJobStatus,
+    -- | The job\'s status message.
+    statusMessage :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePackageImportJobResponse' 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', 'describePackageImportJobResponse_clientToken' - The job\'s client token.
+--
+-- 'jobTags', 'describePackageImportJobResponse_jobTags' - The job\'s tags.
+--
+-- 'httpStatus', 'describePackageImportJobResponse_httpStatus' - The response's http status code.
+--
+-- 'createdTime', 'describePackageImportJobResponse_createdTime' - When the job was created.
+--
+-- 'inputConfig', 'describePackageImportJobResponse_inputConfig' - The job\'s input config.
+--
+-- 'jobId', 'describePackageImportJobResponse_jobId' - The job\'s ID.
+--
+-- 'jobType', 'describePackageImportJobResponse_jobType' - The job\'s type.
+--
+-- 'lastUpdatedTime', 'describePackageImportJobResponse_lastUpdatedTime' - When the job was updated.
+--
+-- 'output', 'describePackageImportJobResponse_output' - The job\'s output.
+--
+-- 'outputConfig', 'describePackageImportJobResponse_outputConfig' - The job\'s output config.
+--
+-- 'status', 'describePackageImportJobResponse_status' - The job\'s status.
+--
+-- 'statusMessage', 'describePackageImportJobResponse_statusMessage' - The job\'s status message.
+newDescribePackageImportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'createdTime'
+  Prelude.UTCTime ->
+  -- | 'inputConfig'
+  PackageImportJobInputConfig ->
+  -- | 'jobId'
+  Prelude.Text ->
+  -- | 'jobType'
+  PackageImportJobType ->
+  -- | 'lastUpdatedTime'
+  Prelude.UTCTime ->
+  -- | 'output'
+  PackageImportJobOutput ->
+  -- | 'outputConfig'
+  PackageImportJobOutputConfig ->
+  -- | 'status'
+  PackageImportJobStatus ->
+  -- | 'statusMessage'
+  Prelude.Text ->
+  DescribePackageImportJobResponse
+newDescribePackageImportJobResponse
+  pHttpStatus_
+  pCreatedTime_
+  pInputConfig_
+  pJobId_
+  pJobType_
+  pLastUpdatedTime_
+  pOutput_
+  pOutputConfig_
+  pStatus_
+  pStatusMessage_ =
+    DescribePackageImportJobResponse'
+      { clientToken =
+          Prelude.Nothing,
+        jobTags = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        createdTime =
+          Data._Time Lens.# pCreatedTime_,
+        inputConfig = pInputConfig_,
+        jobId = pJobId_,
+        jobType = pJobType_,
+        lastUpdatedTime =
+          Data._Time Lens.# pLastUpdatedTime_,
+        output = pOutput_,
+        outputConfig = pOutputConfig_,
+        status = pStatus_,
+        statusMessage = pStatusMessage_
+      }
+
+-- | The job\'s client token.
+describePackageImportJobResponse_clientToken :: Lens.Lens' DescribePackageImportJobResponse (Prelude.Maybe Prelude.Text)
+describePackageImportJobResponse_clientToken = Lens.lens (\DescribePackageImportJobResponse' {clientToken} -> clientToken) (\s@DescribePackageImportJobResponse' {} a -> s {clientToken = a} :: DescribePackageImportJobResponse)
+
+-- | The job\'s tags.
+describePackageImportJobResponse_jobTags :: Lens.Lens' DescribePackageImportJobResponse (Prelude.Maybe [JobResourceTags])
+describePackageImportJobResponse_jobTags = Lens.lens (\DescribePackageImportJobResponse' {jobTags} -> jobTags) (\s@DescribePackageImportJobResponse' {} a -> s {jobTags = a} :: DescribePackageImportJobResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describePackageImportJobResponse_httpStatus :: Lens.Lens' DescribePackageImportJobResponse Prelude.Int
+describePackageImportJobResponse_httpStatus = Lens.lens (\DescribePackageImportJobResponse' {httpStatus} -> httpStatus) (\s@DescribePackageImportJobResponse' {} a -> s {httpStatus = a} :: DescribePackageImportJobResponse)
+
+-- | When the job was created.
+describePackageImportJobResponse_createdTime :: Lens.Lens' DescribePackageImportJobResponse Prelude.UTCTime
+describePackageImportJobResponse_createdTime = Lens.lens (\DescribePackageImportJobResponse' {createdTime} -> createdTime) (\s@DescribePackageImportJobResponse' {} a -> s {createdTime = a} :: DescribePackageImportJobResponse) Prelude.. Data._Time
+
+-- | The job\'s input config.
+describePackageImportJobResponse_inputConfig :: Lens.Lens' DescribePackageImportJobResponse PackageImportJobInputConfig
+describePackageImportJobResponse_inputConfig = Lens.lens (\DescribePackageImportJobResponse' {inputConfig} -> inputConfig) (\s@DescribePackageImportJobResponse' {} a -> s {inputConfig = a} :: DescribePackageImportJobResponse)
+
+-- | The job\'s ID.
+describePackageImportJobResponse_jobId :: Lens.Lens' DescribePackageImportJobResponse Prelude.Text
+describePackageImportJobResponse_jobId = Lens.lens (\DescribePackageImportJobResponse' {jobId} -> jobId) (\s@DescribePackageImportJobResponse' {} a -> s {jobId = a} :: DescribePackageImportJobResponse)
+
+-- | The job\'s type.
+describePackageImportJobResponse_jobType :: Lens.Lens' DescribePackageImportJobResponse PackageImportJobType
+describePackageImportJobResponse_jobType = Lens.lens (\DescribePackageImportJobResponse' {jobType} -> jobType) (\s@DescribePackageImportJobResponse' {} a -> s {jobType = a} :: DescribePackageImportJobResponse)
+
+-- | When the job was updated.
+describePackageImportJobResponse_lastUpdatedTime :: Lens.Lens' DescribePackageImportJobResponse Prelude.UTCTime
+describePackageImportJobResponse_lastUpdatedTime = Lens.lens (\DescribePackageImportJobResponse' {lastUpdatedTime} -> lastUpdatedTime) (\s@DescribePackageImportJobResponse' {} a -> s {lastUpdatedTime = a} :: DescribePackageImportJobResponse) Prelude.. Data._Time
+
+-- | The job\'s output.
+describePackageImportJobResponse_output :: Lens.Lens' DescribePackageImportJobResponse PackageImportJobOutput
+describePackageImportJobResponse_output = Lens.lens (\DescribePackageImportJobResponse' {output} -> output) (\s@DescribePackageImportJobResponse' {} a -> s {output = a} :: DescribePackageImportJobResponse)
+
+-- | The job\'s output config.
+describePackageImportJobResponse_outputConfig :: Lens.Lens' DescribePackageImportJobResponse PackageImportJobOutputConfig
+describePackageImportJobResponse_outputConfig = Lens.lens (\DescribePackageImportJobResponse' {outputConfig} -> outputConfig) (\s@DescribePackageImportJobResponse' {} a -> s {outputConfig = a} :: DescribePackageImportJobResponse)
+
+-- | The job\'s status.
+describePackageImportJobResponse_status :: Lens.Lens' DescribePackageImportJobResponse PackageImportJobStatus
+describePackageImportJobResponse_status = Lens.lens (\DescribePackageImportJobResponse' {status} -> status) (\s@DescribePackageImportJobResponse' {} a -> s {status = a} :: DescribePackageImportJobResponse)
+
+-- | The job\'s status message.
+describePackageImportJobResponse_statusMessage :: Lens.Lens' DescribePackageImportJobResponse Prelude.Text
+describePackageImportJobResponse_statusMessage = Lens.lens (\DescribePackageImportJobResponse' {statusMessage} -> statusMessage) (\s@DescribePackageImportJobResponse' {} a -> s {statusMessage = a} :: DescribePackageImportJobResponse)
+
+instance
+  Prelude.NFData
+    DescribePackageImportJobResponse
+  where
+  rnf DescribePackageImportJobResponse' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf jobTags
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf inputConfig
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobType
+      `Prelude.seq` Prelude.rnf lastUpdatedTime
+      `Prelude.seq` Prelude.rnf output
+      `Prelude.seq` Prelude.rnf outputConfig
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
diff --git a/gen/Amazonka/Panorama/DescribePackageVersion.hs b/gen/Amazonka/Panorama/DescribePackageVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/DescribePackageVersion.hs
@@ -0,0 +1,342 @@
+{-# 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.Panorama.DescribePackageVersion
+-- 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 a package version.
+module Amazonka.Panorama.DescribePackageVersion
+  ( -- * Creating a Request
+    DescribePackageVersion (..),
+    newDescribePackageVersion,
+
+    -- * Request Lenses
+    describePackageVersion_ownerAccount,
+    describePackageVersion_patchVersion,
+    describePackageVersion_packageId,
+    describePackageVersion_packageVersion,
+
+    -- * Destructuring the Response
+    DescribePackageVersionResponse (..),
+    newDescribePackageVersionResponse,
+
+    -- * Response Lenses
+    describePackageVersionResponse_ownerAccount,
+    describePackageVersionResponse_packageArn,
+    describePackageVersionResponse_registeredTime,
+    describePackageVersionResponse_statusDescription,
+    describePackageVersionResponse_httpStatus,
+    describePackageVersionResponse_isLatestPatch,
+    describePackageVersionResponse_packageId,
+    describePackageVersionResponse_packageName,
+    describePackageVersionResponse_packageVersion,
+    describePackageVersionResponse_patchVersion,
+    describePackageVersionResponse_status,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribePackageVersion' smart constructor.
+data DescribePackageVersion = DescribePackageVersion'
+  { -- | The version\'s owner account.
+    ownerAccount :: Prelude.Maybe Prelude.Text,
+    -- | The version\'s patch version.
+    patchVersion :: Prelude.Maybe Prelude.Text,
+    -- | The version\'s ID.
+    packageId :: Prelude.Text,
+    -- | The version\'s version.
+    packageVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePackageVersion' 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:
+--
+-- 'ownerAccount', 'describePackageVersion_ownerAccount' - The version\'s owner account.
+--
+-- 'patchVersion', 'describePackageVersion_patchVersion' - The version\'s patch version.
+--
+-- 'packageId', 'describePackageVersion_packageId' - The version\'s ID.
+--
+-- 'packageVersion', 'describePackageVersion_packageVersion' - The version\'s version.
+newDescribePackageVersion ::
+  -- | 'packageId'
+  Prelude.Text ->
+  -- | 'packageVersion'
+  Prelude.Text ->
+  DescribePackageVersion
+newDescribePackageVersion
+  pPackageId_
+  pPackageVersion_ =
+    DescribePackageVersion'
+      { ownerAccount =
+          Prelude.Nothing,
+        patchVersion = Prelude.Nothing,
+        packageId = pPackageId_,
+        packageVersion = pPackageVersion_
+      }
+
+-- | The version\'s owner account.
+describePackageVersion_ownerAccount :: Lens.Lens' DescribePackageVersion (Prelude.Maybe Prelude.Text)
+describePackageVersion_ownerAccount = Lens.lens (\DescribePackageVersion' {ownerAccount} -> ownerAccount) (\s@DescribePackageVersion' {} a -> s {ownerAccount = a} :: DescribePackageVersion)
+
+-- | The version\'s patch version.
+describePackageVersion_patchVersion :: Lens.Lens' DescribePackageVersion (Prelude.Maybe Prelude.Text)
+describePackageVersion_patchVersion = Lens.lens (\DescribePackageVersion' {patchVersion} -> patchVersion) (\s@DescribePackageVersion' {} a -> s {patchVersion = a} :: DescribePackageVersion)
+
+-- | The version\'s ID.
+describePackageVersion_packageId :: Lens.Lens' DescribePackageVersion Prelude.Text
+describePackageVersion_packageId = Lens.lens (\DescribePackageVersion' {packageId} -> packageId) (\s@DescribePackageVersion' {} a -> s {packageId = a} :: DescribePackageVersion)
+
+-- | The version\'s version.
+describePackageVersion_packageVersion :: Lens.Lens' DescribePackageVersion Prelude.Text
+describePackageVersion_packageVersion = Lens.lens (\DescribePackageVersion' {packageVersion} -> packageVersion) (\s@DescribePackageVersion' {} a -> s {packageVersion = a} :: DescribePackageVersion)
+
+instance Core.AWSRequest DescribePackageVersion where
+  type
+    AWSResponse DescribePackageVersion =
+      DescribePackageVersionResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribePackageVersionResponse'
+            Prelude.<$> (x Data..?> "OwnerAccount")
+            Prelude.<*> (x Data..?> "PackageArn")
+            Prelude.<*> (x Data..?> "RegisteredTime")
+            Prelude.<*> (x Data..?> "StatusDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "IsLatestPatch")
+            Prelude.<*> (x Data..:> "PackageId")
+            Prelude.<*> (x Data..:> "PackageName")
+            Prelude.<*> (x Data..:> "PackageVersion")
+            Prelude.<*> (x Data..:> "PatchVersion")
+            Prelude.<*> (x Data..:> "Status")
+      )
+
+instance Prelude.Hashable DescribePackageVersion where
+  hashWithSalt _salt DescribePackageVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` ownerAccount
+      `Prelude.hashWithSalt` patchVersion
+      `Prelude.hashWithSalt` packageId
+      `Prelude.hashWithSalt` packageVersion
+
+instance Prelude.NFData DescribePackageVersion where
+  rnf DescribePackageVersion' {..} =
+    Prelude.rnf ownerAccount
+      `Prelude.seq` Prelude.rnf patchVersion
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf packageVersion
+
+instance Data.ToHeaders DescribePackageVersion where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribePackageVersion where
+  toPath DescribePackageVersion' {..} =
+    Prelude.mconcat
+      [ "/packages/metadata/",
+        Data.toBS packageId,
+        "/versions/",
+        Data.toBS packageVersion
+      ]
+
+instance Data.ToQuery DescribePackageVersion where
+  toQuery DescribePackageVersion' {..} =
+    Prelude.mconcat
+      [ "OwnerAccount" Data.=: ownerAccount,
+        "PatchVersion" Data.=: patchVersion
+      ]
+
+-- | /See:/ 'newDescribePackageVersionResponse' smart constructor.
+data DescribePackageVersionResponse = DescribePackageVersionResponse'
+  { -- | The account ID of the version\'s owner.
+    ownerAccount :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the package.
+    packageArn :: Prelude.Maybe Prelude.Text,
+    -- | The version\'s registered time.
+    registeredTime :: Prelude.Maybe Data.POSIX,
+    -- | The version\'s status description.
+    statusDescription :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | Whether the version is the latest available.
+    isLatestPatch :: Prelude.Bool,
+    -- | The version\'s ID.
+    packageId :: Prelude.Text,
+    -- | The version\'s name.
+    packageName :: Prelude.Text,
+    -- | The version\'s version.
+    packageVersion :: Prelude.Text,
+    -- | The version\'s patch version.
+    patchVersion :: Prelude.Text,
+    -- | The version\'s status.
+    status :: PackageVersionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePackageVersionResponse' 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:
+--
+-- 'ownerAccount', 'describePackageVersionResponse_ownerAccount' - The account ID of the version\'s owner.
+--
+-- 'packageArn', 'describePackageVersionResponse_packageArn' - The ARN of the package.
+--
+-- 'registeredTime', 'describePackageVersionResponse_registeredTime' - The version\'s registered time.
+--
+-- 'statusDescription', 'describePackageVersionResponse_statusDescription' - The version\'s status description.
+--
+-- 'httpStatus', 'describePackageVersionResponse_httpStatus' - The response's http status code.
+--
+-- 'isLatestPatch', 'describePackageVersionResponse_isLatestPatch' - Whether the version is the latest available.
+--
+-- 'packageId', 'describePackageVersionResponse_packageId' - The version\'s ID.
+--
+-- 'packageName', 'describePackageVersionResponse_packageName' - The version\'s name.
+--
+-- 'packageVersion', 'describePackageVersionResponse_packageVersion' - The version\'s version.
+--
+-- 'patchVersion', 'describePackageVersionResponse_patchVersion' - The version\'s patch version.
+--
+-- 'status', 'describePackageVersionResponse_status' - The version\'s status.
+newDescribePackageVersionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'isLatestPatch'
+  Prelude.Bool ->
+  -- | 'packageId'
+  Prelude.Text ->
+  -- | 'packageName'
+  Prelude.Text ->
+  -- | 'packageVersion'
+  Prelude.Text ->
+  -- | 'patchVersion'
+  Prelude.Text ->
+  -- | 'status'
+  PackageVersionStatus ->
+  DescribePackageVersionResponse
+newDescribePackageVersionResponse
+  pHttpStatus_
+  pIsLatestPatch_
+  pPackageId_
+  pPackageName_
+  pPackageVersion_
+  pPatchVersion_
+  pStatus_ =
+    DescribePackageVersionResponse'
+      { ownerAccount =
+          Prelude.Nothing,
+        packageArn = Prelude.Nothing,
+        registeredTime = Prelude.Nothing,
+        statusDescription = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        isLatestPatch = pIsLatestPatch_,
+        packageId = pPackageId_,
+        packageName = pPackageName_,
+        packageVersion = pPackageVersion_,
+        patchVersion = pPatchVersion_,
+        status = pStatus_
+      }
+
+-- | The account ID of the version\'s owner.
+describePackageVersionResponse_ownerAccount :: Lens.Lens' DescribePackageVersionResponse (Prelude.Maybe Prelude.Text)
+describePackageVersionResponse_ownerAccount = Lens.lens (\DescribePackageVersionResponse' {ownerAccount} -> ownerAccount) (\s@DescribePackageVersionResponse' {} a -> s {ownerAccount = a} :: DescribePackageVersionResponse)
+
+-- | The ARN of the package.
+describePackageVersionResponse_packageArn :: Lens.Lens' DescribePackageVersionResponse (Prelude.Maybe Prelude.Text)
+describePackageVersionResponse_packageArn = Lens.lens (\DescribePackageVersionResponse' {packageArn} -> packageArn) (\s@DescribePackageVersionResponse' {} a -> s {packageArn = a} :: DescribePackageVersionResponse)
+
+-- | The version\'s registered time.
+describePackageVersionResponse_registeredTime :: Lens.Lens' DescribePackageVersionResponse (Prelude.Maybe Prelude.UTCTime)
+describePackageVersionResponse_registeredTime = Lens.lens (\DescribePackageVersionResponse' {registeredTime} -> registeredTime) (\s@DescribePackageVersionResponse' {} a -> s {registeredTime = a} :: DescribePackageVersionResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The version\'s status description.
+describePackageVersionResponse_statusDescription :: Lens.Lens' DescribePackageVersionResponse (Prelude.Maybe Prelude.Text)
+describePackageVersionResponse_statusDescription = Lens.lens (\DescribePackageVersionResponse' {statusDescription} -> statusDescription) (\s@DescribePackageVersionResponse' {} a -> s {statusDescription = a} :: DescribePackageVersionResponse)
+
+-- | The response's http status code.
+describePackageVersionResponse_httpStatus :: Lens.Lens' DescribePackageVersionResponse Prelude.Int
+describePackageVersionResponse_httpStatus = Lens.lens (\DescribePackageVersionResponse' {httpStatus} -> httpStatus) (\s@DescribePackageVersionResponse' {} a -> s {httpStatus = a} :: DescribePackageVersionResponse)
+
+-- | Whether the version is the latest available.
+describePackageVersionResponse_isLatestPatch :: Lens.Lens' DescribePackageVersionResponse Prelude.Bool
+describePackageVersionResponse_isLatestPatch = Lens.lens (\DescribePackageVersionResponse' {isLatestPatch} -> isLatestPatch) (\s@DescribePackageVersionResponse' {} a -> s {isLatestPatch = a} :: DescribePackageVersionResponse)
+
+-- | The version\'s ID.
+describePackageVersionResponse_packageId :: Lens.Lens' DescribePackageVersionResponse Prelude.Text
+describePackageVersionResponse_packageId = Lens.lens (\DescribePackageVersionResponse' {packageId} -> packageId) (\s@DescribePackageVersionResponse' {} a -> s {packageId = a} :: DescribePackageVersionResponse)
+
+-- | The version\'s name.
+describePackageVersionResponse_packageName :: Lens.Lens' DescribePackageVersionResponse Prelude.Text
+describePackageVersionResponse_packageName = Lens.lens (\DescribePackageVersionResponse' {packageName} -> packageName) (\s@DescribePackageVersionResponse' {} a -> s {packageName = a} :: DescribePackageVersionResponse)
+
+-- | The version\'s version.
+describePackageVersionResponse_packageVersion :: Lens.Lens' DescribePackageVersionResponse Prelude.Text
+describePackageVersionResponse_packageVersion = Lens.lens (\DescribePackageVersionResponse' {packageVersion} -> packageVersion) (\s@DescribePackageVersionResponse' {} a -> s {packageVersion = a} :: DescribePackageVersionResponse)
+
+-- | The version\'s patch version.
+describePackageVersionResponse_patchVersion :: Lens.Lens' DescribePackageVersionResponse Prelude.Text
+describePackageVersionResponse_patchVersion = Lens.lens (\DescribePackageVersionResponse' {patchVersion} -> patchVersion) (\s@DescribePackageVersionResponse' {} a -> s {patchVersion = a} :: DescribePackageVersionResponse)
+
+-- | The version\'s status.
+describePackageVersionResponse_status :: Lens.Lens' DescribePackageVersionResponse PackageVersionStatus
+describePackageVersionResponse_status = Lens.lens (\DescribePackageVersionResponse' {status} -> status) (\s@DescribePackageVersionResponse' {} a -> s {status = a} :: DescribePackageVersionResponse)
+
+instance
+  Prelude.NFData
+    DescribePackageVersionResponse
+  where
+  rnf DescribePackageVersionResponse' {..} =
+    Prelude.rnf ownerAccount
+      `Prelude.seq` Prelude.rnf packageArn
+      `Prelude.seq` Prelude.rnf registeredTime
+      `Prelude.seq` Prelude.rnf statusDescription
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf isLatestPatch
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf patchVersion
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Panorama/Lens.hs b/gen/Amazonka/Panorama/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Lens.hs
@@ -0,0 +1,641 @@
+{-# 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.Panorama.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.Panorama.Lens
+  ( -- * Operations
+
+    -- ** CreateApplicationInstance
+    createApplicationInstance_applicationInstanceIdToReplace,
+    createApplicationInstance_description,
+    createApplicationInstance_manifestOverridesPayload,
+    createApplicationInstance_name,
+    createApplicationInstance_runtimeRoleArn,
+    createApplicationInstance_tags,
+    createApplicationInstance_defaultRuntimeContextDevice,
+    createApplicationInstance_manifestPayload,
+    createApplicationInstanceResponse_httpStatus,
+    createApplicationInstanceResponse_applicationInstanceId,
+
+    -- ** CreateJobForDevices
+    createJobForDevices_deviceJobConfig,
+    createJobForDevices_deviceIds,
+    createJobForDevices_jobType,
+    createJobForDevicesResponse_httpStatus,
+    createJobForDevicesResponse_jobs,
+
+    -- ** CreateNodeFromTemplateJob
+    createNodeFromTemplateJob_jobTags,
+    createNodeFromTemplateJob_nodeDescription,
+    createNodeFromTemplateJob_nodeName,
+    createNodeFromTemplateJob_outputPackageName,
+    createNodeFromTemplateJob_outputPackageVersion,
+    createNodeFromTemplateJob_templateParameters,
+    createNodeFromTemplateJob_templateType,
+    createNodeFromTemplateJobResponse_httpStatus,
+    createNodeFromTemplateJobResponse_jobId,
+
+    -- ** CreatePackage
+    createPackage_tags,
+    createPackage_packageName,
+    createPackageResponse_arn,
+    createPackageResponse_packageId,
+    createPackageResponse_httpStatus,
+    createPackageResponse_storageLocation,
+
+    -- ** CreatePackageImportJob
+    createPackageImportJob_jobTags,
+    createPackageImportJob_clientToken,
+    createPackageImportJob_inputConfig,
+    createPackageImportJob_jobType,
+    createPackageImportJob_outputConfig,
+    createPackageImportJobResponse_httpStatus,
+    createPackageImportJobResponse_jobId,
+
+    -- ** DeleteDevice
+    deleteDevice_deviceId,
+    deleteDeviceResponse_deviceId,
+    deleteDeviceResponse_httpStatus,
+
+    -- ** DeletePackage
+    deletePackage_forceDelete,
+    deletePackage_packageId,
+    deletePackageResponse_httpStatus,
+
+    -- ** DeregisterPackageVersion
+    deregisterPackageVersion_ownerAccount,
+    deregisterPackageVersion_updatedLatestPatchVersion,
+    deregisterPackageVersion_packageId,
+    deregisterPackageVersion_packageVersion,
+    deregisterPackageVersion_patchVersion,
+    deregisterPackageVersionResponse_httpStatus,
+
+    -- ** DescribeApplicationInstance
+    describeApplicationInstance_applicationInstanceId,
+    describeApplicationInstanceResponse_applicationInstanceId,
+    describeApplicationInstanceResponse_applicationInstanceIdToReplace,
+    describeApplicationInstanceResponse_arn,
+    describeApplicationInstanceResponse_createdTime,
+    describeApplicationInstanceResponse_defaultRuntimeContextDevice,
+    describeApplicationInstanceResponse_defaultRuntimeContextDeviceName,
+    describeApplicationInstanceResponse_description,
+    describeApplicationInstanceResponse_healthStatus,
+    describeApplicationInstanceResponse_lastUpdatedTime,
+    describeApplicationInstanceResponse_name,
+    describeApplicationInstanceResponse_runtimeContextStates,
+    describeApplicationInstanceResponse_runtimeRoleArn,
+    describeApplicationInstanceResponse_status,
+    describeApplicationInstanceResponse_statusDescription,
+    describeApplicationInstanceResponse_tags,
+    describeApplicationInstanceResponse_httpStatus,
+
+    -- ** DescribeApplicationInstanceDetails
+    describeApplicationInstanceDetails_applicationInstanceId,
+    describeApplicationInstanceDetailsResponse_applicationInstanceId,
+    describeApplicationInstanceDetailsResponse_applicationInstanceIdToReplace,
+    describeApplicationInstanceDetailsResponse_createdTime,
+    describeApplicationInstanceDetailsResponse_defaultRuntimeContextDevice,
+    describeApplicationInstanceDetailsResponse_description,
+    describeApplicationInstanceDetailsResponse_manifestOverridesPayload,
+    describeApplicationInstanceDetailsResponse_manifestPayload,
+    describeApplicationInstanceDetailsResponse_name,
+    describeApplicationInstanceDetailsResponse_httpStatus,
+
+    -- ** DescribeDevice
+    describeDevice_deviceId,
+    describeDeviceResponse_alternateSoftwares,
+    describeDeviceResponse_arn,
+    describeDeviceResponse_brand,
+    describeDeviceResponse_createdTime,
+    describeDeviceResponse_currentNetworkingStatus,
+    describeDeviceResponse_currentSoftware,
+    describeDeviceResponse_description,
+    describeDeviceResponse_deviceAggregatedStatus,
+    describeDeviceResponse_deviceConnectionStatus,
+    describeDeviceResponse_deviceId,
+    describeDeviceResponse_latestAlternateSoftware,
+    describeDeviceResponse_latestDeviceJob,
+    describeDeviceResponse_latestSoftware,
+    describeDeviceResponse_leaseExpirationTime,
+    describeDeviceResponse_name,
+    describeDeviceResponse_networkingConfiguration,
+    describeDeviceResponse_provisioningStatus,
+    describeDeviceResponse_serialNumber,
+    describeDeviceResponse_tags,
+    describeDeviceResponse_type,
+    describeDeviceResponse_httpStatus,
+
+    -- ** DescribeDeviceJob
+    describeDeviceJob_jobId,
+    describeDeviceJobResponse_createdTime,
+    describeDeviceJobResponse_deviceArn,
+    describeDeviceJobResponse_deviceId,
+    describeDeviceJobResponse_deviceName,
+    describeDeviceJobResponse_deviceType,
+    describeDeviceJobResponse_imageVersion,
+    describeDeviceJobResponse_jobId,
+    describeDeviceJobResponse_jobType,
+    describeDeviceJobResponse_status,
+    describeDeviceJobResponse_httpStatus,
+
+    -- ** DescribeNode
+    describeNode_ownerAccount,
+    describeNode_nodeId,
+    describeNodeResponse_assetName,
+    describeNodeResponse_packageArn,
+    describeNodeResponse_httpStatus,
+    describeNodeResponse_category,
+    describeNodeResponse_createdTime,
+    describeNodeResponse_description,
+    describeNodeResponse_lastUpdatedTime,
+    describeNodeResponse_name,
+    describeNodeResponse_nodeId,
+    describeNodeResponse_nodeInterface,
+    describeNodeResponse_ownerAccount,
+    describeNodeResponse_packageId,
+    describeNodeResponse_packageName,
+    describeNodeResponse_packageVersion,
+    describeNodeResponse_patchVersion,
+
+    -- ** DescribeNodeFromTemplateJob
+    describeNodeFromTemplateJob_jobId,
+    describeNodeFromTemplateJobResponse_jobTags,
+    describeNodeFromTemplateJobResponse_nodeDescription,
+    describeNodeFromTemplateJobResponse_httpStatus,
+    describeNodeFromTemplateJobResponse_createdTime,
+    describeNodeFromTemplateJobResponse_jobId,
+    describeNodeFromTemplateJobResponse_lastUpdatedTime,
+    describeNodeFromTemplateJobResponse_nodeName,
+    describeNodeFromTemplateJobResponse_outputPackageName,
+    describeNodeFromTemplateJobResponse_outputPackageVersion,
+    describeNodeFromTemplateJobResponse_status,
+    describeNodeFromTemplateJobResponse_statusMessage,
+    describeNodeFromTemplateJobResponse_templateParameters,
+    describeNodeFromTemplateJobResponse_templateType,
+
+    -- ** DescribePackage
+    describePackage_packageId,
+    describePackageResponse_readAccessPrincipalArns,
+    describePackageResponse_writeAccessPrincipalArns,
+    describePackageResponse_httpStatus,
+    describePackageResponse_arn,
+    describePackageResponse_createdTime,
+    describePackageResponse_packageId,
+    describePackageResponse_packageName,
+    describePackageResponse_storageLocation,
+    describePackageResponse_tags,
+
+    -- ** DescribePackageImportJob
+    describePackageImportJob_jobId,
+    describePackageImportJobResponse_clientToken,
+    describePackageImportJobResponse_jobTags,
+    describePackageImportJobResponse_httpStatus,
+    describePackageImportJobResponse_createdTime,
+    describePackageImportJobResponse_inputConfig,
+    describePackageImportJobResponse_jobId,
+    describePackageImportJobResponse_jobType,
+    describePackageImportJobResponse_lastUpdatedTime,
+    describePackageImportJobResponse_output,
+    describePackageImportJobResponse_outputConfig,
+    describePackageImportJobResponse_status,
+    describePackageImportJobResponse_statusMessage,
+
+    -- ** DescribePackageVersion
+    describePackageVersion_ownerAccount,
+    describePackageVersion_patchVersion,
+    describePackageVersion_packageId,
+    describePackageVersion_packageVersion,
+    describePackageVersionResponse_ownerAccount,
+    describePackageVersionResponse_packageArn,
+    describePackageVersionResponse_registeredTime,
+    describePackageVersionResponse_statusDescription,
+    describePackageVersionResponse_httpStatus,
+    describePackageVersionResponse_isLatestPatch,
+    describePackageVersionResponse_packageId,
+    describePackageVersionResponse_packageName,
+    describePackageVersionResponse_packageVersion,
+    describePackageVersionResponse_patchVersion,
+    describePackageVersionResponse_status,
+
+    -- ** ListApplicationInstanceDependencies
+    listApplicationInstanceDependencies_maxResults,
+    listApplicationInstanceDependencies_nextToken,
+    listApplicationInstanceDependencies_applicationInstanceId,
+    listApplicationInstanceDependenciesResponse_nextToken,
+    listApplicationInstanceDependenciesResponse_packageObjects,
+    listApplicationInstanceDependenciesResponse_httpStatus,
+
+    -- ** ListApplicationInstanceNodeInstances
+    listApplicationInstanceNodeInstances_maxResults,
+    listApplicationInstanceNodeInstances_nextToken,
+    listApplicationInstanceNodeInstances_applicationInstanceId,
+    listApplicationInstanceNodeInstancesResponse_nextToken,
+    listApplicationInstanceNodeInstancesResponse_nodeInstances,
+    listApplicationInstanceNodeInstancesResponse_httpStatus,
+
+    -- ** ListApplicationInstances
+    listApplicationInstances_deviceId,
+    listApplicationInstances_maxResults,
+    listApplicationInstances_nextToken,
+    listApplicationInstances_statusFilter,
+    listApplicationInstancesResponse_applicationInstances,
+    listApplicationInstancesResponse_nextToken,
+    listApplicationInstancesResponse_httpStatus,
+
+    -- ** ListDevices
+    listDevices_deviceAggregatedStatusFilter,
+    listDevices_maxResults,
+    listDevices_nameFilter,
+    listDevices_nextToken,
+    listDevices_sortBy,
+    listDevices_sortOrder,
+    listDevicesResponse_nextToken,
+    listDevicesResponse_httpStatus,
+    listDevicesResponse_devices,
+
+    -- ** ListDevicesJobs
+    listDevicesJobs_deviceId,
+    listDevicesJobs_maxResults,
+    listDevicesJobs_nextToken,
+    listDevicesJobsResponse_deviceJobs,
+    listDevicesJobsResponse_nextToken,
+    listDevicesJobsResponse_httpStatus,
+
+    -- ** ListNodeFromTemplateJobs
+    listNodeFromTemplateJobs_maxResults,
+    listNodeFromTemplateJobs_nextToken,
+    listNodeFromTemplateJobsResponse_nextToken,
+    listNodeFromTemplateJobsResponse_httpStatus,
+    listNodeFromTemplateJobsResponse_nodeFromTemplateJobs,
+
+    -- ** ListNodes
+    listNodes_category,
+    listNodes_maxResults,
+    listNodes_nextToken,
+    listNodes_ownerAccount,
+    listNodes_packageName,
+    listNodes_packageVersion,
+    listNodes_patchVersion,
+    listNodesResponse_nextToken,
+    listNodesResponse_nodes,
+    listNodesResponse_httpStatus,
+
+    -- ** ListPackageImportJobs
+    listPackageImportJobs_maxResults,
+    listPackageImportJobs_nextToken,
+    listPackageImportJobsResponse_nextToken,
+    listPackageImportJobsResponse_httpStatus,
+    listPackageImportJobsResponse_packageImportJobs,
+
+    -- ** ListPackages
+    listPackages_maxResults,
+    listPackages_nextToken,
+    listPackagesResponse_nextToken,
+    listPackagesResponse_packages,
+    listPackagesResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** ProvisionDevice
+    provisionDevice_description,
+    provisionDevice_networkingConfiguration,
+    provisionDevice_tags,
+    provisionDevice_name,
+    provisionDeviceResponse_certificates,
+    provisionDeviceResponse_deviceId,
+    provisionDeviceResponse_iotThingName,
+    provisionDeviceResponse_httpStatus,
+    provisionDeviceResponse_arn,
+    provisionDeviceResponse_status,
+
+    -- ** RegisterPackageVersion
+    registerPackageVersion_markLatest,
+    registerPackageVersion_ownerAccount,
+    registerPackageVersion_packageId,
+    registerPackageVersion_packageVersion,
+    registerPackageVersion_patchVersion,
+    registerPackageVersionResponse_httpStatus,
+
+    -- ** RemoveApplicationInstance
+    removeApplicationInstance_applicationInstanceId,
+    removeApplicationInstanceResponse_httpStatus,
+
+    -- ** SignalApplicationInstanceNodeInstances
+    signalApplicationInstanceNodeInstances_applicationInstanceId,
+    signalApplicationInstanceNodeInstances_nodeSignals,
+    signalApplicationInstanceNodeInstancesResponse_httpStatus,
+    signalApplicationInstanceNodeInstancesResponse_applicationInstanceId,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateDeviceMetadata
+    updateDeviceMetadata_description,
+    updateDeviceMetadata_deviceId,
+    updateDeviceMetadataResponse_deviceId,
+    updateDeviceMetadataResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AlternateSoftwareMetadata
+    alternateSoftwareMetadata_version,
+
+    -- ** ApplicationInstance
+    applicationInstance_applicationInstanceId,
+    applicationInstance_arn,
+    applicationInstance_createdTime,
+    applicationInstance_defaultRuntimeContextDevice,
+    applicationInstance_defaultRuntimeContextDeviceName,
+    applicationInstance_description,
+    applicationInstance_healthStatus,
+    applicationInstance_name,
+    applicationInstance_runtimeContextStates,
+    applicationInstance_status,
+    applicationInstance_statusDescription,
+    applicationInstance_tags,
+
+    -- ** Device
+    device_brand,
+    device_createdTime,
+    device_currentSoftware,
+    device_description,
+    device_deviceAggregatedStatus,
+    device_deviceId,
+    device_lastUpdatedTime,
+    device_latestDeviceJob,
+    device_leaseExpirationTime,
+    device_name,
+    device_provisioningStatus,
+    device_tags,
+    device_type,
+
+    -- ** DeviceJob
+    deviceJob_createdTime,
+    deviceJob_deviceId,
+    deviceJob_deviceName,
+    deviceJob_jobId,
+    deviceJob_jobType,
+
+    -- ** DeviceJobConfig
+    deviceJobConfig_oTAJobConfig,
+
+    -- ** EthernetPayload
+    ethernetPayload_staticIpConnectionInfo,
+    ethernetPayload_connectionType,
+
+    -- ** EthernetStatus
+    ethernetStatus_connectionStatus,
+    ethernetStatus_hwAddress,
+    ethernetStatus_ipAddress,
+
+    -- ** Job
+    job_deviceId,
+    job_jobId,
+
+    -- ** JobResourceTags
+    jobResourceTags_resourceType,
+    jobResourceTags_tags,
+
+    -- ** LatestDeviceJob
+    latestDeviceJob_imageVersion,
+    latestDeviceJob_jobType,
+    latestDeviceJob_status,
+
+    -- ** ManifestOverridesPayload
+    manifestOverridesPayload_payloadData,
+
+    -- ** ManifestPayload
+    manifestPayload_payloadData,
+
+    -- ** NetworkPayload
+    networkPayload_ethernet0,
+    networkPayload_ethernet1,
+    networkPayload_ntp,
+
+    -- ** NetworkStatus
+    networkStatus_ethernet0Status,
+    networkStatus_ethernet1Status,
+    networkStatus_lastUpdatedTime,
+    networkStatus_ntpStatus,
+
+    -- ** Node
+    node_description,
+    node_ownerAccount,
+    node_packageArn,
+    node_category,
+    node_createdTime,
+    node_name,
+    node_nodeId,
+    node_packageId,
+    node_packageName,
+    node_packageVersion,
+    node_patchVersion,
+
+    -- ** NodeFromTemplateJob
+    nodeFromTemplateJob_createdTime,
+    nodeFromTemplateJob_jobId,
+    nodeFromTemplateJob_nodeName,
+    nodeFromTemplateJob_status,
+    nodeFromTemplateJob_statusMessage,
+    nodeFromTemplateJob_templateType,
+
+    -- ** NodeInputPort
+    nodeInputPort_defaultValue,
+    nodeInputPort_description,
+    nodeInputPort_maxConnections,
+    nodeInputPort_name,
+    nodeInputPort_type,
+
+    -- ** NodeInstance
+    nodeInstance_nodeId,
+    nodeInstance_nodeName,
+    nodeInstance_packageName,
+    nodeInstance_packagePatchVersion,
+    nodeInstance_packageVersion,
+    nodeInstance_currentStatus,
+    nodeInstance_nodeInstanceId,
+
+    -- ** NodeInterface
+    nodeInterface_inputs,
+    nodeInterface_outputs,
+
+    -- ** NodeOutputPort
+    nodeOutputPort_description,
+    nodeOutputPort_name,
+    nodeOutputPort_type,
+
+    -- ** NodeSignal
+    nodeSignal_nodeInstanceId,
+    nodeSignal_signal,
+
+    -- ** NtpPayload
+    ntpPayload_ntpServers,
+
+    -- ** NtpStatus
+    ntpStatus_connectionStatus,
+    ntpStatus_ipAddress,
+    ntpStatus_ntpServerName,
+
+    -- ** OTAJobConfig
+    oTAJobConfig_imageVersion,
+
+    -- ** OutPutS3Location
+    outPutS3Location_bucketName,
+    outPutS3Location_objectKey,
+
+    -- ** PackageImportJob
+    packageImportJob_createdTime,
+    packageImportJob_jobId,
+    packageImportJob_jobType,
+    packageImportJob_lastUpdatedTime,
+    packageImportJob_status,
+    packageImportJob_statusMessage,
+
+    -- ** PackageImportJobInputConfig
+    packageImportJobInputConfig_packageVersionInputConfig,
+
+    -- ** PackageImportJobOutput
+    packageImportJobOutput_outputS3Location,
+    packageImportJobOutput_packageId,
+    packageImportJobOutput_packageVersion,
+    packageImportJobOutput_patchVersion,
+
+    -- ** PackageImportJobOutputConfig
+    packageImportJobOutputConfig_packageVersionOutputConfig,
+
+    -- ** PackageListItem
+    packageListItem_arn,
+    packageListItem_createdTime,
+    packageListItem_packageId,
+    packageListItem_packageName,
+    packageListItem_tags,
+
+    -- ** PackageObject
+    packageObject_name,
+    packageObject_packageVersion,
+    packageObject_patchVersion,
+
+    -- ** PackageVersionInputConfig
+    packageVersionInputConfig_s3Location,
+
+    -- ** PackageVersionOutputConfig
+    packageVersionOutputConfig_markLatest,
+    packageVersionOutputConfig_packageName,
+    packageVersionOutputConfig_packageVersion,
+
+    -- ** ReportedRuntimeContextState
+    reportedRuntimeContextState_desiredState,
+    reportedRuntimeContextState_deviceReportedStatus,
+    reportedRuntimeContextState_deviceReportedTime,
+    reportedRuntimeContextState_runtimeContextName,
+
+    -- ** S3Location
+    s3Location_region,
+    s3Location_bucketName,
+    s3Location_objectKey,
+
+    -- ** StaticIpConnectionInfo
+    staticIpConnectionInfo_defaultGateway,
+    staticIpConnectionInfo_dns,
+    staticIpConnectionInfo_ipAddress,
+    staticIpConnectionInfo_mask,
+
+    -- ** StorageLocation
+    storageLocation_binaryPrefixLocation,
+    storageLocation_bucket,
+    storageLocation_generatedPrefixLocation,
+    storageLocation_manifestPrefixLocation,
+    storageLocation_repoPrefixLocation,
+  )
+where
+
+import Amazonka.Panorama.CreateApplicationInstance
+import Amazonka.Panorama.CreateJobForDevices
+import Amazonka.Panorama.CreateNodeFromTemplateJob
+import Amazonka.Panorama.CreatePackage
+import Amazonka.Panorama.CreatePackageImportJob
+import Amazonka.Panorama.DeleteDevice
+import Amazonka.Panorama.DeletePackage
+import Amazonka.Panorama.DeregisterPackageVersion
+import Amazonka.Panorama.DescribeApplicationInstance
+import Amazonka.Panorama.DescribeApplicationInstanceDetails
+import Amazonka.Panorama.DescribeDevice
+import Amazonka.Panorama.DescribeDeviceJob
+import Amazonka.Panorama.DescribeNode
+import Amazonka.Panorama.DescribeNodeFromTemplateJob
+import Amazonka.Panorama.DescribePackage
+import Amazonka.Panorama.DescribePackageImportJob
+import Amazonka.Panorama.DescribePackageVersion
+import Amazonka.Panorama.ListApplicationInstanceDependencies
+import Amazonka.Panorama.ListApplicationInstanceNodeInstances
+import Amazonka.Panorama.ListApplicationInstances
+import Amazonka.Panorama.ListDevices
+import Amazonka.Panorama.ListDevicesJobs
+import Amazonka.Panorama.ListNodeFromTemplateJobs
+import Amazonka.Panorama.ListNodes
+import Amazonka.Panorama.ListPackageImportJobs
+import Amazonka.Panorama.ListPackages
+import Amazonka.Panorama.ListTagsForResource
+import Amazonka.Panorama.ProvisionDevice
+import Amazonka.Panorama.RegisterPackageVersion
+import Amazonka.Panorama.RemoveApplicationInstance
+import Amazonka.Panorama.SignalApplicationInstanceNodeInstances
+import Amazonka.Panorama.TagResource
+import Amazonka.Panorama.Types.AlternateSoftwareMetadata
+import Amazonka.Panorama.Types.ApplicationInstance
+import Amazonka.Panorama.Types.Device
+import Amazonka.Panorama.Types.DeviceJob
+import Amazonka.Panorama.Types.DeviceJobConfig
+import Amazonka.Panorama.Types.EthernetPayload
+import Amazonka.Panorama.Types.EthernetStatus
+import Amazonka.Panorama.Types.Job
+import Amazonka.Panorama.Types.JobResourceTags
+import Amazonka.Panorama.Types.LatestDeviceJob
+import Amazonka.Panorama.Types.ManifestOverridesPayload
+import Amazonka.Panorama.Types.ManifestPayload
+import Amazonka.Panorama.Types.NetworkPayload
+import Amazonka.Panorama.Types.NetworkStatus
+import Amazonka.Panorama.Types.Node
+import Amazonka.Panorama.Types.NodeFromTemplateJob
+import Amazonka.Panorama.Types.NodeInputPort
+import Amazonka.Panorama.Types.NodeInstance
+import Amazonka.Panorama.Types.NodeInterface
+import Amazonka.Panorama.Types.NodeOutputPort
+import Amazonka.Panorama.Types.NodeSignal
+import Amazonka.Panorama.Types.NtpPayload
+import Amazonka.Panorama.Types.NtpStatus
+import Amazonka.Panorama.Types.OTAJobConfig
+import Amazonka.Panorama.Types.OutPutS3Location
+import Amazonka.Panorama.Types.PackageImportJob
+import Amazonka.Panorama.Types.PackageImportJobInputConfig
+import Amazonka.Panorama.Types.PackageImportJobOutput
+import Amazonka.Panorama.Types.PackageImportJobOutputConfig
+import Amazonka.Panorama.Types.PackageListItem
+import Amazonka.Panorama.Types.PackageObject
+import Amazonka.Panorama.Types.PackageVersionInputConfig
+import Amazonka.Panorama.Types.PackageVersionOutputConfig
+import Amazonka.Panorama.Types.ReportedRuntimeContextState
+import Amazonka.Panorama.Types.S3Location
+import Amazonka.Panorama.Types.StaticIpConnectionInfo
+import Amazonka.Panorama.Types.StorageLocation
+import Amazonka.Panorama.UntagResource
+import Amazonka.Panorama.UpdateDeviceMetadata
diff --git a/gen/Amazonka/Panorama/ListApplicationInstanceDependencies.hs b/gen/Amazonka/Panorama/ListApplicationInstanceDependencies.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListApplicationInstanceDependencies.hs
@@ -0,0 +1,240 @@
+{-# 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.Panorama.ListApplicationInstanceDependencies
+-- 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 application instance dependencies.
+module Amazonka.Panorama.ListApplicationInstanceDependencies
+  ( -- * Creating a Request
+    ListApplicationInstanceDependencies (..),
+    newListApplicationInstanceDependencies,
+
+    -- * Request Lenses
+    listApplicationInstanceDependencies_maxResults,
+    listApplicationInstanceDependencies_nextToken,
+    listApplicationInstanceDependencies_applicationInstanceId,
+
+    -- * Destructuring the Response
+    ListApplicationInstanceDependenciesResponse (..),
+    newListApplicationInstanceDependenciesResponse,
+
+    -- * Response Lenses
+    listApplicationInstanceDependenciesResponse_nextToken,
+    listApplicationInstanceDependenciesResponse_packageObjects,
+    listApplicationInstanceDependenciesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListApplicationInstanceDependencies' smart constructor.
+data ListApplicationInstanceDependencies = ListApplicationInstanceDependencies'
+  { -- | The maximum number of application instance dependencies to return in one
+    -- page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s ID.
+    applicationInstanceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListApplicationInstanceDependencies' 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', 'listApplicationInstanceDependencies_maxResults' - The maximum number of application instance dependencies to return in one
+-- page of results.
+--
+-- 'nextToken', 'listApplicationInstanceDependencies_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+--
+-- 'applicationInstanceId', 'listApplicationInstanceDependencies_applicationInstanceId' - The application instance\'s ID.
+newListApplicationInstanceDependencies ::
+  -- | 'applicationInstanceId'
+  Prelude.Text ->
+  ListApplicationInstanceDependencies
+newListApplicationInstanceDependencies
+  pApplicationInstanceId_ =
+    ListApplicationInstanceDependencies'
+      { maxResults =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        applicationInstanceId =
+          pApplicationInstanceId_
+      }
+
+-- | The maximum number of application instance dependencies to return in one
+-- page of results.
+listApplicationInstanceDependencies_maxResults :: Lens.Lens' ListApplicationInstanceDependencies (Prelude.Maybe Prelude.Natural)
+listApplicationInstanceDependencies_maxResults = Lens.lens (\ListApplicationInstanceDependencies' {maxResults} -> maxResults) (\s@ListApplicationInstanceDependencies' {} a -> s {maxResults = a} :: ListApplicationInstanceDependencies)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listApplicationInstanceDependencies_nextToken :: Lens.Lens' ListApplicationInstanceDependencies (Prelude.Maybe Prelude.Text)
+listApplicationInstanceDependencies_nextToken = Lens.lens (\ListApplicationInstanceDependencies' {nextToken} -> nextToken) (\s@ListApplicationInstanceDependencies' {} a -> s {nextToken = a} :: ListApplicationInstanceDependencies)
+
+-- | The application instance\'s ID.
+listApplicationInstanceDependencies_applicationInstanceId :: Lens.Lens' ListApplicationInstanceDependencies Prelude.Text
+listApplicationInstanceDependencies_applicationInstanceId = Lens.lens (\ListApplicationInstanceDependencies' {applicationInstanceId} -> applicationInstanceId) (\s@ListApplicationInstanceDependencies' {} a -> s {applicationInstanceId = a} :: ListApplicationInstanceDependencies)
+
+instance
+  Core.AWSRequest
+    ListApplicationInstanceDependencies
+  where
+  type
+    AWSResponse ListApplicationInstanceDependencies =
+      ListApplicationInstanceDependenciesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListApplicationInstanceDependenciesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "PackageObjects" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListApplicationInstanceDependencies
+  where
+  hashWithSalt
+    _salt
+    ListApplicationInstanceDependencies' {..} =
+      _salt
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` applicationInstanceId
+
+instance
+  Prelude.NFData
+    ListApplicationInstanceDependencies
+  where
+  rnf ListApplicationInstanceDependencies' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf applicationInstanceId
+
+instance
+  Data.ToHeaders
+    ListApplicationInstanceDependencies
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToPath
+    ListApplicationInstanceDependencies
+  where
+  toPath ListApplicationInstanceDependencies' {..} =
+    Prelude.mconcat
+      [ "/application-instances/",
+        Data.toBS applicationInstanceId,
+        "/package-dependencies"
+      ]
+
+instance
+  Data.ToQuery
+    ListApplicationInstanceDependencies
+  where
+  toQuery ListApplicationInstanceDependencies' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListApplicationInstanceDependenciesResponse' smart constructor.
+data ListApplicationInstanceDependenciesResponse = ListApplicationInstanceDependenciesResponse'
+  { -- | A pagination token that\'s included if more results are available.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of package objects.
+    packageObjects :: Prelude.Maybe [PackageObject],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListApplicationInstanceDependenciesResponse' 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', 'listApplicationInstanceDependenciesResponse_nextToken' - A pagination token that\'s included if more results are available.
+--
+-- 'packageObjects', 'listApplicationInstanceDependenciesResponse_packageObjects' - A list of package objects.
+--
+-- 'httpStatus', 'listApplicationInstanceDependenciesResponse_httpStatus' - The response's http status code.
+newListApplicationInstanceDependenciesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListApplicationInstanceDependenciesResponse
+newListApplicationInstanceDependenciesResponse
+  pHttpStatus_ =
+    ListApplicationInstanceDependenciesResponse'
+      { nextToken =
+          Prelude.Nothing,
+        packageObjects =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | A pagination token that\'s included if more results are available.
+listApplicationInstanceDependenciesResponse_nextToken :: Lens.Lens' ListApplicationInstanceDependenciesResponse (Prelude.Maybe Prelude.Text)
+listApplicationInstanceDependenciesResponse_nextToken = Lens.lens (\ListApplicationInstanceDependenciesResponse' {nextToken} -> nextToken) (\s@ListApplicationInstanceDependenciesResponse' {} a -> s {nextToken = a} :: ListApplicationInstanceDependenciesResponse)
+
+-- | A list of package objects.
+listApplicationInstanceDependenciesResponse_packageObjects :: Lens.Lens' ListApplicationInstanceDependenciesResponse (Prelude.Maybe [PackageObject])
+listApplicationInstanceDependenciesResponse_packageObjects = Lens.lens (\ListApplicationInstanceDependenciesResponse' {packageObjects} -> packageObjects) (\s@ListApplicationInstanceDependenciesResponse' {} a -> s {packageObjects = a} :: ListApplicationInstanceDependenciesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listApplicationInstanceDependenciesResponse_httpStatus :: Lens.Lens' ListApplicationInstanceDependenciesResponse Prelude.Int
+listApplicationInstanceDependenciesResponse_httpStatus = Lens.lens (\ListApplicationInstanceDependenciesResponse' {httpStatus} -> httpStatus) (\s@ListApplicationInstanceDependenciesResponse' {} a -> s {httpStatus = a} :: ListApplicationInstanceDependenciesResponse)
+
+instance
+  Prelude.NFData
+    ListApplicationInstanceDependenciesResponse
+  where
+  rnf ListApplicationInstanceDependenciesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf packageObjects
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/ListApplicationInstanceNodeInstances.hs b/gen/Amazonka/Panorama/ListApplicationInstanceNodeInstances.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListApplicationInstanceNodeInstances.hs
@@ -0,0 +1,237 @@
+{-# 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.Panorama.ListApplicationInstanceNodeInstances
+-- 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 application node instances.
+module Amazonka.Panorama.ListApplicationInstanceNodeInstances
+  ( -- * Creating a Request
+    ListApplicationInstanceNodeInstances (..),
+    newListApplicationInstanceNodeInstances,
+
+    -- * Request Lenses
+    listApplicationInstanceNodeInstances_maxResults,
+    listApplicationInstanceNodeInstances_nextToken,
+    listApplicationInstanceNodeInstances_applicationInstanceId,
+
+    -- * Destructuring the Response
+    ListApplicationInstanceNodeInstancesResponse (..),
+    newListApplicationInstanceNodeInstancesResponse,
+
+    -- * Response Lenses
+    listApplicationInstanceNodeInstancesResponse_nextToken,
+    listApplicationInstanceNodeInstancesResponse_nodeInstances,
+    listApplicationInstanceNodeInstancesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListApplicationInstanceNodeInstances' smart constructor.
+data ListApplicationInstanceNodeInstances = ListApplicationInstanceNodeInstances'
+  { -- | The maximum number of node instances to return in one page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The node instances\' application instance ID.
+    applicationInstanceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListApplicationInstanceNodeInstances' 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', 'listApplicationInstanceNodeInstances_maxResults' - The maximum number of node instances to return in one page of results.
+--
+-- 'nextToken', 'listApplicationInstanceNodeInstances_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+--
+-- 'applicationInstanceId', 'listApplicationInstanceNodeInstances_applicationInstanceId' - The node instances\' application instance ID.
+newListApplicationInstanceNodeInstances ::
+  -- | 'applicationInstanceId'
+  Prelude.Text ->
+  ListApplicationInstanceNodeInstances
+newListApplicationInstanceNodeInstances
+  pApplicationInstanceId_ =
+    ListApplicationInstanceNodeInstances'
+      { maxResults =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        applicationInstanceId =
+          pApplicationInstanceId_
+      }
+
+-- | The maximum number of node instances to return in one page of results.
+listApplicationInstanceNodeInstances_maxResults :: Lens.Lens' ListApplicationInstanceNodeInstances (Prelude.Maybe Prelude.Natural)
+listApplicationInstanceNodeInstances_maxResults = Lens.lens (\ListApplicationInstanceNodeInstances' {maxResults} -> maxResults) (\s@ListApplicationInstanceNodeInstances' {} a -> s {maxResults = a} :: ListApplicationInstanceNodeInstances)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listApplicationInstanceNodeInstances_nextToken :: Lens.Lens' ListApplicationInstanceNodeInstances (Prelude.Maybe Prelude.Text)
+listApplicationInstanceNodeInstances_nextToken = Lens.lens (\ListApplicationInstanceNodeInstances' {nextToken} -> nextToken) (\s@ListApplicationInstanceNodeInstances' {} a -> s {nextToken = a} :: ListApplicationInstanceNodeInstances)
+
+-- | The node instances\' application instance ID.
+listApplicationInstanceNodeInstances_applicationInstanceId :: Lens.Lens' ListApplicationInstanceNodeInstances Prelude.Text
+listApplicationInstanceNodeInstances_applicationInstanceId = Lens.lens (\ListApplicationInstanceNodeInstances' {applicationInstanceId} -> applicationInstanceId) (\s@ListApplicationInstanceNodeInstances' {} a -> s {applicationInstanceId = a} :: ListApplicationInstanceNodeInstances)
+
+instance
+  Core.AWSRequest
+    ListApplicationInstanceNodeInstances
+  where
+  type
+    AWSResponse ListApplicationInstanceNodeInstances =
+      ListApplicationInstanceNodeInstancesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListApplicationInstanceNodeInstancesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "NodeInstances" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListApplicationInstanceNodeInstances
+  where
+  hashWithSalt
+    _salt
+    ListApplicationInstanceNodeInstances' {..} =
+      _salt
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` applicationInstanceId
+
+instance
+  Prelude.NFData
+    ListApplicationInstanceNodeInstances
+  where
+  rnf ListApplicationInstanceNodeInstances' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf applicationInstanceId
+
+instance
+  Data.ToHeaders
+    ListApplicationInstanceNodeInstances
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToPath
+    ListApplicationInstanceNodeInstances
+  where
+  toPath ListApplicationInstanceNodeInstances' {..} =
+    Prelude.mconcat
+      [ "/application-instances/",
+        Data.toBS applicationInstanceId,
+        "/node-instances"
+      ]
+
+instance
+  Data.ToQuery
+    ListApplicationInstanceNodeInstances
+  where
+  toQuery ListApplicationInstanceNodeInstances' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListApplicationInstanceNodeInstancesResponse' smart constructor.
+data ListApplicationInstanceNodeInstancesResponse = ListApplicationInstanceNodeInstancesResponse'
+  { -- | A pagination token that\'s included if more results are available.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of node instances.
+    nodeInstances :: Prelude.Maybe [NodeInstance],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListApplicationInstanceNodeInstancesResponse' 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', 'listApplicationInstanceNodeInstancesResponse_nextToken' - A pagination token that\'s included if more results are available.
+--
+-- 'nodeInstances', 'listApplicationInstanceNodeInstancesResponse_nodeInstances' - A list of node instances.
+--
+-- 'httpStatus', 'listApplicationInstanceNodeInstancesResponse_httpStatus' - The response's http status code.
+newListApplicationInstanceNodeInstancesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListApplicationInstanceNodeInstancesResponse
+newListApplicationInstanceNodeInstancesResponse
+  pHttpStatus_ =
+    ListApplicationInstanceNodeInstancesResponse'
+      { nextToken =
+          Prelude.Nothing,
+        nodeInstances =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | A pagination token that\'s included if more results are available.
+listApplicationInstanceNodeInstancesResponse_nextToken :: Lens.Lens' ListApplicationInstanceNodeInstancesResponse (Prelude.Maybe Prelude.Text)
+listApplicationInstanceNodeInstancesResponse_nextToken = Lens.lens (\ListApplicationInstanceNodeInstancesResponse' {nextToken} -> nextToken) (\s@ListApplicationInstanceNodeInstancesResponse' {} a -> s {nextToken = a} :: ListApplicationInstanceNodeInstancesResponse)
+
+-- | A list of node instances.
+listApplicationInstanceNodeInstancesResponse_nodeInstances :: Lens.Lens' ListApplicationInstanceNodeInstancesResponse (Prelude.Maybe [NodeInstance])
+listApplicationInstanceNodeInstancesResponse_nodeInstances = Lens.lens (\ListApplicationInstanceNodeInstancesResponse' {nodeInstances} -> nodeInstances) (\s@ListApplicationInstanceNodeInstancesResponse' {} a -> s {nodeInstances = a} :: ListApplicationInstanceNodeInstancesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listApplicationInstanceNodeInstancesResponse_httpStatus :: Lens.Lens' ListApplicationInstanceNodeInstancesResponse Prelude.Int
+listApplicationInstanceNodeInstancesResponse_httpStatus = Lens.lens (\ListApplicationInstanceNodeInstancesResponse' {httpStatus} -> httpStatus) (\s@ListApplicationInstanceNodeInstancesResponse' {} a -> s {httpStatus = a} :: ListApplicationInstanceNodeInstancesResponse)
+
+instance
+  Prelude.NFData
+    ListApplicationInstanceNodeInstancesResponse
+  where
+  rnf ListApplicationInstanceNodeInstancesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf nodeInstances
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/ListApplicationInstances.hs b/gen/Amazonka/Panorama/ListApplicationInstances.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListApplicationInstances.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.Panorama.ListApplicationInstances
+-- 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 application instances.
+module Amazonka.Panorama.ListApplicationInstances
+  ( -- * Creating a Request
+    ListApplicationInstances (..),
+    newListApplicationInstances,
+
+    -- * Request Lenses
+    listApplicationInstances_deviceId,
+    listApplicationInstances_maxResults,
+    listApplicationInstances_nextToken,
+    listApplicationInstances_statusFilter,
+
+    -- * Destructuring the Response
+    ListApplicationInstancesResponse (..),
+    newListApplicationInstancesResponse,
+
+    -- * Response Lenses
+    listApplicationInstancesResponse_applicationInstances,
+    listApplicationInstancesResponse_nextToken,
+    listApplicationInstancesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListApplicationInstances' smart constructor.
+data ListApplicationInstances = ListApplicationInstances'
+  { -- | The application instances\' device ID.
+    deviceId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of application instances to return in one page of
+    -- results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Only include instances with a specific status.
+    statusFilter :: Prelude.Maybe StatusFilter
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListApplicationInstances' 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:
+--
+-- 'deviceId', 'listApplicationInstances_deviceId' - The application instances\' device ID.
+--
+-- 'maxResults', 'listApplicationInstances_maxResults' - The maximum number of application instances to return in one page of
+-- results.
+--
+-- 'nextToken', 'listApplicationInstances_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+--
+-- 'statusFilter', 'listApplicationInstances_statusFilter' - Only include instances with a specific status.
+newListApplicationInstances ::
+  ListApplicationInstances
+newListApplicationInstances =
+  ListApplicationInstances'
+    { deviceId =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      statusFilter = Prelude.Nothing
+    }
+
+-- | The application instances\' device ID.
+listApplicationInstances_deviceId :: Lens.Lens' ListApplicationInstances (Prelude.Maybe Prelude.Text)
+listApplicationInstances_deviceId = Lens.lens (\ListApplicationInstances' {deviceId} -> deviceId) (\s@ListApplicationInstances' {} a -> s {deviceId = a} :: ListApplicationInstances)
+
+-- | The maximum number of application instances to return in one page of
+-- results.
+listApplicationInstances_maxResults :: Lens.Lens' ListApplicationInstances (Prelude.Maybe Prelude.Natural)
+listApplicationInstances_maxResults = Lens.lens (\ListApplicationInstances' {maxResults} -> maxResults) (\s@ListApplicationInstances' {} a -> s {maxResults = a} :: ListApplicationInstances)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listApplicationInstances_nextToken :: Lens.Lens' ListApplicationInstances (Prelude.Maybe Prelude.Text)
+listApplicationInstances_nextToken = Lens.lens (\ListApplicationInstances' {nextToken} -> nextToken) (\s@ListApplicationInstances' {} a -> s {nextToken = a} :: ListApplicationInstances)
+
+-- | Only include instances with a specific status.
+listApplicationInstances_statusFilter :: Lens.Lens' ListApplicationInstances (Prelude.Maybe StatusFilter)
+listApplicationInstances_statusFilter = Lens.lens (\ListApplicationInstances' {statusFilter} -> statusFilter) (\s@ListApplicationInstances' {} a -> s {statusFilter = a} :: ListApplicationInstances)
+
+instance Core.AWSRequest ListApplicationInstances where
+  type
+    AWSResponse ListApplicationInstances =
+      ListApplicationInstancesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListApplicationInstancesResponse'
+            Prelude.<$> ( x
+                            Data..?> "ApplicationInstances"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListApplicationInstances where
+  hashWithSalt _salt ListApplicationInstances' {..} =
+    _salt
+      `Prelude.hashWithSalt` deviceId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` statusFilter
+
+instance Prelude.NFData ListApplicationInstances where
+  rnf ListApplicationInstances' {..} =
+    Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf statusFilter
+
+instance Data.ToHeaders ListApplicationInstances where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListApplicationInstances where
+  toPath = Prelude.const "/application-instances"
+
+instance Data.ToQuery ListApplicationInstances where
+  toQuery ListApplicationInstances' {..} =
+    Prelude.mconcat
+      [ "deviceId" Data.=: deviceId,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "statusFilter" Data.=: statusFilter
+      ]
+
+-- | /See:/ 'newListApplicationInstancesResponse' smart constructor.
+data ListApplicationInstancesResponse = ListApplicationInstancesResponse'
+  { -- | A list of application instances.
+    applicationInstances :: Prelude.Maybe [ApplicationInstance],
+    -- | A pagination token that\'s included if more results are available.
+    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 'ListApplicationInstancesResponse' 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:
+--
+-- 'applicationInstances', 'listApplicationInstancesResponse_applicationInstances' - A list of application instances.
+--
+-- 'nextToken', 'listApplicationInstancesResponse_nextToken' - A pagination token that\'s included if more results are available.
+--
+-- 'httpStatus', 'listApplicationInstancesResponse_httpStatus' - The response's http status code.
+newListApplicationInstancesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListApplicationInstancesResponse
+newListApplicationInstancesResponse pHttpStatus_ =
+  ListApplicationInstancesResponse'
+    { applicationInstances =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of application instances.
+listApplicationInstancesResponse_applicationInstances :: Lens.Lens' ListApplicationInstancesResponse (Prelude.Maybe [ApplicationInstance])
+listApplicationInstancesResponse_applicationInstances = Lens.lens (\ListApplicationInstancesResponse' {applicationInstances} -> applicationInstances) (\s@ListApplicationInstancesResponse' {} a -> s {applicationInstances = a} :: ListApplicationInstancesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A pagination token that\'s included if more results are available.
+listApplicationInstancesResponse_nextToken :: Lens.Lens' ListApplicationInstancesResponse (Prelude.Maybe Prelude.Text)
+listApplicationInstancesResponse_nextToken = Lens.lens (\ListApplicationInstancesResponse' {nextToken} -> nextToken) (\s@ListApplicationInstancesResponse' {} a -> s {nextToken = a} :: ListApplicationInstancesResponse)
+
+-- | The response's http status code.
+listApplicationInstancesResponse_httpStatus :: Lens.Lens' ListApplicationInstancesResponse Prelude.Int
+listApplicationInstancesResponse_httpStatus = Lens.lens (\ListApplicationInstancesResponse' {httpStatus} -> httpStatus) (\s@ListApplicationInstancesResponse' {} a -> s {httpStatus = a} :: ListApplicationInstancesResponse)
+
+instance
+  Prelude.NFData
+    ListApplicationInstancesResponse
+  where
+  rnf ListApplicationInstancesResponse' {..} =
+    Prelude.rnf applicationInstances
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/ListDevices.hs b/gen/Amazonka/Panorama/ListDevices.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListDevices.hs
@@ -0,0 +1,244 @@
+{-# 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.Panorama.ListDevices
+-- 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 devices.
+module Amazonka.Panorama.ListDevices
+  ( -- * Creating a Request
+    ListDevices (..),
+    newListDevices,
+
+    -- * Request Lenses
+    listDevices_deviceAggregatedStatusFilter,
+    listDevices_maxResults,
+    listDevices_nameFilter,
+    listDevices_nextToken,
+    listDevices_sortBy,
+    listDevices_sortOrder,
+
+    -- * Destructuring the Response
+    ListDevicesResponse (..),
+    newListDevicesResponse,
+
+    -- * Response Lenses
+    listDevicesResponse_nextToken,
+    listDevicesResponse_httpStatus,
+    listDevicesResponse_devices,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDevices' smart constructor.
+data ListDevices = ListDevices'
+  { -- | Filter based on a device\'s status.
+    deviceAggregatedStatusFilter :: Prelude.Maybe DeviceAggregatedStatus,
+    -- | The maximum number of devices to return in one page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Filter based on device\'s name. Prefixes supported.
+    nameFilter :: Prelude.Maybe Prelude.Text,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The target column to be sorted on. Default column sort is CREATED_TIME.
+    sortBy :: Prelude.Maybe ListDevicesSortBy,
+    -- | The sorting order for the returned list. SortOrder is DESCENDING by
+    -- default based on CREATED_TIME. Otherwise, SortOrder is ASCENDING.
+    sortOrder :: Prelude.Maybe SortOrder
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDevices' 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:
+--
+-- 'deviceAggregatedStatusFilter', 'listDevices_deviceAggregatedStatusFilter' - Filter based on a device\'s status.
+--
+-- 'maxResults', 'listDevices_maxResults' - The maximum number of devices to return in one page of results.
+--
+-- 'nameFilter', 'listDevices_nameFilter' - Filter based on device\'s name. Prefixes supported.
+--
+-- 'nextToken', 'listDevices_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+--
+-- 'sortBy', 'listDevices_sortBy' - The target column to be sorted on. Default column sort is CREATED_TIME.
+--
+-- 'sortOrder', 'listDevices_sortOrder' - The sorting order for the returned list. SortOrder is DESCENDING by
+-- default based on CREATED_TIME. Otherwise, SortOrder is ASCENDING.
+newListDevices ::
+  ListDevices
+newListDevices =
+  ListDevices'
+    { deviceAggregatedStatusFilter =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nameFilter = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      sortBy = Prelude.Nothing,
+      sortOrder = Prelude.Nothing
+    }
+
+-- | Filter based on a device\'s status.
+listDevices_deviceAggregatedStatusFilter :: Lens.Lens' ListDevices (Prelude.Maybe DeviceAggregatedStatus)
+listDevices_deviceAggregatedStatusFilter = Lens.lens (\ListDevices' {deviceAggregatedStatusFilter} -> deviceAggregatedStatusFilter) (\s@ListDevices' {} a -> s {deviceAggregatedStatusFilter = a} :: ListDevices)
+
+-- | The maximum number of devices to return in one page of results.
+listDevices_maxResults :: Lens.Lens' ListDevices (Prelude.Maybe Prelude.Natural)
+listDevices_maxResults = Lens.lens (\ListDevices' {maxResults} -> maxResults) (\s@ListDevices' {} a -> s {maxResults = a} :: ListDevices)
+
+-- | Filter based on device\'s name. Prefixes supported.
+listDevices_nameFilter :: Lens.Lens' ListDevices (Prelude.Maybe Prelude.Text)
+listDevices_nameFilter = Lens.lens (\ListDevices' {nameFilter} -> nameFilter) (\s@ListDevices' {} a -> s {nameFilter = a} :: ListDevices)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listDevices_nextToken :: Lens.Lens' ListDevices (Prelude.Maybe Prelude.Text)
+listDevices_nextToken = Lens.lens (\ListDevices' {nextToken} -> nextToken) (\s@ListDevices' {} a -> s {nextToken = a} :: ListDevices)
+
+-- | The target column to be sorted on. Default column sort is CREATED_TIME.
+listDevices_sortBy :: Lens.Lens' ListDevices (Prelude.Maybe ListDevicesSortBy)
+listDevices_sortBy = Lens.lens (\ListDevices' {sortBy} -> sortBy) (\s@ListDevices' {} a -> s {sortBy = a} :: ListDevices)
+
+-- | The sorting order for the returned list. SortOrder is DESCENDING by
+-- default based on CREATED_TIME. Otherwise, SortOrder is ASCENDING.
+listDevices_sortOrder :: Lens.Lens' ListDevices (Prelude.Maybe SortOrder)
+listDevices_sortOrder = Lens.lens (\ListDevices' {sortOrder} -> sortOrder) (\s@ListDevices' {} a -> s {sortOrder = a} :: ListDevices)
+
+instance Core.AWSRequest ListDevices where
+  type AWSResponse ListDevices = ListDevicesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDevicesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Devices" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListDevices where
+  hashWithSalt _salt ListDevices' {..} =
+    _salt
+      `Prelude.hashWithSalt` deviceAggregatedStatusFilter
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nameFilter
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` sortBy
+      `Prelude.hashWithSalt` sortOrder
+
+instance Prelude.NFData ListDevices where
+  rnf ListDevices' {..} =
+    Prelude.rnf deviceAggregatedStatusFilter
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nameFilter
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf sortBy
+      `Prelude.seq` Prelude.rnf sortOrder
+
+instance Data.ToHeaders ListDevices where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListDevices where
+  toPath = Prelude.const "/devices"
+
+instance Data.ToQuery ListDevices where
+  toQuery ListDevices' {..} =
+    Prelude.mconcat
+      [ "DeviceAggregatedStatusFilter"
+          Data.=: deviceAggregatedStatusFilter,
+        "MaxResults" Data.=: maxResults,
+        "NameFilter" Data.=: nameFilter,
+        "NextToken" Data.=: nextToken,
+        "SortBy" Data.=: sortBy,
+        "SortOrder" Data.=: sortOrder
+      ]
+
+-- | /See:/ 'newListDevicesResponse' smart constructor.
+data ListDevicesResponse = ListDevicesResponse'
+  { -- | A pagination token that\'s included if more results are available.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of devices.
+    devices :: [Device]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDevicesResponse' 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', 'listDevicesResponse_nextToken' - A pagination token that\'s included if more results are available.
+--
+-- 'httpStatus', 'listDevicesResponse_httpStatus' - The response's http status code.
+--
+-- 'devices', 'listDevicesResponse_devices' - A list of devices.
+newListDevicesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDevicesResponse
+newListDevicesResponse pHttpStatus_ =
+  ListDevicesResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      devices = Prelude.mempty
+    }
+
+-- | A pagination token that\'s included if more results are available.
+listDevicesResponse_nextToken :: Lens.Lens' ListDevicesResponse (Prelude.Maybe Prelude.Text)
+listDevicesResponse_nextToken = Lens.lens (\ListDevicesResponse' {nextToken} -> nextToken) (\s@ListDevicesResponse' {} a -> s {nextToken = a} :: ListDevicesResponse)
+
+-- | The response's http status code.
+listDevicesResponse_httpStatus :: Lens.Lens' ListDevicesResponse Prelude.Int
+listDevicesResponse_httpStatus = Lens.lens (\ListDevicesResponse' {httpStatus} -> httpStatus) (\s@ListDevicesResponse' {} a -> s {httpStatus = a} :: ListDevicesResponse)
+
+-- | A list of devices.
+listDevicesResponse_devices :: Lens.Lens' ListDevicesResponse [Device]
+listDevicesResponse_devices = Lens.lens (\ListDevicesResponse' {devices} -> devices) (\s@ListDevicesResponse' {} a -> s {devices = a} :: ListDevicesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListDevicesResponse where
+  rnf ListDevicesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf devices
diff --git a/gen/Amazonka/Panorama/ListDevicesJobs.hs b/gen/Amazonka/Panorama/ListDevicesJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListDevicesJobs.hs
@@ -0,0 +1,203 @@
+{-# 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.Panorama.ListDevicesJobs
+-- 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 jobs.
+module Amazonka.Panorama.ListDevicesJobs
+  ( -- * Creating a Request
+    ListDevicesJobs (..),
+    newListDevicesJobs,
+
+    -- * Request Lenses
+    listDevicesJobs_deviceId,
+    listDevicesJobs_maxResults,
+    listDevicesJobs_nextToken,
+
+    -- * Destructuring the Response
+    ListDevicesJobsResponse (..),
+    newListDevicesJobsResponse,
+
+    -- * Response Lenses
+    listDevicesJobsResponse_deviceJobs,
+    listDevicesJobsResponse_nextToken,
+    listDevicesJobsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDevicesJobs' smart constructor.
+data ListDevicesJobs = ListDevicesJobs'
+  { -- | Filter results by the job\'s target device ID.
+    deviceId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of device jobs to return in one page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDevicesJobs' 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:
+--
+-- 'deviceId', 'listDevicesJobs_deviceId' - Filter results by the job\'s target device ID.
+--
+-- 'maxResults', 'listDevicesJobs_maxResults' - The maximum number of device jobs to return in one page of results.
+--
+-- 'nextToken', 'listDevicesJobs_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+newListDevicesJobs ::
+  ListDevicesJobs
+newListDevicesJobs =
+  ListDevicesJobs'
+    { deviceId = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | Filter results by the job\'s target device ID.
+listDevicesJobs_deviceId :: Lens.Lens' ListDevicesJobs (Prelude.Maybe Prelude.Text)
+listDevicesJobs_deviceId = Lens.lens (\ListDevicesJobs' {deviceId} -> deviceId) (\s@ListDevicesJobs' {} a -> s {deviceId = a} :: ListDevicesJobs)
+
+-- | The maximum number of device jobs to return in one page of results.
+listDevicesJobs_maxResults :: Lens.Lens' ListDevicesJobs (Prelude.Maybe Prelude.Natural)
+listDevicesJobs_maxResults = Lens.lens (\ListDevicesJobs' {maxResults} -> maxResults) (\s@ListDevicesJobs' {} a -> s {maxResults = a} :: ListDevicesJobs)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listDevicesJobs_nextToken :: Lens.Lens' ListDevicesJobs (Prelude.Maybe Prelude.Text)
+listDevicesJobs_nextToken = Lens.lens (\ListDevicesJobs' {nextToken} -> nextToken) (\s@ListDevicesJobs' {} a -> s {nextToken = a} :: ListDevicesJobs)
+
+instance Core.AWSRequest ListDevicesJobs where
+  type
+    AWSResponse ListDevicesJobs =
+      ListDevicesJobsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDevicesJobsResponse'
+            Prelude.<$> (x Data..?> "DeviceJobs" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDevicesJobs where
+  hashWithSalt _salt ListDevicesJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` deviceId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListDevicesJobs where
+  rnf ListDevicesJobs' {..} =
+    Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListDevicesJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListDevicesJobs where
+  toPath = Prelude.const "/jobs"
+
+instance Data.ToQuery ListDevicesJobs where
+  toQuery ListDevicesJobs' {..} =
+    Prelude.mconcat
+      [ "DeviceId" Data.=: deviceId,
+        "MaxResults" Data.=: maxResults,
+        "NextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListDevicesJobsResponse' smart constructor.
+data ListDevicesJobsResponse = ListDevicesJobsResponse'
+  { -- | A list of jobs.
+    deviceJobs :: Prelude.Maybe [DeviceJob],
+    -- | A pagination token that\'s included if more results are available.
+    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 'ListDevicesJobsResponse' 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:
+--
+-- 'deviceJobs', 'listDevicesJobsResponse_deviceJobs' - A list of jobs.
+--
+-- 'nextToken', 'listDevicesJobsResponse_nextToken' - A pagination token that\'s included if more results are available.
+--
+-- 'httpStatus', 'listDevicesJobsResponse_httpStatus' - The response's http status code.
+newListDevicesJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDevicesJobsResponse
+newListDevicesJobsResponse pHttpStatus_ =
+  ListDevicesJobsResponse'
+    { deviceJobs =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of jobs.
+listDevicesJobsResponse_deviceJobs :: Lens.Lens' ListDevicesJobsResponse (Prelude.Maybe [DeviceJob])
+listDevicesJobsResponse_deviceJobs = Lens.lens (\ListDevicesJobsResponse' {deviceJobs} -> deviceJobs) (\s@ListDevicesJobsResponse' {} a -> s {deviceJobs = a} :: ListDevicesJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A pagination token that\'s included if more results are available.
+listDevicesJobsResponse_nextToken :: Lens.Lens' ListDevicesJobsResponse (Prelude.Maybe Prelude.Text)
+listDevicesJobsResponse_nextToken = Lens.lens (\ListDevicesJobsResponse' {nextToken} -> nextToken) (\s@ListDevicesJobsResponse' {} a -> s {nextToken = a} :: ListDevicesJobsResponse)
+
+-- | The response's http status code.
+listDevicesJobsResponse_httpStatus :: Lens.Lens' ListDevicesJobsResponse Prelude.Int
+listDevicesJobsResponse_httpStatus = Lens.lens (\ListDevicesJobsResponse' {httpStatus} -> httpStatus) (\s@ListDevicesJobsResponse' {} a -> s {httpStatus = a} :: ListDevicesJobsResponse)
+
+instance Prelude.NFData ListDevicesJobsResponse where
+  rnf ListDevicesJobsResponse' {..} =
+    Prelude.rnf deviceJobs
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/ListNodeFromTemplateJobs.hs b/gen/Amazonka/Panorama/ListNodeFromTemplateJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListNodeFromTemplateJobs.hs
@@ -0,0 +1,200 @@
+{-# 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.Panorama.ListNodeFromTemplateJobs
+-- 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 camera stream node jobs.
+module Amazonka.Panorama.ListNodeFromTemplateJobs
+  ( -- * Creating a Request
+    ListNodeFromTemplateJobs (..),
+    newListNodeFromTemplateJobs,
+
+    -- * Request Lenses
+    listNodeFromTemplateJobs_maxResults,
+    listNodeFromTemplateJobs_nextToken,
+
+    -- * Destructuring the Response
+    ListNodeFromTemplateJobsResponse (..),
+    newListNodeFromTemplateJobsResponse,
+
+    -- * Response Lenses
+    listNodeFromTemplateJobsResponse_nextToken,
+    listNodeFromTemplateJobsResponse_httpStatus,
+    listNodeFromTemplateJobsResponse_nodeFromTemplateJobs,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListNodeFromTemplateJobs' smart constructor.
+data ListNodeFromTemplateJobs = ListNodeFromTemplateJobs'
+  { -- | The maximum number of node from template jobs to return in one page of
+    -- results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListNodeFromTemplateJobs' 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', 'listNodeFromTemplateJobs_maxResults' - The maximum number of node from template jobs to return in one page of
+-- results.
+--
+-- 'nextToken', 'listNodeFromTemplateJobs_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+newListNodeFromTemplateJobs ::
+  ListNodeFromTemplateJobs
+newListNodeFromTemplateJobs =
+  ListNodeFromTemplateJobs'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of node from template jobs to return in one page of
+-- results.
+listNodeFromTemplateJobs_maxResults :: Lens.Lens' ListNodeFromTemplateJobs (Prelude.Maybe Prelude.Natural)
+listNodeFromTemplateJobs_maxResults = Lens.lens (\ListNodeFromTemplateJobs' {maxResults} -> maxResults) (\s@ListNodeFromTemplateJobs' {} a -> s {maxResults = a} :: ListNodeFromTemplateJobs)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listNodeFromTemplateJobs_nextToken :: Lens.Lens' ListNodeFromTemplateJobs (Prelude.Maybe Prelude.Text)
+listNodeFromTemplateJobs_nextToken = Lens.lens (\ListNodeFromTemplateJobs' {nextToken} -> nextToken) (\s@ListNodeFromTemplateJobs' {} a -> s {nextToken = a} :: ListNodeFromTemplateJobs)
+
+instance Core.AWSRequest ListNodeFromTemplateJobs where
+  type
+    AWSResponse ListNodeFromTemplateJobs =
+      ListNodeFromTemplateJobsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListNodeFromTemplateJobsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "NodeFromTemplateJobs"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListNodeFromTemplateJobs where
+  hashWithSalt _salt ListNodeFromTemplateJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListNodeFromTemplateJobs where
+  rnf ListNodeFromTemplateJobs' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListNodeFromTemplateJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListNodeFromTemplateJobs where
+  toPath = Prelude.const "/packages/template-job"
+
+instance Data.ToQuery ListNodeFromTemplateJobs where
+  toQuery ListNodeFromTemplateJobs' {..} =
+    Prelude.mconcat
+      [ "MaxResults" Data.=: maxResults,
+        "NextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListNodeFromTemplateJobsResponse' smart constructor.
+data ListNodeFromTemplateJobsResponse = ListNodeFromTemplateJobsResponse'
+  { -- | A pagination token that\'s included if more results are available.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of jobs.
+    nodeFromTemplateJobs :: [NodeFromTemplateJob]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListNodeFromTemplateJobsResponse' 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', 'listNodeFromTemplateJobsResponse_nextToken' - A pagination token that\'s included if more results are available.
+--
+-- 'httpStatus', 'listNodeFromTemplateJobsResponse_httpStatus' - The response's http status code.
+--
+-- 'nodeFromTemplateJobs', 'listNodeFromTemplateJobsResponse_nodeFromTemplateJobs' - A list of jobs.
+newListNodeFromTemplateJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListNodeFromTemplateJobsResponse
+newListNodeFromTemplateJobsResponse pHttpStatus_ =
+  ListNodeFromTemplateJobsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      nodeFromTemplateJobs = Prelude.mempty
+    }
+
+-- | A pagination token that\'s included if more results are available.
+listNodeFromTemplateJobsResponse_nextToken :: Lens.Lens' ListNodeFromTemplateJobsResponse (Prelude.Maybe Prelude.Text)
+listNodeFromTemplateJobsResponse_nextToken = Lens.lens (\ListNodeFromTemplateJobsResponse' {nextToken} -> nextToken) (\s@ListNodeFromTemplateJobsResponse' {} a -> s {nextToken = a} :: ListNodeFromTemplateJobsResponse)
+
+-- | The response's http status code.
+listNodeFromTemplateJobsResponse_httpStatus :: Lens.Lens' ListNodeFromTemplateJobsResponse Prelude.Int
+listNodeFromTemplateJobsResponse_httpStatus = Lens.lens (\ListNodeFromTemplateJobsResponse' {httpStatus} -> httpStatus) (\s@ListNodeFromTemplateJobsResponse' {} a -> s {httpStatus = a} :: ListNodeFromTemplateJobsResponse)
+
+-- | A list of jobs.
+listNodeFromTemplateJobsResponse_nodeFromTemplateJobs :: Lens.Lens' ListNodeFromTemplateJobsResponse [NodeFromTemplateJob]
+listNodeFromTemplateJobsResponse_nodeFromTemplateJobs = Lens.lens (\ListNodeFromTemplateJobsResponse' {nodeFromTemplateJobs} -> nodeFromTemplateJobs) (\s@ListNodeFromTemplateJobsResponse' {} a -> s {nodeFromTemplateJobs = a} :: ListNodeFromTemplateJobsResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    ListNodeFromTemplateJobsResponse
+  where
+  rnf ListNodeFromTemplateJobsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf nodeFromTemplateJobs
diff --git a/gen/Amazonka/Panorama/ListNodes.hs b/gen/Amazonka/Panorama/ListNodes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListNodes.hs
@@ -0,0 +1,252 @@
+{-# 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.Panorama.ListNodes
+-- 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 nodes.
+module Amazonka.Panorama.ListNodes
+  ( -- * Creating a Request
+    ListNodes (..),
+    newListNodes,
+
+    -- * Request Lenses
+    listNodes_category,
+    listNodes_maxResults,
+    listNodes_nextToken,
+    listNodes_ownerAccount,
+    listNodes_packageName,
+    listNodes_packageVersion,
+    listNodes_patchVersion,
+
+    -- * Destructuring the Response
+    ListNodesResponse (..),
+    newListNodesResponse,
+
+    -- * Response Lenses
+    listNodesResponse_nextToken,
+    listNodesResponse_nodes,
+    listNodesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListNodes' smart constructor.
+data ListNodes = ListNodes'
+  { -- | Search for nodes by category.
+    category :: Prelude.Maybe NodeCategory,
+    -- | The maximum number of nodes to return in one page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Search for nodes by the account ID of the nodes\' owner.
+    ownerAccount :: Prelude.Maybe Prelude.Text,
+    -- | Search for nodes by name.
+    packageName :: Prelude.Maybe Prelude.Text,
+    -- | Search for nodes by version.
+    packageVersion :: Prelude.Maybe Prelude.Text,
+    -- | Search for nodes by patch version.
+    patchVersion :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListNodes' 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:
+--
+-- 'category', 'listNodes_category' - Search for nodes by category.
+--
+-- 'maxResults', 'listNodes_maxResults' - The maximum number of nodes to return in one page of results.
+--
+-- 'nextToken', 'listNodes_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+--
+-- 'ownerAccount', 'listNodes_ownerAccount' - Search for nodes by the account ID of the nodes\' owner.
+--
+-- 'packageName', 'listNodes_packageName' - Search for nodes by name.
+--
+-- 'packageVersion', 'listNodes_packageVersion' - Search for nodes by version.
+--
+-- 'patchVersion', 'listNodes_patchVersion' - Search for nodes by patch version.
+newListNodes ::
+  ListNodes
+newListNodes =
+  ListNodes'
+    { category = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      ownerAccount = Prelude.Nothing,
+      packageName = Prelude.Nothing,
+      packageVersion = Prelude.Nothing,
+      patchVersion = Prelude.Nothing
+    }
+
+-- | Search for nodes by category.
+listNodes_category :: Lens.Lens' ListNodes (Prelude.Maybe NodeCategory)
+listNodes_category = Lens.lens (\ListNodes' {category} -> category) (\s@ListNodes' {} a -> s {category = a} :: ListNodes)
+
+-- | The maximum number of nodes to return in one page of results.
+listNodes_maxResults :: Lens.Lens' ListNodes (Prelude.Maybe Prelude.Natural)
+listNodes_maxResults = Lens.lens (\ListNodes' {maxResults} -> maxResults) (\s@ListNodes' {} a -> s {maxResults = a} :: ListNodes)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listNodes_nextToken :: Lens.Lens' ListNodes (Prelude.Maybe Prelude.Text)
+listNodes_nextToken = Lens.lens (\ListNodes' {nextToken} -> nextToken) (\s@ListNodes' {} a -> s {nextToken = a} :: ListNodes)
+
+-- | Search for nodes by the account ID of the nodes\' owner.
+listNodes_ownerAccount :: Lens.Lens' ListNodes (Prelude.Maybe Prelude.Text)
+listNodes_ownerAccount = Lens.lens (\ListNodes' {ownerAccount} -> ownerAccount) (\s@ListNodes' {} a -> s {ownerAccount = a} :: ListNodes)
+
+-- | Search for nodes by name.
+listNodes_packageName :: Lens.Lens' ListNodes (Prelude.Maybe Prelude.Text)
+listNodes_packageName = Lens.lens (\ListNodes' {packageName} -> packageName) (\s@ListNodes' {} a -> s {packageName = a} :: ListNodes)
+
+-- | Search for nodes by version.
+listNodes_packageVersion :: Lens.Lens' ListNodes (Prelude.Maybe Prelude.Text)
+listNodes_packageVersion = Lens.lens (\ListNodes' {packageVersion} -> packageVersion) (\s@ListNodes' {} a -> s {packageVersion = a} :: ListNodes)
+
+-- | Search for nodes by patch version.
+listNodes_patchVersion :: Lens.Lens' ListNodes (Prelude.Maybe Prelude.Text)
+listNodes_patchVersion = Lens.lens (\ListNodes' {patchVersion} -> patchVersion) (\s@ListNodes' {} a -> s {patchVersion = a} :: ListNodes)
+
+instance Core.AWSRequest ListNodes where
+  type AWSResponse ListNodes = ListNodesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListNodesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Nodes" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListNodes where
+  hashWithSalt _salt ListNodes' {..} =
+    _salt
+      `Prelude.hashWithSalt` category
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` ownerAccount
+      `Prelude.hashWithSalt` packageName
+      `Prelude.hashWithSalt` packageVersion
+      `Prelude.hashWithSalt` patchVersion
+
+instance Prelude.NFData ListNodes where
+  rnf ListNodes' {..} =
+    Prelude.rnf category
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf ownerAccount
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf patchVersion
+
+instance Data.ToHeaders ListNodes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListNodes where
+  toPath = Prelude.const "/nodes"
+
+instance Data.ToQuery ListNodes where
+  toQuery ListNodes' {..} =
+    Prelude.mconcat
+      [ "category" Data.=: category,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "ownerAccount" Data.=: ownerAccount,
+        "packageName" Data.=: packageName,
+        "packageVersion" Data.=: packageVersion,
+        "patchVersion" Data.=: patchVersion
+      ]
+
+-- | /See:/ 'newListNodesResponse' smart constructor.
+data ListNodesResponse = ListNodesResponse'
+  { -- | A pagination token that\'s included if more results are available.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of nodes.
+    nodes :: Prelude.Maybe [Node],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListNodesResponse' 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', 'listNodesResponse_nextToken' - A pagination token that\'s included if more results are available.
+--
+-- 'nodes', 'listNodesResponse_nodes' - A list of nodes.
+--
+-- 'httpStatus', 'listNodesResponse_httpStatus' - The response's http status code.
+newListNodesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListNodesResponse
+newListNodesResponse pHttpStatus_ =
+  ListNodesResponse'
+    { nextToken = Prelude.Nothing,
+      nodes = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A pagination token that\'s included if more results are available.
+listNodesResponse_nextToken :: Lens.Lens' ListNodesResponse (Prelude.Maybe Prelude.Text)
+listNodesResponse_nextToken = Lens.lens (\ListNodesResponse' {nextToken} -> nextToken) (\s@ListNodesResponse' {} a -> s {nextToken = a} :: ListNodesResponse)
+
+-- | A list of nodes.
+listNodesResponse_nodes :: Lens.Lens' ListNodesResponse (Prelude.Maybe [Node])
+listNodesResponse_nodes = Lens.lens (\ListNodesResponse' {nodes} -> nodes) (\s@ListNodesResponse' {} a -> s {nodes = a} :: ListNodesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listNodesResponse_httpStatus :: Lens.Lens' ListNodesResponse Prelude.Int
+listNodesResponse_httpStatus = Lens.lens (\ListNodesResponse' {httpStatus} -> httpStatus) (\s@ListNodesResponse' {} a -> s {httpStatus = a} :: ListNodesResponse)
+
+instance Prelude.NFData ListNodesResponse where
+  rnf ListNodesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf nodes
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/ListPackageImportJobs.hs b/gen/Amazonka/Panorama/ListPackageImportJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListPackageImportJobs.hs
@@ -0,0 +1,197 @@
+{-# 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.Panorama.ListPackageImportJobs
+-- 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 package import jobs.
+module Amazonka.Panorama.ListPackageImportJobs
+  ( -- * Creating a Request
+    ListPackageImportJobs (..),
+    newListPackageImportJobs,
+
+    -- * Request Lenses
+    listPackageImportJobs_maxResults,
+    listPackageImportJobs_nextToken,
+
+    -- * Destructuring the Response
+    ListPackageImportJobsResponse (..),
+    newListPackageImportJobsResponse,
+
+    -- * Response Lenses
+    listPackageImportJobsResponse_nextToken,
+    listPackageImportJobsResponse_httpStatus,
+    listPackageImportJobsResponse_packageImportJobs,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListPackageImportJobs' smart constructor.
+data ListPackageImportJobs = ListPackageImportJobs'
+  { -- | The maximum number of package import jobs to return in one page of
+    -- results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPackageImportJobs' 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', 'listPackageImportJobs_maxResults' - The maximum number of package import jobs to return in one page of
+-- results.
+--
+-- 'nextToken', 'listPackageImportJobs_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+newListPackageImportJobs ::
+  ListPackageImportJobs
+newListPackageImportJobs =
+  ListPackageImportJobs'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of package import jobs to return in one page of
+-- results.
+listPackageImportJobs_maxResults :: Lens.Lens' ListPackageImportJobs (Prelude.Maybe Prelude.Natural)
+listPackageImportJobs_maxResults = Lens.lens (\ListPackageImportJobs' {maxResults} -> maxResults) (\s@ListPackageImportJobs' {} a -> s {maxResults = a} :: ListPackageImportJobs)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listPackageImportJobs_nextToken :: Lens.Lens' ListPackageImportJobs (Prelude.Maybe Prelude.Text)
+listPackageImportJobs_nextToken = Lens.lens (\ListPackageImportJobs' {nextToken} -> nextToken) (\s@ListPackageImportJobs' {} a -> s {nextToken = a} :: ListPackageImportJobs)
+
+instance Core.AWSRequest ListPackageImportJobs where
+  type
+    AWSResponse ListPackageImportJobs =
+      ListPackageImportJobsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPackageImportJobsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "PackageImportJobs"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListPackageImportJobs where
+  hashWithSalt _salt ListPackageImportJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListPackageImportJobs where
+  rnf ListPackageImportJobs' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListPackageImportJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListPackageImportJobs where
+  toPath = Prelude.const "/packages/import-jobs"
+
+instance Data.ToQuery ListPackageImportJobs where
+  toQuery ListPackageImportJobs' {..} =
+    Prelude.mconcat
+      [ "MaxResults" Data.=: maxResults,
+        "NextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListPackageImportJobsResponse' smart constructor.
+data ListPackageImportJobsResponse = ListPackageImportJobsResponse'
+  { -- | A pagination token that\'s included if more results are available.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of package import jobs.
+    packageImportJobs :: [PackageImportJob]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPackageImportJobsResponse' 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', 'listPackageImportJobsResponse_nextToken' - A pagination token that\'s included if more results are available.
+--
+-- 'httpStatus', 'listPackageImportJobsResponse_httpStatus' - The response's http status code.
+--
+-- 'packageImportJobs', 'listPackageImportJobsResponse_packageImportJobs' - A list of package import jobs.
+newListPackageImportJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPackageImportJobsResponse
+newListPackageImportJobsResponse pHttpStatus_ =
+  ListPackageImportJobsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      packageImportJobs = Prelude.mempty
+    }
+
+-- | A pagination token that\'s included if more results are available.
+listPackageImportJobsResponse_nextToken :: Lens.Lens' ListPackageImportJobsResponse (Prelude.Maybe Prelude.Text)
+listPackageImportJobsResponse_nextToken = Lens.lens (\ListPackageImportJobsResponse' {nextToken} -> nextToken) (\s@ListPackageImportJobsResponse' {} a -> s {nextToken = a} :: ListPackageImportJobsResponse)
+
+-- | The response's http status code.
+listPackageImportJobsResponse_httpStatus :: Lens.Lens' ListPackageImportJobsResponse Prelude.Int
+listPackageImportJobsResponse_httpStatus = Lens.lens (\ListPackageImportJobsResponse' {httpStatus} -> httpStatus) (\s@ListPackageImportJobsResponse' {} a -> s {httpStatus = a} :: ListPackageImportJobsResponse)
+
+-- | A list of package import jobs.
+listPackageImportJobsResponse_packageImportJobs :: Lens.Lens' ListPackageImportJobsResponse [PackageImportJob]
+listPackageImportJobsResponse_packageImportJobs = Lens.lens (\ListPackageImportJobsResponse' {packageImportJobs} -> packageImportJobs) (\s@ListPackageImportJobsResponse' {} a -> s {packageImportJobs = a} :: ListPackageImportJobsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListPackageImportJobsResponse where
+  rnf ListPackageImportJobsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf packageImportJobs
diff --git a/gen/Amazonka/Panorama/ListPackages.hs b/gen/Amazonka/Panorama/ListPackages.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListPackages.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.Panorama.ListPackages
+-- 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 packages.
+module Amazonka.Panorama.ListPackages
+  ( -- * Creating a Request
+    ListPackages (..),
+    newListPackages,
+
+    -- * Request Lenses
+    listPackages_maxResults,
+    listPackages_nextToken,
+
+    -- * Destructuring the Response
+    ListPackagesResponse (..),
+    newListPackagesResponse,
+
+    -- * Response Lenses
+    listPackagesResponse_nextToken,
+    listPackagesResponse_packages,
+    listPackagesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListPackages' smart constructor.
+data ListPackages = ListPackages'
+  { -- | The maximum number of packages to return in one page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPackages' 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', 'listPackages_maxResults' - The maximum number of packages to return in one page of results.
+--
+-- 'nextToken', 'listPackages_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+newListPackages ::
+  ListPackages
+newListPackages =
+  ListPackages'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of packages to return in one page of results.
+listPackages_maxResults :: Lens.Lens' ListPackages (Prelude.Maybe Prelude.Natural)
+listPackages_maxResults = Lens.lens (\ListPackages' {maxResults} -> maxResults) (\s@ListPackages' {} a -> s {maxResults = a} :: ListPackages)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listPackages_nextToken :: Lens.Lens' ListPackages (Prelude.Maybe Prelude.Text)
+listPackages_nextToken = Lens.lens (\ListPackages' {nextToken} -> nextToken) (\s@ListPackages' {} a -> s {nextToken = a} :: ListPackages)
+
+instance Core.AWSRequest ListPackages where
+  type AWSResponse ListPackages = ListPackagesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPackagesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Packages" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListPackages where
+  hashWithSalt _salt ListPackages' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListPackages where
+  rnf ListPackages' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListPackages where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListPackages where
+  toPath = Prelude.const "/packages"
+
+instance Data.ToQuery ListPackages where
+  toQuery ListPackages' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListPackagesResponse' smart constructor.
+data ListPackagesResponse = ListPackagesResponse'
+  { -- | A pagination token that\'s included if more results are available.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of packages.
+    packages :: Prelude.Maybe [PackageListItem],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPackagesResponse' 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', 'listPackagesResponse_nextToken' - A pagination token that\'s included if more results are available.
+--
+-- 'packages', 'listPackagesResponse_packages' - A list of packages.
+--
+-- 'httpStatus', 'listPackagesResponse_httpStatus' - The response's http status code.
+newListPackagesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPackagesResponse
+newListPackagesResponse pHttpStatus_ =
+  ListPackagesResponse'
+    { nextToken = Prelude.Nothing,
+      packages = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A pagination token that\'s included if more results are available.
+listPackagesResponse_nextToken :: Lens.Lens' ListPackagesResponse (Prelude.Maybe Prelude.Text)
+listPackagesResponse_nextToken = Lens.lens (\ListPackagesResponse' {nextToken} -> nextToken) (\s@ListPackagesResponse' {} a -> s {nextToken = a} :: ListPackagesResponse)
+
+-- | A list of packages.
+listPackagesResponse_packages :: Lens.Lens' ListPackagesResponse (Prelude.Maybe [PackageListItem])
+listPackagesResponse_packages = Lens.lens (\ListPackagesResponse' {packages} -> packages) (\s@ListPackagesResponse' {} a -> s {packages = a} :: ListPackagesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listPackagesResponse_httpStatus :: Lens.Lens' ListPackagesResponse Prelude.Int
+listPackagesResponse_httpStatus = Lens.lens (\ListPackagesResponse' {httpStatus} -> httpStatus) (\s@ListPackagesResponse' {} a -> s {httpStatus = a} :: ListPackagesResponse)
+
+instance Prelude.NFData ListPackagesResponse where
+  rnf ListPackagesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf packages
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/ListTagsForResource.hs b/gen/Amazonka/Panorama/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ListTagsForResource.hs
@@ -0,0 +1,159 @@
+{-# 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.Panorama.ListTagsForResource
+-- 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 tags for a resource.
+module Amazonka.Panorama.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The resource\'s ARN.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' 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:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The resource\'s ARN.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The resource\'s ARN.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath ListTagsForResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | A list of tags.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' 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:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - A list of tags.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of tags.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/ProvisionDevice.hs b/gen/Amazonka/Panorama/ProvisionDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/ProvisionDevice.hs
@@ -0,0 +1,277 @@
+{-# 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.Panorama.ProvisionDevice
+-- 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 device and returns a configuration archive. The configuration
+-- archive is a ZIP file that contains a provisioning certificate that is
+-- valid for 5 minutes. Name the configuration archive
+-- @certificates-omni_@/@device-name@/@.zip@ and transfer it to the device
+-- within 5 minutes. Use the included USB storage device and connect it to
+-- the USB 3.0 port next to the HDMI output.
+module Amazonka.Panorama.ProvisionDevice
+  ( -- * Creating a Request
+    ProvisionDevice (..),
+    newProvisionDevice,
+
+    -- * Request Lenses
+    provisionDevice_description,
+    provisionDevice_networkingConfiguration,
+    provisionDevice_tags,
+    provisionDevice_name,
+
+    -- * Destructuring the Response
+    ProvisionDeviceResponse (..),
+    newProvisionDeviceResponse,
+
+    -- * Response Lenses
+    provisionDeviceResponse_certificates,
+    provisionDeviceResponse_deviceId,
+    provisionDeviceResponse_iotThingName,
+    provisionDeviceResponse_httpStatus,
+    provisionDeviceResponse_arn,
+    provisionDeviceResponse_status,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newProvisionDevice' smart constructor.
+data ProvisionDevice = ProvisionDevice'
+  { -- | A description for the device.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | A networking configuration for the device.
+    networkingConfiguration :: Prelude.Maybe NetworkPayload,
+    -- | Tags for the device.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A name for the device.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProvisionDevice' 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', 'provisionDevice_description' - A description for the device.
+--
+-- 'networkingConfiguration', 'provisionDevice_networkingConfiguration' - A networking configuration for the device.
+--
+-- 'tags', 'provisionDevice_tags' - Tags for the device.
+--
+-- 'name', 'provisionDevice_name' - A name for the device.
+newProvisionDevice ::
+  -- | 'name'
+  Prelude.Text ->
+  ProvisionDevice
+newProvisionDevice pName_ =
+  ProvisionDevice'
+    { description = Prelude.Nothing,
+      networkingConfiguration = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | A description for the device.
+provisionDevice_description :: Lens.Lens' ProvisionDevice (Prelude.Maybe Prelude.Text)
+provisionDevice_description = Lens.lens (\ProvisionDevice' {description} -> description) (\s@ProvisionDevice' {} a -> s {description = a} :: ProvisionDevice)
+
+-- | A networking configuration for the device.
+provisionDevice_networkingConfiguration :: Lens.Lens' ProvisionDevice (Prelude.Maybe NetworkPayload)
+provisionDevice_networkingConfiguration = Lens.lens (\ProvisionDevice' {networkingConfiguration} -> networkingConfiguration) (\s@ProvisionDevice' {} a -> s {networkingConfiguration = a} :: ProvisionDevice)
+
+-- | Tags for the device.
+provisionDevice_tags :: Lens.Lens' ProvisionDevice (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+provisionDevice_tags = Lens.lens (\ProvisionDevice' {tags} -> tags) (\s@ProvisionDevice' {} a -> s {tags = a} :: ProvisionDevice) Prelude.. Lens.mapping Lens.coerced
+
+-- | A name for the device.
+provisionDevice_name :: Lens.Lens' ProvisionDevice Prelude.Text
+provisionDevice_name = Lens.lens (\ProvisionDevice' {name} -> name) (\s@ProvisionDevice' {} a -> s {name = a} :: ProvisionDevice)
+
+instance Core.AWSRequest ProvisionDevice where
+  type
+    AWSResponse ProvisionDevice =
+      ProvisionDeviceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ProvisionDeviceResponse'
+            Prelude.<$> (x Data..?> "Certificates")
+            Prelude.<*> (x Data..?> "DeviceId")
+            Prelude.<*> (x Data..?> "IotThingName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "Arn")
+            Prelude.<*> (x Data..:> "Status")
+      )
+
+instance Prelude.Hashable ProvisionDevice where
+  hashWithSalt _salt ProvisionDevice' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` networkingConfiguration
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData ProvisionDevice where
+  rnf ProvisionDevice' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf networkingConfiguration
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToHeaders ProvisionDevice where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ProvisionDevice where
+  toJSON ProvisionDevice' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Description" Data..=) Prelude.<$> description,
+            ("NetworkingConfiguration" Data..=)
+              Prelude.<$> networkingConfiguration,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
+
+instance Data.ToPath ProvisionDevice where
+  toPath = Prelude.const "/devices"
+
+instance Data.ToQuery ProvisionDevice where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newProvisionDeviceResponse' smart constructor.
+data ProvisionDeviceResponse = ProvisionDeviceResponse'
+  { -- | The device\'s configuration bundle.
+    certificates :: Prelude.Maybe Data.Base64,
+    -- | The device\'s ID.
+    deviceId :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s IoT thing name.
+    iotThingName :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The device\'s ARN.
+    arn :: Prelude.Text,
+    -- | The device\'s status.
+    status :: DeviceStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProvisionDeviceResponse' 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:
+--
+-- 'certificates', 'provisionDeviceResponse_certificates' - The device\'s configuration bundle.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+--
+-- 'deviceId', 'provisionDeviceResponse_deviceId' - The device\'s ID.
+--
+-- 'iotThingName', 'provisionDeviceResponse_iotThingName' - The device\'s IoT thing name.
+--
+-- 'httpStatus', 'provisionDeviceResponse_httpStatus' - The response's http status code.
+--
+-- 'arn', 'provisionDeviceResponse_arn' - The device\'s ARN.
+--
+-- 'status', 'provisionDeviceResponse_status' - The device\'s status.
+newProvisionDeviceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'status'
+  DeviceStatus ->
+  ProvisionDeviceResponse
+newProvisionDeviceResponse
+  pHttpStatus_
+  pArn_
+  pStatus_ =
+    ProvisionDeviceResponse'
+      { certificates =
+          Prelude.Nothing,
+        deviceId = Prelude.Nothing,
+        iotThingName = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        arn = pArn_,
+        status = pStatus_
+      }
+
+-- | The device\'s configuration bundle.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+provisionDeviceResponse_certificates :: Lens.Lens' ProvisionDeviceResponse (Prelude.Maybe Prelude.ByteString)
+provisionDeviceResponse_certificates = Lens.lens (\ProvisionDeviceResponse' {certificates} -> certificates) (\s@ProvisionDeviceResponse' {} a -> s {certificates = a} :: ProvisionDeviceResponse) Prelude.. Lens.mapping Data._Base64
+
+-- | The device\'s ID.
+provisionDeviceResponse_deviceId :: Lens.Lens' ProvisionDeviceResponse (Prelude.Maybe Prelude.Text)
+provisionDeviceResponse_deviceId = Lens.lens (\ProvisionDeviceResponse' {deviceId} -> deviceId) (\s@ProvisionDeviceResponse' {} a -> s {deviceId = a} :: ProvisionDeviceResponse)
+
+-- | The device\'s IoT thing name.
+provisionDeviceResponse_iotThingName :: Lens.Lens' ProvisionDeviceResponse (Prelude.Maybe Prelude.Text)
+provisionDeviceResponse_iotThingName = Lens.lens (\ProvisionDeviceResponse' {iotThingName} -> iotThingName) (\s@ProvisionDeviceResponse' {} a -> s {iotThingName = a} :: ProvisionDeviceResponse)
+
+-- | The response's http status code.
+provisionDeviceResponse_httpStatus :: Lens.Lens' ProvisionDeviceResponse Prelude.Int
+provisionDeviceResponse_httpStatus = Lens.lens (\ProvisionDeviceResponse' {httpStatus} -> httpStatus) (\s@ProvisionDeviceResponse' {} a -> s {httpStatus = a} :: ProvisionDeviceResponse)
+
+-- | The device\'s ARN.
+provisionDeviceResponse_arn :: Lens.Lens' ProvisionDeviceResponse Prelude.Text
+provisionDeviceResponse_arn = Lens.lens (\ProvisionDeviceResponse' {arn} -> arn) (\s@ProvisionDeviceResponse' {} a -> s {arn = a} :: ProvisionDeviceResponse)
+
+-- | The device\'s status.
+provisionDeviceResponse_status :: Lens.Lens' ProvisionDeviceResponse DeviceStatus
+provisionDeviceResponse_status = Lens.lens (\ProvisionDeviceResponse' {status} -> status) (\s@ProvisionDeviceResponse' {} a -> s {status = a} :: ProvisionDeviceResponse)
+
+instance Prelude.NFData ProvisionDeviceResponse where
+  rnf ProvisionDeviceResponse' {..} =
+    Prelude.rnf certificates
+      `Prelude.seq` Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf iotThingName
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Panorama/RegisterPackageVersion.hs b/gen/Amazonka/Panorama/RegisterPackageVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/RegisterPackageVersion.hs
@@ -0,0 +1,225 @@
+{-# 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.Panorama.RegisterPackageVersion
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Registers a package version.
+module Amazonka.Panorama.RegisterPackageVersion
+  ( -- * Creating a Request
+    RegisterPackageVersion (..),
+    newRegisterPackageVersion,
+
+    -- * Request Lenses
+    registerPackageVersion_markLatest,
+    registerPackageVersion_ownerAccount,
+    registerPackageVersion_packageId,
+    registerPackageVersion_packageVersion,
+    registerPackageVersion_patchVersion,
+
+    -- * Destructuring the Response
+    RegisterPackageVersionResponse (..),
+    newRegisterPackageVersionResponse,
+
+    -- * Response Lenses
+    registerPackageVersionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newRegisterPackageVersion' smart constructor.
+data RegisterPackageVersion = RegisterPackageVersion'
+  { -- | Whether to mark the new version as the latest version.
+    markLatest :: Prelude.Maybe Prelude.Bool,
+    -- | An owner account.
+    ownerAccount :: Prelude.Maybe Prelude.Text,
+    -- | A package ID.
+    packageId :: Prelude.Text,
+    -- | A package version.
+    packageVersion :: Prelude.Text,
+    -- | A patch version.
+    patchVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RegisterPackageVersion' 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:
+--
+-- 'markLatest', 'registerPackageVersion_markLatest' - Whether to mark the new version as the latest version.
+--
+-- 'ownerAccount', 'registerPackageVersion_ownerAccount' - An owner account.
+--
+-- 'packageId', 'registerPackageVersion_packageId' - A package ID.
+--
+-- 'packageVersion', 'registerPackageVersion_packageVersion' - A package version.
+--
+-- 'patchVersion', 'registerPackageVersion_patchVersion' - A patch version.
+newRegisterPackageVersion ::
+  -- | 'packageId'
+  Prelude.Text ->
+  -- | 'packageVersion'
+  Prelude.Text ->
+  -- | 'patchVersion'
+  Prelude.Text ->
+  RegisterPackageVersion
+newRegisterPackageVersion
+  pPackageId_
+  pPackageVersion_
+  pPatchVersion_ =
+    RegisterPackageVersion'
+      { markLatest =
+          Prelude.Nothing,
+        ownerAccount = Prelude.Nothing,
+        packageId = pPackageId_,
+        packageVersion = pPackageVersion_,
+        patchVersion = pPatchVersion_
+      }
+
+-- | Whether to mark the new version as the latest version.
+registerPackageVersion_markLatest :: Lens.Lens' RegisterPackageVersion (Prelude.Maybe Prelude.Bool)
+registerPackageVersion_markLatest = Lens.lens (\RegisterPackageVersion' {markLatest} -> markLatest) (\s@RegisterPackageVersion' {} a -> s {markLatest = a} :: RegisterPackageVersion)
+
+-- | An owner account.
+registerPackageVersion_ownerAccount :: Lens.Lens' RegisterPackageVersion (Prelude.Maybe Prelude.Text)
+registerPackageVersion_ownerAccount = Lens.lens (\RegisterPackageVersion' {ownerAccount} -> ownerAccount) (\s@RegisterPackageVersion' {} a -> s {ownerAccount = a} :: RegisterPackageVersion)
+
+-- | A package ID.
+registerPackageVersion_packageId :: Lens.Lens' RegisterPackageVersion Prelude.Text
+registerPackageVersion_packageId = Lens.lens (\RegisterPackageVersion' {packageId} -> packageId) (\s@RegisterPackageVersion' {} a -> s {packageId = a} :: RegisterPackageVersion)
+
+-- | A package version.
+registerPackageVersion_packageVersion :: Lens.Lens' RegisterPackageVersion Prelude.Text
+registerPackageVersion_packageVersion = Lens.lens (\RegisterPackageVersion' {packageVersion} -> packageVersion) (\s@RegisterPackageVersion' {} a -> s {packageVersion = a} :: RegisterPackageVersion)
+
+-- | A patch version.
+registerPackageVersion_patchVersion :: Lens.Lens' RegisterPackageVersion Prelude.Text
+registerPackageVersion_patchVersion = Lens.lens (\RegisterPackageVersion' {patchVersion} -> patchVersion) (\s@RegisterPackageVersion' {} a -> s {patchVersion = a} :: RegisterPackageVersion)
+
+instance Core.AWSRequest RegisterPackageVersion where
+  type
+    AWSResponse RegisterPackageVersion =
+      RegisterPackageVersionResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          RegisterPackageVersionResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RegisterPackageVersion where
+  hashWithSalt _salt RegisterPackageVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` markLatest
+      `Prelude.hashWithSalt` ownerAccount
+      `Prelude.hashWithSalt` packageId
+      `Prelude.hashWithSalt` packageVersion
+      `Prelude.hashWithSalt` patchVersion
+
+instance Prelude.NFData RegisterPackageVersion where
+  rnf RegisterPackageVersion' {..} =
+    Prelude.rnf markLatest
+      `Prelude.seq` Prelude.rnf ownerAccount
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf patchVersion
+
+instance Data.ToHeaders RegisterPackageVersion where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON RegisterPackageVersion where
+  toJSON RegisterPackageVersion' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MarkLatest" Data..=) Prelude.<$> markLatest,
+            ("OwnerAccount" Data..=) Prelude.<$> ownerAccount
+          ]
+      )
+
+instance Data.ToPath RegisterPackageVersion where
+  toPath RegisterPackageVersion' {..} =
+    Prelude.mconcat
+      [ "/packages/",
+        Data.toBS packageId,
+        "/versions/",
+        Data.toBS packageVersion,
+        "/patch/",
+        Data.toBS patchVersion
+      ]
+
+instance Data.ToQuery RegisterPackageVersion where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRegisterPackageVersionResponse' smart constructor.
+data RegisterPackageVersionResponse = RegisterPackageVersionResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RegisterPackageVersionResponse' 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', 'registerPackageVersionResponse_httpStatus' - The response's http status code.
+newRegisterPackageVersionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RegisterPackageVersionResponse
+newRegisterPackageVersionResponse pHttpStatus_ =
+  RegisterPackageVersionResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+registerPackageVersionResponse_httpStatus :: Lens.Lens' RegisterPackageVersionResponse Prelude.Int
+registerPackageVersionResponse_httpStatus = Lens.lens (\RegisterPackageVersionResponse' {httpStatus} -> httpStatus) (\s@RegisterPackageVersionResponse' {} a -> s {httpStatus = a} :: RegisterPackageVersionResponse)
+
+instance
+  Prelude.NFData
+    RegisterPackageVersionResponse
+  where
+  rnf RegisterPackageVersionResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/RemoveApplicationInstance.hs b/gen/Amazonka/Panorama/RemoveApplicationInstance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/RemoveApplicationInstance.hs
@@ -0,0 +1,156 @@
+{-# 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.Panorama.RemoveApplicationInstance
+-- 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 an application instance.
+module Amazonka.Panorama.RemoveApplicationInstance
+  ( -- * Creating a Request
+    RemoveApplicationInstance (..),
+    newRemoveApplicationInstance,
+
+    -- * Request Lenses
+    removeApplicationInstance_applicationInstanceId,
+
+    -- * Destructuring the Response
+    RemoveApplicationInstanceResponse (..),
+    newRemoveApplicationInstanceResponse,
+
+    -- * Response Lenses
+    removeApplicationInstanceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newRemoveApplicationInstance' smart constructor.
+data RemoveApplicationInstance = RemoveApplicationInstance'
+  { -- | An application instance ID.
+    applicationInstanceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemoveApplicationInstance' 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:
+--
+-- 'applicationInstanceId', 'removeApplicationInstance_applicationInstanceId' - An application instance ID.
+newRemoveApplicationInstance ::
+  -- | 'applicationInstanceId'
+  Prelude.Text ->
+  RemoveApplicationInstance
+newRemoveApplicationInstance pApplicationInstanceId_ =
+  RemoveApplicationInstance'
+    { applicationInstanceId =
+        pApplicationInstanceId_
+    }
+
+-- | An application instance ID.
+removeApplicationInstance_applicationInstanceId :: Lens.Lens' RemoveApplicationInstance Prelude.Text
+removeApplicationInstance_applicationInstanceId = Lens.lens (\RemoveApplicationInstance' {applicationInstanceId} -> applicationInstanceId) (\s@RemoveApplicationInstance' {} a -> s {applicationInstanceId = a} :: RemoveApplicationInstance)
+
+instance Core.AWSRequest RemoveApplicationInstance where
+  type
+    AWSResponse RemoveApplicationInstance =
+      RemoveApplicationInstanceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          RemoveApplicationInstanceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RemoveApplicationInstance where
+  hashWithSalt _salt RemoveApplicationInstance' {..} =
+    _salt `Prelude.hashWithSalt` applicationInstanceId
+
+instance Prelude.NFData RemoveApplicationInstance where
+  rnf RemoveApplicationInstance' {..} =
+    Prelude.rnf applicationInstanceId
+
+instance Data.ToHeaders RemoveApplicationInstance where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath RemoveApplicationInstance where
+  toPath RemoveApplicationInstance' {..} =
+    Prelude.mconcat
+      [ "/application-instances/",
+        Data.toBS applicationInstanceId
+      ]
+
+instance Data.ToQuery RemoveApplicationInstance where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newRemoveApplicationInstanceResponse' smart constructor.
+data RemoveApplicationInstanceResponse = RemoveApplicationInstanceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemoveApplicationInstanceResponse' 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', 'removeApplicationInstanceResponse_httpStatus' - The response's http status code.
+newRemoveApplicationInstanceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RemoveApplicationInstanceResponse
+newRemoveApplicationInstanceResponse pHttpStatus_ =
+  RemoveApplicationInstanceResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+removeApplicationInstanceResponse_httpStatus :: Lens.Lens' RemoveApplicationInstanceResponse Prelude.Int
+removeApplicationInstanceResponse_httpStatus = Lens.lens (\RemoveApplicationInstanceResponse' {httpStatus} -> httpStatus) (\s@RemoveApplicationInstanceResponse' {} a -> s {httpStatus = a} :: RemoveApplicationInstanceResponse)
+
+instance
+  Prelude.NFData
+    RemoveApplicationInstanceResponse
+  where
+  rnf RemoveApplicationInstanceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/SignalApplicationInstanceNodeInstances.hs b/gen/Amazonka/Panorama/SignalApplicationInstanceNodeInstances.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/SignalApplicationInstanceNodeInstances.hs
@@ -0,0 +1,224 @@
+{-# 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.Panorama.SignalApplicationInstanceNodeInstances
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Signal camera nodes to stop or resume.
+module Amazonka.Panorama.SignalApplicationInstanceNodeInstances
+  ( -- * Creating a Request
+    SignalApplicationInstanceNodeInstances (..),
+    newSignalApplicationInstanceNodeInstances,
+
+    -- * Request Lenses
+    signalApplicationInstanceNodeInstances_applicationInstanceId,
+    signalApplicationInstanceNodeInstances_nodeSignals,
+
+    -- * Destructuring the Response
+    SignalApplicationInstanceNodeInstancesResponse (..),
+    newSignalApplicationInstanceNodeInstancesResponse,
+
+    -- * Response Lenses
+    signalApplicationInstanceNodeInstancesResponse_httpStatus,
+    signalApplicationInstanceNodeInstancesResponse_applicationInstanceId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newSignalApplicationInstanceNodeInstances' smart constructor.
+data SignalApplicationInstanceNodeInstances = SignalApplicationInstanceNodeInstances'
+  { -- | An application instance ID.
+    applicationInstanceId :: Prelude.Text,
+    -- | A list of signals.
+    nodeSignals :: Prelude.NonEmpty NodeSignal
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SignalApplicationInstanceNodeInstances' 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:
+--
+-- 'applicationInstanceId', 'signalApplicationInstanceNodeInstances_applicationInstanceId' - An application instance ID.
+--
+-- 'nodeSignals', 'signalApplicationInstanceNodeInstances_nodeSignals' - A list of signals.
+newSignalApplicationInstanceNodeInstances ::
+  -- | 'applicationInstanceId'
+  Prelude.Text ->
+  -- | 'nodeSignals'
+  Prelude.NonEmpty NodeSignal ->
+  SignalApplicationInstanceNodeInstances
+newSignalApplicationInstanceNodeInstances
+  pApplicationInstanceId_
+  pNodeSignals_ =
+    SignalApplicationInstanceNodeInstances'
+      { applicationInstanceId =
+          pApplicationInstanceId_,
+        nodeSignals =
+          Lens.coerced Lens.# pNodeSignals_
+      }
+
+-- | An application instance ID.
+signalApplicationInstanceNodeInstances_applicationInstanceId :: Lens.Lens' SignalApplicationInstanceNodeInstances Prelude.Text
+signalApplicationInstanceNodeInstances_applicationInstanceId = Lens.lens (\SignalApplicationInstanceNodeInstances' {applicationInstanceId} -> applicationInstanceId) (\s@SignalApplicationInstanceNodeInstances' {} a -> s {applicationInstanceId = a} :: SignalApplicationInstanceNodeInstances)
+
+-- | A list of signals.
+signalApplicationInstanceNodeInstances_nodeSignals :: Lens.Lens' SignalApplicationInstanceNodeInstances (Prelude.NonEmpty NodeSignal)
+signalApplicationInstanceNodeInstances_nodeSignals = Lens.lens (\SignalApplicationInstanceNodeInstances' {nodeSignals} -> nodeSignals) (\s@SignalApplicationInstanceNodeInstances' {} a -> s {nodeSignals = a} :: SignalApplicationInstanceNodeInstances) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    SignalApplicationInstanceNodeInstances
+  where
+  type
+    AWSResponse
+      SignalApplicationInstanceNodeInstances =
+      SignalApplicationInstanceNodeInstancesResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          SignalApplicationInstanceNodeInstancesResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "ApplicationInstanceId")
+      )
+
+instance
+  Prelude.Hashable
+    SignalApplicationInstanceNodeInstances
+  where
+  hashWithSalt
+    _salt
+    SignalApplicationInstanceNodeInstances' {..} =
+      _salt
+        `Prelude.hashWithSalt` applicationInstanceId
+        `Prelude.hashWithSalt` nodeSignals
+
+instance
+  Prelude.NFData
+    SignalApplicationInstanceNodeInstances
+  where
+  rnf SignalApplicationInstanceNodeInstances' {..} =
+    Prelude.rnf applicationInstanceId
+      `Prelude.seq` Prelude.rnf nodeSignals
+
+instance
+  Data.ToHeaders
+    SignalApplicationInstanceNodeInstances
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    SignalApplicationInstanceNodeInstances
+  where
+  toJSON SignalApplicationInstanceNodeInstances' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("NodeSignals" Data..= nodeSignals)]
+      )
+
+instance
+  Data.ToPath
+    SignalApplicationInstanceNodeInstances
+  where
+  toPath SignalApplicationInstanceNodeInstances' {..} =
+    Prelude.mconcat
+      [ "/application-instances/",
+        Data.toBS applicationInstanceId,
+        "/node-signals"
+      ]
+
+instance
+  Data.ToQuery
+    SignalApplicationInstanceNodeInstances
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newSignalApplicationInstanceNodeInstancesResponse' smart constructor.
+data SignalApplicationInstanceNodeInstancesResponse = SignalApplicationInstanceNodeInstancesResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | An application instance ID.
+    applicationInstanceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SignalApplicationInstanceNodeInstancesResponse' 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', 'signalApplicationInstanceNodeInstancesResponse_httpStatus' - The response's http status code.
+--
+-- 'applicationInstanceId', 'signalApplicationInstanceNodeInstancesResponse_applicationInstanceId' - An application instance ID.
+newSignalApplicationInstanceNodeInstancesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'applicationInstanceId'
+  Prelude.Text ->
+  SignalApplicationInstanceNodeInstancesResponse
+newSignalApplicationInstanceNodeInstancesResponse
+  pHttpStatus_
+  pApplicationInstanceId_ =
+    SignalApplicationInstanceNodeInstancesResponse'
+      { httpStatus =
+          pHttpStatus_,
+        applicationInstanceId =
+          pApplicationInstanceId_
+      }
+
+-- | The response's http status code.
+signalApplicationInstanceNodeInstancesResponse_httpStatus :: Lens.Lens' SignalApplicationInstanceNodeInstancesResponse Prelude.Int
+signalApplicationInstanceNodeInstancesResponse_httpStatus = Lens.lens (\SignalApplicationInstanceNodeInstancesResponse' {httpStatus} -> httpStatus) (\s@SignalApplicationInstanceNodeInstancesResponse' {} a -> s {httpStatus = a} :: SignalApplicationInstanceNodeInstancesResponse)
+
+-- | An application instance ID.
+signalApplicationInstanceNodeInstancesResponse_applicationInstanceId :: Lens.Lens' SignalApplicationInstanceNodeInstancesResponse Prelude.Text
+signalApplicationInstanceNodeInstancesResponse_applicationInstanceId = Lens.lens (\SignalApplicationInstanceNodeInstancesResponse' {applicationInstanceId} -> applicationInstanceId) (\s@SignalApplicationInstanceNodeInstancesResponse' {} a -> s {applicationInstanceId = a} :: SignalApplicationInstanceNodeInstancesResponse)
+
+instance
+  Prelude.NFData
+    SignalApplicationInstanceNodeInstancesResponse
+  where
+  rnf
+    SignalApplicationInstanceNodeInstancesResponse' {..} =
+      Prelude.rnf httpStatus
+        `Prelude.seq` Prelude.rnf applicationInstanceId
diff --git a/gen/Amazonka/Panorama/TagResource.hs b/gen/Amazonka/Panorama/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/TagResource.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.Panorama.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Tags a resource.
+module Amazonka.Panorama.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The resource\'s ARN.
+    resourceArn :: Prelude.Text,
+    -- | Tags for the resource.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' 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:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The resource\'s ARN.
+--
+-- 'tags', 'tagResource_tags' - Tags for the resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The resource\'s ARN.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | Tags for the resource.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath TagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' 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', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/Types.hs b/gen/Amazonka/Panorama/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types.hs
@@ -0,0 +1,577 @@
+{-# 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.Panorama.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.Panorama.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ValidationException,
+
+    -- * ApplicationInstanceHealthStatus
+    ApplicationInstanceHealthStatus (..),
+
+    -- * ApplicationInstanceStatus
+    ApplicationInstanceStatus (..),
+
+    -- * ConnectionType
+    ConnectionType (..),
+
+    -- * DesiredState
+    DesiredState (..),
+
+    -- * DeviceAggregatedStatus
+    DeviceAggregatedStatus (..),
+
+    -- * DeviceBrand
+    DeviceBrand (..),
+
+    -- * DeviceConnectionStatus
+    DeviceConnectionStatus (..),
+
+    -- * DeviceReportedStatus
+    DeviceReportedStatus (..),
+
+    -- * DeviceStatus
+    DeviceStatus (..),
+
+    -- * DeviceType
+    DeviceType (..),
+
+    -- * JobResourceType
+    JobResourceType (..),
+
+    -- * JobType
+    JobType (..),
+
+    -- * ListDevicesSortBy
+    ListDevicesSortBy (..),
+
+    -- * NetworkConnectionStatus
+    NetworkConnectionStatus (..),
+
+    -- * NodeCategory
+    NodeCategory (..),
+
+    -- * NodeFromTemplateJobStatus
+    NodeFromTemplateJobStatus (..),
+
+    -- * NodeInstanceStatus
+    NodeInstanceStatus (..),
+
+    -- * NodeSignalValue
+    NodeSignalValue (..),
+
+    -- * PackageImportJobStatus
+    PackageImportJobStatus (..),
+
+    -- * PackageImportJobType
+    PackageImportJobType (..),
+
+    -- * PackageVersionStatus
+    PackageVersionStatus (..),
+
+    -- * PortType
+    PortType (..),
+
+    -- * SortOrder
+    SortOrder (..),
+
+    -- * StatusFilter
+    StatusFilter (..),
+
+    -- * TemplateType
+    TemplateType (..),
+
+    -- * UpdateProgress
+    UpdateProgress (..),
+
+    -- * AlternateSoftwareMetadata
+    AlternateSoftwareMetadata (..),
+    newAlternateSoftwareMetadata,
+    alternateSoftwareMetadata_version,
+
+    -- * ApplicationInstance
+    ApplicationInstance (..),
+    newApplicationInstance,
+    applicationInstance_applicationInstanceId,
+    applicationInstance_arn,
+    applicationInstance_createdTime,
+    applicationInstance_defaultRuntimeContextDevice,
+    applicationInstance_defaultRuntimeContextDeviceName,
+    applicationInstance_description,
+    applicationInstance_healthStatus,
+    applicationInstance_name,
+    applicationInstance_runtimeContextStates,
+    applicationInstance_status,
+    applicationInstance_statusDescription,
+    applicationInstance_tags,
+
+    -- * Device
+    Device (..),
+    newDevice,
+    device_brand,
+    device_createdTime,
+    device_currentSoftware,
+    device_description,
+    device_deviceAggregatedStatus,
+    device_deviceId,
+    device_lastUpdatedTime,
+    device_latestDeviceJob,
+    device_leaseExpirationTime,
+    device_name,
+    device_provisioningStatus,
+    device_tags,
+    device_type,
+
+    -- * DeviceJob
+    DeviceJob (..),
+    newDeviceJob,
+    deviceJob_createdTime,
+    deviceJob_deviceId,
+    deviceJob_deviceName,
+    deviceJob_jobId,
+    deviceJob_jobType,
+
+    -- * DeviceJobConfig
+    DeviceJobConfig (..),
+    newDeviceJobConfig,
+    deviceJobConfig_oTAJobConfig,
+
+    -- * EthernetPayload
+    EthernetPayload (..),
+    newEthernetPayload,
+    ethernetPayload_staticIpConnectionInfo,
+    ethernetPayload_connectionType,
+
+    -- * EthernetStatus
+    EthernetStatus (..),
+    newEthernetStatus,
+    ethernetStatus_connectionStatus,
+    ethernetStatus_hwAddress,
+    ethernetStatus_ipAddress,
+
+    -- * Job
+    Job (..),
+    newJob,
+    job_deviceId,
+    job_jobId,
+
+    -- * JobResourceTags
+    JobResourceTags (..),
+    newJobResourceTags,
+    jobResourceTags_resourceType,
+    jobResourceTags_tags,
+
+    -- * LatestDeviceJob
+    LatestDeviceJob (..),
+    newLatestDeviceJob,
+    latestDeviceJob_imageVersion,
+    latestDeviceJob_jobType,
+    latestDeviceJob_status,
+
+    -- * ManifestOverridesPayload
+    ManifestOverridesPayload (..),
+    newManifestOverridesPayload,
+    manifestOverridesPayload_payloadData,
+
+    -- * ManifestPayload
+    ManifestPayload (..),
+    newManifestPayload,
+    manifestPayload_payloadData,
+
+    -- * NetworkPayload
+    NetworkPayload (..),
+    newNetworkPayload,
+    networkPayload_ethernet0,
+    networkPayload_ethernet1,
+    networkPayload_ntp,
+
+    -- * NetworkStatus
+    NetworkStatus (..),
+    newNetworkStatus,
+    networkStatus_ethernet0Status,
+    networkStatus_ethernet1Status,
+    networkStatus_lastUpdatedTime,
+    networkStatus_ntpStatus,
+
+    -- * Node
+    Node (..),
+    newNode,
+    node_description,
+    node_ownerAccount,
+    node_packageArn,
+    node_category,
+    node_createdTime,
+    node_name,
+    node_nodeId,
+    node_packageId,
+    node_packageName,
+    node_packageVersion,
+    node_patchVersion,
+
+    -- * NodeFromTemplateJob
+    NodeFromTemplateJob (..),
+    newNodeFromTemplateJob,
+    nodeFromTemplateJob_createdTime,
+    nodeFromTemplateJob_jobId,
+    nodeFromTemplateJob_nodeName,
+    nodeFromTemplateJob_status,
+    nodeFromTemplateJob_statusMessage,
+    nodeFromTemplateJob_templateType,
+
+    -- * NodeInputPort
+    NodeInputPort (..),
+    newNodeInputPort,
+    nodeInputPort_defaultValue,
+    nodeInputPort_description,
+    nodeInputPort_maxConnections,
+    nodeInputPort_name,
+    nodeInputPort_type,
+
+    -- * NodeInstance
+    NodeInstance (..),
+    newNodeInstance,
+    nodeInstance_nodeId,
+    nodeInstance_nodeName,
+    nodeInstance_packageName,
+    nodeInstance_packagePatchVersion,
+    nodeInstance_packageVersion,
+    nodeInstance_currentStatus,
+    nodeInstance_nodeInstanceId,
+
+    -- * NodeInterface
+    NodeInterface (..),
+    newNodeInterface,
+    nodeInterface_inputs,
+    nodeInterface_outputs,
+
+    -- * NodeOutputPort
+    NodeOutputPort (..),
+    newNodeOutputPort,
+    nodeOutputPort_description,
+    nodeOutputPort_name,
+    nodeOutputPort_type,
+
+    -- * NodeSignal
+    NodeSignal (..),
+    newNodeSignal,
+    nodeSignal_nodeInstanceId,
+    nodeSignal_signal,
+
+    -- * NtpPayload
+    NtpPayload (..),
+    newNtpPayload,
+    ntpPayload_ntpServers,
+
+    -- * NtpStatus
+    NtpStatus (..),
+    newNtpStatus,
+    ntpStatus_connectionStatus,
+    ntpStatus_ipAddress,
+    ntpStatus_ntpServerName,
+
+    -- * OTAJobConfig
+    OTAJobConfig (..),
+    newOTAJobConfig,
+    oTAJobConfig_imageVersion,
+
+    -- * OutPutS3Location
+    OutPutS3Location (..),
+    newOutPutS3Location,
+    outPutS3Location_bucketName,
+    outPutS3Location_objectKey,
+
+    -- * PackageImportJob
+    PackageImportJob (..),
+    newPackageImportJob,
+    packageImportJob_createdTime,
+    packageImportJob_jobId,
+    packageImportJob_jobType,
+    packageImportJob_lastUpdatedTime,
+    packageImportJob_status,
+    packageImportJob_statusMessage,
+
+    -- * PackageImportJobInputConfig
+    PackageImportJobInputConfig (..),
+    newPackageImportJobInputConfig,
+    packageImportJobInputConfig_packageVersionInputConfig,
+
+    -- * PackageImportJobOutput
+    PackageImportJobOutput (..),
+    newPackageImportJobOutput,
+    packageImportJobOutput_outputS3Location,
+    packageImportJobOutput_packageId,
+    packageImportJobOutput_packageVersion,
+    packageImportJobOutput_patchVersion,
+
+    -- * PackageImportJobOutputConfig
+    PackageImportJobOutputConfig (..),
+    newPackageImportJobOutputConfig,
+    packageImportJobOutputConfig_packageVersionOutputConfig,
+
+    -- * PackageListItem
+    PackageListItem (..),
+    newPackageListItem,
+    packageListItem_arn,
+    packageListItem_createdTime,
+    packageListItem_packageId,
+    packageListItem_packageName,
+    packageListItem_tags,
+
+    -- * PackageObject
+    PackageObject (..),
+    newPackageObject,
+    packageObject_name,
+    packageObject_packageVersion,
+    packageObject_patchVersion,
+
+    -- * PackageVersionInputConfig
+    PackageVersionInputConfig (..),
+    newPackageVersionInputConfig,
+    packageVersionInputConfig_s3Location,
+
+    -- * PackageVersionOutputConfig
+    PackageVersionOutputConfig (..),
+    newPackageVersionOutputConfig,
+    packageVersionOutputConfig_markLatest,
+    packageVersionOutputConfig_packageName,
+    packageVersionOutputConfig_packageVersion,
+
+    -- * ReportedRuntimeContextState
+    ReportedRuntimeContextState (..),
+    newReportedRuntimeContextState,
+    reportedRuntimeContextState_desiredState,
+    reportedRuntimeContextState_deviceReportedStatus,
+    reportedRuntimeContextState_deviceReportedTime,
+    reportedRuntimeContextState_runtimeContextName,
+
+    -- * S3Location
+    S3Location (..),
+    newS3Location,
+    s3Location_region,
+    s3Location_bucketName,
+    s3Location_objectKey,
+
+    -- * StaticIpConnectionInfo
+    StaticIpConnectionInfo (..),
+    newStaticIpConnectionInfo,
+    staticIpConnectionInfo_defaultGateway,
+    staticIpConnectionInfo_dns,
+    staticIpConnectionInfo_ipAddress,
+    staticIpConnectionInfo_mask,
+
+    -- * StorageLocation
+    StorageLocation (..),
+    newStorageLocation,
+    storageLocation_binaryPrefixLocation,
+    storageLocation_bucket,
+    storageLocation_generatedPrefixLocation,
+    storageLocation_manifestPrefixLocation,
+    storageLocation_repoPrefixLocation,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.Panorama.Types.AlternateSoftwareMetadata
+import Amazonka.Panorama.Types.ApplicationInstance
+import Amazonka.Panorama.Types.ApplicationInstanceHealthStatus
+import Amazonka.Panorama.Types.ApplicationInstanceStatus
+import Amazonka.Panorama.Types.ConnectionType
+import Amazonka.Panorama.Types.DesiredState
+import Amazonka.Panorama.Types.Device
+import Amazonka.Panorama.Types.DeviceAggregatedStatus
+import Amazonka.Panorama.Types.DeviceBrand
+import Amazonka.Panorama.Types.DeviceConnectionStatus
+import Amazonka.Panorama.Types.DeviceJob
+import Amazonka.Panorama.Types.DeviceJobConfig
+import Amazonka.Panorama.Types.DeviceReportedStatus
+import Amazonka.Panorama.Types.DeviceStatus
+import Amazonka.Panorama.Types.DeviceType
+import Amazonka.Panorama.Types.EthernetPayload
+import Amazonka.Panorama.Types.EthernetStatus
+import Amazonka.Panorama.Types.Job
+import Amazonka.Panorama.Types.JobResourceTags
+import Amazonka.Panorama.Types.JobResourceType
+import Amazonka.Panorama.Types.JobType
+import Amazonka.Panorama.Types.LatestDeviceJob
+import Amazonka.Panorama.Types.ListDevicesSortBy
+import Amazonka.Panorama.Types.ManifestOverridesPayload
+import Amazonka.Panorama.Types.ManifestPayload
+import Amazonka.Panorama.Types.NetworkConnectionStatus
+import Amazonka.Panorama.Types.NetworkPayload
+import Amazonka.Panorama.Types.NetworkStatus
+import Amazonka.Panorama.Types.Node
+import Amazonka.Panorama.Types.NodeCategory
+import Amazonka.Panorama.Types.NodeFromTemplateJob
+import Amazonka.Panorama.Types.NodeFromTemplateJobStatus
+import Amazonka.Panorama.Types.NodeInputPort
+import Amazonka.Panorama.Types.NodeInstance
+import Amazonka.Panorama.Types.NodeInstanceStatus
+import Amazonka.Panorama.Types.NodeInterface
+import Amazonka.Panorama.Types.NodeOutputPort
+import Amazonka.Panorama.Types.NodeSignal
+import Amazonka.Panorama.Types.NodeSignalValue
+import Amazonka.Panorama.Types.NtpPayload
+import Amazonka.Panorama.Types.NtpStatus
+import Amazonka.Panorama.Types.OTAJobConfig
+import Amazonka.Panorama.Types.OutPutS3Location
+import Amazonka.Panorama.Types.PackageImportJob
+import Amazonka.Panorama.Types.PackageImportJobInputConfig
+import Amazonka.Panorama.Types.PackageImportJobOutput
+import Amazonka.Panorama.Types.PackageImportJobOutputConfig
+import Amazonka.Panorama.Types.PackageImportJobStatus
+import Amazonka.Panorama.Types.PackageImportJobType
+import Amazonka.Panorama.Types.PackageListItem
+import Amazonka.Panorama.Types.PackageObject
+import Amazonka.Panorama.Types.PackageVersionInputConfig
+import Amazonka.Panorama.Types.PackageVersionOutputConfig
+import Amazonka.Panorama.Types.PackageVersionStatus
+import Amazonka.Panorama.Types.PortType
+import Amazonka.Panorama.Types.ReportedRuntimeContextState
+import Amazonka.Panorama.Types.S3Location
+import Amazonka.Panorama.Types.SortOrder
+import Amazonka.Panorama.Types.StaticIpConnectionInfo
+import Amazonka.Panorama.Types.StatusFilter
+import Amazonka.Panorama.Types.StorageLocation
+import Amazonka.Panorama.Types.TemplateType
+import Amazonka.Panorama.Types.UpdateProgress
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2019-07-24@ of the Amazon Panorama SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "Panorama",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "panorama",
+      Core.signingName = "panorama",
+      Core.version = "2019-07-24",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "Panorama",
+      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
+
+-- | The requestor does not have permission to access the target action or
+-- resource.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | The target resource is in use.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | An internal error occurred.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | The target resource was not found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | The request would cause a limit to be exceeded.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | The request contains an invalid parameter value.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/Panorama/Types/AlternateSoftwareMetadata.hs b/gen/Amazonka/Panorama/Types/AlternateSoftwareMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/AlternateSoftwareMetadata.hs
@@ -0,0 +1,72 @@
+{-# 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.Panorama.Types.AlternateSoftwareMetadata
+-- 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.Panorama.Types.AlternateSoftwareMetadata 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 beta appliance software update.
+--
+-- /See:/ 'newAlternateSoftwareMetadata' smart constructor.
+data AlternateSoftwareMetadata = AlternateSoftwareMetadata'
+  { -- | The appliance software version.
+    version :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AlternateSoftwareMetadata' 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:
+--
+-- 'version', 'alternateSoftwareMetadata_version' - The appliance software version.
+newAlternateSoftwareMetadata ::
+  AlternateSoftwareMetadata
+newAlternateSoftwareMetadata =
+  AlternateSoftwareMetadata'
+    { version =
+        Prelude.Nothing
+    }
+
+-- | The appliance software version.
+alternateSoftwareMetadata_version :: Lens.Lens' AlternateSoftwareMetadata (Prelude.Maybe Prelude.Text)
+alternateSoftwareMetadata_version = Lens.lens (\AlternateSoftwareMetadata' {version} -> version) (\s@AlternateSoftwareMetadata' {} a -> s {version = a} :: AlternateSoftwareMetadata)
+
+instance Data.FromJSON AlternateSoftwareMetadata where
+  parseJSON =
+    Data.withObject
+      "AlternateSoftwareMetadata"
+      ( \x ->
+          AlternateSoftwareMetadata'
+            Prelude.<$> (x Data..:? "Version")
+      )
+
+instance Prelude.Hashable AlternateSoftwareMetadata where
+  hashWithSalt _salt AlternateSoftwareMetadata' {..} =
+    _salt `Prelude.hashWithSalt` version
+
+instance Prelude.NFData AlternateSoftwareMetadata where
+  rnf AlternateSoftwareMetadata' {..} =
+    Prelude.rnf version
diff --git a/gen/Amazonka/Panorama/Types/ApplicationInstance.hs b/gen/Amazonka/Panorama/Types/ApplicationInstance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/ApplicationInstance.hs
@@ -0,0 +1,211 @@
+{-# 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.Panorama.Types.ApplicationInstance
+-- 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.Panorama.Types.ApplicationInstance where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.ApplicationInstanceHealthStatus
+import Amazonka.Panorama.Types.ApplicationInstanceStatus
+import Amazonka.Panorama.Types.ReportedRuntimeContextState
+import qualified Amazonka.Prelude as Prelude
+
+-- | An application instance on a device.
+--
+-- /See:/ 'newApplicationInstance' smart constructor.
+data ApplicationInstance = ApplicationInstance'
+  { -- | The application instance\'s ID.
+    applicationInstanceId :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | When the application instance was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | The device\'s ID.
+    defaultRuntimeContextDevice :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s name.
+    defaultRuntimeContextDeviceName :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s health status.
+    healthStatus :: Prelude.Maybe ApplicationInstanceHealthStatus,
+    -- | The application instance\'s name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The application\'s state.
+    runtimeContextStates :: Prelude.Maybe [ReportedRuntimeContextState],
+    -- | The application instance\'s status.
+    status :: Prelude.Maybe ApplicationInstanceStatus,
+    -- | The application instance\'s status description.
+    statusDescription :: Prelude.Maybe Prelude.Text,
+    -- | The application instance\'s tags.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ApplicationInstance' 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:
+--
+-- 'applicationInstanceId', 'applicationInstance_applicationInstanceId' - The application instance\'s ID.
+--
+-- 'arn', 'applicationInstance_arn' - The application instance\'s ARN.
+--
+-- 'createdTime', 'applicationInstance_createdTime' - When the application instance was created.
+--
+-- 'defaultRuntimeContextDevice', 'applicationInstance_defaultRuntimeContextDevice' - The device\'s ID.
+--
+-- 'defaultRuntimeContextDeviceName', 'applicationInstance_defaultRuntimeContextDeviceName' - The device\'s name.
+--
+-- 'description', 'applicationInstance_description' - The application instance\'s description.
+--
+-- 'healthStatus', 'applicationInstance_healthStatus' - The application instance\'s health status.
+--
+-- 'name', 'applicationInstance_name' - The application instance\'s name.
+--
+-- 'runtimeContextStates', 'applicationInstance_runtimeContextStates' - The application\'s state.
+--
+-- 'status', 'applicationInstance_status' - The application instance\'s status.
+--
+-- 'statusDescription', 'applicationInstance_statusDescription' - The application instance\'s status description.
+--
+-- 'tags', 'applicationInstance_tags' - The application instance\'s tags.
+newApplicationInstance ::
+  ApplicationInstance
+newApplicationInstance =
+  ApplicationInstance'
+    { applicationInstanceId =
+        Prelude.Nothing,
+      arn = Prelude.Nothing,
+      createdTime = Prelude.Nothing,
+      defaultRuntimeContextDevice = Prelude.Nothing,
+      defaultRuntimeContextDeviceName = Prelude.Nothing,
+      description = Prelude.Nothing,
+      healthStatus = Prelude.Nothing,
+      name = Prelude.Nothing,
+      runtimeContextStates = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusDescription = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | The application instance\'s ID.
+applicationInstance_applicationInstanceId :: Lens.Lens' ApplicationInstance (Prelude.Maybe Prelude.Text)
+applicationInstance_applicationInstanceId = Lens.lens (\ApplicationInstance' {applicationInstanceId} -> applicationInstanceId) (\s@ApplicationInstance' {} a -> s {applicationInstanceId = a} :: ApplicationInstance)
+
+-- | The application instance\'s ARN.
+applicationInstance_arn :: Lens.Lens' ApplicationInstance (Prelude.Maybe Prelude.Text)
+applicationInstance_arn = Lens.lens (\ApplicationInstance' {arn} -> arn) (\s@ApplicationInstance' {} a -> s {arn = a} :: ApplicationInstance)
+
+-- | When the application instance was created.
+applicationInstance_createdTime :: Lens.Lens' ApplicationInstance (Prelude.Maybe Prelude.UTCTime)
+applicationInstance_createdTime = Lens.lens (\ApplicationInstance' {createdTime} -> createdTime) (\s@ApplicationInstance' {} a -> s {createdTime = a} :: ApplicationInstance) Prelude.. Lens.mapping Data._Time
+
+-- | The device\'s ID.
+applicationInstance_defaultRuntimeContextDevice :: Lens.Lens' ApplicationInstance (Prelude.Maybe Prelude.Text)
+applicationInstance_defaultRuntimeContextDevice = Lens.lens (\ApplicationInstance' {defaultRuntimeContextDevice} -> defaultRuntimeContextDevice) (\s@ApplicationInstance' {} a -> s {defaultRuntimeContextDevice = a} :: ApplicationInstance)
+
+-- | The device\'s name.
+applicationInstance_defaultRuntimeContextDeviceName :: Lens.Lens' ApplicationInstance (Prelude.Maybe Prelude.Text)
+applicationInstance_defaultRuntimeContextDeviceName = Lens.lens (\ApplicationInstance' {defaultRuntimeContextDeviceName} -> defaultRuntimeContextDeviceName) (\s@ApplicationInstance' {} a -> s {defaultRuntimeContextDeviceName = a} :: ApplicationInstance)
+
+-- | The application instance\'s description.
+applicationInstance_description :: Lens.Lens' ApplicationInstance (Prelude.Maybe Prelude.Text)
+applicationInstance_description = Lens.lens (\ApplicationInstance' {description} -> description) (\s@ApplicationInstance' {} a -> s {description = a} :: ApplicationInstance)
+
+-- | The application instance\'s health status.
+applicationInstance_healthStatus :: Lens.Lens' ApplicationInstance (Prelude.Maybe ApplicationInstanceHealthStatus)
+applicationInstance_healthStatus = Lens.lens (\ApplicationInstance' {healthStatus} -> healthStatus) (\s@ApplicationInstance' {} a -> s {healthStatus = a} :: ApplicationInstance)
+
+-- | The application instance\'s name.
+applicationInstance_name :: Lens.Lens' ApplicationInstance (Prelude.Maybe Prelude.Text)
+applicationInstance_name = Lens.lens (\ApplicationInstance' {name} -> name) (\s@ApplicationInstance' {} a -> s {name = a} :: ApplicationInstance)
+
+-- | The application\'s state.
+applicationInstance_runtimeContextStates :: Lens.Lens' ApplicationInstance (Prelude.Maybe [ReportedRuntimeContextState])
+applicationInstance_runtimeContextStates = Lens.lens (\ApplicationInstance' {runtimeContextStates} -> runtimeContextStates) (\s@ApplicationInstance' {} a -> s {runtimeContextStates = a} :: ApplicationInstance) Prelude.. Lens.mapping Lens.coerced
+
+-- | The application instance\'s status.
+applicationInstance_status :: Lens.Lens' ApplicationInstance (Prelude.Maybe ApplicationInstanceStatus)
+applicationInstance_status = Lens.lens (\ApplicationInstance' {status} -> status) (\s@ApplicationInstance' {} a -> s {status = a} :: ApplicationInstance)
+
+-- | The application instance\'s status description.
+applicationInstance_statusDescription :: Lens.Lens' ApplicationInstance (Prelude.Maybe Prelude.Text)
+applicationInstance_statusDescription = Lens.lens (\ApplicationInstance' {statusDescription} -> statusDescription) (\s@ApplicationInstance' {} a -> s {statusDescription = a} :: ApplicationInstance)
+
+-- | The application instance\'s tags.
+applicationInstance_tags :: Lens.Lens' ApplicationInstance (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+applicationInstance_tags = Lens.lens (\ApplicationInstance' {tags} -> tags) (\s@ApplicationInstance' {} a -> s {tags = a} :: ApplicationInstance) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON ApplicationInstance where
+  parseJSON =
+    Data.withObject
+      "ApplicationInstance"
+      ( \x ->
+          ApplicationInstance'
+            Prelude.<$> (x Data..:? "ApplicationInstanceId")
+            Prelude.<*> (x Data..:? "Arn")
+            Prelude.<*> (x Data..:? "CreatedTime")
+            Prelude.<*> (x Data..:? "DefaultRuntimeContextDevice")
+            Prelude.<*> (x Data..:? "DefaultRuntimeContextDeviceName")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "HealthStatus")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> ( x
+                            Data..:? "RuntimeContextStates"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "StatusDescription")
+            Prelude.<*> (x Data..:? "Tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ApplicationInstance where
+  hashWithSalt _salt ApplicationInstance' {..} =
+    _salt
+      `Prelude.hashWithSalt` applicationInstanceId
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdTime
+      `Prelude.hashWithSalt` defaultRuntimeContextDevice
+      `Prelude.hashWithSalt` defaultRuntimeContextDeviceName
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` healthStatus
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` runtimeContextStates
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` statusDescription
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData ApplicationInstance where
+  rnf ApplicationInstance' {..} =
+    Prelude.rnf applicationInstanceId
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf defaultRuntimeContextDevice
+      `Prelude.seq` Prelude.rnf defaultRuntimeContextDeviceName
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf healthStatus
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf runtimeContextStates
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusDescription
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/Panorama/Types/ApplicationInstanceHealthStatus.hs b/gen/Amazonka/Panorama/Types/ApplicationInstanceHealthStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/ApplicationInstanceHealthStatus.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.Panorama.Types.ApplicationInstanceHealthStatus
+-- 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.Panorama.Types.ApplicationInstanceHealthStatus
+  ( ApplicationInstanceHealthStatus
+      ( ..,
+        ApplicationInstanceHealthStatus_ERROR,
+        ApplicationInstanceHealthStatus_NOT_AVAILABLE,
+        ApplicationInstanceHealthStatus_RUNNING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ApplicationInstanceHealthStatus = ApplicationInstanceHealthStatus'
+  { fromApplicationInstanceHealthStatus ::
+      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 ApplicationInstanceHealthStatus_ERROR :: ApplicationInstanceHealthStatus
+pattern ApplicationInstanceHealthStatus_ERROR = ApplicationInstanceHealthStatus' "ERROR"
+
+pattern ApplicationInstanceHealthStatus_NOT_AVAILABLE :: ApplicationInstanceHealthStatus
+pattern ApplicationInstanceHealthStatus_NOT_AVAILABLE = ApplicationInstanceHealthStatus' "NOT_AVAILABLE"
+
+pattern ApplicationInstanceHealthStatus_RUNNING :: ApplicationInstanceHealthStatus
+pattern ApplicationInstanceHealthStatus_RUNNING = ApplicationInstanceHealthStatus' "RUNNING"
+
+{-# COMPLETE
+  ApplicationInstanceHealthStatus_ERROR,
+  ApplicationInstanceHealthStatus_NOT_AVAILABLE,
+  ApplicationInstanceHealthStatus_RUNNING,
+  ApplicationInstanceHealthStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/ApplicationInstanceStatus.hs b/gen/Amazonka/Panorama/Types/ApplicationInstanceStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/ApplicationInstanceStatus.hs
@@ -0,0 +1,116 @@
+{-# 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.Panorama.Types.ApplicationInstanceStatus
+-- 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.Panorama.Types.ApplicationInstanceStatus
+  ( ApplicationInstanceStatus
+      ( ..,
+        ApplicationInstanceStatus_DEPLOYMENT_ERROR,
+        ApplicationInstanceStatus_DEPLOYMENT_FAILED,
+        ApplicationInstanceStatus_DEPLOYMENT_IN_PROGRESS,
+        ApplicationInstanceStatus_DEPLOYMENT_PENDING,
+        ApplicationInstanceStatus_DEPLOYMENT_REQUESTED,
+        ApplicationInstanceStatus_DEPLOYMENT_SUCCEEDED,
+        ApplicationInstanceStatus_REMOVAL_FAILED,
+        ApplicationInstanceStatus_REMOVAL_IN_PROGRESS,
+        ApplicationInstanceStatus_REMOVAL_PENDING,
+        ApplicationInstanceStatus_REMOVAL_REQUESTED,
+        ApplicationInstanceStatus_REMOVAL_SUCCEEDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ApplicationInstanceStatus = ApplicationInstanceStatus'
+  { fromApplicationInstanceStatus ::
+      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 ApplicationInstanceStatus_DEPLOYMENT_ERROR :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_DEPLOYMENT_ERROR = ApplicationInstanceStatus' "DEPLOYMENT_ERROR"
+
+pattern ApplicationInstanceStatus_DEPLOYMENT_FAILED :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_DEPLOYMENT_FAILED = ApplicationInstanceStatus' "DEPLOYMENT_FAILED"
+
+pattern ApplicationInstanceStatus_DEPLOYMENT_IN_PROGRESS :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_DEPLOYMENT_IN_PROGRESS = ApplicationInstanceStatus' "DEPLOYMENT_IN_PROGRESS"
+
+pattern ApplicationInstanceStatus_DEPLOYMENT_PENDING :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_DEPLOYMENT_PENDING = ApplicationInstanceStatus' "DEPLOYMENT_PENDING"
+
+pattern ApplicationInstanceStatus_DEPLOYMENT_REQUESTED :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_DEPLOYMENT_REQUESTED = ApplicationInstanceStatus' "DEPLOYMENT_REQUESTED"
+
+pattern ApplicationInstanceStatus_DEPLOYMENT_SUCCEEDED :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_DEPLOYMENT_SUCCEEDED = ApplicationInstanceStatus' "DEPLOYMENT_SUCCEEDED"
+
+pattern ApplicationInstanceStatus_REMOVAL_FAILED :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_REMOVAL_FAILED = ApplicationInstanceStatus' "REMOVAL_FAILED"
+
+pattern ApplicationInstanceStatus_REMOVAL_IN_PROGRESS :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_REMOVAL_IN_PROGRESS = ApplicationInstanceStatus' "REMOVAL_IN_PROGRESS"
+
+pattern ApplicationInstanceStatus_REMOVAL_PENDING :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_REMOVAL_PENDING = ApplicationInstanceStatus' "REMOVAL_PENDING"
+
+pattern ApplicationInstanceStatus_REMOVAL_REQUESTED :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_REMOVAL_REQUESTED = ApplicationInstanceStatus' "REMOVAL_REQUESTED"
+
+pattern ApplicationInstanceStatus_REMOVAL_SUCCEEDED :: ApplicationInstanceStatus
+pattern ApplicationInstanceStatus_REMOVAL_SUCCEEDED = ApplicationInstanceStatus' "REMOVAL_SUCCEEDED"
+
+{-# COMPLETE
+  ApplicationInstanceStatus_DEPLOYMENT_ERROR,
+  ApplicationInstanceStatus_DEPLOYMENT_FAILED,
+  ApplicationInstanceStatus_DEPLOYMENT_IN_PROGRESS,
+  ApplicationInstanceStatus_DEPLOYMENT_PENDING,
+  ApplicationInstanceStatus_DEPLOYMENT_REQUESTED,
+  ApplicationInstanceStatus_DEPLOYMENT_SUCCEEDED,
+  ApplicationInstanceStatus_REMOVAL_FAILED,
+  ApplicationInstanceStatus_REMOVAL_IN_PROGRESS,
+  ApplicationInstanceStatus_REMOVAL_PENDING,
+  ApplicationInstanceStatus_REMOVAL_REQUESTED,
+  ApplicationInstanceStatus_REMOVAL_SUCCEEDED,
+  ApplicationInstanceStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/ConnectionType.hs b/gen/Amazonka/Panorama/Types/ConnectionType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/ConnectionType.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.Panorama.Types.ConnectionType
+-- 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.Panorama.Types.ConnectionType
+  ( ConnectionType
+      ( ..,
+        ConnectionType_DHCP,
+        ConnectionType_STATIC_IP
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ConnectionType = ConnectionType'
+  { fromConnectionType ::
+      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 ConnectionType_DHCP :: ConnectionType
+pattern ConnectionType_DHCP = ConnectionType' "DHCP"
+
+pattern ConnectionType_STATIC_IP :: ConnectionType
+pattern ConnectionType_STATIC_IP = ConnectionType' "STATIC_IP"
+
+{-# COMPLETE
+  ConnectionType_DHCP,
+  ConnectionType_STATIC_IP,
+  ConnectionType'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/DesiredState.hs b/gen/Amazonka/Panorama/Types/DesiredState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/DesiredState.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.Panorama.Types.DesiredState
+-- 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.Panorama.Types.DesiredState
+  ( DesiredState
+      ( ..,
+        DesiredState_REMOVED,
+        DesiredState_RUNNING,
+        DesiredState_STOPPED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DesiredState = DesiredState'
+  { fromDesiredState ::
+      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 DesiredState_REMOVED :: DesiredState
+pattern DesiredState_REMOVED = DesiredState' "REMOVED"
+
+pattern DesiredState_RUNNING :: DesiredState
+pattern DesiredState_RUNNING = DesiredState' "RUNNING"
+
+pattern DesiredState_STOPPED :: DesiredState
+pattern DesiredState_STOPPED = DesiredState' "STOPPED"
+
+{-# COMPLETE
+  DesiredState_REMOVED,
+  DesiredState_RUNNING,
+  DesiredState_STOPPED,
+  DesiredState'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/Device.hs b/gen/Amazonka/Panorama/Types/Device.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/Device.hs
@@ -0,0 +1,227 @@
+{-# 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.Panorama.Types.Device
+-- 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.Panorama.Types.Device where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.DeviceAggregatedStatus
+import Amazonka.Panorama.Types.DeviceBrand
+import Amazonka.Panorama.Types.DeviceStatus
+import Amazonka.Panorama.Types.DeviceType
+import Amazonka.Panorama.Types.LatestDeviceJob
+import qualified Amazonka.Prelude as Prelude
+
+-- | A device.
+--
+-- /See:/ 'newDevice' smart constructor.
+data Device = Device'
+  { -- | The device\'s maker.
+    brand :: Prelude.Maybe DeviceBrand,
+    -- | When the device was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | A device\'s current software.
+    currentSoftware :: Prelude.Maybe Prelude.Text,
+    -- | A description for the device.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | A device\'s aggregated status. Including the device\'s connection
+    -- status, provisioning status, and lease status.
+    deviceAggregatedStatus :: Prelude.Maybe DeviceAggregatedStatus,
+    -- | The device\'s ID.
+    deviceId :: Prelude.Maybe Prelude.Text,
+    -- | When the device was updated.
+    lastUpdatedTime :: Prelude.Maybe Data.POSIX,
+    -- | A device\'s latest job. Includes the target image version, and the
+    -- update job status.
+    latestDeviceJob :: Prelude.Maybe LatestDeviceJob,
+    -- | The device\'s lease expiration time.
+    leaseExpirationTime :: Prelude.Maybe Data.POSIX,
+    -- | The device\'s name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s provisioning status.
+    provisioningStatus :: Prelude.Maybe DeviceStatus,
+    -- | The device\'s tags.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The device\'s type.
+    type' :: Prelude.Maybe DeviceType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Device' 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:
+--
+-- 'brand', 'device_brand' - The device\'s maker.
+--
+-- 'createdTime', 'device_createdTime' - When the device was created.
+--
+-- 'currentSoftware', 'device_currentSoftware' - A device\'s current software.
+--
+-- 'description', 'device_description' - A description for the device.
+--
+-- 'deviceAggregatedStatus', 'device_deviceAggregatedStatus' - A device\'s aggregated status. Including the device\'s connection
+-- status, provisioning status, and lease status.
+--
+-- 'deviceId', 'device_deviceId' - The device\'s ID.
+--
+-- 'lastUpdatedTime', 'device_lastUpdatedTime' - When the device was updated.
+--
+-- 'latestDeviceJob', 'device_latestDeviceJob' - A device\'s latest job. Includes the target image version, and the
+-- update job status.
+--
+-- 'leaseExpirationTime', 'device_leaseExpirationTime' - The device\'s lease expiration time.
+--
+-- 'name', 'device_name' - The device\'s name.
+--
+-- 'provisioningStatus', 'device_provisioningStatus' - The device\'s provisioning status.
+--
+-- 'tags', 'device_tags' - The device\'s tags.
+--
+-- 'type'', 'device_type' - The device\'s type.
+newDevice ::
+  Device
+newDevice =
+  Device'
+    { brand = Prelude.Nothing,
+      createdTime = Prelude.Nothing,
+      currentSoftware = Prelude.Nothing,
+      description = Prelude.Nothing,
+      deviceAggregatedStatus = Prelude.Nothing,
+      deviceId = Prelude.Nothing,
+      lastUpdatedTime = Prelude.Nothing,
+      latestDeviceJob = Prelude.Nothing,
+      leaseExpirationTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      provisioningStatus = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The device\'s maker.
+device_brand :: Lens.Lens' Device (Prelude.Maybe DeviceBrand)
+device_brand = Lens.lens (\Device' {brand} -> brand) (\s@Device' {} a -> s {brand = a} :: Device)
+
+-- | When the device was created.
+device_createdTime :: Lens.Lens' Device (Prelude.Maybe Prelude.UTCTime)
+device_createdTime = Lens.lens (\Device' {createdTime} -> createdTime) (\s@Device' {} a -> s {createdTime = a} :: Device) Prelude.. Lens.mapping Data._Time
+
+-- | A device\'s current software.
+device_currentSoftware :: Lens.Lens' Device (Prelude.Maybe Prelude.Text)
+device_currentSoftware = Lens.lens (\Device' {currentSoftware} -> currentSoftware) (\s@Device' {} a -> s {currentSoftware = a} :: Device)
+
+-- | A description for the device.
+device_description :: Lens.Lens' Device (Prelude.Maybe Prelude.Text)
+device_description = Lens.lens (\Device' {description} -> description) (\s@Device' {} a -> s {description = a} :: Device)
+
+-- | A device\'s aggregated status. Including the device\'s connection
+-- status, provisioning status, and lease status.
+device_deviceAggregatedStatus :: Lens.Lens' Device (Prelude.Maybe DeviceAggregatedStatus)
+device_deviceAggregatedStatus = Lens.lens (\Device' {deviceAggregatedStatus} -> deviceAggregatedStatus) (\s@Device' {} a -> s {deviceAggregatedStatus = a} :: Device)
+
+-- | The device\'s ID.
+device_deviceId :: Lens.Lens' Device (Prelude.Maybe Prelude.Text)
+device_deviceId = Lens.lens (\Device' {deviceId} -> deviceId) (\s@Device' {} a -> s {deviceId = a} :: Device)
+
+-- | When the device was updated.
+device_lastUpdatedTime :: Lens.Lens' Device (Prelude.Maybe Prelude.UTCTime)
+device_lastUpdatedTime = Lens.lens (\Device' {lastUpdatedTime} -> lastUpdatedTime) (\s@Device' {} a -> s {lastUpdatedTime = a} :: Device) Prelude.. Lens.mapping Data._Time
+
+-- | A device\'s latest job. Includes the target image version, and the
+-- update job status.
+device_latestDeviceJob :: Lens.Lens' Device (Prelude.Maybe LatestDeviceJob)
+device_latestDeviceJob = Lens.lens (\Device' {latestDeviceJob} -> latestDeviceJob) (\s@Device' {} a -> s {latestDeviceJob = a} :: Device)
+
+-- | The device\'s lease expiration time.
+device_leaseExpirationTime :: Lens.Lens' Device (Prelude.Maybe Prelude.UTCTime)
+device_leaseExpirationTime = Lens.lens (\Device' {leaseExpirationTime} -> leaseExpirationTime) (\s@Device' {} a -> s {leaseExpirationTime = a} :: Device) Prelude.. Lens.mapping Data._Time
+
+-- | The device\'s name.
+device_name :: Lens.Lens' Device (Prelude.Maybe Prelude.Text)
+device_name = Lens.lens (\Device' {name} -> name) (\s@Device' {} a -> s {name = a} :: Device)
+
+-- | The device\'s provisioning status.
+device_provisioningStatus :: Lens.Lens' Device (Prelude.Maybe DeviceStatus)
+device_provisioningStatus = Lens.lens (\Device' {provisioningStatus} -> provisioningStatus) (\s@Device' {} a -> s {provisioningStatus = a} :: Device)
+
+-- | The device\'s tags.
+device_tags :: Lens.Lens' Device (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+device_tags = Lens.lens (\Device' {tags} -> tags) (\s@Device' {} a -> s {tags = a} :: Device) Prelude.. Lens.mapping Lens.coerced
+
+-- | The device\'s type.
+device_type :: Lens.Lens' Device (Prelude.Maybe DeviceType)
+device_type = Lens.lens (\Device' {type'} -> type') (\s@Device' {} a -> s {type' = a} :: Device)
+
+instance Data.FromJSON Device where
+  parseJSON =
+    Data.withObject
+      "Device"
+      ( \x ->
+          Device'
+            Prelude.<$> (x Data..:? "Brand")
+            Prelude.<*> (x Data..:? "CreatedTime")
+            Prelude.<*> (x Data..:? "CurrentSoftware")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "DeviceAggregatedStatus")
+            Prelude.<*> (x Data..:? "DeviceId")
+            Prelude.<*> (x Data..:? "LastUpdatedTime")
+            Prelude.<*> (x Data..:? "LatestDeviceJob")
+            Prelude.<*> (x Data..:? "LeaseExpirationTime")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "ProvisioningStatus")
+            Prelude.<*> (x Data..:? "Tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance Prelude.Hashable Device where
+  hashWithSalt _salt Device' {..} =
+    _salt
+      `Prelude.hashWithSalt` brand
+      `Prelude.hashWithSalt` createdTime
+      `Prelude.hashWithSalt` currentSoftware
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` deviceAggregatedStatus
+      `Prelude.hashWithSalt` deviceId
+      `Prelude.hashWithSalt` lastUpdatedTime
+      `Prelude.hashWithSalt` latestDeviceJob
+      `Prelude.hashWithSalt` leaseExpirationTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` provisioningStatus
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData Device where
+  rnf Device' {..} =
+    Prelude.rnf brand
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf currentSoftware
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf deviceAggregatedStatus
+      `Prelude.seq` Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf lastUpdatedTime
+      `Prelude.seq` Prelude.rnf latestDeviceJob
+      `Prelude.seq` Prelude.rnf leaseExpirationTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf provisioningStatus
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/Panorama/Types/DeviceAggregatedStatus.hs b/gen/Amazonka/Panorama/Types/DeviceAggregatedStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/DeviceAggregatedStatus.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.Panorama.Types.DeviceAggregatedStatus
+-- 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.Panorama.Types.DeviceAggregatedStatus
+  ( DeviceAggregatedStatus
+      ( ..,
+        DeviceAggregatedStatus_AWAITING_PROVISIONING,
+        DeviceAggregatedStatus_DELETING,
+        DeviceAggregatedStatus_ERROR,
+        DeviceAggregatedStatus_FAILED,
+        DeviceAggregatedStatus_LEASE_EXPIRED,
+        DeviceAggregatedStatus_OFFLINE,
+        DeviceAggregatedStatus_ONLINE,
+        DeviceAggregatedStatus_PENDING,
+        DeviceAggregatedStatus_REBOOTING,
+        DeviceAggregatedStatus_UPDATE_NEEDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeviceAggregatedStatus = DeviceAggregatedStatus'
+  { fromDeviceAggregatedStatus ::
+      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 DeviceAggregatedStatus_AWAITING_PROVISIONING :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_AWAITING_PROVISIONING = DeviceAggregatedStatus' "AWAITING_PROVISIONING"
+
+pattern DeviceAggregatedStatus_DELETING :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_DELETING = DeviceAggregatedStatus' "DELETING"
+
+pattern DeviceAggregatedStatus_ERROR :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_ERROR = DeviceAggregatedStatus' "ERROR"
+
+pattern DeviceAggregatedStatus_FAILED :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_FAILED = DeviceAggregatedStatus' "FAILED"
+
+pattern DeviceAggregatedStatus_LEASE_EXPIRED :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_LEASE_EXPIRED = DeviceAggregatedStatus' "LEASE_EXPIRED"
+
+pattern DeviceAggregatedStatus_OFFLINE :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_OFFLINE = DeviceAggregatedStatus' "OFFLINE"
+
+pattern DeviceAggregatedStatus_ONLINE :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_ONLINE = DeviceAggregatedStatus' "ONLINE"
+
+pattern DeviceAggregatedStatus_PENDING :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_PENDING = DeviceAggregatedStatus' "PENDING"
+
+pattern DeviceAggregatedStatus_REBOOTING :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_REBOOTING = DeviceAggregatedStatus' "REBOOTING"
+
+pattern DeviceAggregatedStatus_UPDATE_NEEDED :: DeviceAggregatedStatus
+pattern DeviceAggregatedStatus_UPDATE_NEEDED = DeviceAggregatedStatus' "UPDATE_NEEDED"
+
+{-# COMPLETE
+  DeviceAggregatedStatus_AWAITING_PROVISIONING,
+  DeviceAggregatedStatus_DELETING,
+  DeviceAggregatedStatus_ERROR,
+  DeviceAggregatedStatus_FAILED,
+  DeviceAggregatedStatus_LEASE_EXPIRED,
+  DeviceAggregatedStatus_OFFLINE,
+  DeviceAggregatedStatus_ONLINE,
+  DeviceAggregatedStatus_PENDING,
+  DeviceAggregatedStatus_REBOOTING,
+  DeviceAggregatedStatus_UPDATE_NEEDED,
+  DeviceAggregatedStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/DeviceBrand.hs b/gen/Amazonka/Panorama/Types/DeviceBrand.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/DeviceBrand.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.Panorama.Types.DeviceBrand
+-- 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.Panorama.Types.DeviceBrand
+  ( DeviceBrand
+      ( ..,
+        DeviceBrand_AWS_PANORAMA,
+        DeviceBrand_LENOVO
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeviceBrand = DeviceBrand'
+  { fromDeviceBrand ::
+      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 DeviceBrand_AWS_PANORAMA :: DeviceBrand
+pattern DeviceBrand_AWS_PANORAMA = DeviceBrand' "AWS_PANORAMA"
+
+pattern DeviceBrand_LENOVO :: DeviceBrand
+pattern DeviceBrand_LENOVO = DeviceBrand' "LENOVO"
+
+{-# COMPLETE
+  DeviceBrand_AWS_PANORAMA,
+  DeviceBrand_LENOVO,
+  DeviceBrand'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/DeviceConnectionStatus.hs b/gen/Amazonka/Panorama/Types/DeviceConnectionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/DeviceConnectionStatus.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.Panorama.Types.DeviceConnectionStatus
+-- 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.Panorama.Types.DeviceConnectionStatus
+  ( DeviceConnectionStatus
+      ( ..,
+        DeviceConnectionStatus_AWAITING_CREDENTIALS,
+        DeviceConnectionStatus_ERROR,
+        DeviceConnectionStatus_NOT_AVAILABLE,
+        DeviceConnectionStatus_OFFLINE,
+        DeviceConnectionStatus_ONLINE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeviceConnectionStatus = DeviceConnectionStatus'
+  { fromDeviceConnectionStatus ::
+      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 DeviceConnectionStatus_AWAITING_CREDENTIALS :: DeviceConnectionStatus
+pattern DeviceConnectionStatus_AWAITING_CREDENTIALS = DeviceConnectionStatus' "AWAITING_CREDENTIALS"
+
+pattern DeviceConnectionStatus_ERROR :: DeviceConnectionStatus
+pattern DeviceConnectionStatus_ERROR = DeviceConnectionStatus' "ERROR"
+
+pattern DeviceConnectionStatus_NOT_AVAILABLE :: DeviceConnectionStatus
+pattern DeviceConnectionStatus_NOT_AVAILABLE = DeviceConnectionStatus' "NOT_AVAILABLE"
+
+pattern DeviceConnectionStatus_OFFLINE :: DeviceConnectionStatus
+pattern DeviceConnectionStatus_OFFLINE = DeviceConnectionStatus' "OFFLINE"
+
+pattern DeviceConnectionStatus_ONLINE :: DeviceConnectionStatus
+pattern DeviceConnectionStatus_ONLINE = DeviceConnectionStatus' "ONLINE"
+
+{-# COMPLETE
+  DeviceConnectionStatus_AWAITING_CREDENTIALS,
+  DeviceConnectionStatus_ERROR,
+  DeviceConnectionStatus_NOT_AVAILABLE,
+  DeviceConnectionStatus_OFFLINE,
+  DeviceConnectionStatus_ONLINE,
+  DeviceConnectionStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/DeviceJob.hs b/gen/Amazonka/Panorama/Types/DeviceJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/DeviceJob.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.Panorama.Types.DeviceJob
+-- 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.Panorama.Types.DeviceJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.JobType
+import qualified Amazonka.Prelude as Prelude
+
+-- | A job that runs on a device.
+--
+-- /See:/ 'newDeviceJob' smart constructor.
+data DeviceJob = DeviceJob'
+  { -- | When the job was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the target device.
+    deviceId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the target device
+    deviceName :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s ID.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s type.
+    jobType :: Prelude.Maybe JobType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeviceJob' 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:
+--
+-- 'createdTime', 'deviceJob_createdTime' - When the job was created.
+--
+-- 'deviceId', 'deviceJob_deviceId' - The ID of the target device.
+--
+-- 'deviceName', 'deviceJob_deviceName' - The name of the target device
+--
+-- 'jobId', 'deviceJob_jobId' - The job\'s ID.
+--
+-- 'jobType', 'deviceJob_jobType' - The job\'s type.
+newDeviceJob ::
+  DeviceJob
+newDeviceJob =
+  DeviceJob'
+    { createdTime = Prelude.Nothing,
+      deviceId = Prelude.Nothing,
+      deviceName = Prelude.Nothing,
+      jobId = Prelude.Nothing,
+      jobType = Prelude.Nothing
+    }
+
+-- | When the job was created.
+deviceJob_createdTime :: Lens.Lens' DeviceJob (Prelude.Maybe Prelude.UTCTime)
+deviceJob_createdTime = Lens.lens (\DeviceJob' {createdTime} -> createdTime) (\s@DeviceJob' {} a -> s {createdTime = a} :: DeviceJob) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the target device.
+deviceJob_deviceId :: Lens.Lens' DeviceJob (Prelude.Maybe Prelude.Text)
+deviceJob_deviceId = Lens.lens (\DeviceJob' {deviceId} -> deviceId) (\s@DeviceJob' {} a -> s {deviceId = a} :: DeviceJob)
+
+-- | The name of the target device
+deviceJob_deviceName :: Lens.Lens' DeviceJob (Prelude.Maybe Prelude.Text)
+deviceJob_deviceName = Lens.lens (\DeviceJob' {deviceName} -> deviceName) (\s@DeviceJob' {} a -> s {deviceName = a} :: DeviceJob)
+
+-- | The job\'s ID.
+deviceJob_jobId :: Lens.Lens' DeviceJob (Prelude.Maybe Prelude.Text)
+deviceJob_jobId = Lens.lens (\DeviceJob' {jobId} -> jobId) (\s@DeviceJob' {} a -> s {jobId = a} :: DeviceJob)
+
+-- | The job\'s type.
+deviceJob_jobType :: Lens.Lens' DeviceJob (Prelude.Maybe JobType)
+deviceJob_jobType = Lens.lens (\DeviceJob' {jobType} -> jobType) (\s@DeviceJob' {} a -> s {jobType = a} :: DeviceJob)
+
+instance Data.FromJSON DeviceJob where
+  parseJSON =
+    Data.withObject
+      "DeviceJob"
+      ( \x ->
+          DeviceJob'
+            Prelude.<$> (x Data..:? "CreatedTime")
+            Prelude.<*> (x Data..:? "DeviceId")
+            Prelude.<*> (x Data..:? "DeviceName")
+            Prelude.<*> (x Data..:? "JobId")
+            Prelude.<*> (x Data..:? "JobType")
+      )
+
+instance Prelude.Hashable DeviceJob where
+  hashWithSalt _salt DeviceJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdTime
+      `Prelude.hashWithSalt` deviceId
+      `Prelude.hashWithSalt` deviceName
+      `Prelude.hashWithSalt` jobId
+      `Prelude.hashWithSalt` jobType
+
+instance Prelude.NFData DeviceJob where
+  rnf DeviceJob' {..} =
+    Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf deviceName
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobType
diff --git a/gen/Amazonka/Panorama/Types/DeviceJobConfig.hs b/gen/Amazonka/Panorama/Types/DeviceJobConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/DeviceJobConfig.hs
@@ -0,0 +1,70 @@
+{-# 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.Panorama.Types.DeviceJobConfig
+-- 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.Panorama.Types.DeviceJobConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.OTAJobConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | A job\'s configuration.
+--
+-- /See:/ 'newDeviceJobConfig' smart constructor.
+data DeviceJobConfig = DeviceJobConfig'
+  { -- | A configuration for an over-the-air (OTA) upgrade. Required for OTA
+    -- jobs.
+    oTAJobConfig :: Prelude.Maybe OTAJobConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeviceJobConfig' 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:
+--
+-- 'oTAJobConfig', 'deviceJobConfig_oTAJobConfig' - A configuration for an over-the-air (OTA) upgrade. Required for OTA
+-- jobs.
+newDeviceJobConfig ::
+  DeviceJobConfig
+newDeviceJobConfig =
+  DeviceJobConfig' {oTAJobConfig = Prelude.Nothing}
+
+-- | A configuration for an over-the-air (OTA) upgrade. Required for OTA
+-- jobs.
+deviceJobConfig_oTAJobConfig :: Lens.Lens' DeviceJobConfig (Prelude.Maybe OTAJobConfig)
+deviceJobConfig_oTAJobConfig = Lens.lens (\DeviceJobConfig' {oTAJobConfig} -> oTAJobConfig) (\s@DeviceJobConfig' {} a -> s {oTAJobConfig = a} :: DeviceJobConfig)
+
+instance Prelude.Hashable DeviceJobConfig where
+  hashWithSalt _salt DeviceJobConfig' {..} =
+    _salt `Prelude.hashWithSalt` oTAJobConfig
+
+instance Prelude.NFData DeviceJobConfig where
+  rnf DeviceJobConfig' {..} = Prelude.rnf oTAJobConfig
+
+instance Data.ToJSON DeviceJobConfig where
+  toJSON DeviceJobConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("OTAJobConfig" Data..=) Prelude.<$> oTAJobConfig]
+      )
diff --git a/gen/Amazonka/Panorama/Types/DeviceReportedStatus.hs b/gen/Amazonka/Panorama/Types/DeviceReportedStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/DeviceReportedStatus.hs
@@ -0,0 +1,116 @@
+{-# 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.Panorama.Types.DeviceReportedStatus
+-- 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.Panorama.Types.DeviceReportedStatus
+  ( DeviceReportedStatus
+      ( ..,
+        DeviceReportedStatus_INSTALL_ERROR,
+        DeviceReportedStatus_INSTALL_IN_PROGRESS,
+        DeviceReportedStatus_LAUNCHED,
+        DeviceReportedStatus_LAUNCH_ERROR,
+        DeviceReportedStatus_REMOVAL_FAILED,
+        DeviceReportedStatus_REMOVAL_IN_PROGRESS,
+        DeviceReportedStatus_RUNNING,
+        DeviceReportedStatus_STARTING,
+        DeviceReportedStatus_STOPPED,
+        DeviceReportedStatus_STOPPING,
+        DeviceReportedStatus_STOP_ERROR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeviceReportedStatus = DeviceReportedStatus'
+  { fromDeviceReportedStatus ::
+      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 DeviceReportedStatus_INSTALL_ERROR :: DeviceReportedStatus
+pattern DeviceReportedStatus_INSTALL_ERROR = DeviceReportedStatus' "INSTALL_ERROR"
+
+pattern DeviceReportedStatus_INSTALL_IN_PROGRESS :: DeviceReportedStatus
+pattern DeviceReportedStatus_INSTALL_IN_PROGRESS = DeviceReportedStatus' "INSTALL_IN_PROGRESS"
+
+pattern DeviceReportedStatus_LAUNCHED :: DeviceReportedStatus
+pattern DeviceReportedStatus_LAUNCHED = DeviceReportedStatus' "LAUNCHED"
+
+pattern DeviceReportedStatus_LAUNCH_ERROR :: DeviceReportedStatus
+pattern DeviceReportedStatus_LAUNCH_ERROR = DeviceReportedStatus' "LAUNCH_ERROR"
+
+pattern DeviceReportedStatus_REMOVAL_FAILED :: DeviceReportedStatus
+pattern DeviceReportedStatus_REMOVAL_FAILED = DeviceReportedStatus' "REMOVAL_FAILED"
+
+pattern DeviceReportedStatus_REMOVAL_IN_PROGRESS :: DeviceReportedStatus
+pattern DeviceReportedStatus_REMOVAL_IN_PROGRESS = DeviceReportedStatus' "REMOVAL_IN_PROGRESS"
+
+pattern DeviceReportedStatus_RUNNING :: DeviceReportedStatus
+pattern DeviceReportedStatus_RUNNING = DeviceReportedStatus' "RUNNING"
+
+pattern DeviceReportedStatus_STARTING :: DeviceReportedStatus
+pattern DeviceReportedStatus_STARTING = DeviceReportedStatus' "STARTING"
+
+pattern DeviceReportedStatus_STOPPED :: DeviceReportedStatus
+pattern DeviceReportedStatus_STOPPED = DeviceReportedStatus' "STOPPED"
+
+pattern DeviceReportedStatus_STOPPING :: DeviceReportedStatus
+pattern DeviceReportedStatus_STOPPING = DeviceReportedStatus' "STOPPING"
+
+pattern DeviceReportedStatus_STOP_ERROR :: DeviceReportedStatus
+pattern DeviceReportedStatus_STOP_ERROR = DeviceReportedStatus' "STOP_ERROR"
+
+{-# COMPLETE
+  DeviceReportedStatus_INSTALL_ERROR,
+  DeviceReportedStatus_INSTALL_IN_PROGRESS,
+  DeviceReportedStatus_LAUNCHED,
+  DeviceReportedStatus_LAUNCH_ERROR,
+  DeviceReportedStatus_REMOVAL_FAILED,
+  DeviceReportedStatus_REMOVAL_IN_PROGRESS,
+  DeviceReportedStatus_RUNNING,
+  DeviceReportedStatus_STARTING,
+  DeviceReportedStatus_STOPPED,
+  DeviceReportedStatus_STOPPING,
+  DeviceReportedStatus_STOP_ERROR,
+  DeviceReportedStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/DeviceStatus.hs b/gen/Amazonka/Panorama/Types/DeviceStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/DeviceStatus.hs
@@ -0,0 +1,91 @@
+{-# 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.Panorama.Types.DeviceStatus
+-- 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.Panorama.Types.DeviceStatus
+  ( DeviceStatus
+      ( ..,
+        DeviceStatus_AWAITING_PROVISIONING,
+        DeviceStatus_DELETING,
+        DeviceStatus_ERROR,
+        DeviceStatus_FAILED,
+        DeviceStatus_PENDING,
+        DeviceStatus_SUCCEEDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeviceStatus = DeviceStatus'
+  { fromDeviceStatus ::
+      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 DeviceStatus_AWAITING_PROVISIONING :: DeviceStatus
+pattern DeviceStatus_AWAITING_PROVISIONING = DeviceStatus' "AWAITING_PROVISIONING"
+
+pattern DeviceStatus_DELETING :: DeviceStatus
+pattern DeviceStatus_DELETING = DeviceStatus' "DELETING"
+
+pattern DeviceStatus_ERROR :: DeviceStatus
+pattern DeviceStatus_ERROR = DeviceStatus' "ERROR"
+
+pattern DeviceStatus_FAILED :: DeviceStatus
+pattern DeviceStatus_FAILED = DeviceStatus' "FAILED"
+
+pattern DeviceStatus_PENDING :: DeviceStatus
+pattern DeviceStatus_PENDING = DeviceStatus' "PENDING"
+
+pattern DeviceStatus_SUCCEEDED :: DeviceStatus
+pattern DeviceStatus_SUCCEEDED = DeviceStatus' "SUCCEEDED"
+
+{-# COMPLETE
+  DeviceStatus_AWAITING_PROVISIONING,
+  DeviceStatus_DELETING,
+  DeviceStatus_ERROR,
+  DeviceStatus_FAILED,
+  DeviceStatus_PENDING,
+  DeviceStatus_SUCCEEDED,
+  DeviceStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/DeviceType.hs b/gen/Amazonka/Panorama/Types/DeviceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/DeviceType.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.Panorama.Types.DeviceType
+-- 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.Panorama.Types.DeviceType
+  ( DeviceType
+      ( ..,
+        DeviceType_PANORAMA_APPLIANCE,
+        DeviceType_PANORAMA_APPLIANCE_DEVELOPER_KIT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DeviceType = DeviceType'
+  { fromDeviceType ::
+      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 DeviceType_PANORAMA_APPLIANCE :: DeviceType
+pattern DeviceType_PANORAMA_APPLIANCE = DeviceType' "PANORAMA_APPLIANCE"
+
+pattern DeviceType_PANORAMA_APPLIANCE_DEVELOPER_KIT :: DeviceType
+pattern DeviceType_PANORAMA_APPLIANCE_DEVELOPER_KIT = DeviceType' "PANORAMA_APPLIANCE_DEVELOPER_KIT"
+
+{-# COMPLETE
+  DeviceType_PANORAMA_APPLIANCE,
+  DeviceType_PANORAMA_APPLIANCE_DEVELOPER_KIT,
+  DeviceType'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/EthernetPayload.hs b/gen/Amazonka/Panorama/Types/EthernetPayload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/EthernetPayload.hs
@@ -0,0 +1,100 @@
+{-# 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.Panorama.Types.EthernetPayload
+-- 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.Panorama.Types.EthernetPayload where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.ConnectionType
+import Amazonka.Panorama.Types.StaticIpConnectionInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | A device\'s network configuration.
+--
+-- /See:/ 'newEthernetPayload' smart constructor.
+data EthernetPayload = EthernetPayload'
+  { -- | Network configuration for a static IP connection.
+    staticIpConnectionInfo :: Prelude.Maybe StaticIpConnectionInfo,
+    -- | How the device gets an IP address.
+    connectionType :: ConnectionType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EthernetPayload' 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:
+--
+-- 'staticIpConnectionInfo', 'ethernetPayload_staticIpConnectionInfo' - Network configuration for a static IP connection.
+--
+-- 'connectionType', 'ethernetPayload_connectionType' - How the device gets an IP address.
+newEthernetPayload ::
+  -- | 'connectionType'
+  ConnectionType ->
+  EthernetPayload
+newEthernetPayload pConnectionType_ =
+  EthernetPayload'
+    { staticIpConnectionInfo =
+        Prelude.Nothing,
+      connectionType = pConnectionType_
+    }
+
+-- | Network configuration for a static IP connection.
+ethernetPayload_staticIpConnectionInfo :: Lens.Lens' EthernetPayload (Prelude.Maybe StaticIpConnectionInfo)
+ethernetPayload_staticIpConnectionInfo = Lens.lens (\EthernetPayload' {staticIpConnectionInfo} -> staticIpConnectionInfo) (\s@EthernetPayload' {} a -> s {staticIpConnectionInfo = a} :: EthernetPayload)
+
+-- | How the device gets an IP address.
+ethernetPayload_connectionType :: Lens.Lens' EthernetPayload ConnectionType
+ethernetPayload_connectionType = Lens.lens (\EthernetPayload' {connectionType} -> connectionType) (\s@EthernetPayload' {} a -> s {connectionType = a} :: EthernetPayload)
+
+instance Data.FromJSON EthernetPayload where
+  parseJSON =
+    Data.withObject
+      "EthernetPayload"
+      ( \x ->
+          EthernetPayload'
+            Prelude.<$> (x Data..:? "StaticIpConnectionInfo")
+            Prelude.<*> (x Data..: "ConnectionType")
+      )
+
+instance Prelude.Hashable EthernetPayload where
+  hashWithSalt _salt EthernetPayload' {..} =
+    _salt
+      `Prelude.hashWithSalt` staticIpConnectionInfo
+      `Prelude.hashWithSalt` connectionType
+
+instance Prelude.NFData EthernetPayload where
+  rnf EthernetPayload' {..} =
+    Prelude.rnf staticIpConnectionInfo
+      `Prelude.seq` Prelude.rnf connectionType
+
+instance Data.ToJSON EthernetPayload where
+  toJSON EthernetPayload' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("StaticIpConnectionInfo" Data..=)
+              Prelude.<$> staticIpConnectionInfo,
+            Prelude.Just
+              ("ConnectionType" Data..= connectionType)
+          ]
+      )
diff --git a/gen/Amazonka/Panorama/Types/EthernetStatus.hs b/gen/Amazonka/Panorama/Types/EthernetStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/EthernetStatus.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.Panorama.Types.EthernetStatus
+-- 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.Panorama.Types.EthernetStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.NetworkConnectionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | A device\'s Ethernet status.
+--
+-- /See:/ 'newEthernetStatus' smart constructor.
+data EthernetStatus = EthernetStatus'
+  { -- | The device\'s connection status.
+    connectionStatus :: Prelude.Maybe NetworkConnectionStatus,
+    -- | The device\'s physical address.
+    hwAddress :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s IP address.
+    ipAddress :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EthernetStatus' 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:
+--
+-- 'connectionStatus', 'ethernetStatus_connectionStatus' - The device\'s connection status.
+--
+-- 'hwAddress', 'ethernetStatus_hwAddress' - The device\'s physical address.
+--
+-- 'ipAddress', 'ethernetStatus_ipAddress' - The device\'s IP address.
+newEthernetStatus ::
+  EthernetStatus
+newEthernetStatus =
+  EthernetStatus'
+    { connectionStatus = Prelude.Nothing,
+      hwAddress = Prelude.Nothing,
+      ipAddress = Prelude.Nothing
+    }
+
+-- | The device\'s connection status.
+ethernetStatus_connectionStatus :: Lens.Lens' EthernetStatus (Prelude.Maybe NetworkConnectionStatus)
+ethernetStatus_connectionStatus = Lens.lens (\EthernetStatus' {connectionStatus} -> connectionStatus) (\s@EthernetStatus' {} a -> s {connectionStatus = a} :: EthernetStatus)
+
+-- | The device\'s physical address.
+ethernetStatus_hwAddress :: Lens.Lens' EthernetStatus (Prelude.Maybe Prelude.Text)
+ethernetStatus_hwAddress = Lens.lens (\EthernetStatus' {hwAddress} -> hwAddress) (\s@EthernetStatus' {} a -> s {hwAddress = a} :: EthernetStatus)
+
+-- | The device\'s IP address.
+ethernetStatus_ipAddress :: Lens.Lens' EthernetStatus (Prelude.Maybe Prelude.Text)
+ethernetStatus_ipAddress = Lens.lens (\EthernetStatus' {ipAddress} -> ipAddress) (\s@EthernetStatus' {} a -> s {ipAddress = a} :: EthernetStatus)
+
+instance Data.FromJSON EthernetStatus where
+  parseJSON =
+    Data.withObject
+      "EthernetStatus"
+      ( \x ->
+          EthernetStatus'
+            Prelude.<$> (x Data..:? "ConnectionStatus")
+            Prelude.<*> (x Data..:? "HwAddress")
+            Prelude.<*> (x Data..:? "IpAddress")
+      )
+
+instance Prelude.Hashable EthernetStatus where
+  hashWithSalt _salt EthernetStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` connectionStatus
+      `Prelude.hashWithSalt` hwAddress
+      `Prelude.hashWithSalt` ipAddress
+
+instance Prelude.NFData EthernetStatus where
+  rnf EthernetStatus' {..} =
+    Prelude.rnf connectionStatus
+      `Prelude.seq` Prelude.rnf hwAddress
+      `Prelude.seq` Prelude.rnf ipAddress
diff --git a/gen/Amazonka/Panorama/Types/Job.hs b/gen/Amazonka/Panorama/Types/Job.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/Job.hs
@@ -0,0 +1,84 @@
+{-# 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.Panorama.Types.Job
+-- 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.Panorama.Types.Job 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 job for a device.
+--
+-- /See:/ 'newJob' smart constructor.
+data Job = Job'
+  { -- | The target device\'s ID.
+    deviceId :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s ID.
+    jobId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Job' 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:
+--
+-- 'deviceId', 'job_deviceId' - The target device\'s ID.
+--
+-- 'jobId', 'job_jobId' - The job\'s ID.
+newJob ::
+  Job
+newJob =
+  Job'
+    { deviceId = Prelude.Nothing,
+      jobId = Prelude.Nothing
+    }
+
+-- | The target device\'s ID.
+job_deviceId :: Lens.Lens' Job (Prelude.Maybe Prelude.Text)
+job_deviceId = Lens.lens (\Job' {deviceId} -> deviceId) (\s@Job' {} a -> s {deviceId = a} :: Job)
+
+-- | The job\'s ID.
+job_jobId :: Lens.Lens' Job (Prelude.Maybe Prelude.Text)
+job_jobId = Lens.lens (\Job' {jobId} -> jobId) (\s@Job' {} a -> s {jobId = a} :: Job)
+
+instance Data.FromJSON Job where
+  parseJSON =
+    Data.withObject
+      "Job"
+      ( \x ->
+          Job'
+            Prelude.<$> (x Data..:? "DeviceId")
+            Prelude.<*> (x Data..:? "JobId")
+      )
+
+instance Prelude.Hashable Job where
+  hashWithSalt _salt Job' {..} =
+    _salt
+      `Prelude.hashWithSalt` deviceId
+      `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData Job where
+  rnf Job' {..} =
+    Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf jobId
diff --git a/gen/Amazonka/Panorama/Types/JobResourceTags.hs b/gen/Amazonka/Panorama/Types/JobResourceTags.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/JobResourceTags.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.Panorama.Types.JobResourceTags
+-- 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.Panorama.Types.JobResourceTags where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.JobResourceType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Tags for a job.
+--
+-- /See:/ 'newJobResourceTags' smart constructor.
+data JobResourceTags = JobResourceTags'
+  { -- | The job\'s type.
+    resourceType :: JobResourceType,
+    -- | The job\'s tags.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JobResourceTags' 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:
+--
+-- 'resourceType', 'jobResourceTags_resourceType' - The job\'s type.
+--
+-- 'tags', 'jobResourceTags_tags' - The job\'s tags.
+newJobResourceTags ::
+  -- | 'resourceType'
+  JobResourceType ->
+  JobResourceTags
+newJobResourceTags pResourceType_ =
+  JobResourceTags'
+    { resourceType = pResourceType_,
+      tags = Prelude.mempty
+    }
+
+-- | The job\'s type.
+jobResourceTags_resourceType :: Lens.Lens' JobResourceTags JobResourceType
+jobResourceTags_resourceType = Lens.lens (\JobResourceTags' {resourceType} -> resourceType) (\s@JobResourceTags' {} a -> s {resourceType = a} :: JobResourceTags)
+
+-- | The job\'s tags.
+jobResourceTags_tags :: Lens.Lens' JobResourceTags (Prelude.HashMap Prelude.Text Prelude.Text)
+jobResourceTags_tags = Lens.lens (\JobResourceTags' {tags} -> tags) (\s@JobResourceTags' {} a -> s {tags = a} :: JobResourceTags) Prelude.. Lens.coerced
+
+instance Data.FromJSON JobResourceTags where
+  parseJSON =
+    Data.withObject
+      "JobResourceTags"
+      ( \x ->
+          JobResourceTags'
+            Prelude.<$> (x Data..: "ResourceType")
+            Prelude.<*> (x Data..:? "Tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable JobResourceTags where
+  hashWithSalt _salt JobResourceTags' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceType
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData JobResourceTags where
+  rnf JobResourceTags' {..} =
+    Prelude.rnf resourceType
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToJSON JobResourceTags where
+  toJSON JobResourceTags' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ResourceType" Data..= resourceType),
+            Prelude.Just ("Tags" Data..= tags)
+          ]
+      )
diff --git a/gen/Amazonka/Panorama/Types/JobResourceType.hs b/gen/Amazonka/Panorama/Types/JobResourceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/JobResourceType.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.Panorama.Types.JobResourceType
+-- 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.Panorama.Types.JobResourceType
+  ( JobResourceType
+      ( ..,
+        JobResourceType_PACKAGE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype JobResourceType = JobResourceType'
+  { fromJobResourceType ::
+      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 JobResourceType_PACKAGE :: JobResourceType
+pattern JobResourceType_PACKAGE = JobResourceType' "PACKAGE"
+
+{-# COMPLETE
+  JobResourceType_PACKAGE,
+  JobResourceType'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/JobType.hs b/gen/Amazonka/Panorama/Types/JobType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/JobType.hs
@@ -0,0 +1,68 @@
+{-# 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.Panorama.Types.JobType
+-- 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.Panorama.Types.JobType
+  ( JobType
+      ( ..,
+        JobType_OTA,
+        JobType_REBOOT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype JobType = JobType' {fromJobType :: 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 JobType_OTA :: JobType
+pattern JobType_OTA = JobType' "OTA"
+
+pattern JobType_REBOOT :: JobType
+pattern JobType_REBOOT = JobType' "REBOOT"
+
+{-# COMPLETE
+  JobType_OTA,
+  JobType_REBOOT,
+  JobType'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/LatestDeviceJob.hs b/gen/Amazonka/Panorama/Types/LatestDeviceJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/LatestDeviceJob.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.Panorama.Types.LatestDeviceJob
+-- 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.Panorama.Types.LatestDeviceJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.JobType
+import Amazonka.Panorama.Types.UpdateProgress
+import qualified Amazonka.Prelude as Prelude
+
+-- | Returns information about the latest device job.
+--
+-- /See:/ 'newLatestDeviceJob' smart constructor.
+data LatestDeviceJob = LatestDeviceJob'
+  { -- | The target version of the device software.
+    imageVersion :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s type.
+    jobType :: Prelude.Maybe JobType,
+    -- | Status of the latest device job.
+    status :: Prelude.Maybe UpdateProgress
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LatestDeviceJob' 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:
+--
+-- 'imageVersion', 'latestDeviceJob_imageVersion' - The target version of the device software.
+--
+-- 'jobType', 'latestDeviceJob_jobType' - The job\'s type.
+--
+-- 'status', 'latestDeviceJob_status' - Status of the latest device job.
+newLatestDeviceJob ::
+  LatestDeviceJob
+newLatestDeviceJob =
+  LatestDeviceJob'
+    { imageVersion = Prelude.Nothing,
+      jobType = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The target version of the device software.
+latestDeviceJob_imageVersion :: Lens.Lens' LatestDeviceJob (Prelude.Maybe Prelude.Text)
+latestDeviceJob_imageVersion = Lens.lens (\LatestDeviceJob' {imageVersion} -> imageVersion) (\s@LatestDeviceJob' {} a -> s {imageVersion = a} :: LatestDeviceJob)
+
+-- | The job\'s type.
+latestDeviceJob_jobType :: Lens.Lens' LatestDeviceJob (Prelude.Maybe JobType)
+latestDeviceJob_jobType = Lens.lens (\LatestDeviceJob' {jobType} -> jobType) (\s@LatestDeviceJob' {} a -> s {jobType = a} :: LatestDeviceJob)
+
+-- | Status of the latest device job.
+latestDeviceJob_status :: Lens.Lens' LatestDeviceJob (Prelude.Maybe UpdateProgress)
+latestDeviceJob_status = Lens.lens (\LatestDeviceJob' {status} -> status) (\s@LatestDeviceJob' {} a -> s {status = a} :: LatestDeviceJob)
+
+instance Data.FromJSON LatestDeviceJob where
+  parseJSON =
+    Data.withObject
+      "LatestDeviceJob"
+      ( \x ->
+          LatestDeviceJob'
+            Prelude.<$> (x Data..:? "ImageVersion")
+            Prelude.<*> (x Data..:? "JobType")
+            Prelude.<*> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable LatestDeviceJob where
+  hashWithSalt _salt LatestDeviceJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` imageVersion
+      `Prelude.hashWithSalt` jobType
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData LatestDeviceJob where
+  rnf LatestDeviceJob' {..} =
+    Prelude.rnf imageVersion
+      `Prelude.seq` Prelude.rnf jobType
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Panorama/Types/ListDevicesSortBy.hs b/gen/Amazonka/Panorama/Types/ListDevicesSortBy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/ListDevicesSortBy.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.Panorama.Types.ListDevicesSortBy
+-- 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.Panorama.Types.ListDevicesSortBy
+  ( ListDevicesSortBy
+      ( ..,
+        ListDevicesSortBy_CREATED_TIME,
+        ListDevicesSortBy_DEVICE_AGGREGATED_STATUS,
+        ListDevicesSortBy_DEVICE_ID,
+        ListDevicesSortBy_NAME
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ListDevicesSortBy = ListDevicesSortBy'
+  { fromListDevicesSortBy ::
+      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 ListDevicesSortBy_CREATED_TIME :: ListDevicesSortBy
+pattern ListDevicesSortBy_CREATED_TIME = ListDevicesSortBy' "CREATED_TIME"
+
+pattern ListDevicesSortBy_DEVICE_AGGREGATED_STATUS :: ListDevicesSortBy
+pattern ListDevicesSortBy_DEVICE_AGGREGATED_STATUS = ListDevicesSortBy' "DEVICE_AGGREGATED_STATUS"
+
+pattern ListDevicesSortBy_DEVICE_ID :: ListDevicesSortBy
+pattern ListDevicesSortBy_DEVICE_ID = ListDevicesSortBy' "DEVICE_ID"
+
+pattern ListDevicesSortBy_NAME :: ListDevicesSortBy
+pattern ListDevicesSortBy_NAME = ListDevicesSortBy' "NAME"
+
+{-# COMPLETE
+  ListDevicesSortBy_CREATED_TIME,
+  ListDevicesSortBy_DEVICE_AGGREGATED_STATUS,
+  ListDevicesSortBy_DEVICE_ID,
+  ListDevicesSortBy_NAME,
+  ListDevicesSortBy'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/ManifestOverridesPayload.hs b/gen/Amazonka/Panorama/Types/ManifestOverridesPayload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/ManifestOverridesPayload.hs
@@ -0,0 +1,81 @@
+{-# 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.Panorama.Types.ManifestOverridesPayload
+-- 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.Panorama.Types.ManifestOverridesPayload 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
+
+-- | Parameter overrides for an application instance. This is a JSON document
+-- that has a single key (@PayloadData@) where the value is an escaped
+-- string representation of the overrides document.
+--
+-- /See:/ 'newManifestOverridesPayload' smart constructor.
+data ManifestOverridesPayload = ManifestOverridesPayload'
+  { -- | The overrides document.
+    payloadData :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ManifestOverridesPayload' 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:
+--
+-- 'payloadData', 'manifestOverridesPayload_payloadData' - The overrides document.
+newManifestOverridesPayload ::
+  ManifestOverridesPayload
+newManifestOverridesPayload =
+  ManifestOverridesPayload'
+    { payloadData =
+        Prelude.Nothing
+    }
+
+-- | The overrides document.
+manifestOverridesPayload_payloadData :: Lens.Lens' ManifestOverridesPayload (Prelude.Maybe Prelude.Text)
+manifestOverridesPayload_payloadData = Lens.lens (\ManifestOverridesPayload' {payloadData} -> payloadData) (\s@ManifestOverridesPayload' {} a -> s {payloadData = a} :: ManifestOverridesPayload)
+
+instance Data.FromJSON ManifestOverridesPayload where
+  parseJSON =
+    Data.withObject
+      "ManifestOverridesPayload"
+      ( \x ->
+          ManifestOverridesPayload'
+            Prelude.<$> (x Data..:? "PayloadData")
+      )
+
+instance Prelude.Hashable ManifestOverridesPayload where
+  hashWithSalt _salt ManifestOverridesPayload' {..} =
+    _salt `Prelude.hashWithSalt` payloadData
+
+instance Prelude.NFData ManifestOverridesPayload where
+  rnf ManifestOverridesPayload' {..} =
+    Prelude.rnf payloadData
+
+instance Data.ToJSON ManifestOverridesPayload where
+  toJSON ManifestOverridesPayload' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("PayloadData" Data..=) Prelude.<$> payloadData]
+      )
diff --git a/gen/Amazonka/Panorama/Types/ManifestPayload.hs b/gen/Amazonka/Panorama/Types/ManifestPayload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/ManifestPayload.hs
@@ -0,0 +1,78 @@
+{-# 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.Panorama.Types.ManifestPayload
+-- 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.Panorama.Types.ManifestPayload 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 application verion\'s manifest file. This is a JSON document that has
+-- a single key (@PayloadData@) where the value is an escaped string
+-- representation of the application manifest (@graph.json@). This file is
+-- located in the @graphs@ folder in your application source.
+--
+-- /See:/ 'newManifestPayload' smart constructor.
+data ManifestPayload = ManifestPayload'
+  { -- | The application manifest.
+    payloadData :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ManifestPayload' 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:
+--
+-- 'payloadData', 'manifestPayload_payloadData' - The application manifest.
+newManifestPayload ::
+  ManifestPayload
+newManifestPayload =
+  ManifestPayload' {payloadData = Prelude.Nothing}
+
+-- | The application manifest.
+manifestPayload_payloadData :: Lens.Lens' ManifestPayload (Prelude.Maybe Prelude.Text)
+manifestPayload_payloadData = Lens.lens (\ManifestPayload' {payloadData} -> payloadData) (\s@ManifestPayload' {} a -> s {payloadData = a} :: ManifestPayload)
+
+instance Data.FromJSON ManifestPayload where
+  parseJSON =
+    Data.withObject
+      "ManifestPayload"
+      ( \x ->
+          ManifestPayload'
+            Prelude.<$> (x Data..:? "PayloadData")
+      )
+
+instance Prelude.Hashable ManifestPayload where
+  hashWithSalt _salt ManifestPayload' {..} =
+    _salt `Prelude.hashWithSalt` payloadData
+
+instance Prelude.NFData ManifestPayload where
+  rnf ManifestPayload' {..} = Prelude.rnf payloadData
+
+instance Data.ToJSON ManifestPayload where
+  toJSON ManifestPayload' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("PayloadData" Data..=) Prelude.<$> payloadData]
+      )
diff --git a/gen/Amazonka/Panorama/Types/NetworkConnectionStatus.hs b/gen/Amazonka/Panorama/Types/NetworkConnectionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NetworkConnectionStatus.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.Panorama.Types.NetworkConnectionStatus
+-- 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.Panorama.Types.NetworkConnectionStatus
+  ( NetworkConnectionStatus
+      ( ..,
+        NetworkConnectionStatus_CONNECTED,
+        NetworkConnectionStatus_CONNECTING,
+        NetworkConnectionStatus_NOT_CONNECTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype NetworkConnectionStatus = NetworkConnectionStatus'
+  { fromNetworkConnectionStatus ::
+      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 NetworkConnectionStatus_CONNECTED :: NetworkConnectionStatus
+pattern NetworkConnectionStatus_CONNECTED = NetworkConnectionStatus' "CONNECTED"
+
+pattern NetworkConnectionStatus_CONNECTING :: NetworkConnectionStatus
+pattern NetworkConnectionStatus_CONNECTING = NetworkConnectionStatus' "CONNECTING"
+
+pattern NetworkConnectionStatus_NOT_CONNECTED :: NetworkConnectionStatus
+pattern NetworkConnectionStatus_NOT_CONNECTED = NetworkConnectionStatus' "NOT_CONNECTED"
+
+{-# COMPLETE
+  NetworkConnectionStatus_CONNECTED,
+  NetworkConnectionStatus_CONNECTING,
+  NetworkConnectionStatus_NOT_CONNECTED,
+  NetworkConnectionStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/NetworkPayload.hs b/gen/Amazonka/Panorama/Types/NetworkPayload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NetworkPayload.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.Panorama.Types.NetworkPayload
+-- 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.Panorama.Types.NetworkPayload where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.EthernetPayload
+import Amazonka.Panorama.Types.NtpPayload
+import qualified Amazonka.Prelude as Prelude
+
+-- | The network configuration for a device.
+--
+-- /See:/ 'newNetworkPayload' smart constructor.
+data NetworkPayload = NetworkPayload'
+  { -- | Settings for Ethernet port 0.
+    ethernet0 :: Prelude.Maybe EthernetPayload,
+    -- | Settings for Ethernet port 1.
+    ethernet1 :: Prelude.Maybe EthernetPayload,
+    -- | Network time protocol (NTP) server settings.
+    ntp :: Prelude.Maybe NtpPayload
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NetworkPayload' 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:
+--
+-- 'ethernet0', 'networkPayload_ethernet0' - Settings for Ethernet port 0.
+--
+-- 'ethernet1', 'networkPayload_ethernet1' - Settings for Ethernet port 1.
+--
+-- 'ntp', 'networkPayload_ntp' - Network time protocol (NTP) server settings.
+newNetworkPayload ::
+  NetworkPayload
+newNetworkPayload =
+  NetworkPayload'
+    { ethernet0 = Prelude.Nothing,
+      ethernet1 = Prelude.Nothing,
+      ntp = Prelude.Nothing
+    }
+
+-- | Settings for Ethernet port 0.
+networkPayload_ethernet0 :: Lens.Lens' NetworkPayload (Prelude.Maybe EthernetPayload)
+networkPayload_ethernet0 = Lens.lens (\NetworkPayload' {ethernet0} -> ethernet0) (\s@NetworkPayload' {} a -> s {ethernet0 = a} :: NetworkPayload)
+
+-- | Settings for Ethernet port 1.
+networkPayload_ethernet1 :: Lens.Lens' NetworkPayload (Prelude.Maybe EthernetPayload)
+networkPayload_ethernet1 = Lens.lens (\NetworkPayload' {ethernet1} -> ethernet1) (\s@NetworkPayload' {} a -> s {ethernet1 = a} :: NetworkPayload)
+
+-- | Network time protocol (NTP) server settings.
+networkPayload_ntp :: Lens.Lens' NetworkPayload (Prelude.Maybe NtpPayload)
+networkPayload_ntp = Lens.lens (\NetworkPayload' {ntp} -> ntp) (\s@NetworkPayload' {} a -> s {ntp = a} :: NetworkPayload)
+
+instance Data.FromJSON NetworkPayload where
+  parseJSON =
+    Data.withObject
+      "NetworkPayload"
+      ( \x ->
+          NetworkPayload'
+            Prelude.<$> (x Data..:? "Ethernet0")
+            Prelude.<*> (x Data..:? "Ethernet1")
+            Prelude.<*> (x Data..:? "Ntp")
+      )
+
+instance Prelude.Hashable NetworkPayload where
+  hashWithSalt _salt NetworkPayload' {..} =
+    _salt
+      `Prelude.hashWithSalt` ethernet0
+      `Prelude.hashWithSalt` ethernet1
+      `Prelude.hashWithSalt` ntp
+
+instance Prelude.NFData NetworkPayload where
+  rnf NetworkPayload' {..} =
+    Prelude.rnf ethernet0
+      `Prelude.seq` Prelude.rnf ethernet1
+      `Prelude.seq` Prelude.rnf ntp
+
+instance Data.ToJSON NetworkPayload where
+  toJSON NetworkPayload' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Ethernet0" Data..=) Prelude.<$> ethernet0,
+            ("Ethernet1" Data..=) Prelude.<$> ethernet1,
+            ("Ntp" Data..=) Prelude.<$> ntp
+          ]
+      )
diff --git a/gen/Amazonka/Panorama/Types/NetworkStatus.hs b/gen/Amazonka/Panorama/Types/NetworkStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NetworkStatus.hs
@@ -0,0 +1,110 @@
+{-# 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.Panorama.Types.NetworkStatus
+-- 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.Panorama.Types.NetworkStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.EthernetStatus
+import Amazonka.Panorama.Types.NtpStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The network status of a device.
+--
+-- /See:/ 'newNetworkStatus' smart constructor.
+data NetworkStatus = NetworkStatus'
+  { -- | The status of Ethernet port 0.
+    ethernet0Status :: Prelude.Maybe EthernetStatus,
+    -- | The status of Ethernet port 1.
+    ethernet1Status :: Prelude.Maybe EthernetStatus,
+    -- | When the network status changed.
+    lastUpdatedTime :: Prelude.Maybe Data.POSIX,
+    -- | Details about a network time protocol (NTP) server connection.
+    ntpStatus :: Prelude.Maybe NtpStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NetworkStatus' 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:
+--
+-- 'ethernet0Status', 'networkStatus_ethernet0Status' - The status of Ethernet port 0.
+--
+-- 'ethernet1Status', 'networkStatus_ethernet1Status' - The status of Ethernet port 1.
+--
+-- 'lastUpdatedTime', 'networkStatus_lastUpdatedTime' - When the network status changed.
+--
+-- 'ntpStatus', 'networkStatus_ntpStatus' - Details about a network time protocol (NTP) server connection.
+newNetworkStatus ::
+  NetworkStatus
+newNetworkStatus =
+  NetworkStatus'
+    { ethernet0Status = Prelude.Nothing,
+      ethernet1Status = Prelude.Nothing,
+      lastUpdatedTime = Prelude.Nothing,
+      ntpStatus = Prelude.Nothing
+    }
+
+-- | The status of Ethernet port 0.
+networkStatus_ethernet0Status :: Lens.Lens' NetworkStatus (Prelude.Maybe EthernetStatus)
+networkStatus_ethernet0Status = Lens.lens (\NetworkStatus' {ethernet0Status} -> ethernet0Status) (\s@NetworkStatus' {} a -> s {ethernet0Status = a} :: NetworkStatus)
+
+-- | The status of Ethernet port 1.
+networkStatus_ethernet1Status :: Lens.Lens' NetworkStatus (Prelude.Maybe EthernetStatus)
+networkStatus_ethernet1Status = Lens.lens (\NetworkStatus' {ethernet1Status} -> ethernet1Status) (\s@NetworkStatus' {} a -> s {ethernet1Status = a} :: NetworkStatus)
+
+-- | When the network status changed.
+networkStatus_lastUpdatedTime :: Lens.Lens' NetworkStatus (Prelude.Maybe Prelude.UTCTime)
+networkStatus_lastUpdatedTime = Lens.lens (\NetworkStatus' {lastUpdatedTime} -> lastUpdatedTime) (\s@NetworkStatus' {} a -> s {lastUpdatedTime = a} :: NetworkStatus) Prelude.. Lens.mapping Data._Time
+
+-- | Details about a network time protocol (NTP) server connection.
+networkStatus_ntpStatus :: Lens.Lens' NetworkStatus (Prelude.Maybe NtpStatus)
+networkStatus_ntpStatus = Lens.lens (\NetworkStatus' {ntpStatus} -> ntpStatus) (\s@NetworkStatus' {} a -> s {ntpStatus = a} :: NetworkStatus)
+
+instance Data.FromJSON NetworkStatus where
+  parseJSON =
+    Data.withObject
+      "NetworkStatus"
+      ( \x ->
+          NetworkStatus'
+            Prelude.<$> (x Data..:? "Ethernet0Status")
+            Prelude.<*> (x Data..:? "Ethernet1Status")
+            Prelude.<*> (x Data..:? "LastUpdatedTime")
+            Prelude.<*> (x Data..:? "NtpStatus")
+      )
+
+instance Prelude.Hashable NetworkStatus where
+  hashWithSalt _salt NetworkStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` ethernet0Status
+      `Prelude.hashWithSalt` ethernet1Status
+      `Prelude.hashWithSalt` lastUpdatedTime
+      `Prelude.hashWithSalt` ntpStatus
+
+instance Prelude.NFData NetworkStatus where
+  rnf NetworkStatus' {..} =
+    Prelude.rnf ethernet0Status
+      `Prelude.seq` Prelude.rnf ethernet1Status
+      `Prelude.seq` Prelude.rnf lastUpdatedTime
+      `Prelude.seq` Prelude.rnf ntpStatus
diff --git a/gen/Amazonka/Panorama/Types/Node.hs b/gen/Amazonka/Panorama/Types/Node.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/Node.hs
@@ -0,0 +1,218 @@
+{-# 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.Panorama.Types.Node
+-- 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.Panorama.Types.Node where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.NodeCategory
+import qualified Amazonka.Prelude as Prelude
+
+-- | An application node that represents a camera stream, a model, code, or
+-- output.
+--
+-- /See:/ 'newNode' smart constructor.
+data Node = Node'
+  { -- | The node\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The account ID of the node\'s owner.
+    ownerAccount :: Prelude.Maybe Prelude.Text,
+    -- | The node\'s ARN.
+    packageArn :: Prelude.Maybe Prelude.Text,
+    -- | The node\'s category.
+    category :: NodeCategory,
+    -- | When the node was created.
+    createdTime :: Data.POSIX,
+    -- | The node\'s name.
+    name :: Prelude.Text,
+    -- | The node\'s ID.
+    nodeId :: Prelude.Text,
+    -- | The node\'s package ID.
+    packageId :: Prelude.Text,
+    -- | The node\'s package name.
+    packageName :: Prelude.Text,
+    -- | The node\'s package version.
+    packageVersion :: Prelude.Text,
+    -- | The node\'s patch version.
+    patchVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Node' 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', 'node_description' - The node\'s description.
+--
+-- 'ownerAccount', 'node_ownerAccount' - The account ID of the node\'s owner.
+--
+-- 'packageArn', 'node_packageArn' - The node\'s ARN.
+--
+-- 'category', 'node_category' - The node\'s category.
+--
+-- 'createdTime', 'node_createdTime' - When the node was created.
+--
+-- 'name', 'node_name' - The node\'s name.
+--
+-- 'nodeId', 'node_nodeId' - The node\'s ID.
+--
+-- 'packageId', 'node_packageId' - The node\'s package ID.
+--
+-- 'packageName', 'node_packageName' - The node\'s package name.
+--
+-- 'packageVersion', 'node_packageVersion' - The node\'s package version.
+--
+-- 'patchVersion', 'node_patchVersion' - The node\'s patch version.
+newNode ::
+  -- | 'category'
+  NodeCategory ->
+  -- | 'createdTime'
+  Prelude.UTCTime ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'nodeId'
+  Prelude.Text ->
+  -- | 'packageId'
+  Prelude.Text ->
+  -- | 'packageName'
+  Prelude.Text ->
+  -- | 'packageVersion'
+  Prelude.Text ->
+  -- | 'patchVersion'
+  Prelude.Text ->
+  Node
+newNode
+  pCategory_
+  pCreatedTime_
+  pName_
+  pNodeId_
+  pPackageId_
+  pPackageName_
+  pPackageVersion_
+  pPatchVersion_ =
+    Node'
+      { description = Prelude.Nothing,
+        ownerAccount = Prelude.Nothing,
+        packageArn = Prelude.Nothing,
+        category = pCategory_,
+        createdTime = Data._Time Lens.# pCreatedTime_,
+        name = pName_,
+        nodeId = pNodeId_,
+        packageId = pPackageId_,
+        packageName = pPackageName_,
+        packageVersion = pPackageVersion_,
+        patchVersion = pPatchVersion_
+      }
+
+-- | The node\'s description.
+node_description :: Lens.Lens' Node (Prelude.Maybe Prelude.Text)
+node_description = Lens.lens (\Node' {description} -> description) (\s@Node' {} a -> s {description = a} :: Node)
+
+-- | The account ID of the node\'s owner.
+node_ownerAccount :: Lens.Lens' Node (Prelude.Maybe Prelude.Text)
+node_ownerAccount = Lens.lens (\Node' {ownerAccount} -> ownerAccount) (\s@Node' {} a -> s {ownerAccount = a} :: Node)
+
+-- | The node\'s ARN.
+node_packageArn :: Lens.Lens' Node (Prelude.Maybe Prelude.Text)
+node_packageArn = Lens.lens (\Node' {packageArn} -> packageArn) (\s@Node' {} a -> s {packageArn = a} :: Node)
+
+-- | The node\'s category.
+node_category :: Lens.Lens' Node NodeCategory
+node_category = Lens.lens (\Node' {category} -> category) (\s@Node' {} a -> s {category = a} :: Node)
+
+-- | When the node was created.
+node_createdTime :: Lens.Lens' Node Prelude.UTCTime
+node_createdTime = Lens.lens (\Node' {createdTime} -> createdTime) (\s@Node' {} a -> s {createdTime = a} :: Node) Prelude.. Data._Time
+
+-- | The node\'s name.
+node_name :: Lens.Lens' Node Prelude.Text
+node_name = Lens.lens (\Node' {name} -> name) (\s@Node' {} a -> s {name = a} :: Node)
+
+-- | The node\'s ID.
+node_nodeId :: Lens.Lens' Node Prelude.Text
+node_nodeId = Lens.lens (\Node' {nodeId} -> nodeId) (\s@Node' {} a -> s {nodeId = a} :: Node)
+
+-- | The node\'s package ID.
+node_packageId :: Lens.Lens' Node Prelude.Text
+node_packageId = Lens.lens (\Node' {packageId} -> packageId) (\s@Node' {} a -> s {packageId = a} :: Node)
+
+-- | The node\'s package name.
+node_packageName :: Lens.Lens' Node Prelude.Text
+node_packageName = Lens.lens (\Node' {packageName} -> packageName) (\s@Node' {} a -> s {packageName = a} :: Node)
+
+-- | The node\'s package version.
+node_packageVersion :: Lens.Lens' Node Prelude.Text
+node_packageVersion = Lens.lens (\Node' {packageVersion} -> packageVersion) (\s@Node' {} a -> s {packageVersion = a} :: Node)
+
+-- | The node\'s patch version.
+node_patchVersion :: Lens.Lens' Node Prelude.Text
+node_patchVersion = Lens.lens (\Node' {patchVersion} -> patchVersion) (\s@Node' {} a -> s {patchVersion = a} :: Node)
+
+instance Data.FromJSON Node where
+  parseJSON =
+    Data.withObject
+      "Node"
+      ( \x ->
+          Node'
+            Prelude.<$> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "OwnerAccount")
+            Prelude.<*> (x Data..:? "PackageArn")
+            Prelude.<*> (x Data..: "Category")
+            Prelude.<*> (x Data..: "CreatedTime")
+            Prelude.<*> (x Data..: "Name")
+            Prelude.<*> (x Data..: "NodeId")
+            Prelude.<*> (x Data..: "PackageId")
+            Prelude.<*> (x Data..: "PackageName")
+            Prelude.<*> (x Data..: "PackageVersion")
+            Prelude.<*> (x Data..: "PatchVersion")
+      )
+
+instance Prelude.Hashable Node where
+  hashWithSalt _salt Node' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` ownerAccount
+      `Prelude.hashWithSalt` packageArn
+      `Prelude.hashWithSalt` category
+      `Prelude.hashWithSalt` createdTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` nodeId
+      `Prelude.hashWithSalt` packageId
+      `Prelude.hashWithSalt` packageName
+      `Prelude.hashWithSalt` packageVersion
+      `Prelude.hashWithSalt` patchVersion
+
+instance Prelude.NFData Node where
+  rnf Node' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf ownerAccount
+      `Prelude.seq` Prelude.rnf packageArn
+      `Prelude.seq` Prelude.rnf category
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf nodeId
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf patchVersion
diff --git a/gen/Amazonka/Panorama/Types/NodeCategory.hs b/gen/Amazonka/Panorama/Types/NodeCategory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeCategory.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.Panorama.Types.NodeCategory
+-- 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.Panorama.Types.NodeCategory
+  ( NodeCategory
+      ( ..,
+        NodeCategory_BUSINESS_LOGIC,
+        NodeCategory_MEDIA_SINK,
+        NodeCategory_MEDIA_SOURCE,
+        NodeCategory_ML_MODEL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype NodeCategory = NodeCategory'
+  { fromNodeCategory ::
+      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 NodeCategory_BUSINESS_LOGIC :: NodeCategory
+pattern NodeCategory_BUSINESS_LOGIC = NodeCategory' "BUSINESS_LOGIC"
+
+pattern NodeCategory_MEDIA_SINK :: NodeCategory
+pattern NodeCategory_MEDIA_SINK = NodeCategory' "MEDIA_SINK"
+
+pattern NodeCategory_MEDIA_SOURCE :: NodeCategory
+pattern NodeCategory_MEDIA_SOURCE = NodeCategory' "MEDIA_SOURCE"
+
+pattern NodeCategory_ML_MODEL :: NodeCategory
+pattern NodeCategory_ML_MODEL = NodeCategory' "ML_MODEL"
+
+{-# COMPLETE
+  NodeCategory_BUSINESS_LOGIC,
+  NodeCategory_MEDIA_SINK,
+  NodeCategory_MEDIA_SOURCE,
+  NodeCategory_ML_MODEL,
+  NodeCategory'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/NodeFromTemplateJob.hs b/gen/Amazonka/Panorama/Types/NodeFromTemplateJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeFromTemplateJob.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.Panorama.Types.NodeFromTemplateJob
+-- 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.Panorama.Types.NodeFromTemplateJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.NodeFromTemplateJobStatus
+import Amazonka.Panorama.Types.TemplateType
+import qualified Amazonka.Prelude as Prelude
+
+-- | A job to create a camera stream node.
+--
+-- /See:/ 'newNodeFromTemplateJob' smart constructor.
+data NodeFromTemplateJob = NodeFromTemplateJob'
+  { -- | When the job was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | The job\'s ID.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The node\'s name.
+    nodeName :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s status.
+    status :: Prelude.Maybe NodeFromTemplateJobStatus,
+    -- | The job\'s status message.
+    statusMessage :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s template type.
+    templateType :: Prelude.Maybe TemplateType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeFromTemplateJob' 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:
+--
+-- 'createdTime', 'nodeFromTemplateJob_createdTime' - When the job was created.
+--
+-- 'jobId', 'nodeFromTemplateJob_jobId' - The job\'s ID.
+--
+-- 'nodeName', 'nodeFromTemplateJob_nodeName' - The node\'s name.
+--
+-- 'status', 'nodeFromTemplateJob_status' - The job\'s status.
+--
+-- 'statusMessage', 'nodeFromTemplateJob_statusMessage' - The job\'s status message.
+--
+-- 'templateType', 'nodeFromTemplateJob_templateType' - The job\'s template type.
+newNodeFromTemplateJob ::
+  NodeFromTemplateJob
+newNodeFromTemplateJob =
+  NodeFromTemplateJob'
+    { createdTime = Prelude.Nothing,
+      jobId = Prelude.Nothing,
+      nodeName = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusMessage = Prelude.Nothing,
+      templateType = Prelude.Nothing
+    }
+
+-- | When the job was created.
+nodeFromTemplateJob_createdTime :: Lens.Lens' NodeFromTemplateJob (Prelude.Maybe Prelude.UTCTime)
+nodeFromTemplateJob_createdTime = Lens.lens (\NodeFromTemplateJob' {createdTime} -> createdTime) (\s@NodeFromTemplateJob' {} a -> s {createdTime = a} :: NodeFromTemplateJob) Prelude.. Lens.mapping Data._Time
+
+-- | The job\'s ID.
+nodeFromTemplateJob_jobId :: Lens.Lens' NodeFromTemplateJob (Prelude.Maybe Prelude.Text)
+nodeFromTemplateJob_jobId = Lens.lens (\NodeFromTemplateJob' {jobId} -> jobId) (\s@NodeFromTemplateJob' {} a -> s {jobId = a} :: NodeFromTemplateJob)
+
+-- | The node\'s name.
+nodeFromTemplateJob_nodeName :: Lens.Lens' NodeFromTemplateJob (Prelude.Maybe Prelude.Text)
+nodeFromTemplateJob_nodeName = Lens.lens (\NodeFromTemplateJob' {nodeName} -> nodeName) (\s@NodeFromTemplateJob' {} a -> s {nodeName = a} :: NodeFromTemplateJob)
+
+-- | The job\'s status.
+nodeFromTemplateJob_status :: Lens.Lens' NodeFromTemplateJob (Prelude.Maybe NodeFromTemplateJobStatus)
+nodeFromTemplateJob_status = Lens.lens (\NodeFromTemplateJob' {status} -> status) (\s@NodeFromTemplateJob' {} a -> s {status = a} :: NodeFromTemplateJob)
+
+-- | The job\'s status message.
+nodeFromTemplateJob_statusMessage :: Lens.Lens' NodeFromTemplateJob (Prelude.Maybe Prelude.Text)
+nodeFromTemplateJob_statusMessage = Lens.lens (\NodeFromTemplateJob' {statusMessage} -> statusMessage) (\s@NodeFromTemplateJob' {} a -> s {statusMessage = a} :: NodeFromTemplateJob)
+
+-- | The job\'s template type.
+nodeFromTemplateJob_templateType :: Lens.Lens' NodeFromTemplateJob (Prelude.Maybe TemplateType)
+nodeFromTemplateJob_templateType = Lens.lens (\NodeFromTemplateJob' {templateType} -> templateType) (\s@NodeFromTemplateJob' {} a -> s {templateType = a} :: NodeFromTemplateJob)
+
+instance Data.FromJSON NodeFromTemplateJob where
+  parseJSON =
+    Data.withObject
+      "NodeFromTemplateJob"
+      ( \x ->
+          NodeFromTemplateJob'
+            Prelude.<$> (x Data..:? "CreatedTime")
+            Prelude.<*> (x Data..:? "JobId")
+            Prelude.<*> (x Data..:? "NodeName")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "StatusMessage")
+            Prelude.<*> (x Data..:? "TemplateType")
+      )
+
+instance Prelude.Hashable NodeFromTemplateJob where
+  hashWithSalt _salt NodeFromTemplateJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdTime
+      `Prelude.hashWithSalt` jobId
+      `Prelude.hashWithSalt` nodeName
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` statusMessage
+      `Prelude.hashWithSalt` templateType
+
+instance Prelude.NFData NodeFromTemplateJob where
+  rnf NodeFromTemplateJob' {..} =
+    Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf nodeName
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
+      `Prelude.seq` Prelude.rnf templateType
diff --git a/gen/Amazonka/Panorama/Types/NodeFromTemplateJobStatus.hs b/gen/Amazonka/Panorama/Types/NodeFromTemplateJobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeFromTemplateJobStatus.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.Panorama.Types.NodeFromTemplateJobStatus
+-- 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.Panorama.Types.NodeFromTemplateJobStatus
+  ( NodeFromTemplateJobStatus
+      ( ..,
+        NodeFromTemplateJobStatus_FAILED,
+        NodeFromTemplateJobStatus_PENDING,
+        NodeFromTemplateJobStatus_SUCCEEDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype NodeFromTemplateJobStatus = NodeFromTemplateJobStatus'
+  { fromNodeFromTemplateJobStatus ::
+      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 NodeFromTemplateJobStatus_FAILED :: NodeFromTemplateJobStatus
+pattern NodeFromTemplateJobStatus_FAILED = NodeFromTemplateJobStatus' "FAILED"
+
+pattern NodeFromTemplateJobStatus_PENDING :: NodeFromTemplateJobStatus
+pattern NodeFromTemplateJobStatus_PENDING = NodeFromTemplateJobStatus' "PENDING"
+
+pattern NodeFromTemplateJobStatus_SUCCEEDED :: NodeFromTemplateJobStatus
+pattern NodeFromTemplateJobStatus_SUCCEEDED = NodeFromTemplateJobStatus' "SUCCEEDED"
+
+{-# COMPLETE
+  NodeFromTemplateJobStatus_FAILED,
+  NodeFromTemplateJobStatus_PENDING,
+  NodeFromTemplateJobStatus_SUCCEEDED,
+  NodeFromTemplateJobStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/NodeInputPort.hs b/gen/Amazonka/Panorama/Types/NodeInputPort.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeInputPort.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.Panorama.Types.NodeInputPort
+-- 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.Panorama.Types.NodeInputPort where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.PortType
+import qualified Amazonka.Prelude as Prelude
+
+-- | A node input port.
+--
+-- /See:/ 'newNodeInputPort' smart constructor.
+data NodeInputPort = NodeInputPort'
+  { -- | The input port\'s default value.
+    defaultValue :: Prelude.Maybe Prelude.Text,
+    -- | The input port\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The input port\'s max connections.
+    maxConnections :: Prelude.Maybe Prelude.Int,
+    -- | The input port\'s name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The input port\'s type.
+    type' :: Prelude.Maybe PortType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeInputPort' 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:
+--
+-- 'defaultValue', 'nodeInputPort_defaultValue' - The input port\'s default value.
+--
+-- 'description', 'nodeInputPort_description' - The input port\'s description.
+--
+-- 'maxConnections', 'nodeInputPort_maxConnections' - The input port\'s max connections.
+--
+-- 'name', 'nodeInputPort_name' - The input port\'s name.
+--
+-- 'type'', 'nodeInputPort_type' - The input port\'s type.
+newNodeInputPort ::
+  NodeInputPort
+newNodeInputPort =
+  NodeInputPort'
+    { defaultValue = Prelude.Nothing,
+      description = Prelude.Nothing,
+      maxConnections = Prelude.Nothing,
+      name = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The input port\'s default value.
+nodeInputPort_defaultValue :: Lens.Lens' NodeInputPort (Prelude.Maybe Prelude.Text)
+nodeInputPort_defaultValue = Lens.lens (\NodeInputPort' {defaultValue} -> defaultValue) (\s@NodeInputPort' {} a -> s {defaultValue = a} :: NodeInputPort)
+
+-- | The input port\'s description.
+nodeInputPort_description :: Lens.Lens' NodeInputPort (Prelude.Maybe Prelude.Text)
+nodeInputPort_description = Lens.lens (\NodeInputPort' {description} -> description) (\s@NodeInputPort' {} a -> s {description = a} :: NodeInputPort)
+
+-- | The input port\'s max connections.
+nodeInputPort_maxConnections :: Lens.Lens' NodeInputPort (Prelude.Maybe Prelude.Int)
+nodeInputPort_maxConnections = Lens.lens (\NodeInputPort' {maxConnections} -> maxConnections) (\s@NodeInputPort' {} a -> s {maxConnections = a} :: NodeInputPort)
+
+-- | The input port\'s name.
+nodeInputPort_name :: Lens.Lens' NodeInputPort (Prelude.Maybe Prelude.Text)
+nodeInputPort_name = Lens.lens (\NodeInputPort' {name} -> name) (\s@NodeInputPort' {} a -> s {name = a} :: NodeInputPort)
+
+-- | The input port\'s type.
+nodeInputPort_type :: Lens.Lens' NodeInputPort (Prelude.Maybe PortType)
+nodeInputPort_type = Lens.lens (\NodeInputPort' {type'} -> type') (\s@NodeInputPort' {} a -> s {type' = a} :: NodeInputPort)
+
+instance Data.FromJSON NodeInputPort where
+  parseJSON =
+    Data.withObject
+      "NodeInputPort"
+      ( \x ->
+          NodeInputPort'
+            Prelude.<$> (x Data..:? "DefaultValue")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "MaxConnections")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance Prelude.Hashable NodeInputPort where
+  hashWithSalt _salt NodeInputPort' {..} =
+    _salt
+      `Prelude.hashWithSalt` defaultValue
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` maxConnections
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData NodeInputPort where
+  rnf NodeInputPort' {..} =
+    Prelude.rnf defaultValue
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf maxConnections
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/Panorama/Types/NodeInstance.hs b/gen/Amazonka/Panorama/Types/NodeInstance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeInstance.hs
@@ -0,0 +1,149 @@
+{-# 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.Panorama.Types.NodeInstance
+-- 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.Panorama.Types.NodeInstance where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.NodeInstanceStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | A node instance.
+--
+-- /See:/ 'newNodeInstance' smart constructor.
+data NodeInstance = NodeInstance'
+  { -- | The node\'s ID.
+    nodeId :: Prelude.Maybe Prelude.Text,
+    -- | The instance\'s name.
+    nodeName :: Prelude.Maybe Prelude.Text,
+    -- | The instance\'s package name.
+    packageName :: Prelude.Maybe Prelude.Text,
+    -- | The instance\'s package patch version.
+    packagePatchVersion :: Prelude.Maybe Prelude.Text,
+    -- | The instance\'s package version.
+    packageVersion :: Prelude.Maybe Prelude.Text,
+    -- | The instance\'s current status.
+    currentStatus :: NodeInstanceStatus,
+    -- | The instance\'s ID.
+    nodeInstanceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeInstance' 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:
+--
+-- 'nodeId', 'nodeInstance_nodeId' - The node\'s ID.
+--
+-- 'nodeName', 'nodeInstance_nodeName' - The instance\'s name.
+--
+-- 'packageName', 'nodeInstance_packageName' - The instance\'s package name.
+--
+-- 'packagePatchVersion', 'nodeInstance_packagePatchVersion' - The instance\'s package patch version.
+--
+-- 'packageVersion', 'nodeInstance_packageVersion' - The instance\'s package version.
+--
+-- 'currentStatus', 'nodeInstance_currentStatus' - The instance\'s current status.
+--
+-- 'nodeInstanceId', 'nodeInstance_nodeInstanceId' - The instance\'s ID.
+newNodeInstance ::
+  -- | 'currentStatus'
+  NodeInstanceStatus ->
+  -- | 'nodeInstanceId'
+  Prelude.Text ->
+  NodeInstance
+newNodeInstance pCurrentStatus_ pNodeInstanceId_ =
+  NodeInstance'
+    { nodeId = Prelude.Nothing,
+      nodeName = Prelude.Nothing,
+      packageName = Prelude.Nothing,
+      packagePatchVersion = Prelude.Nothing,
+      packageVersion = Prelude.Nothing,
+      currentStatus = pCurrentStatus_,
+      nodeInstanceId = pNodeInstanceId_
+    }
+
+-- | The node\'s ID.
+nodeInstance_nodeId :: Lens.Lens' NodeInstance (Prelude.Maybe Prelude.Text)
+nodeInstance_nodeId = Lens.lens (\NodeInstance' {nodeId} -> nodeId) (\s@NodeInstance' {} a -> s {nodeId = a} :: NodeInstance)
+
+-- | The instance\'s name.
+nodeInstance_nodeName :: Lens.Lens' NodeInstance (Prelude.Maybe Prelude.Text)
+nodeInstance_nodeName = Lens.lens (\NodeInstance' {nodeName} -> nodeName) (\s@NodeInstance' {} a -> s {nodeName = a} :: NodeInstance)
+
+-- | The instance\'s package name.
+nodeInstance_packageName :: Lens.Lens' NodeInstance (Prelude.Maybe Prelude.Text)
+nodeInstance_packageName = Lens.lens (\NodeInstance' {packageName} -> packageName) (\s@NodeInstance' {} a -> s {packageName = a} :: NodeInstance)
+
+-- | The instance\'s package patch version.
+nodeInstance_packagePatchVersion :: Lens.Lens' NodeInstance (Prelude.Maybe Prelude.Text)
+nodeInstance_packagePatchVersion = Lens.lens (\NodeInstance' {packagePatchVersion} -> packagePatchVersion) (\s@NodeInstance' {} a -> s {packagePatchVersion = a} :: NodeInstance)
+
+-- | The instance\'s package version.
+nodeInstance_packageVersion :: Lens.Lens' NodeInstance (Prelude.Maybe Prelude.Text)
+nodeInstance_packageVersion = Lens.lens (\NodeInstance' {packageVersion} -> packageVersion) (\s@NodeInstance' {} a -> s {packageVersion = a} :: NodeInstance)
+
+-- | The instance\'s current status.
+nodeInstance_currentStatus :: Lens.Lens' NodeInstance NodeInstanceStatus
+nodeInstance_currentStatus = Lens.lens (\NodeInstance' {currentStatus} -> currentStatus) (\s@NodeInstance' {} a -> s {currentStatus = a} :: NodeInstance)
+
+-- | The instance\'s ID.
+nodeInstance_nodeInstanceId :: Lens.Lens' NodeInstance Prelude.Text
+nodeInstance_nodeInstanceId = Lens.lens (\NodeInstance' {nodeInstanceId} -> nodeInstanceId) (\s@NodeInstance' {} a -> s {nodeInstanceId = a} :: NodeInstance)
+
+instance Data.FromJSON NodeInstance where
+  parseJSON =
+    Data.withObject
+      "NodeInstance"
+      ( \x ->
+          NodeInstance'
+            Prelude.<$> (x Data..:? "NodeId")
+            Prelude.<*> (x Data..:? "NodeName")
+            Prelude.<*> (x Data..:? "PackageName")
+            Prelude.<*> (x Data..:? "PackagePatchVersion")
+            Prelude.<*> (x Data..:? "PackageVersion")
+            Prelude.<*> (x Data..: "CurrentStatus")
+            Prelude.<*> (x Data..: "NodeInstanceId")
+      )
+
+instance Prelude.Hashable NodeInstance where
+  hashWithSalt _salt NodeInstance' {..} =
+    _salt
+      `Prelude.hashWithSalt` nodeId
+      `Prelude.hashWithSalt` nodeName
+      `Prelude.hashWithSalt` packageName
+      `Prelude.hashWithSalt` packagePatchVersion
+      `Prelude.hashWithSalt` packageVersion
+      `Prelude.hashWithSalt` currentStatus
+      `Prelude.hashWithSalt` nodeInstanceId
+
+instance Prelude.NFData NodeInstance where
+  rnf NodeInstance' {..} =
+    Prelude.rnf nodeId
+      `Prelude.seq` Prelude.rnf nodeName
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf packagePatchVersion
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf currentStatus
+      `Prelude.seq` Prelude.rnf nodeInstanceId
diff --git a/gen/Amazonka/Panorama/Types/NodeInstanceStatus.hs b/gen/Amazonka/Panorama/Types/NodeInstanceStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeInstanceStatus.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.Panorama.Types.NodeInstanceStatus
+-- 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.Panorama.Types.NodeInstanceStatus
+  ( NodeInstanceStatus
+      ( ..,
+        NodeInstanceStatus_ERROR,
+        NodeInstanceStatus_NOT_AVAILABLE,
+        NodeInstanceStatus_PAUSED,
+        NodeInstanceStatus_RUNNING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype NodeInstanceStatus = NodeInstanceStatus'
+  { fromNodeInstanceStatus ::
+      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 NodeInstanceStatus_ERROR :: NodeInstanceStatus
+pattern NodeInstanceStatus_ERROR = NodeInstanceStatus' "ERROR"
+
+pattern NodeInstanceStatus_NOT_AVAILABLE :: NodeInstanceStatus
+pattern NodeInstanceStatus_NOT_AVAILABLE = NodeInstanceStatus' "NOT_AVAILABLE"
+
+pattern NodeInstanceStatus_PAUSED :: NodeInstanceStatus
+pattern NodeInstanceStatus_PAUSED = NodeInstanceStatus' "PAUSED"
+
+pattern NodeInstanceStatus_RUNNING :: NodeInstanceStatus
+pattern NodeInstanceStatus_RUNNING = NodeInstanceStatus' "RUNNING"
+
+{-# COMPLETE
+  NodeInstanceStatus_ERROR,
+  NodeInstanceStatus_NOT_AVAILABLE,
+  NodeInstanceStatus_PAUSED,
+  NodeInstanceStatus_RUNNING,
+  NodeInstanceStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/NodeInterface.hs b/gen/Amazonka/Panorama/Types/NodeInterface.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeInterface.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.Panorama.Types.NodeInterface
+-- 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.Panorama.Types.NodeInterface where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.NodeInputPort
+import Amazonka.Panorama.Types.NodeOutputPort
+import qualified Amazonka.Prelude as Prelude
+
+-- | A node interface.
+--
+-- /See:/ 'newNodeInterface' smart constructor.
+data NodeInterface = NodeInterface'
+  { -- | The node interface\'s inputs.
+    inputs :: [NodeInputPort],
+    -- | The node interface\'s outputs.
+    outputs :: [NodeOutputPort]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeInterface' 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:
+--
+-- 'inputs', 'nodeInterface_inputs' - The node interface\'s inputs.
+--
+-- 'outputs', 'nodeInterface_outputs' - The node interface\'s outputs.
+newNodeInterface ::
+  NodeInterface
+newNodeInterface =
+  NodeInterface'
+    { inputs = Prelude.mempty,
+      outputs = Prelude.mempty
+    }
+
+-- | The node interface\'s inputs.
+nodeInterface_inputs :: Lens.Lens' NodeInterface [NodeInputPort]
+nodeInterface_inputs = Lens.lens (\NodeInterface' {inputs} -> inputs) (\s@NodeInterface' {} a -> s {inputs = a} :: NodeInterface) Prelude.. Lens.coerced
+
+-- | The node interface\'s outputs.
+nodeInterface_outputs :: Lens.Lens' NodeInterface [NodeOutputPort]
+nodeInterface_outputs = Lens.lens (\NodeInterface' {outputs} -> outputs) (\s@NodeInterface' {} a -> s {outputs = a} :: NodeInterface) Prelude.. Lens.coerced
+
+instance Data.FromJSON NodeInterface where
+  parseJSON =
+    Data.withObject
+      "NodeInterface"
+      ( \x ->
+          NodeInterface'
+            Prelude.<$> (x Data..:? "Inputs" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Outputs" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable NodeInterface where
+  hashWithSalt _salt NodeInterface' {..} =
+    _salt
+      `Prelude.hashWithSalt` inputs
+      `Prelude.hashWithSalt` outputs
+
+instance Prelude.NFData NodeInterface where
+  rnf NodeInterface' {..} =
+    Prelude.rnf inputs
+      `Prelude.seq` Prelude.rnf outputs
diff --git a/gen/Amazonka/Panorama/Types/NodeOutputPort.hs b/gen/Amazonka/Panorama/Types/NodeOutputPort.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeOutputPort.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.Panorama.Types.NodeOutputPort
+-- 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.Panorama.Types.NodeOutputPort where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.PortType
+import qualified Amazonka.Prelude as Prelude
+
+-- | A node output port.
+--
+-- /See:/ 'newNodeOutputPort' smart constructor.
+data NodeOutputPort = NodeOutputPort'
+  { -- | The output port\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The output port\'s name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The output port\'s type.
+    type' :: Prelude.Maybe PortType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeOutputPort' 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', 'nodeOutputPort_description' - The output port\'s description.
+--
+-- 'name', 'nodeOutputPort_name' - The output port\'s name.
+--
+-- 'type'', 'nodeOutputPort_type' - The output port\'s type.
+newNodeOutputPort ::
+  NodeOutputPort
+newNodeOutputPort =
+  NodeOutputPort'
+    { description = Prelude.Nothing,
+      name = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The output port\'s description.
+nodeOutputPort_description :: Lens.Lens' NodeOutputPort (Prelude.Maybe Prelude.Text)
+nodeOutputPort_description = Lens.lens (\NodeOutputPort' {description} -> description) (\s@NodeOutputPort' {} a -> s {description = a} :: NodeOutputPort)
+
+-- | The output port\'s name.
+nodeOutputPort_name :: Lens.Lens' NodeOutputPort (Prelude.Maybe Prelude.Text)
+nodeOutputPort_name = Lens.lens (\NodeOutputPort' {name} -> name) (\s@NodeOutputPort' {} a -> s {name = a} :: NodeOutputPort)
+
+-- | The output port\'s type.
+nodeOutputPort_type :: Lens.Lens' NodeOutputPort (Prelude.Maybe PortType)
+nodeOutputPort_type = Lens.lens (\NodeOutputPort' {type'} -> type') (\s@NodeOutputPort' {} a -> s {type' = a} :: NodeOutputPort)
+
+instance Data.FromJSON NodeOutputPort where
+  parseJSON =
+    Data.withObject
+      "NodeOutputPort"
+      ( \x ->
+          NodeOutputPort'
+            Prelude.<$> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance Prelude.Hashable NodeOutputPort where
+  hashWithSalt _salt NodeOutputPort' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData NodeOutputPort where
+  rnf NodeOutputPort' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/Panorama/Types/NodeSignal.hs b/gen/Amazonka/Panorama/Types/NodeSignal.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeSignal.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.Panorama.Types.NodeSignal
+-- 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.Panorama.Types.NodeSignal where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.NodeSignalValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | A signal to a camera node to start or stop processing video.
+--
+-- /See:/ 'newNodeSignal' smart constructor.
+data NodeSignal = NodeSignal'
+  { -- | The camera node\'s name, from the application manifest.
+    nodeInstanceId :: Prelude.Text,
+    -- | The signal value.
+    signal :: NodeSignalValue
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NodeSignal' 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:
+--
+-- 'nodeInstanceId', 'nodeSignal_nodeInstanceId' - The camera node\'s name, from the application manifest.
+--
+-- 'signal', 'nodeSignal_signal' - The signal value.
+newNodeSignal ::
+  -- | 'nodeInstanceId'
+  Prelude.Text ->
+  -- | 'signal'
+  NodeSignalValue ->
+  NodeSignal
+newNodeSignal pNodeInstanceId_ pSignal_ =
+  NodeSignal'
+    { nodeInstanceId = pNodeInstanceId_,
+      signal = pSignal_
+    }
+
+-- | The camera node\'s name, from the application manifest.
+nodeSignal_nodeInstanceId :: Lens.Lens' NodeSignal Prelude.Text
+nodeSignal_nodeInstanceId = Lens.lens (\NodeSignal' {nodeInstanceId} -> nodeInstanceId) (\s@NodeSignal' {} a -> s {nodeInstanceId = a} :: NodeSignal)
+
+-- | The signal value.
+nodeSignal_signal :: Lens.Lens' NodeSignal NodeSignalValue
+nodeSignal_signal = Lens.lens (\NodeSignal' {signal} -> signal) (\s@NodeSignal' {} a -> s {signal = a} :: NodeSignal)
+
+instance Prelude.Hashable NodeSignal where
+  hashWithSalt _salt NodeSignal' {..} =
+    _salt
+      `Prelude.hashWithSalt` nodeInstanceId
+      `Prelude.hashWithSalt` signal
+
+instance Prelude.NFData NodeSignal where
+  rnf NodeSignal' {..} =
+    Prelude.rnf nodeInstanceId
+      `Prelude.seq` Prelude.rnf signal
+
+instance Data.ToJSON NodeSignal where
+  toJSON NodeSignal' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("NodeInstanceId" Data..= nodeInstanceId),
+            Prelude.Just ("Signal" Data..= signal)
+          ]
+      )
diff --git a/gen/Amazonka/Panorama/Types/NodeSignalValue.hs b/gen/Amazonka/Panorama/Types/NodeSignalValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NodeSignalValue.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.Panorama.Types.NodeSignalValue
+-- 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.Panorama.Types.NodeSignalValue
+  ( NodeSignalValue
+      ( ..,
+        NodeSignalValue_PAUSE,
+        NodeSignalValue_RESUME
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype NodeSignalValue = NodeSignalValue'
+  { fromNodeSignalValue ::
+      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 NodeSignalValue_PAUSE :: NodeSignalValue
+pattern NodeSignalValue_PAUSE = NodeSignalValue' "PAUSE"
+
+pattern NodeSignalValue_RESUME :: NodeSignalValue
+pattern NodeSignalValue_RESUME = NodeSignalValue' "RESUME"
+
+{-# COMPLETE
+  NodeSignalValue_PAUSE,
+  NodeSignalValue_RESUME,
+  NodeSignalValue'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/NtpPayload.hs b/gen/Amazonka/Panorama/Types/NtpPayload.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NtpPayload.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.Panorama.Types.NtpPayload
+-- 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.Panorama.Types.NtpPayload 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
+
+-- | Network time protocol (NTP) server settings. Use this option to connect
+-- to local NTP servers instead of @pool.ntp.org@.
+--
+-- /See:/ 'newNtpPayload' smart constructor.
+data NtpPayload = NtpPayload'
+  { -- | NTP servers to use, in order of preference.
+    ntpServers :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NtpPayload' 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:
+--
+-- 'ntpServers', 'ntpPayload_ntpServers' - NTP servers to use, in order of preference.
+newNtpPayload ::
+  NtpPayload
+newNtpPayload =
+  NtpPayload' {ntpServers = Prelude.mempty}
+
+-- | NTP servers to use, in order of preference.
+ntpPayload_ntpServers :: Lens.Lens' NtpPayload [Prelude.Text]
+ntpPayload_ntpServers = Lens.lens (\NtpPayload' {ntpServers} -> ntpServers) (\s@NtpPayload' {} a -> s {ntpServers = a} :: NtpPayload) Prelude.. Lens.coerced
+
+instance Data.FromJSON NtpPayload where
+  parseJSON =
+    Data.withObject
+      "NtpPayload"
+      ( \x ->
+          NtpPayload'
+            Prelude.<$> (x Data..:? "NtpServers" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable NtpPayload where
+  hashWithSalt _salt NtpPayload' {..} =
+    _salt `Prelude.hashWithSalt` ntpServers
+
+instance Prelude.NFData NtpPayload where
+  rnf NtpPayload' {..} = Prelude.rnf ntpServers
+
+instance Data.ToJSON NtpPayload where
+  toJSON NtpPayload' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("NtpServers" Data..= ntpServers)]
+      )
diff --git a/gen/Amazonka/Panorama/Types/NtpStatus.hs b/gen/Amazonka/Panorama/Types/NtpStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/NtpStatus.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.Panorama.Types.NtpStatus
+-- 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.Panorama.Types.NtpStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.NetworkConnectionStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Details about an NTP server connection.
+--
+-- /See:/ 'newNtpStatus' smart constructor.
+data NtpStatus = NtpStatus'
+  { -- | The connection\'s status.
+    connectionStatus :: Prelude.Maybe NetworkConnectionStatus,
+    -- | The IP address of the server.
+    ipAddress :: Prelude.Maybe Prelude.Text,
+    -- | The domain name of the server.
+    ntpServerName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NtpStatus' 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:
+--
+-- 'connectionStatus', 'ntpStatus_connectionStatus' - The connection\'s status.
+--
+-- 'ipAddress', 'ntpStatus_ipAddress' - The IP address of the server.
+--
+-- 'ntpServerName', 'ntpStatus_ntpServerName' - The domain name of the server.
+newNtpStatus ::
+  NtpStatus
+newNtpStatus =
+  NtpStatus'
+    { connectionStatus = Prelude.Nothing,
+      ipAddress = Prelude.Nothing,
+      ntpServerName = Prelude.Nothing
+    }
+
+-- | The connection\'s status.
+ntpStatus_connectionStatus :: Lens.Lens' NtpStatus (Prelude.Maybe NetworkConnectionStatus)
+ntpStatus_connectionStatus = Lens.lens (\NtpStatus' {connectionStatus} -> connectionStatus) (\s@NtpStatus' {} a -> s {connectionStatus = a} :: NtpStatus)
+
+-- | The IP address of the server.
+ntpStatus_ipAddress :: Lens.Lens' NtpStatus (Prelude.Maybe Prelude.Text)
+ntpStatus_ipAddress = Lens.lens (\NtpStatus' {ipAddress} -> ipAddress) (\s@NtpStatus' {} a -> s {ipAddress = a} :: NtpStatus)
+
+-- | The domain name of the server.
+ntpStatus_ntpServerName :: Lens.Lens' NtpStatus (Prelude.Maybe Prelude.Text)
+ntpStatus_ntpServerName = Lens.lens (\NtpStatus' {ntpServerName} -> ntpServerName) (\s@NtpStatus' {} a -> s {ntpServerName = a} :: NtpStatus)
+
+instance Data.FromJSON NtpStatus where
+  parseJSON =
+    Data.withObject
+      "NtpStatus"
+      ( \x ->
+          NtpStatus'
+            Prelude.<$> (x Data..:? "ConnectionStatus")
+            Prelude.<*> (x Data..:? "IpAddress")
+            Prelude.<*> (x Data..:? "NtpServerName")
+      )
+
+instance Prelude.Hashable NtpStatus where
+  hashWithSalt _salt NtpStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` connectionStatus
+      `Prelude.hashWithSalt` ipAddress
+      `Prelude.hashWithSalt` ntpServerName
+
+instance Prelude.NFData NtpStatus where
+  rnf NtpStatus' {..} =
+    Prelude.rnf connectionStatus
+      `Prelude.seq` Prelude.rnf ipAddress
+      `Prelude.seq` Prelude.rnf ntpServerName
diff --git a/gen/Amazonka/Panorama/Types/OTAJobConfig.hs b/gen/Amazonka/Panorama/Types/OTAJobConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/OTAJobConfig.hs
@@ -0,0 +1,68 @@
+{-# 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.Panorama.Types.OTAJobConfig
+-- 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.Panorama.Types.OTAJobConfig 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
+
+-- | An over-the-air update (OTA) job configuration.
+--
+-- /See:/ 'newOTAJobConfig' smart constructor.
+data OTAJobConfig = OTAJobConfig'
+  { -- | The target version of the device software.
+    imageVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OTAJobConfig' 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:
+--
+-- 'imageVersion', 'oTAJobConfig_imageVersion' - The target version of the device software.
+newOTAJobConfig ::
+  -- | 'imageVersion'
+  Prelude.Text ->
+  OTAJobConfig
+newOTAJobConfig pImageVersion_ =
+  OTAJobConfig' {imageVersion = pImageVersion_}
+
+-- | The target version of the device software.
+oTAJobConfig_imageVersion :: Lens.Lens' OTAJobConfig Prelude.Text
+oTAJobConfig_imageVersion = Lens.lens (\OTAJobConfig' {imageVersion} -> imageVersion) (\s@OTAJobConfig' {} a -> s {imageVersion = a} :: OTAJobConfig)
+
+instance Prelude.Hashable OTAJobConfig where
+  hashWithSalt _salt OTAJobConfig' {..} =
+    _salt `Prelude.hashWithSalt` imageVersion
+
+instance Prelude.NFData OTAJobConfig where
+  rnf OTAJobConfig' {..} = Prelude.rnf imageVersion
+
+instance Data.ToJSON OTAJobConfig where
+  toJSON OTAJobConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ImageVersion" Data..= imageVersion)]
+      )
diff --git a/gen/Amazonka/Panorama/Types/OutPutS3Location.hs b/gen/Amazonka/Panorama/Types/OutPutS3Location.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/OutPutS3Location.hs
@@ -0,0 +1,88 @@
+{-# 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.Panorama.Types.OutPutS3Location
+-- 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.Panorama.Types.OutPutS3Location 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 location of an output object in Amazon S3.
+--
+-- /See:/ 'newOutPutS3Location' smart constructor.
+data OutPutS3Location = OutPutS3Location'
+  { -- | The object\'s bucket.
+    bucketName :: Prelude.Text,
+    -- | The object\'s key.
+    objectKey :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OutPutS3Location' 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:
+--
+-- 'bucketName', 'outPutS3Location_bucketName' - The object\'s bucket.
+--
+-- 'objectKey', 'outPutS3Location_objectKey' - The object\'s key.
+newOutPutS3Location ::
+  -- | 'bucketName'
+  Prelude.Text ->
+  -- | 'objectKey'
+  Prelude.Text ->
+  OutPutS3Location
+newOutPutS3Location pBucketName_ pObjectKey_ =
+  OutPutS3Location'
+    { bucketName = pBucketName_,
+      objectKey = pObjectKey_
+    }
+
+-- | The object\'s bucket.
+outPutS3Location_bucketName :: Lens.Lens' OutPutS3Location Prelude.Text
+outPutS3Location_bucketName = Lens.lens (\OutPutS3Location' {bucketName} -> bucketName) (\s@OutPutS3Location' {} a -> s {bucketName = a} :: OutPutS3Location)
+
+-- | The object\'s key.
+outPutS3Location_objectKey :: Lens.Lens' OutPutS3Location Prelude.Text
+outPutS3Location_objectKey = Lens.lens (\OutPutS3Location' {objectKey} -> objectKey) (\s@OutPutS3Location' {} a -> s {objectKey = a} :: OutPutS3Location)
+
+instance Data.FromJSON OutPutS3Location where
+  parseJSON =
+    Data.withObject
+      "OutPutS3Location"
+      ( \x ->
+          OutPutS3Location'
+            Prelude.<$> (x Data..: "BucketName")
+            Prelude.<*> (x Data..: "ObjectKey")
+      )
+
+instance Prelude.Hashable OutPutS3Location where
+  hashWithSalt _salt OutPutS3Location' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucketName
+      `Prelude.hashWithSalt` objectKey
+
+instance Prelude.NFData OutPutS3Location where
+  rnf OutPutS3Location' {..} =
+    Prelude.rnf bucketName
+      `Prelude.seq` Prelude.rnf objectKey
diff --git a/gen/Amazonka/Panorama/Types/PackageImportJob.hs b/gen/Amazonka/Panorama/Types/PackageImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageImportJob.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.Panorama.Types.PackageImportJob
+-- 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.Panorama.Types.PackageImportJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.PackageImportJobStatus
+import Amazonka.Panorama.Types.PackageImportJobType
+import qualified Amazonka.Prelude as Prelude
+
+-- | A job to import a package version.
+--
+-- /See:/ 'newPackageImportJob' smart constructor.
+data PackageImportJob = PackageImportJob'
+  { -- | When the job was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | The job\'s ID.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The job\'s type.
+    jobType :: Prelude.Maybe PackageImportJobType,
+    -- | When the job was updated.
+    lastUpdatedTime :: Prelude.Maybe Data.POSIX,
+    -- | The job\'s status.
+    status :: Prelude.Maybe PackageImportJobStatus,
+    -- | The job\'s status message.
+    statusMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageImportJob' 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:
+--
+-- 'createdTime', 'packageImportJob_createdTime' - When the job was created.
+--
+-- 'jobId', 'packageImportJob_jobId' - The job\'s ID.
+--
+-- 'jobType', 'packageImportJob_jobType' - The job\'s type.
+--
+-- 'lastUpdatedTime', 'packageImportJob_lastUpdatedTime' - When the job was updated.
+--
+-- 'status', 'packageImportJob_status' - The job\'s status.
+--
+-- 'statusMessage', 'packageImportJob_statusMessage' - The job\'s status message.
+newPackageImportJob ::
+  PackageImportJob
+newPackageImportJob =
+  PackageImportJob'
+    { createdTime = Prelude.Nothing,
+      jobId = Prelude.Nothing,
+      jobType = Prelude.Nothing,
+      lastUpdatedTime = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusMessage = Prelude.Nothing
+    }
+
+-- | When the job was created.
+packageImportJob_createdTime :: Lens.Lens' PackageImportJob (Prelude.Maybe Prelude.UTCTime)
+packageImportJob_createdTime = Lens.lens (\PackageImportJob' {createdTime} -> createdTime) (\s@PackageImportJob' {} a -> s {createdTime = a} :: PackageImportJob) Prelude.. Lens.mapping Data._Time
+
+-- | The job\'s ID.
+packageImportJob_jobId :: Lens.Lens' PackageImportJob (Prelude.Maybe Prelude.Text)
+packageImportJob_jobId = Lens.lens (\PackageImportJob' {jobId} -> jobId) (\s@PackageImportJob' {} a -> s {jobId = a} :: PackageImportJob)
+
+-- | The job\'s type.
+packageImportJob_jobType :: Lens.Lens' PackageImportJob (Prelude.Maybe PackageImportJobType)
+packageImportJob_jobType = Lens.lens (\PackageImportJob' {jobType} -> jobType) (\s@PackageImportJob' {} a -> s {jobType = a} :: PackageImportJob)
+
+-- | When the job was updated.
+packageImportJob_lastUpdatedTime :: Lens.Lens' PackageImportJob (Prelude.Maybe Prelude.UTCTime)
+packageImportJob_lastUpdatedTime = Lens.lens (\PackageImportJob' {lastUpdatedTime} -> lastUpdatedTime) (\s@PackageImportJob' {} a -> s {lastUpdatedTime = a} :: PackageImportJob) Prelude.. Lens.mapping Data._Time
+
+-- | The job\'s status.
+packageImportJob_status :: Lens.Lens' PackageImportJob (Prelude.Maybe PackageImportJobStatus)
+packageImportJob_status = Lens.lens (\PackageImportJob' {status} -> status) (\s@PackageImportJob' {} a -> s {status = a} :: PackageImportJob)
+
+-- | The job\'s status message.
+packageImportJob_statusMessage :: Lens.Lens' PackageImportJob (Prelude.Maybe Prelude.Text)
+packageImportJob_statusMessage = Lens.lens (\PackageImportJob' {statusMessage} -> statusMessage) (\s@PackageImportJob' {} a -> s {statusMessage = a} :: PackageImportJob)
+
+instance Data.FromJSON PackageImportJob where
+  parseJSON =
+    Data.withObject
+      "PackageImportJob"
+      ( \x ->
+          PackageImportJob'
+            Prelude.<$> (x Data..:? "CreatedTime")
+            Prelude.<*> (x Data..:? "JobId")
+            Prelude.<*> (x Data..:? "JobType")
+            Prelude.<*> (x Data..:? "LastUpdatedTime")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "StatusMessage")
+      )
+
+instance Prelude.Hashable PackageImportJob where
+  hashWithSalt _salt PackageImportJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdTime
+      `Prelude.hashWithSalt` jobId
+      `Prelude.hashWithSalt` jobType
+      `Prelude.hashWithSalt` lastUpdatedTime
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` statusMessage
+
+instance Prelude.NFData PackageImportJob where
+  rnf PackageImportJob' {..} =
+    Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobType
+      `Prelude.seq` Prelude.rnf lastUpdatedTime
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
diff --git a/gen/Amazonka/Panorama/Types/PackageImportJobInputConfig.hs b/gen/Amazonka/Panorama/Types/PackageImportJobInputConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageImportJobInputConfig.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.Panorama.Types.PackageImportJobInputConfig
+-- 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.Panorama.Types.PackageImportJobInputConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.PackageVersionInputConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | A configuration for a package import job.
+--
+-- /See:/ 'newPackageImportJobInputConfig' smart constructor.
+data PackageImportJobInputConfig = PackageImportJobInputConfig'
+  { -- | The package version\'s input configuration.
+    packageVersionInputConfig :: Prelude.Maybe PackageVersionInputConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageImportJobInputConfig' 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:
+--
+-- 'packageVersionInputConfig', 'packageImportJobInputConfig_packageVersionInputConfig' - The package version\'s input configuration.
+newPackageImportJobInputConfig ::
+  PackageImportJobInputConfig
+newPackageImportJobInputConfig =
+  PackageImportJobInputConfig'
+    { packageVersionInputConfig =
+        Prelude.Nothing
+    }
+
+-- | The package version\'s input configuration.
+packageImportJobInputConfig_packageVersionInputConfig :: Lens.Lens' PackageImportJobInputConfig (Prelude.Maybe PackageVersionInputConfig)
+packageImportJobInputConfig_packageVersionInputConfig = Lens.lens (\PackageImportJobInputConfig' {packageVersionInputConfig} -> packageVersionInputConfig) (\s@PackageImportJobInputConfig' {} a -> s {packageVersionInputConfig = a} :: PackageImportJobInputConfig)
+
+instance Data.FromJSON PackageImportJobInputConfig where
+  parseJSON =
+    Data.withObject
+      "PackageImportJobInputConfig"
+      ( \x ->
+          PackageImportJobInputConfig'
+            Prelude.<$> (x Data..:? "PackageVersionInputConfig")
+      )
+
+instance Prelude.Hashable PackageImportJobInputConfig where
+  hashWithSalt _salt PackageImportJobInputConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` packageVersionInputConfig
+
+instance Prelude.NFData PackageImportJobInputConfig where
+  rnf PackageImportJobInputConfig' {..} =
+    Prelude.rnf packageVersionInputConfig
+
+instance Data.ToJSON PackageImportJobInputConfig where
+  toJSON PackageImportJobInputConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("PackageVersionInputConfig" Data..=)
+              Prelude.<$> packageVersionInputConfig
+          ]
+      )
diff --git a/gen/Amazonka/Panorama/Types/PackageImportJobOutput.hs b/gen/Amazonka/Panorama/Types/PackageImportJobOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageImportJobOutput.hs
@@ -0,0 +1,122 @@
+{-# 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.Panorama.Types.PackageImportJobOutput
+-- 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.Panorama.Types.PackageImportJobOutput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.OutPutS3Location
+import qualified Amazonka.Prelude as Prelude
+
+-- | Results of a package import job.
+--
+-- /See:/ 'newPackageImportJobOutput' smart constructor.
+data PackageImportJobOutput = PackageImportJobOutput'
+  { -- | The package\'s output location.
+    outputS3Location :: OutPutS3Location,
+    -- | The package\'s ID.
+    packageId :: Prelude.Text,
+    -- | The package\'s version.
+    packageVersion :: Prelude.Text,
+    -- | The package\'s patch version.
+    patchVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageImportJobOutput' 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:
+--
+-- 'outputS3Location', 'packageImportJobOutput_outputS3Location' - The package\'s output location.
+--
+-- 'packageId', 'packageImportJobOutput_packageId' - The package\'s ID.
+--
+-- 'packageVersion', 'packageImportJobOutput_packageVersion' - The package\'s version.
+--
+-- 'patchVersion', 'packageImportJobOutput_patchVersion' - The package\'s patch version.
+newPackageImportJobOutput ::
+  -- | 'outputS3Location'
+  OutPutS3Location ->
+  -- | 'packageId'
+  Prelude.Text ->
+  -- | 'packageVersion'
+  Prelude.Text ->
+  -- | 'patchVersion'
+  Prelude.Text ->
+  PackageImportJobOutput
+newPackageImportJobOutput
+  pOutputS3Location_
+  pPackageId_
+  pPackageVersion_
+  pPatchVersion_ =
+    PackageImportJobOutput'
+      { outputS3Location =
+          pOutputS3Location_,
+        packageId = pPackageId_,
+        packageVersion = pPackageVersion_,
+        patchVersion = pPatchVersion_
+      }
+
+-- | The package\'s output location.
+packageImportJobOutput_outputS3Location :: Lens.Lens' PackageImportJobOutput OutPutS3Location
+packageImportJobOutput_outputS3Location = Lens.lens (\PackageImportJobOutput' {outputS3Location} -> outputS3Location) (\s@PackageImportJobOutput' {} a -> s {outputS3Location = a} :: PackageImportJobOutput)
+
+-- | The package\'s ID.
+packageImportJobOutput_packageId :: Lens.Lens' PackageImportJobOutput Prelude.Text
+packageImportJobOutput_packageId = Lens.lens (\PackageImportJobOutput' {packageId} -> packageId) (\s@PackageImportJobOutput' {} a -> s {packageId = a} :: PackageImportJobOutput)
+
+-- | The package\'s version.
+packageImportJobOutput_packageVersion :: Lens.Lens' PackageImportJobOutput Prelude.Text
+packageImportJobOutput_packageVersion = Lens.lens (\PackageImportJobOutput' {packageVersion} -> packageVersion) (\s@PackageImportJobOutput' {} a -> s {packageVersion = a} :: PackageImportJobOutput)
+
+-- | The package\'s patch version.
+packageImportJobOutput_patchVersion :: Lens.Lens' PackageImportJobOutput Prelude.Text
+packageImportJobOutput_patchVersion = Lens.lens (\PackageImportJobOutput' {patchVersion} -> patchVersion) (\s@PackageImportJobOutput' {} a -> s {patchVersion = a} :: PackageImportJobOutput)
+
+instance Data.FromJSON PackageImportJobOutput where
+  parseJSON =
+    Data.withObject
+      "PackageImportJobOutput"
+      ( \x ->
+          PackageImportJobOutput'
+            Prelude.<$> (x Data..: "OutputS3Location")
+            Prelude.<*> (x Data..: "PackageId")
+            Prelude.<*> (x Data..: "PackageVersion")
+            Prelude.<*> (x Data..: "PatchVersion")
+      )
+
+instance Prelude.Hashable PackageImportJobOutput where
+  hashWithSalt _salt PackageImportJobOutput' {..} =
+    _salt
+      `Prelude.hashWithSalt` outputS3Location
+      `Prelude.hashWithSalt` packageId
+      `Prelude.hashWithSalt` packageVersion
+      `Prelude.hashWithSalt` patchVersion
+
+instance Prelude.NFData PackageImportJobOutput where
+  rnf PackageImportJobOutput' {..} =
+    Prelude.rnf outputS3Location
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf patchVersion
diff --git a/gen/Amazonka/Panorama/Types/PackageImportJobOutputConfig.hs b/gen/Amazonka/Panorama/Types/PackageImportJobOutputConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageImportJobOutputConfig.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.Panorama.Types.PackageImportJobOutputConfig
+-- 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.Panorama.Types.PackageImportJobOutputConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.PackageVersionOutputConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | An output configuration for a package import job.
+--
+-- /See:/ 'newPackageImportJobOutputConfig' smart constructor.
+data PackageImportJobOutputConfig = PackageImportJobOutputConfig'
+  { -- | The package version\'s output configuration.
+    packageVersionOutputConfig :: Prelude.Maybe PackageVersionOutputConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageImportJobOutputConfig' 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:
+--
+-- 'packageVersionOutputConfig', 'packageImportJobOutputConfig_packageVersionOutputConfig' - The package version\'s output configuration.
+newPackageImportJobOutputConfig ::
+  PackageImportJobOutputConfig
+newPackageImportJobOutputConfig =
+  PackageImportJobOutputConfig'
+    { packageVersionOutputConfig =
+        Prelude.Nothing
+    }
+
+-- | The package version\'s output configuration.
+packageImportJobOutputConfig_packageVersionOutputConfig :: Lens.Lens' PackageImportJobOutputConfig (Prelude.Maybe PackageVersionOutputConfig)
+packageImportJobOutputConfig_packageVersionOutputConfig = Lens.lens (\PackageImportJobOutputConfig' {packageVersionOutputConfig} -> packageVersionOutputConfig) (\s@PackageImportJobOutputConfig' {} a -> s {packageVersionOutputConfig = a} :: PackageImportJobOutputConfig)
+
+instance Data.FromJSON PackageImportJobOutputConfig where
+  parseJSON =
+    Data.withObject
+      "PackageImportJobOutputConfig"
+      ( \x ->
+          PackageImportJobOutputConfig'
+            Prelude.<$> (x Data..:? "PackageVersionOutputConfig")
+      )
+
+instance
+  Prelude.Hashable
+    PackageImportJobOutputConfig
+  where
+  hashWithSalt _salt PackageImportJobOutputConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` packageVersionOutputConfig
+
+instance Prelude.NFData PackageImportJobOutputConfig where
+  rnf PackageImportJobOutputConfig' {..} =
+    Prelude.rnf packageVersionOutputConfig
+
+instance Data.ToJSON PackageImportJobOutputConfig where
+  toJSON PackageImportJobOutputConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("PackageVersionOutputConfig" Data..=)
+              Prelude.<$> packageVersionOutputConfig
+          ]
+      )
diff --git a/gen/Amazonka/Panorama/Types/PackageImportJobStatus.hs b/gen/Amazonka/Panorama/Types/PackageImportJobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageImportJobStatus.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.Panorama.Types.PackageImportJobStatus
+-- 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.Panorama.Types.PackageImportJobStatus
+  ( PackageImportJobStatus
+      ( ..,
+        PackageImportJobStatus_FAILED,
+        PackageImportJobStatus_PENDING,
+        PackageImportJobStatus_SUCCEEDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PackageImportJobStatus = PackageImportJobStatus'
+  { fromPackageImportJobStatus ::
+      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 PackageImportJobStatus_FAILED :: PackageImportJobStatus
+pattern PackageImportJobStatus_FAILED = PackageImportJobStatus' "FAILED"
+
+pattern PackageImportJobStatus_PENDING :: PackageImportJobStatus
+pattern PackageImportJobStatus_PENDING = PackageImportJobStatus' "PENDING"
+
+pattern PackageImportJobStatus_SUCCEEDED :: PackageImportJobStatus
+pattern PackageImportJobStatus_SUCCEEDED = PackageImportJobStatus' "SUCCEEDED"
+
+{-# COMPLETE
+  PackageImportJobStatus_FAILED,
+  PackageImportJobStatus_PENDING,
+  PackageImportJobStatus_SUCCEEDED,
+  PackageImportJobStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/PackageImportJobType.hs b/gen/Amazonka/Panorama/Types/PackageImportJobType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageImportJobType.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.Panorama.Types.PackageImportJobType
+-- 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.Panorama.Types.PackageImportJobType
+  ( PackageImportJobType
+      ( ..,
+        PackageImportJobType_MARKETPLACE_NODE_PACKAGE_VERSION,
+        PackageImportJobType_NODE_PACKAGE_VERSION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PackageImportJobType = PackageImportJobType'
+  { fromPackageImportJobType ::
+      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 PackageImportJobType_MARKETPLACE_NODE_PACKAGE_VERSION :: PackageImportJobType
+pattern PackageImportJobType_MARKETPLACE_NODE_PACKAGE_VERSION = PackageImportJobType' "MARKETPLACE_NODE_PACKAGE_VERSION"
+
+pattern PackageImportJobType_NODE_PACKAGE_VERSION :: PackageImportJobType
+pattern PackageImportJobType_NODE_PACKAGE_VERSION = PackageImportJobType' "NODE_PACKAGE_VERSION"
+
+{-# COMPLETE
+  PackageImportJobType_MARKETPLACE_NODE_PACKAGE_VERSION,
+  PackageImportJobType_NODE_PACKAGE_VERSION,
+  PackageImportJobType'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/PackageListItem.hs b/gen/Amazonka/Panorama/Types/PackageListItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageListItem.hs
@@ -0,0 +1,120 @@
+{-# 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.Panorama.Types.PackageListItem
+-- 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.Panorama.Types.PackageListItem 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 package summary.
+--
+-- /See:/ 'newPackageListItem' smart constructor.
+data PackageListItem = PackageListItem'
+  { -- | The package\'s ARN.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | When the package was created.
+    createdTime :: Prelude.Maybe Data.POSIX,
+    -- | The package\'s ID.
+    packageId :: Prelude.Maybe Prelude.Text,
+    -- | The package\'s name.
+    packageName :: Prelude.Maybe Prelude.Text,
+    -- | The package\'s tags.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageListItem' 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', 'packageListItem_arn' - The package\'s ARN.
+--
+-- 'createdTime', 'packageListItem_createdTime' - When the package was created.
+--
+-- 'packageId', 'packageListItem_packageId' - The package\'s ID.
+--
+-- 'packageName', 'packageListItem_packageName' - The package\'s name.
+--
+-- 'tags', 'packageListItem_tags' - The package\'s tags.
+newPackageListItem ::
+  PackageListItem
+newPackageListItem =
+  PackageListItem'
+    { arn = Prelude.Nothing,
+      createdTime = Prelude.Nothing,
+      packageId = Prelude.Nothing,
+      packageName = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | The package\'s ARN.
+packageListItem_arn :: Lens.Lens' PackageListItem (Prelude.Maybe Prelude.Text)
+packageListItem_arn = Lens.lens (\PackageListItem' {arn} -> arn) (\s@PackageListItem' {} a -> s {arn = a} :: PackageListItem)
+
+-- | When the package was created.
+packageListItem_createdTime :: Lens.Lens' PackageListItem (Prelude.Maybe Prelude.UTCTime)
+packageListItem_createdTime = Lens.lens (\PackageListItem' {createdTime} -> createdTime) (\s@PackageListItem' {} a -> s {createdTime = a} :: PackageListItem) Prelude.. Lens.mapping Data._Time
+
+-- | The package\'s ID.
+packageListItem_packageId :: Lens.Lens' PackageListItem (Prelude.Maybe Prelude.Text)
+packageListItem_packageId = Lens.lens (\PackageListItem' {packageId} -> packageId) (\s@PackageListItem' {} a -> s {packageId = a} :: PackageListItem)
+
+-- | The package\'s name.
+packageListItem_packageName :: Lens.Lens' PackageListItem (Prelude.Maybe Prelude.Text)
+packageListItem_packageName = Lens.lens (\PackageListItem' {packageName} -> packageName) (\s@PackageListItem' {} a -> s {packageName = a} :: PackageListItem)
+
+-- | The package\'s tags.
+packageListItem_tags :: Lens.Lens' PackageListItem (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+packageListItem_tags = Lens.lens (\PackageListItem' {tags} -> tags) (\s@PackageListItem' {} a -> s {tags = a} :: PackageListItem) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON PackageListItem where
+  parseJSON =
+    Data.withObject
+      "PackageListItem"
+      ( \x ->
+          PackageListItem'
+            Prelude.<$> (x Data..:? "Arn")
+            Prelude.<*> (x Data..:? "CreatedTime")
+            Prelude.<*> (x Data..:? "PackageId")
+            Prelude.<*> (x Data..:? "PackageName")
+            Prelude.<*> (x Data..:? "Tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable PackageListItem where
+  hashWithSalt _salt PackageListItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdTime
+      `Prelude.hashWithSalt` packageId
+      `Prelude.hashWithSalt` packageName
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData PackageListItem where
+  rnf PackageListItem' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdTime
+      `Prelude.seq` Prelude.rnf packageId
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/Panorama/Types/PackageObject.hs b/gen/Amazonka/Panorama/Types/PackageObject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageObject.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.Panorama.Types.PackageObject
+-- 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.Panorama.Types.PackageObject 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 package object.
+--
+-- /See:/ 'newPackageObject' smart constructor.
+data PackageObject = PackageObject'
+  { -- | The object\'s name.
+    name :: Prelude.Text,
+    -- | The object\'s package version.
+    packageVersion :: Prelude.Text,
+    -- | The object\'s patch version.
+    patchVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageObject' 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', 'packageObject_name' - The object\'s name.
+--
+-- 'packageVersion', 'packageObject_packageVersion' - The object\'s package version.
+--
+-- 'patchVersion', 'packageObject_patchVersion' - The object\'s patch version.
+newPackageObject ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'packageVersion'
+  Prelude.Text ->
+  -- | 'patchVersion'
+  Prelude.Text ->
+  PackageObject
+newPackageObject
+  pName_
+  pPackageVersion_
+  pPatchVersion_ =
+    PackageObject'
+      { name = pName_,
+        packageVersion = pPackageVersion_,
+        patchVersion = pPatchVersion_
+      }
+
+-- | The object\'s name.
+packageObject_name :: Lens.Lens' PackageObject Prelude.Text
+packageObject_name = Lens.lens (\PackageObject' {name} -> name) (\s@PackageObject' {} a -> s {name = a} :: PackageObject)
+
+-- | The object\'s package version.
+packageObject_packageVersion :: Lens.Lens' PackageObject Prelude.Text
+packageObject_packageVersion = Lens.lens (\PackageObject' {packageVersion} -> packageVersion) (\s@PackageObject' {} a -> s {packageVersion = a} :: PackageObject)
+
+-- | The object\'s patch version.
+packageObject_patchVersion :: Lens.Lens' PackageObject Prelude.Text
+packageObject_patchVersion = Lens.lens (\PackageObject' {patchVersion} -> patchVersion) (\s@PackageObject' {} a -> s {patchVersion = a} :: PackageObject)
+
+instance Data.FromJSON PackageObject where
+  parseJSON =
+    Data.withObject
+      "PackageObject"
+      ( \x ->
+          PackageObject'
+            Prelude.<$> (x Data..: "Name")
+            Prelude.<*> (x Data..: "PackageVersion")
+            Prelude.<*> (x Data..: "PatchVersion")
+      )
+
+instance Prelude.Hashable PackageObject where
+  hashWithSalt _salt PackageObject' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` packageVersion
+      `Prelude.hashWithSalt` patchVersion
+
+instance Prelude.NFData PackageObject where
+  rnf PackageObject' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf packageVersion
+      `Prelude.seq` Prelude.rnf patchVersion
diff --git a/gen/Amazonka/Panorama/Types/PackageVersionInputConfig.hs b/gen/Amazonka/Panorama/Types/PackageVersionInputConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageVersionInputConfig.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.Panorama.Types.PackageVersionInputConfig
+-- 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.Panorama.Types.PackageVersionInputConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.S3Location
+import qualified Amazonka.Prelude as Prelude
+
+-- | A package version input configuration.
+--
+-- /See:/ 'newPackageVersionInputConfig' smart constructor.
+data PackageVersionInputConfig = PackageVersionInputConfig'
+  { -- | A location in Amazon S3.
+    s3Location :: S3Location
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageVersionInputConfig' 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:
+--
+-- 's3Location', 'packageVersionInputConfig_s3Location' - A location in Amazon S3.
+newPackageVersionInputConfig ::
+  -- | 's3Location'
+  S3Location ->
+  PackageVersionInputConfig
+newPackageVersionInputConfig pS3Location_ =
+  PackageVersionInputConfig'
+    { s3Location =
+        pS3Location_
+    }
+
+-- | A location in Amazon S3.
+packageVersionInputConfig_s3Location :: Lens.Lens' PackageVersionInputConfig S3Location
+packageVersionInputConfig_s3Location = Lens.lens (\PackageVersionInputConfig' {s3Location} -> s3Location) (\s@PackageVersionInputConfig' {} a -> s {s3Location = a} :: PackageVersionInputConfig)
+
+instance Data.FromJSON PackageVersionInputConfig where
+  parseJSON =
+    Data.withObject
+      "PackageVersionInputConfig"
+      ( \x ->
+          PackageVersionInputConfig'
+            Prelude.<$> (x Data..: "S3Location")
+      )
+
+instance Prelude.Hashable PackageVersionInputConfig where
+  hashWithSalt _salt PackageVersionInputConfig' {..} =
+    _salt `Prelude.hashWithSalt` s3Location
+
+instance Prelude.NFData PackageVersionInputConfig where
+  rnf PackageVersionInputConfig' {..} =
+    Prelude.rnf s3Location
+
+instance Data.ToJSON PackageVersionInputConfig where
+  toJSON PackageVersionInputConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("S3Location" Data..= s3Location)]
+      )
diff --git a/gen/Amazonka/Panorama/Types/PackageVersionOutputConfig.hs b/gen/Amazonka/Panorama/Types/PackageVersionOutputConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageVersionOutputConfig.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.Panorama.Types.PackageVersionOutputConfig
+-- 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.Panorama.Types.PackageVersionOutputConfig 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 package version output configuration.
+--
+-- /See:/ 'newPackageVersionOutputConfig' smart constructor.
+data PackageVersionOutputConfig = PackageVersionOutputConfig'
+  { -- | Indicates that the version is recommended for all users.
+    markLatest :: Prelude.Maybe Prelude.Bool,
+    -- | The output\'s package name.
+    packageName :: Prelude.Text,
+    -- | The output\'s package version.
+    packageVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PackageVersionOutputConfig' 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:
+--
+-- 'markLatest', 'packageVersionOutputConfig_markLatest' - Indicates that the version is recommended for all users.
+--
+-- 'packageName', 'packageVersionOutputConfig_packageName' - The output\'s package name.
+--
+-- 'packageVersion', 'packageVersionOutputConfig_packageVersion' - The output\'s package version.
+newPackageVersionOutputConfig ::
+  -- | 'packageName'
+  Prelude.Text ->
+  -- | 'packageVersion'
+  Prelude.Text ->
+  PackageVersionOutputConfig
+newPackageVersionOutputConfig
+  pPackageName_
+  pPackageVersion_ =
+    PackageVersionOutputConfig'
+      { markLatest =
+          Prelude.Nothing,
+        packageName = pPackageName_,
+        packageVersion = pPackageVersion_
+      }
+
+-- | Indicates that the version is recommended for all users.
+packageVersionOutputConfig_markLatest :: Lens.Lens' PackageVersionOutputConfig (Prelude.Maybe Prelude.Bool)
+packageVersionOutputConfig_markLatest = Lens.lens (\PackageVersionOutputConfig' {markLatest} -> markLatest) (\s@PackageVersionOutputConfig' {} a -> s {markLatest = a} :: PackageVersionOutputConfig)
+
+-- | The output\'s package name.
+packageVersionOutputConfig_packageName :: Lens.Lens' PackageVersionOutputConfig Prelude.Text
+packageVersionOutputConfig_packageName = Lens.lens (\PackageVersionOutputConfig' {packageName} -> packageName) (\s@PackageVersionOutputConfig' {} a -> s {packageName = a} :: PackageVersionOutputConfig)
+
+-- | The output\'s package version.
+packageVersionOutputConfig_packageVersion :: Lens.Lens' PackageVersionOutputConfig Prelude.Text
+packageVersionOutputConfig_packageVersion = Lens.lens (\PackageVersionOutputConfig' {packageVersion} -> packageVersion) (\s@PackageVersionOutputConfig' {} a -> s {packageVersion = a} :: PackageVersionOutputConfig)
+
+instance Data.FromJSON PackageVersionOutputConfig where
+  parseJSON =
+    Data.withObject
+      "PackageVersionOutputConfig"
+      ( \x ->
+          PackageVersionOutputConfig'
+            Prelude.<$> (x Data..:? "MarkLatest")
+            Prelude.<*> (x Data..: "PackageName")
+            Prelude.<*> (x Data..: "PackageVersion")
+      )
+
+instance Prelude.Hashable PackageVersionOutputConfig where
+  hashWithSalt _salt PackageVersionOutputConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` markLatest
+      `Prelude.hashWithSalt` packageName
+      `Prelude.hashWithSalt` packageVersion
+
+instance Prelude.NFData PackageVersionOutputConfig where
+  rnf PackageVersionOutputConfig' {..} =
+    Prelude.rnf markLatest
+      `Prelude.seq` Prelude.rnf packageName
+      `Prelude.seq` Prelude.rnf packageVersion
+
+instance Data.ToJSON PackageVersionOutputConfig where
+  toJSON PackageVersionOutputConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MarkLatest" Data..=) Prelude.<$> markLatest,
+            Prelude.Just ("PackageName" Data..= packageName),
+            Prelude.Just
+              ("PackageVersion" Data..= packageVersion)
+          ]
+      )
diff --git a/gen/Amazonka/Panorama/Types/PackageVersionStatus.hs b/gen/Amazonka/Panorama/Types/PackageVersionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PackageVersionStatus.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.Panorama.Types.PackageVersionStatus
+-- 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.Panorama.Types.PackageVersionStatus
+  ( PackageVersionStatus
+      ( ..,
+        PackageVersionStatus_DELETING,
+        PackageVersionStatus_FAILED,
+        PackageVersionStatus_REGISTER_COMPLETED,
+        PackageVersionStatus_REGISTER_PENDING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PackageVersionStatus = PackageVersionStatus'
+  { fromPackageVersionStatus ::
+      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 PackageVersionStatus_DELETING :: PackageVersionStatus
+pattern PackageVersionStatus_DELETING = PackageVersionStatus' "DELETING"
+
+pattern PackageVersionStatus_FAILED :: PackageVersionStatus
+pattern PackageVersionStatus_FAILED = PackageVersionStatus' "FAILED"
+
+pattern PackageVersionStatus_REGISTER_COMPLETED :: PackageVersionStatus
+pattern PackageVersionStatus_REGISTER_COMPLETED = PackageVersionStatus' "REGISTER_COMPLETED"
+
+pattern PackageVersionStatus_REGISTER_PENDING :: PackageVersionStatus
+pattern PackageVersionStatus_REGISTER_PENDING = PackageVersionStatus' "REGISTER_PENDING"
+
+{-# COMPLETE
+  PackageVersionStatus_DELETING,
+  PackageVersionStatus_FAILED,
+  PackageVersionStatus_REGISTER_COMPLETED,
+  PackageVersionStatus_REGISTER_PENDING,
+  PackageVersionStatus'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/PortType.hs b/gen/Amazonka/Panorama/Types/PortType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/PortType.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.Panorama.Types.PortType
+-- 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.Panorama.Types.PortType
+  ( PortType
+      ( ..,
+        PortType_BOOLEAN,
+        PortType_FLOAT32,
+        PortType_INT32,
+        PortType_MEDIA,
+        PortType_STRING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PortType = PortType'
+  { fromPortType ::
+      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 PortType_BOOLEAN :: PortType
+pattern PortType_BOOLEAN = PortType' "BOOLEAN"
+
+pattern PortType_FLOAT32 :: PortType
+pattern PortType_FLOAT32 = PortType' "FLOAT32"
+
+pattern PortType_INT32 :: PortType
+pattern PortType_INT32 = PortType' "INT32"
+
+pattern PortType_MEDIA :: PortType
+pattern PortType_MEDIA = PortType' "MEDIA"
+
+pattern PortType_STRING :: PortType
+pattern PortType_STRING = PortType' "STRING"
+
+{-# COMPLETE
+  PortType_BOOLEAN,
+  PortType_FLOAT32,
+  PortType_INT32,
+  PortType_MEDIA,
+  PortType_STRING,
+  PortType'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/ReportedRuntimeContextState.hs b/gen/Amazonka/Panorama/Types/ReportedRuntimeContextState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/ReportedRuntimeContextState.hs
@@ -0,0 +1,124 @@
+{-# 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.Panorama.Types.ReportedRuntimeContextState
+-- 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.Panorama.Types.ReportedRuntimeContextState where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types.DesiredState
+import Amazonka.Panorama.Types.DeviceReportedStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | An application instance\'s state.
+--
+-- /See:/ 'newReportedRuntimeContextState' smart constructor.
+data ReportedRuntimeContextState = ReportedRuntimeContextState'
+  { -- | The application\'s desired state.
+    desiredState :: DesiredState,
+    -- | The application\'s reported status.
+    deviceReportedStatus :: DeviceReportedStatus,
+    -- | When the device reported the application\'s state.
+    deviceReportedTime :: Data.POSIX,
+    -- | The device\'s name.
+    runtimeContextName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ReportedRuntimeContextState' 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', 'reportedRuntimeContextState_desiredState' - The application\'s desired state.
+--
+-- 'deviceReportedStatus', 'reportedRuntimeContextState_deviceReportedStatus' - The application\'s reported status.
+--
+-- 'deviceReportedTime', 'reportedRuntimeContextState_deviceReportedTime' - When the device reported the application\'s state.
+--
+-- 'runtimeContextName', 'reportedRuntimeContextState_runtimeContextName' - The device\'s name.
+newReportedRuntimeContextState ::
+  -- | 'desiredState'
+  DesiredState ->
+  -- | 'deviceReportedStatus'
+  DeviceReportedStatus ->
+  -- | 'deviceReportedTime'
+  Prelude.UTCTime ->
+  -- | 'runtimeContextName'
+  Prelude.Text ->
+  ReportedRuntimeContextState
+newReportedRuntimeContextState
+  pDesiredState_
+  pDeviceReportedStatus_
+  pDeviceReportedTime_
+  pRuntimeContextName_ =
+    ReportedRuntimeContextState'
+      { desiredState =
+          pDesiredState_,
+        deviceReportedStatus = pDeviceReportedStatus_,
+        deviceReportedTime =
+          Data._Time Lens.# pDeviceReportedTime_,
+        runtimeContextName = pRuntimeContextName_
+      }
+
+-- | The application\'s desired state.
+reportedRuntimeContextState_desiredState :: Lens.Lens' ReportedRuntimeContextState DesiredState
+reportedRuntimeContextState_desiredState = Lens.lens (\ReportedRuntimeContextState' {desiredState} -> desiredState) (\s@ReportedRuntimeContextState' {} a -> s {desiredState = a} :: ReportedRuntimeContextState)
+
+-- | The application\'s reported status.
+reportedRuntimeContextState_deviceReportedStatus :: Lens.Lens' ReportedRuntimeContextState DeviceReportedStatus
+reportedRuntimeContextState_deviceReportedStatus = Lens.lens (\ReportedRuntimeContextState' {deviceReportedStatus} -> deviceReportedStatus) (\s@ReportedRuntimeContextState' {} a -> s {deviceReportedStatus = a} :: ReportedRuntimeContextState)
+
+-- | When the device reported the application\'s state.
+reportedRuntimeContextState_deviceReportedTime :: Lens.Lens' ReportedRuntimeContextState Prelude.UTCTime
+reportedRuntimeContextState_deviceReportedTime = Lens.lens (\ReportedRuntimeContextState' {deviceReportedTime} -> deviceReportedTime) (\s@ReportedRuntimeContextState' {} a -> s {deviceReportedTime = a} :: ReportedRuntimeContextState) Prelude.. Data._Time
+
+-- | The device\'s name.
+reportedRuntimeContextState_runtimeContextName :: Lens.Lens' ReportedRuntimeContextState Prelude.Text
+reportedRuntimeContextState_runtimeContextName = Lens.lens (\ReportedRuntimeContextState' {runtimeContextName} -> runtimeContextName) (\s@ReportedRuntimeContextState' {} a -> s {runtimeContextName = a} :: ReportedRuntimeContextState)
+
+instance Data.FromJSON ReportedRuntimeContextState where
+  parseJSON =
+    Data.withObject
+      "ReportedRuntimeContextState"
+      ( \x ->
+          ReportedRuntimeContextState'
+            Prelude.<$> (x Data..: "DesiredState")
+            Prelude.<*> (x Data..: "DeviceReportedStatus")
+            Prelude.<*> (x Data..: "DeviceReportedTime")
+            Prelude.<*> (x Data..: "RuntimeContextName")
+      )
+
+instance Prelude.Hashable ReportedRuntimeContextState where
+  hashWithSalt _salt ReportedRuntimeContextState' {..} =
+    _salt
+      `Prelude.hashWithSalt` desiredState
+      `Prelude.hashWithSalt` deviceReportedStatus
+      `Prelude.hashWithSalt` deviceReportedTime
+      `Prelude.hashWithSalt` runtimeContextName
+
+instance Prelude.NFData ReportedRuntimeContextState where
+  rnf ReportedRuntimeContextState' {..} =
+    Prelude.rnf desiredState
+      `Prelude.seq` Prelude.rnf deviceReportedStatus
+      `Prelude.seq` Prelude.rnf deviceReportedTime
+      `Prelude.seq` Prelude.rnf runtimeContextName
diff --git a/gen/Amazonka/Panorama/Types/S3Location.hs b/gen/Amazonka/Panorama/Types/S3Location.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/S3Location.hs
@@ -0,0 +1,110 @@
+{-# 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.Panorama.Types.S3Location
+-- 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.Panorama.Types.S3Location 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 location in Amazon S3.
+--
+-- /See:/ 'newS3Location' smart constructor.
+data S3Location = S3Location'
+  { -- | The bucket\'s Region.
+    region :: Prelude.Maybe Prelude.Text,
+    -- | A bucket name.
+    bucketName :: Prelude.Text,
+    -- | An object key.
+    objectKey :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3Location' 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:
+--
+-- 'region', 's3Location_region' - The bucket\'s Region.
+--
+-- 'bucketName', 's3Location_bucketName' - A bucket name.
+--
+-- 'objectKey', 's3Location_objectKey' - An object key.
+newS3Location ::
+  -- | 'bucketName'
+  Prelude.Text ->
+  -- | 'objectKey'
+  Prelude.Text ->
+  S3Location
+newS3Location pBucketName_ pObjectKey_ =
+  S3Location'
+    { region = Prelude.Nothing,
+      bucketName = pBucketName_,
+      objectKey = pObjectKey_
+    }
+
+-- | The bucket\'s Region.
+s3Location_region :: Lens.Lens' S3Location (Prelude.Maybe Prelude.Text)
+s3Location_region = Lens.lens (\S3Location' {region} -> region) (\s@S3Location' {} a -> s {region = a} :: S3Location)
+
+-- | A bucket name.
+s3Location_bucketName :: Lens.Lens' S3Location Prelude.Text
+s3Location_bucketName = Lens.lens (\S3Location' {bucketName} -> bucketName) (\s@S3Location' {} a -> s {bucketName = a} :: S3Location)
+
+-- | An object key.
+s3Location_objectKey :: Lens.Lens' S3Location Prelude.Text
+s3Location_objectKey = Lens.lens (\S3Location' {objectKey} -> objectKey) (\s@S3Location' {} a -> s {objectKey = a} :: S3Location)
+
+instance Data.FromJSON S3Location where
+  parseJSON =
+    Data.withObject
+      "S3Location"
+      ( \x ->
+          S3Location'
+            Prelude.<$> (x Data..:? "Region")
+            Prelude.<*> (x Data..: "BucketName")
+            Prelude.<*> (x Data..: "ObjectKey")
+      )
+
+instance Prelude.Hashable S3Location where
+  hashWithSalt _salt S3Location' {..} =
+    _salt
+      `Prelude.hashWithSalt` region
+      `Prelude.hashWithSalt` bucketName
+      `Prelude.hashWithSalt` objectKey
+
+instance Prelude.NFData S3Location where
+  rnf S3Location' {..} =
+    Prelude.rnf region
+      `Prelude.seq` Prelude.rnf bucketName
+      `Prelude.seq` Prelude.rnf objectKey
+
+instance Data.ToJSON S3Location where
+  toJSON S3Location' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Region" Data..=) Prelude.<$> region,
+            Prelude.Just ("BucketName" Data..= bucketName),
+            Prelude.Just ("ObjectKey" Data..= objectKey)
+          ]
+      )
diff --git a/gen/Amazonka/Panorama/Types/SortOrder.hs b/gen/Amazonka/Panorama/Types/SortOrder.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/SortOrder.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.Panorama.Types.SortOrder
+-- 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.Panorama.Types.SortOrder
+  ( SortOrder
+      ( ..,
+        SortOrder_ASCENDING,
+        SortOrder_DESCENDING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SortOrder = SortOrder'
+  { fromSortOrder ::
+      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 SortOrder_ASCENDING :: SortOrder
+pattern SortOrder_ASCENDING = SortOrder' "ASCENDING"
+
+pattern SortOrder_DESCENDING :: SortOrder
+pattern SortOrder_DESCENDING = SortOrder' "DESCENDING"
+
+{-# COMPLETE
+  SortOrder_ASCENDING,
+  SortOrder_DESCENDING,
+  SortOrder'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/StaticIpConnectionInfo.hs b/gen/Amazonka/Panorama/Types/StaticIpConnectionInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/StaticIpConnectionInfo.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.Panorama.Types.StaticIpConnectionInfo
+-- 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.Panorama.Types.StaticIpConnectionInfo 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 static IP configuration.
+--
+-- /See:/ 'newStaticIpConnectionInfo' smart constructor.
+data StaticIpConnectionInfo = StaticIpConnectionInfo'
+  { -- | The connection\'s default gateway.
+    defaultGateway :: Prelude.Text,
+    -- | The connection\'s DNS address.
+    dns :: [Prelude.Text],
+    -- | The connection\'s IP address.
+    ipAddress :: Prelude.Text,
+    -- | The connection\'s DNS mask.
+    mask :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StaticIpConnectionInfo' 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:
+--
+-- 'defaultGateway', 'staticIpConnectionInfo_defaultGateway' - The connection\'s default gateway.
+--
+-- 'dns', 'staticIpConnectionInfo_dns' - The connection\'s DNS address.
+--
+-- 'ipAddress', 'staticIpConnectionInfo_ipAddress' - The connection\'s IP address.
+--
+-- 'mask', 'staticIpConnectionInfo_mask' - The connection\'s DNS mask.
+newStaticIpConnectionInfo ::
+  -- | 'defaultGateway'
+  Prelude.Text ->
+  -- | 'ipAddress'
+  Prelude.Text ->
+  -- | 'mask'
+  Prelude.Text ->
+  StaticIpConnectionInfo
+newStaticIpConnectionInfo
+  pDefaultGateway_
+  pIpAddress_
+  pMask_ =
+    StaticIpConnectionInfo'
+      { defaultGateway =
+          pDefaultGateway_,
+        dns = Prelude.mempty,
+        ipAddress = pIpAddress_,
+        mask = pMask_
+      }
+
+-- | The connection\'s default gateway.
+staticIpConnectionInfo_defaultGateway :: Lens.Lens' StaticIpConnectionInfo Prelude.Text
+staticIpConnectionInfo_defaultGateway = Lens.lens (\StaticIpConnectionInfo' {defaultGateway} -> defaultGateway) (\s@StaticIpConnectionInfo' {} a -> s {defaultGateway = a} :: StaticIpConnectionInfo)
+
+-- | The connection\'s DNS address.
+staticIpConnectionInfo_dns :: Lens.Lens' StaticIpConnectionInfo [Prelude.Text]
+staticIpConnectionInfo_dns = Lens.lens (\StaticIpConnectionInfo' {dns} -> dns) (\s@StaticIpConnectionInfo' {} a -> s {dns = a} :: StaticIpConnectionInfo) Prelude.. Lens.coerced
+
+-- | The connection\'s IP address.
+staticIpConnectionInfo_ipAddress :: Lens.Lens' StaticIpConnectionInfo Prelude.Text
+staticIpConnectionInfo_ipAddress = Lens.lens (\StaticIpConnectionInfo' {ipAddress} -> ipAddress) (\s@StaticIpConnectionInfo' {} a -> s {ipAddress = a} :: StaticIpConnectionInfo)
+
+-- | The connection\'s DNS mask.
+staticIpConnectionInfo_mask :: Lens.Lens' StaticIpConnectionInfo Prelude.Text
+staticIpConnectionInfo_mask = Lens.lens (\StaticIpConnectionInfo' {mask} -> mask) (\s@StaticIpConnectionInfo' {} a -> s {mask = a} :: StaticIpConnectionInfo)
+
+instance Data.FromJSON StaticIpConnectionInfo where
+  parseJSON =
+    Data.withObject
+      "StaticIpConnectionInfo"
+      ( \x ->
+          StaticIpConnectionInfo'
+            Prelude.<$> (x Data..: "DefaultGateway")
+            Prelude.<*> (x Data..:? "Dns" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "IpAddress")
+            Prelude.<*> (x Data..: "Mask")
+      )
+
+instance Prelude.Hashable StaticIpConnectionInfo where
+  hashWithSalt _salt StaticIpConnectionInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` defaultGateway
+      `Prelude.hashWithSalt` dns
+      `Prelude.hashWithSalt` ipAddress
+      `Prelude.hashWithSalt` mask
+
+instance Prelude.NFData StaticIpConnectionInfo where
+  rnf StaticIpConnectionInfo' {..} =
+    Prelude.rnf defaultGateway
+      `Prelude.seq` Prelude.rnf dns
+      `Prelude.seq` Prelude.rnf ipAddress
+      `Prelude.seq` Prelude.rnf mask
+
+instance Data.ToJSON StaticIpConnectionInfo where
+  toJSON StaticIpConnectionInfo' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("DefaultGateway" Data..= defaultGateway),
+            Prelude.Just ("Dns" Data..= dns),
+            Prelude.Just ("IpAddress" Data..= ipAddress),
+            Prelude.Just ("Mask" Data..= mask)
+          ]
+      )
diff --git a/gen/Amazonka/Panorama/Types/StatusFilter.hs b/gen/Amazonka/Panorama/Types/StatusFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/StatusFilter.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.Panorama.Types.StatusFilter
+-- 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.Panorama.Types.StatusFilter
+  ( StatusFilter
+      ( ..,
+        StatusFilter_DEPLOYMENT_ERROR,
+        StatusFilter_DEPLOYMENT_FAILED,
+        StatusFilter_DEPLOYMENT_SUCCEEDED,
+        StatusFilter_PROCESSING_DEPLOYMENT,
+        StatusFilter_PROCESSING_REMOVAL,
+        StatusFilter_REMOVAL_FAILED,
+        StatusFilter_REMOVAL_SUCCEEDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype StatusFilter = StatusFilter'
+  { fromStatusFilter ::
+      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 StatusFilter_DEPLOYMENT_ERROR :: StatusFilter
+pattern StatusFilter_DEPLOYMENT_ERROR = StatusFilter' "DEPLOYMENT_ERROR"
+
+pattern StatusFilter_DEPLOYMENT_FAILED :: StatusFilter
+pattern StatusFilter_DEPLOYMENT_FAILED = StatusFilter' "DEPLOYMENT_FAILED"
+
+pattern StatusFilter_DEPLOYMENT_SUCCEEDED :: StatusFilter
+pattern StatusFilter_DEPLOYMENT_SUCCEEDED = StatusFilter' "DEPLOYMENT_SUCCEEDED"
+
+pattern StatusFilter_PROCESSING_DEPLOYMENT :: StatusFilter
+pattern StatusFilter_PROCESSING_DEPLOYMENT = StatusFilter' "PROCESSING_DEPLOYMENT"
+
+pattern StatusFilter_PROCESSING_REMOVAL :: StatusFilter
+pattern StatusFilter_PROCESSING_REMOVAL = StatusFilter' "PROCESSING_REMOVAL"
+
+pattern StatusFilter_REMOVAL_FAILED :: StatusFilter
+pattern StatusFilter_REMOVAL_FAILED = StatusFilter' "REMOVAL_FAILED"
+
+pattern StatusFilter_REMOVAL_SUCCEEDED :: StatusFilter
+pattern StatusFilter_REMOVAL_SUCCEEDED = StatusFilter' "REMOVAL_SUCCEEDED"
+
+{-# COMPLETE
+  StatusFilter_DEPLOYMENT_ERROR,
+  StatusFilter_DEPLOYMENT_FAILED,
+  StatusFilter_DEPLOYMENT_SUCCEEDED,
+  StatusFilter_PROCESSING_DEPLOYMENT,
+  StatusFilter_PROCESSING_REMOVAL,
+  StatusFilter_REMOVAL_FAILED,
+  StatusFilter_REMOVAL_SUCCEEDED,
+  StatusFilter'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/StorageLocation.hs b/gen/Amazonka/Panorama/Types/StorageLocation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/StorageLocation.hs
@@ -0,0 +1,136 @@
+{-# 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.Panorama.Types.StorageLocation
+-- 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.Panorama.Types.StorageLocation 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 storage location.
+--
+-- /See:/ 'newStorageLocation' smart constructor.
+data StorageLocation = StorageLocation'
+  { -- | The location\'s binary prefix.
+    binaryPrefixLocation :: Prelude.Text,
+    -- | The location\'s bucket.
+    bucket :: Prelude.Text,
+    -- | The location\'s generated prefix.
+    generatedPrefixLocation :: Prelude.Text,
+    -- | The location\'s manifest prefix.
+    manifestPrefixLocation :: Prelude.Text,
+    -- | The location\'s repo prefix.
+    repoPrefixLocation :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StorageLocation' 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:
+--
+-- 'binaryPrefixLocation', 'storageLocation_binaryPrefixLocation' - The location\'s binary prefix.
+--
+-- 'bucket', 'storageLocation_bucket' - The location\'s bucket.
+--
+-- 'generatedPrefixLocation', 'storageLocation_generatedPrefixLocation' - The location\'s generated prefix.
+--
+-- 'manifestPrefixLocation', 'storageLocation_manifestPrefixLocation' - The location\'s manifest prefix.
+--
+-- 'repoPrefixLocation', 'storageLocation_repoPrefixLocation' - The location\'s repo prefix.
+newStorageLocation ::
+  -- | 'binaryPrefixLocation'
+  Prelude.Text ->
+  -- | 'bucket'
+  Prelude.Text ->
+  -- | 'generatedPrefixLocation'
+  Prelude.Text ->
+  -- | 'manifestPrefixLocation'
+  Prelude.Text ->
+  -- | 'repoPrefixLocation'
+  Prelude.Text ->
+  StorageLocation
+newStorageLocation
+  pBinaryPrefixLocation_
+  pBucket_
+  pGeneratedPrefixLocation_
+  pManifestPrefixLocation_
+  pRepoPrefixLocation_ =
+    StorageLocation'
+      { binaryPrefixLocation =
+          pBinaryPrefixLocation_,
+        bucket = pBucket_,
+        generatedPrefixLocation = pGeneratedPrefixLocation_,
+        manifestPrefixLocation = pManifestPrefixLocation_,
+        repoPrefixLocation = pRepoPrefixLocation_
+      }
+
+-- | The location\'s binary prefix.
+storageLocation_binaryPrefixLocation :: Lens.Lens' StorageLocation Prelude.Text
+storageLocation_binaryPrefixLocation = Lens.lens (\StorageLocation' {binaryPrefixLocation} -> binaryPrefixLocation) (\s@StorageLocation' {} a -> s {binaryPrefixLocation = a} :: StorageLocation)
+
+-- | The location\'s bucket.
+storageLocation_bucket :: Lens.Lens' StorageLocation Prelude.Text
+storageLocation_bucket = Lens.lens (\StorageLocation' {bucket} -> bucket) (\s@StorageLocation' {} a -> s {bucket = a} :: StorageLocation)
+
+-- | The location\'s generated prefix.
+storageLocation_generatedPrefixLocation :: Lens.Lens' StorageLocation Prelude.Text
+storageLocation_generatedPrefixLocation = Lens.lens (\StorageLocation' {generatedPrefixLocation} -> generatedPrefixLocation) (\s@StorageLocation' {} a -> s {generatedPrefixLocation = a} :: StorageLocation)
+
+-- | The location\'s manifest prefix.
+storageLocation_manifestPrefixLocation :: Lens.Lens' StorageLocation Prelude.Text
+storageLocation_manifestPrefixLocation = Lens.lens (\StorageLocation' {manifestPrefixLocation} -> manifestPrefixLocation) (\s@StorageLocation' {} a -> s {manifestPrefixLocation = a} :: StorageLocation)
+
+-- | The location\'s repo prefix.
+storageLocation_repoPrefixLocation :: Lens.Lens' StorageLocation Prelude.Text
+storageLocation_repoPrefixLocation = Lens.lens (\StorageLocation' {repoPrefixLocation} -> repoPrefixLocation) (\s@StorageLocation' {} a -> s {repoPrefixLocation = a} :: StorageLocation)
+
+instance Data.FromJSON StorageLocation where
+  parseJSON =
+    Data.withObject
+      "StorageLocation"
+      ( \x ->
+          StorageLocation'
+            Prelude.<$> (x Data..: "BinaryPrefixLocation")
+            Prelude.<*> (x Data..: "Bucket")
+            Prelude.<*> (x Data..: "GeneratedPrefixLocation")
+            Prelude.<*> (x Data..: "ManifestPrefixLocation")
+            Prelude.<*> (x Data..: "RepoPrefixLocation")
+      )
+
+instance Prelude.Hashable StorageLocation where
+  hashWithSalt _salt StorageLocation' {..} =
+    _salt
+      `Prelude.hashWithSalt` binaryPrefixLocation
+      `Prelude.hashWithSalt` bucket
+      `Prelude.hashWithSalt` generatedPrefixLocation
+      `Prelude.hashWithSalt` manifestPrefixLocation
+      `Prelude.hashWithSalt` repoPrefixLocation
+
+instance Prelude.NFData StorageLocation where
+  rnf StorageLocation' {..} =
+    Prelude.rnf binaryPrefixLocation
+      `Prelude.seq` Prelude.rnf bucket
+      `Prelude.seq` Prelude.rnf generatedPrefixLocation
+      `Prelude.seq` Prelude.rnf manifestPrefixLocation
+      `Prelude.seq` Prelude.rnf repoPrefixLocation
diff --git a/gen/Amazonka/Panorama/Types/TemplateType.hs b/gen/Amazonka/Panorama/Types/TemplateType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/TemplateType.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.Panorama.Types.TemplateType
+-- 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.Panorama.Types.TemplateType
+  ( TemplateType
+      ( ..,
+        TemplateType_RTSP_CAMERA_STREAM
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TemplateType = TemplateType'
+  { fromTemplateType ::
+      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 TemplateType_RTSP_CAMERA_STREAM :: TemplateType
+pattern TemplateType_RTSP_CAMERA_STREAM = TemplateType' "RTSP_CAMERA_STREAM"
+
+{-# COMPLETE
+  TemplateType_RTSP_CAMERA_STREAM,
+  TemplateType'
+  #-}
diff --git a/gen/Amazonka/Panorama/Types/UpdateProgress.hs b/gen/Amazonka/Panorama/Types/UpdateProgress.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/Types/UpdateProgress.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.Panorama.Types.UpdateProgress
+-- 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.Panorama.Types.UpdateProgress
+  ( UpdateProgress
+      ( ..,
+        UpdateProgress_COMPLETED,
+        UpdateProgress_DOWNLOADING,
+        UpdateProgress_FAILED,
+        UpdateProgress_IN_PROGRESS,
+        UpdateProgress_PENDING,
+        UpdateProgress_REBOOTING,
+        UpdateProgress_VERIFYING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype UpdateProgress = UpdateProgress'
+  { fromUpdateProgress ::
+      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 UpdateProgress_COMPLETED :: UpdateProgress
+pattern UpdateProgress_COMPLETED = UpdateProgress' "COMPLETED"
+
+pattern UpdateProgress_DOWNLOADING :: UpdateProgress
+pattern UpdateProgress_DOWNLOADING = UpdateProgress' "DOWNLOADING"
+
+pattern UpdateProgress_FAILED :: UpdateProgress
+pattern UpdateProgress_FAILED = UpdateProgress' "FAILED"
+
+pattern UpdateProgress_IN_PROGRESS :: UpdateProgress
+pattern UpdateProgress_IN_PROGRESS = UpdateProgress' "IN_PROGRESS"
+
+pattern UpdateProgress_PENDING :: UpdateProgress
+pattern UpdateProgress_PENDING = UpdateProgress' "PENDING"
+
+pattern UpdateProgress_REBOOTING :: UpdateProgress
+pattern UpdateProgress_REBOOTING = UpdateProgress' "REBOOTING"
+
+pattern UpdateProgress_VERIFYING :: UpdateProgress
+pattern UpdateProgress_VERIFYING = UpdateProgress' "VERIFYING"
+
+{-# COMPLETE
+  UpdateProgress_COMPLETED,
+  UpdateProgress_DOWNLOADING,
+  UpdateProgress_FAILED,
+  UpdateProgress_IN_PROGRESS,
+  UpdateProgress_PENDING,
+  UpdateProgress_REBOOTING,
+  UpdateProgress_VERIFYING,
+  UpdateProgress'
+  #-}
diff --git a/gen/Amazonka/Panorama/UntagResource.hs b/gen/Amazonka/Panorama/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/UntagResource.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.Panorama.UntagResource
+-- 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 tags from a resource.
+module Amazonka.Panorama.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The resource\'s ARN.
+    resourceArn :: Prelude.Text,
+    -- | Tag keys to remove.
+    tagKeys :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' 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:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The resource\'s ARN.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - Tag keys to remove.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  -- | 'tagKeys'
+  Prelude.NonEmpty Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ pTagKeys_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Lens.coerced Lens.# pTagKeys_
+    }
+
+-- | The resource\'s ARN.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | Tag keys to remove.
+untagResource_tagKeys :: Lens.Lens' UntagResource (Prelude.NonEmpty Prelude.Text)
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath UntagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      ["tagKeys" Data.=: Data.toQueryList "member" tagKeys]
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' 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', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/UpdateDeviceMetadata.hs b/gen/Amazonka/Panorama/UpdateDeviceMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/UpdateDeviceMetadata.hs
@@ -0,0 +1,182 @@
+{-# 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.Panorama.UpdateDeviceMetadata
+-- 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 device\'s metadata.
+module Amazonka.Panorama.UpdateDeviceMetadata
+  ( -- * Creating a Request
+    UpdateDeviceMetadata (..),
+    newUpdateDeviceMetadata,
+
+    -- * Request Lenses
+    updateDeviceMetadata_description,
+    updateDeviceMetadata_deviceId,
+
+    -- * Destructuring the Response
+    UpdateDeviceMetadataResponse (..),
+    newUpdateDeviceMetadataResponse,
+
+    -- * Response Lenses
+    updateDeviceMetadataResponse_deviceId,
+    updateDeviceMetadataResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateDeviceMetadata' smart constructor.
+data UpdateDeviceMetadata = UpdateDeviceMetadata'
+  { -- | A description for the device.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The device\'s ID.
+    deviceId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDeviceMetadata' 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', 'updateDeviceMetadata_description' - A description for the device.
+--
+-- 'deviceId', 'updateDeviceMetadata_deviceId' - The device\'s ID.
+newUpdateDeviceMetadata ::
+  -- | 'deviceId'
+  Prelude.Text ->
+  UpdateDeviceMetadata
+newUpdateDeviceMetadata pDeviceId_ =
+  UpdateDeviceMetadata'
+    { description =
+        Prelude.Nothing,
+      deviceId = pDeviceId_
+    }
+
+-- | A description for the device.
+updateDeviceMetadata_description :: Lens.Lens' UpdateDeviceMetadata (Prelude.Maybe Prelude.Text)
+updateDeviceMetadata_description = Lens.lens (\UpdateDeviceMetadata' {description} -> description) (\s@UpdateDeviceMetadata' {} a -> s {description = a} :: UpdateDeviceMetadata)
+
+-- | The device\'s ID.
+updateDeviceMetadata_deviceId :: Lens.Lens' UpdateDeviceMetadata Prelude.Text
+updateDeviceMetadata_deviceId = Lens.lens (\UpdateDeviceMetadata' {deviceId} -> deviceId) (\s@UpdateDeviceMetadata' {} a -> s {deviceId = a} :: UpdateDeviceMetadata)
+
+instance Core.AWSRequest UpdateDeviceMetadata where
+  type
+    AWSResponse UpdateDeviceMetadata =
+      UpdateDeviceMetadataResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateDeviceMetadataResponse'
+            Prelude.<$> (x Data..?> "DeviceId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateDeviceMetadata where
+  hashWithSalt _salt UpdateDeviceMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` deviceId
+
+instance Prelude.NFData UpdateDeviceMetadata where
+  rnf UpdateDeviceMetadata' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf deviceId
+
+instance Data.ToHeaders UpdateDeviceMetadata where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateDeviceMetadata where
+  toJSON UpdateDeviceMetadata' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("Description" Data..=) Prelude.<$> description]
+      )
+
+instance Data.ToPath UpdateDeviceMetadata where
+  toPath UpdateDeviceMetadata' {..} =
+    Prelude.mconcat ["/devices/", Data.toBS deviceId]
+
+instance Data.ToQuery UpdateDeviceMetadata where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateDeviceMetadataResponse' smart constructor.
+data UpdateDeviceMetadataResponse = UpdateDeviceMetadataResponse'
+  { -- | The device\'s ID.
+    deviceId :: 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 'UpdateDeviceMetadataResponse' 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:
+--
+-- 'deviceId', 'updateDeviceMetadataResponse_deviceId' - The device\'s ID.
+--
+-- 'httpStatus', 'updateDeviceMetadataResponse_httpStatus' - The response's http status code.
+newUpdateDeviceMetadataResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateDeviceMetadataResponse
+newUpdateDeviceMetadataResponse pHttpStatus_ =
+  UpdateDeviceMetadataResponse'
+    { deviceId =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The device\'s ID.
+updateDeviceMetadataResponse_deviceId :: Lens.Lens' UpdateDeviceMetadataResponse (Prelude.Maybe Prelude.Text)
+updateDeviceMetadataResponse_deviceId = Lens.lens (\UpdateDeviceMetadataResponse' {deviceId} -> deviceId) (\s@UpdateDeviceMetadataResponse' {} a -> s {deviceId = a} :: UpdateDeviceMetadataResponse)
+
+-- | The response's http status code.
+updateDeviceMetadataResponse_httpStatus :: Lens.Lens' UpdateDeviceMetadataResponse Prelude.Int
+updateDeviceMetadataResponse_httpStatus = Lens.lens (\UpdateDeviceMetadataResponse' {httpStatus} -> httpStatus) (\s@UpdateDeviceMetadataResponse' {} a -> s {httpStatus = a} :: UpdateDeviceMetadataResponse)
+
+instance Prelude.NFData UpdateDeviceMetadataResponse where
+  rnf UpdateDeviceMetadataResponse' {..} =
+    Prelude.rnf deviceId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Panorama/Waiters.hs b/gen/Amazonka/Panorama/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Panorama/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.Panorama.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.Panorama.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Panorama.Lens
+import Amazonka.Panorama.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.Panorama
+import Test.Amazonka.Panorama.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "Panorama"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/Panorama.hs b/test/Test/Amazonka/Gen/Panorama.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/Panorama.hs
@@ -0,0 +1,718 @@
+{-# 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.Panorama
+-- 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.Panorama where
+
+import Amazonka.Panorama
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Panorama.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"
+--         [ requestCreateApplicationInstance $
+--             newCreateApplicationInstance
+--
+--         , requestCreateJobForDevices $
+--             newCreateJobForDevices
+--
+--         , requestCreateNodeFromTemplateJob $
+--             newCreateNodeFromTemplateJob
+--
+--         , requestCreatePackage $
+--             newCreatePackage
+--
+--         , requestCreatePackageImportJob $
+--             newCreatePackageImportJob
+--
+--         , requestDeleteDevice $
+--             newDeleteDevice
+--
+--         , requestDeletePackage $
+--             newDeletePackage
+--
+--         , requestDeregisterPackageVersion $
+--             newDeregisterPackageVersion
+--
+--         , requestDescribeApplicationInstance $
+--             newDescribeApplicationInstance
+--
+--         , requestDescribeApplicationInstanceDetails $
+--             newDescribeApplicationInstanceDetails
+--
+--         , requestDescribeDevice $
+--             newDescribeDevice
+--
+--         , requestDescribeDeviceJob $
+--             newDescribeDeviceJob
+--
+--         , requestDescribeNode $
+--             newDescribeNode
+--
+--         , requestDescribeNodeFromTemplateJob $
+--             newDescribeNodeFromTemplateJob
+--
+--         , requestDescribePackage $
+--             newDescribePackage
+--
+--         , requestDescribePackageImportJob $
+--             newDescribePackageImportJob
+--
+--         , requestDescribePackageVersion $
+--             newDescribePackageVersion
+--
+--         , requestListApplicationInstanceDependencies $
+--             newListApplicationInstanceDependencies
+--
+--         , requestListApplicationInstanceNodeInstances $
+--             newListApplicationInstanceNodeInstances
+--
+--         , requestListApplicationInstances $
+--             newListApplicationInstances
+--
+--         , requestListDevices $
+--             newListDevices
+--
+--         , requestListDevicesJobs $
+--             newListDevicesJobs
+--
+--         , requestListNodeFromTemplateJobs $
+--             newListNodeFromTemplateJobs
+--
+--         , requestListNodes $
+--             newListNodes
+--
+--         , requestListPackageImportJobs $
+--             newListPackageImportJobs
+--
+--         , requestListPackages $
+--             newListPackages
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestProvisionDevice $
+--             newProvisionDevice
+--
+--         , requestRegisterPackageVersion $
+--             newRegisterPackageVersion
+--
+--         , requestRemoveApplicationInstance $
+--             newRemoveApplicationInstance
+--
+--         , requestSignalApplicationInstanceNodeInstances $
+--             newSignalApplicationInstanceNodeInstances
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateDeviceMetadata $
+--             newUpdateDeviceMetadata
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateApplicationInstance $
+--             newCreateApplicationInstanceResponse
+--
+--         , responseCreateJobForDevices $
+--             newCreateJobForDevicesResponse
+--
+--         , responseCreateNodeFromTemplateJob $
+--             newCreateNodeFromTemplateJobResponse
+--
+--         , responseCreatePackage $
+--             newCreatePackageResponse
+--
+--         , responseCreatePackageImportJob $
+--             newCreatePackageImportJobResponse
+--
+--         , responseDeleteDevice $
+--             newDeleteDeviceResponse
+--
+--         , responseDeletePackage $
+--             newDeletePackageResponse
+--
+--         , responseDeregisterPackageVersion $
+--             newDeregisterPackageVersionResponse
+--
+--         , responseDescribeApplicationInstance $
+--             newDescribeApplicationInstanceResponse
+--
+--         , responseDescribeApplicationInstanceDetails $
+--             newDescribeApplicationInstanceDetailsResponse
+--
+--         , responseDescribeDevice $
+--             newDescribeDeviceResponse
+--
+--         , responseDescribeDeviceJob $
+--             newDescribeDeviceJobResponse
+--
+--         , responseDescribeNode $
+--             newDescribeNodeResponse
+--
+--         , responseDescribeNodeFromTemplateJob $
+--             newDescribeNodeFromTemplateJobResponse
+--
+--         , responseDescribePackage $
+--             newDescribePackageResponse
+--
+--         , responseDescribePackageImportJob $
+--             newDescribePackageImportJobResponse
+--
+--         , responseDescribePackageVersion $
+--             newDescribePackageVersionResponse
+--
+--         , responseListApplicationInstanceDependencies $
+--             newListApplicationInstanceDependenciesResponse
+--
+--         , responseListApplicationInstanceNodeInstances $
+--             newListApplicationInstanceNodeInstancesResponse
+--
+--         , responseListApplicationInstances $
+--             newListApplicationInstancesResponse
+--
+--         , responseListDevices $
+--             newListDevicesResponse
+--
+--         , responseListDevicesJobs $
+--             newListDevicesJobsResponse
+--
+--         , responseListNodeFromTemplateJobs $
+--             newListNodeFromTemplateJobsResponse
+--
+--         , responseListNodes $
+--             newListNodesResponse
+--
+--         , responseListPackageImportJobs $
+--             newListPackageImportJobsResponse
+--
+--         , responseListPackages $
+--             newListPackagesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseProvisionDevice $
+--             newProvisionDeviceResponse
+--
+--         , responseRegisterPackageVersion $
+--             newRegisterPackageVersionResponse
+--
+--         , responseRemoveApplicationInstance $
+--             newRemoveApplicationInstanceResponse
+--
+--         , responseSignalApplicationInstanceNodeInstances $
+--             newSignalApplicationInstanceNodeInstancesResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateDeviceMetadata $
+--             newUpdateDeviceMetadataResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateApplicationInstance :: CreateApplicationInstance -> TestTree
+requestCreateApplicationInstance =
+  req
+    "CreateApplicationInstance"
+    "fixture/CreateApplicationInstance.yaml"
+
+requestCreateJobForDevices :: CreateJobForDevices -> TestTree
+requestCreateJobForDevices =
+  req
+    "CreateJobForDevices"
+    "fixture/CreateJobForDevices.yaml"
+
+requestCreateNodeFromTemplateJob :: CreateNodeFromTemplateJob -> TestTree
+requestCreateNodeFromTemplateJob =
+  req
+    "CreateNodeFromTemplateJob"
+    "fixture/CreateNodeFromTemplateJob.yaml"
+
+requestCreatePackage :: CreatePackage -> TestTree
+requestCreatePackage =
+  req
+    "CreatePackage"
+    "fixture/CreatePackage.yaml"
+
+requestCreatePackageImportJob :: CreatePackageImportJob -> TestTree
+requestCreatePackageImportJob =
+  req
+    "CreatePackageImportJob"
+    "fixture/CreatePackageImportJob.yaml"
+
+requestDeleteDevice :: DeleteDevice -> TestTree
+requestDeleteDevice =
+  req
+    "DeleteDevice"
+    "fixture/DeleteDevice.yaml"
+
+requestDeletePackage :: DeletePackage -> TestTree
+requestDeletePackage =
+  req
+    "DeletePackage"
+    "fixture/DeletePackage.yaml"
+
+requestDeregisterPackageVersion :: DeregisterPackageVersion -> TestTree
+requestDeregisterPackageVersion =
+  req
+    "DeregisterPackageVersion"
+    "fixture/DeregisterPackageVersion.yaml"
+
+requestDescribeApplicationInstance :: DescribeApplicationInstance -> TestTree
+requestDescribeApplicationInstance =
+  req
+    "DescribeApplicationInstance"
+    "fixture/DescribeApplicationInstance.yaml"
+
+requestDescribeApplicationInstanceDetails :: DescribeApplicationInstanceDetails -> TestTree
+requestDescribeApplicationInstanceDetails =
+  req
+    "DescribeApplicationInstanceDetails"
+    "fixture/DescribeApplicationInstanceDetails.yaml"
+
+requestDescribeDevice :: DescribeDevice -> TestTree
+requestDescribeDevice =
+  req
+    "DescribeDevice"
+    "fixture/DescribeDevice.yaml"
+
+requestDescribeDeviceJob :: DescribeDeviceJob -> TestTree
+requestDescribeDeviceJob =
+  req
+    "DescribeDeviceJob"
+    "fixture/DescribeDeviceJob.yaml"
+
+requestDescribeNode :: DescribeNode -> TestTree
+requestDescribeNode =
+  req
+    "DescribeNode"
+    "fixture/DescribeNode.yaml"
+
+requestDescribeNodeFromTemplateJob :: DescribeNodeFromTemplateJob -> TestTree
+requestDescribeNodeFromTemplateJob =
+  req
+    "DescribeNodeFromTemplateJob"
+    "fixture/DescribeNodeFromTemplateJob.yaml"
+
+requestDescribePackage :: DescribePackage -> TestTree
+requestDescribePackage =
+  req
+    "DescribePackage"
+    "fixture/DescribePackage.yaml"
+
+requestDescribePackageImportJob :: DescribePackageImportJob -> TestTree
+requestDescribePackageImportJob =
+  req
+    "DescribePackageImportJob"
+    "fixture/DescribePackageImportJob.yaml"
+
+requestDescribePackageVersion :: DescribePackageVersion -> TestTree
+requestDescribePackageVersion =
+  req
+    "DescribePackageVersion"
+    "fixture/DescribePackageVersion.yaml"
+
+requestListApplicationInstanceDependencies :: ListApplicationInstanceDependencies -> TestTree
+requestListApplicationInstanceDependencies =
+  req
+    "ListApplicationInstanceDependencies"
+    "fixture/ListApplicationInstanceDependencies.yaml"
+
+requestListApplicationInstanceNodeInstances :: ListApplicationInstanceNodeInstances -> TestTree
+requestListApplicationInstanceNodeInstances =
+  req
+    "ListApplicationInstanceNodeInstances"
+    "fixture/ListApplicationInstanceNodeInstances.yaml"
+
+requestListApplicationInstances :: ListApplicationInstances -> TestTree
+requestListApplicationInstances =
+  req
+    "ListApplicationInstances"
+    "fixture/ListApplicationInstances.yaml"
+
+requestListDevices :: ListDevices -> TestTree
+requestListDevices =
+  req
+    "ListDevices"
+    "fixture/ListDevices.yaml"
+
+requestListDevicesJobs :: ListDevicesJobs -> TestTree
+requestListDevicesJobs =
+  req
+    "ListDevicesJobs"
+    "fixture/ListDevicesJobs.yaml"
+
+requestListNodeFromTemplateJobs :: ListNodeFromTemplateJobs -> TestTree
+requestListNodeFromTemplateJobs =
+  req
+    "ListNodeFromTemplateJobs"
+    "fixture/ListNodeFromTemplateJobs.yaml"
+
+requestListNodes :: ListNodes -> TestTree
+requestListNodes =
+  req
+    "ListNodes"
+    "fixture/ListNodes.yaml"
+
+requestListPackageImportJobs :: ListPackageImportJobs -> TestTree
+requestListPackageImportJobs =
+  req
+    "ListPackageImportJobs"
+    "fixture/ListPackageImportJobs.yaml"
+
+requestListPackages :: ListPackages -> TestTree
+requestListPackages =
+  req
+    "ListPackages"
+    "fixture/ListPackages.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestProvisionDevice :: ProvisionDevice -> TestTree
+requestProvisionDevice =
+  req
+    "ProvisionDevice"
+    "fixture/ProvisionDevice.yaml"
+
+requestRegisterPackageVersion :: RegisterPackageVersion -> TestTree
+requestRegisterPackageVersion =
+  req
+    "RegisterPackageVersion"
+    "fixture/RegisterPackageVersion.yaml"
+
+requestRemoveApplicationInstance :: RemoveApplicationInstance -> TestTree
+requestRemoveApplicationInstance =
+  req
+    "RemoveApplicationInstance"
+    "fixture/RemoveApplicationInstance.yaml"
+
+requestSignalApplicationInstanceNodeInstances :: SignalApplicationInstanceNodeInstances -> TestTree
+requestSignalApplicationInstanceNodeInstances =
+  req
+    "SignalApplicationInstanceNodeInstances"
+    "fixture/SignalApplicationInstanceNodeInstances.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateDeviceMetadata :: UpdateDeviceMetadata -> TestTree
+requestUpdateDeviceMetadata =
+  req
+    "UpdateDeviceMetadata"
+    "fixture/UpdateDeviceMetadata.yaml"
+
+-- Responses
+
+responseCreateApplicationInstance :: CreateApplicationInstanceResponse -> TestTree
+responseCreateApplicationInstance =
+  res
+    "CreateApplicationInstanceResponse"
+    "fixture/CreateApplicationInstanceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateApplicationInstance)
+
+responseCreateJobForDevices :: CreateJobForDevicesResponse -> TestTree
+responseCreateJobForDevices =
+  res
+    "CreateJobForDevicesResponse"
+    "fixture/CreateJobForDevicesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateJobForDevices)
+
+responseCreateNodeFromTemplateJob :: CreateNodeFromTemplateJobResponse -> TestTree
+responseCreateNodeFromTemplateJob =
+  res
+    "CreateNodeFromTemplateJobResponse"
+    "fixture/CreateNodeFromTemplateJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateNodeFromTemplateJob)
+
+responseCreatePackage :: CreatePackageResponse -> TestTree
+responseCreatePackage =
+  res
+    "CreatePackageResponse"
+    "fixture/CreatePackageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreatePackage)
+
+responseCreatePackageImportJob :: CreatePackageImportJobResponse -> TestTree
+responseCreatePackageImportJob =
+  res
+    "CreatePackageImportJobResponse"
+    "fixture/CreatePackageImportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreatePackageImportJob)
+
+responseDeleteDevice :: DeleteDeviceResponse -> TestTree
+responseDeleteDevice =
+  res
+    "DeleteDeviceResponse"
+    "fixture/DeleteDeviceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDevice)
+
+responseDeletePackage :: DeletePackageResponse -> TestTree
+responseDeletePackage =
+  res
+    "DeletePackageResponse"
+    "fixture/DeletePackageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeletePackage)
+
+responseDeregisterPackageVersion :: DeregisterPackageVersionResponse -> TestTree
+responseDeregisterPackageVersion =
+  res
+    "DeregisterPackageVersionResponse"
+    "fixture/DeregisterPackageVersionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeregisterPackageVersion)
+
+responseDescribeApplicationInstance :: DescribeApplicationInstanceResponse -> TestTree
+responseDescribeApplicationInstance =
+  res
+    "DescribeApplicationInstanceResponse"
+    "fixture/DescribeApplicationInstanceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeApplicationInstance)
+
+responseDescribeApplicationInstanceDetails :: DescribeApplicationInstanceDetailsResponse -> TestTree
+responseDescribeApplicationInstanceDetails =
+  res
+    "DescribeApplicationInstanceDetailsResponse"
+    "fixture/DescribeApplicationInstanceDetailsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeApplicationInstanceDetails)
+
+responseDescribeDevice :: DescribeDeviceResponse -> TestTree
+responseDescribeDevice =
+  res
+    "DescribeDeviceResponse"
+    "fixture/DescribeDeviceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDevice)
+
+responseDescribeDeviceJob :: DescribeDeviceJobResponse -> TestTree
+responseDescribeDeviceJob =
+  res
+    "DescribeDeviceJobResponse"
+    "fixture/DescribeDeviceJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDeviceJob)
+
+responseDescribeNode :: DescribeNodeResponse -> TestTree
+responseDescribeNode =
+  res
+    "DescribeNodeResponse"
+    "fixture/DescribeNodeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeNode)
+
+responseDescribeNodeFromTemplateJob :: DescribeNodeFromTemplateJobResponse -> TestTree
+responseDescribeNodeFromTemplateJob =
+  res
+    "DescribeNodeFromTemplateJobResponse"
+    "fixture/DescribeNodeFromTemplateJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeNodeFromTemplateJob)
+
+responseDescribePackage :: DescribePackageResponse -> TestTree
+responseDescribePackage =
+  res
+    "DescribePackageResponse"
+    "fixture/DescribePackageResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribePackage)
+
+responseDescribePackageImportJob :: DescribePackageImportJobResponse -> TestTree
+responseDescribePackageImportJob =
+  res
+    "DescribePackageImportJobResponse"
+    "fixture/DescribePackageImportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribePackageImportJob)
+
+responseDescribePackageVersion :: DescribePackageVersionResponse -> TestTree
+responseDescribePackageVersion =
+  res
+    "DescribePackageVersionResponse"
+    "fixture/DescribePackageVersionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribePackageVersion)
+
+responseListApplicationInstanceDependencies :: ListApplicationInstanceDependenciesResponse -> TestTree
+responseListApplicationInstanceDependencies =
+  res
+    "ListApplicationInstanceDependenciesResponse"
+    "fixture/ListApplicationInstanceDependenciesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListApplicationInstanceDependencies)
+
+responseListApplicationInstanceNodeInstances :: ListApplicationInstanceNodeInstancesResponse -> TestTree
+responseListApplicationInstanceNodeInstances =
+  res
+    "ListApplicationInstanceNodeInstancesResponse"
+    "fixture/ListApplicationInstanceNodeInstancesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListApplicationInstanceNodeInstances)
+
+responseListApplicationInstances :: ListApplicationInstancesResponse -> TestTree
+responseListApplicationInstances =
+  res
+    "ListApplicationInstancesResponse"
+    "fixture/ListApplicationInstancesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListApplicationInstances)
+
+responseListDevices :: ListDevicesResponse -> TestTree
+responseListDevices =
+  res
+    "ListDevicesResponse"
+    "fixture/ListDevicesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDevices)
+
+responseListDevicesJobs :: ListDevicesJobsResponse -> TestTree
+responseListDevicesJobs =
+  res
+    "ListDevicesJobsResponse"
+    "fixture/ListDevicesJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDevicesJobs)
+
+responseListNodeFromTemplateJobs :: ListNodeFromTemplateJobsResponse -> TestTree
+responseListNodeFromTemplateJobs =
+  res
+    "ListNodeFromTemplateJobsResponse"
+    "fixture/ListNodeFromTemplateJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListNodeFromTemplateJobs)
+
+responseListNodes :: ListNodesResponse -> TestTree
+responseListNodes =
+  res
+    "ListNodesResponse"
+    "fixture/ListNodesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListNodes)
+
+responseListPackageImportJobs :: ListPackageImportJobsResponse -> TestTree
+responseListPackageImportJobs =
+  res
+    "ListPackageImportJobsResponse"
+    "fixture/ListPackageImportJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPackageImportJobs)
+
+responseListPackages :: ListPackagesResponse -> TestTree
+responseListPackages =
+  res
+    "ListPackagesResponse"
+    "fixture/ListPackagesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPackages)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseProvisionDevice :: ProvisionDeviceResponse -> TestTree
+responseProvisionDevice =
+  res
+    "ProvisionDeviceResponse"
+    "fixture/ProvisionDeviceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ProvisionDevice)
+
+responseRegisterPackageVersion :: RegisterPackageVersionResponse -> TestTree
+responseRegisterPackageVersion =
+  res
+    "RegisterPackageVersionResponse"
+    "fixture/RegisterPackageVersionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RegisterPackageVersion)
+
+responseRemoveApplicationInstance :: RemoveApplicationInstanceResponse -> TestTree
+responseRemoveApplicationInstance =
+  res
+    "RemoveApplicationInstanceResponse"
+    "fixture/RemoveApplicationInstanceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RemoveApplicationInstance)
+
+responseSignalApplicationInstanceNodeInstances :: SignalApplicationInstanceNodeInstancesResponse -> TestTree
+responseSignalApplicationInstanceNodeInstances =
+  res
+    "SignalApplicationInstanceNodeInstancesResponse"
+    "fixture/SignalApplicationInstanceNodeInstancesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SignalApplicationInstanceNodeInstances)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateDeviceMetadata :: UpdateDeviceMetadataResponse -> TestTree
+responseUpdateDeviceMetadata =
+  res
+    "UpdateDeviceMetadataResponse"
+    "fixture/UpdateDeviceMetadataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateDeviceMetadata)
diff --git a/test/Test/Amazonka/Panorama.hs b/test/Test/Amazonka/Panorama.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Panorama.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.Panorama
+-- 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.Panorama
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/Panorama/Internal.hs b/test/Test/Amazonka/Panorama/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Panorama/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.Panorama.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.Panorama.Internal where
