packages feed

amazonka-elasticache-2.0: gen/Amazonka/ElastiCache/ModifyReplicationGroupShardConfiguration.hs

{-# 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.ElastiCache.ModifyReplicationGroupShardConfiguration
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Modifies a replication group\'s shards (node groups) by allowing you to
-- add shards, remove shards, or rebalance the keyspaces among existing
-- shards.
module Amazonka.ElastiCache.ModifyReplicationGroupShardConfiguration
  ( -- * Creating a Request
    ModifyReplicationGroupShardConfiguration (..),
    newModifyReplicationGroupShardConfiguration,

    -- * Request Lenses
    modifyReplicationGroupShardConfiguration_nodeGroupsToRemove,
    modifyReplicationGroupShardConfiguration_nodeGroupsToRetain,
    modifyReplicationGroupShardConfiguration_reshardingConfiguration,
    modifyReplicationGroupShardConfiguration_replicationGroupId,
    modifyReplicationGroupShardConfiguration_nodeGroupCount,
    modifyReplicationGroupShardConfiguration_applyImmediately,

    -- * Destructuring the Response
    ModifyReplicationGroupShardConfigurationResponse (..),
    newModifyReplicationGroupShardConfigurationResponse,

    -- * Response Lenses
    modifyReplicationGroupShardConfigurationResponse_replicationGroup,
    modifyReplicationGroupShardConfigurationResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.ElastiCache.Types
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | Represents the input for a @ModifyReplicationGroupShardConfiguration@
-- operation.
--
-- /See:/ 'newModifyReplicationGroupShardConfiguration' smart constructor.
data ModifyReplicationGroupShardConfiguration = ModifyReplicationGroupShardConfiguration'
  { -- | If the value of @NodeGroupCount@ is less than the current number of node
    -- groups (shards), then either @NodeGroupsToRemove@ or
    -- @NodeGroupsToRetain@ is required. @NodeGroupsToRemove@ is a list of
    -- @NodeGroupId@s to remove from the cluster.
    --
    -- ElastiCache for Redis will attempt to remove all node groups listed by
    -- @NodeGroupsToRemove@ from the cluster.
    nodeGroupsToRemove :: Prelude.Maybe [Prelude.Text],
    -- | If the value of @NodeGroupCount@ is less than the current number of node
    -- groups (shards), then either @NodeGroupsToRemove@ or
    -- @NodeGroupsToRetain@ is required. @NodeGroupsToRetain@ is a list of
    -- @NodeGroupId@s to retain in the cluster.
    --
    -- ElastiCache for Redis will attempt to remove all node groups except
    -- those listed by @NodeGroupsToRetain@ from the cluster.
    nodeGroupsToRetain :: Prelude.Maybe [Prelude.Text],
    -- | Specifies the preferred availability zones for each node group in the
    -- cluster. If the value of @NodeGroupCount@ is greater than the current
    -- number of node groups (shards), you can use this parameter to specify
    -- the preferred availability zones of the cluster\'s shards. If you omit
    -- this parameter ElastiCache selects availability zones for you.
    --
    -- You can specify this parameter only if the value of @NodeGroupCount@ is
    -- greater than the current number of node groups (shards).
    reshardingConfiguration :: Prelude.Maybe [ReshardingConfiguration],
    -- | The name of the Redis (cluster mode enabled) cluster (replication group)
    -- on which the shards are to be configured.
    replicationGroupId :: Prelude.Text,
    -- | The number of node groups (shards) that results from the modification of
    -- the shard configuration.
    nodeGroupCount :: Prelude.Int,
    -- | Indicates that the shard reconfiguration process begins immediately. At
    -- present, the only permitted value for this parameter is @true@.
    --
    -- Value: true
    applyImmediately :: Prelude.Bool
  }
  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)

-- |
-- Create a value of 'ModifyReplicationGroupShardConfiguration' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'nodeGroupsToRemove', 'modifyReplicationGroupShardConfiguration_nodeGroupsToRemove' - If the value of @NodeGroupCount@ is less than the current number of node
-- groups (shards), then either @NodeGroupsToRemove@ or
-- @NodeGroupsToRetain@ is required. @NodeGroupsToRemove@ is a list of
-- @NodeGroupId@s to remove from the cluster.
--
-- ElastiCache for Redis will attempt to remove all node groups listed by
-- @NodeGroupsToRemove@ from the cluster.
--
-- 'nodeGroupsToRetain', 'modifyReplicationGroupShardConfiguration_nodeGroupsToRetain' - If the value of @NodeGroupCount@ is less than the current number of node
-- groups (shards), then either @NodeGroupsToRemove@ or
-- @NodeGroupsToRetain@ is required. @NodeGroupsToRetain@ is a list of
-- @NodeGroupId@s to retain in the cluster.
--
-- ElastiCache for Redis will attempt to remove all node groups except
-- those listed by @NodeGroupsToRetain@ from the cluster.
--
-- 'reshardingConfiguration', 'modifyReplicationGroupShardConfiguration_reshardingConfiguration' - Specifies the preferred availability zones for each node group in the
-- cluster. If the value of @NodeGroupCount@ is greater than the current
-- number of node groups (shards), you can use this parameter to specify
-- the preferred availability zones of the cluster\'s shards. If you omit
-- this parameter ElastiCache selects availability zones for you.
--
-- You can specify this parameter only if the value of @NodeGroupCount@ is
-- greater than the current number of node groups (shards).
--
-- 'replicationGroupId', 'modifyReplicationGroupShardConfiguration_replicationGroupId' - The name of the Redis (cluster mode enabled) cluster (replication group)
-- on which the shards are to be configured.
--
-- 'nodeGroupCount', 'modifyReplicationGroupShardConfiguration_nodeGroupCount' - The number of node groups (shards) that results from the modification of
-- the shard configuration.
--
-- 'applyImmediately', 'modifyReplicationGroupShardConfiguration_applyImmediately' - Indicates that the shard reconfiguration process begins immediately. At
-- present, the only permitted value for this parameter is @true@.
--
-- Value: true
newModifyReplicationGroupShardConfiguration ::
  -- | 'replicationGroupId'
  Prelude.Text ->
  -- | 'nodeGroupCount'
  Prelude.Int ->
  -- | 'applyImmediately'
  Prelude.Bool ->
  ModifyReplicationGroupShardConfiguration
newModifyReplicationGroupShardConfiguration
  pReplicationGroupId_
  pNodeGroupCount_
  pApplyImmediately_ =
    ModifyReplicationGroupShardConfiguration'
      { nodeGroupsToRemove =
          Prelude.Nothing,
        nodeGroupsToRetain =
          Prelude.Nothing,
        reshardingConfiguration =
          Prelude.Nothing,
        replicationGroupId =
          pReplicationGroupId_,
        nodeGroupCount = pNodeGroupCount_,
        applyImmediately =
          pApplyImmediately_
      }

-- | If the value of @NodeGroupCount@ is less than the current number of node
-- groups (shards), then either @NodeGroupsToRemove@ or
-- @NodeGroupsToRetain@ is required. @NodeGroupsToRemove@ is a list of
-- @NodeGroupId@s to remove from the cluster.
--
-- ElastiCache for Redis will attempt to remove all node groups listed by
-- @NodeGroupsToRemove@ from the cluster.
modifyReplicationGroupShardConfiguration_nodeGroupsToRemove :: Lens.Lens' ModifyReplicationGroupShardConfiguration (Prelude.Maybe [Prelude.Text])
modifyReplicationGroupShardConfiguration_nodeGroupsToRemove = Lens.lens (\ModifyReplicationGroupShardConfiguration' {nodeGroupsToRemove} -> nodeGroupsToRemove) (\s@ModifyReplicationGroupShardConfiguration' {} a -> s {nodeGroupsToRemove = a} :: ModifyReplicationGroupShardConfiguration) Prelude.. Lens.mapping Lens.coerced

-- | If the value of @NodeGroupCount@ is less than the current number of node
-- groups (shards), then either @NodeGroupsToRemove@ or
-- @NodeGroupsToRetain@ is required. @NodeGroupsToRetain@ is a list of
-- @NodeGroupId@s to retain in the cluster.
--
-- ElastiCache for Redis will attempt to remove all node groups except
-- those listed by @NodeGroupsToRetain@ from the cluster.
modifyReplicationGroupShardConfiguration_nodeGroupsToRetain :: Lens.Lens' ModifyReplicationGroupShardConfiguration (Prelude.Maybe [Prelude.Text])
modifyReplicationGroupShardConfiguration_nodeGroupsToRetain = Lens.lens (\ModifyReplicationGroupShardConfiguration' {nodeGroupsToRetain} -> nodeGroupsToRetain) (\s@ModifyReplicationGroupShardConfiguration' {} a -> s {nodeGroupsToRetain = a} :: ModifyReplicationGroupShardConfiguration) Prelude.. Lens.mapping Lens.coerced

-- | Specifies the preferred availability zones for each node group in the
-- cluster. If the value of @NodeGroupCount@ is greater than the current
-- number of node groups (shards), you can use this parameter to specify
-- the preferred availability zones of the cluster\'s shards. If you omit
-- this parameter ElastiCache selects availability zones for you.
--
-- You can specify this parameter only if the value of @NodeGroupCount@ is
-- greater than the current number of node groups (shards).
modifyReplicationGroupShardConfiguration_reshardingConfiguration :: Lens.Lens' ModifyReplicationGroupShardConfiguration (Prelude.Maybe [ReshardingConfiguration])
modifyReplicationGroupShardConfiguration_reshardingConfiguration = Lens.lens (\ModifyReplicationGroupShardConfiguration' {reshardingConfiguration} -> reshardingConfiguration) (\s@ModifyReplicationGroupShardConfiguration' {} a -> s {reshardingConfiguration = a} :: ModifyReplicationGroupShardConfiguration) Prelude.. Lens.mapping Lens.coerced

-- | The name of the Redis (cluster mode enabled) cluster (replication group)
-- on which the shards are to be configured.
modifyReplicationGroupShardConfiguration_replicationGroupId :: Lens.Lens' ModifyReplicationGroupShardConfiguration Prelude.Text
modifyReplicationGroupShardConfiguration_replicationGroupId = Lens.lens (\ModifyReplicationGroupShardConfiguration' {replicationGroupId} -> replicationGroupId) (\s@ModifyReplicationGroupShardConfiguration' {} a -> s {replicationGroupId = a} :: ModifyReplicationGroupShardConfiguration)

-- | The number of node groups (shards) that results from the modification of
-- the shard configuration.
modifyReplicationGroupShardConfiguration_nodeGroupCount :: Lens.Lens' ModifyReplicationGroupShardConfiguration Prelude.Int
modifyReplicationGroupShardConfiguration_nodeGroupCount = Lens.lens (\ModifyReplicationGroupShardConfiguration' {nodeGroupCount} -> nodeGroupCount) (\s@ModifyReplicationGroupShardConfiguration' {} a -> s {nodeGroupCount = a} :: ModifyReplicationGroupShardConfiguration)

-- | Indicates that the shard reconfiguration process begins immediately. At
-- present, the only permitted value for this parameter is @true@.
--
-- Value: true
modifyReplicationGroupShardConfiguration_applyImmediately :: Lens.Lens' ModifyReplicationGroupShardConfiguration Prelude.Bool
modifyReplicationGroupShardConfiguration_applyImmediately = Lens.lens (\ModifyReplicationGroupShardConfiguration' {applyImmediately} -> applyImmediately) (\s@ModifyReplicationGroupShardConfiguration' {} a -> s {applyImmediately = a} :: ModifyReplicationGroupShardConfiguration)

instance
  Core.AWSRequest
    ModifyReplicationGroupShardConfiguration
  where
  type
    AWSResponse
      ModifyReplicationGroupShardConfiguration =
      ModifyReplicationGroupShardConfigurationResponse
  request overrides =
    Request.postQuery (overrides defaultService)
  response =
    Response.receiveXMLWrapper
      "ModifyReplicationGroupShardConfigurationResult"
      ( \s h x ->
          ModifyReplicationGroupShardConfigurationResponse'
            Prelude.<$> (x Data..@? "ReplicationGroup")
            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
      )

instance
  Prelude.Hashable
    ModifyReplicationGroupShardConfiguration
  where
  hashWithSalt
    _salt
    ModifyReplicationGroupShardConfiguration' {..} =
      _salt
        `Prelude.hashWithSalt` nodeGroupsToRemove
        `Prelude.hashWithSalt` nodeGroupsToRetain
        `Prelude.hashWithSalt` reshardingConfiguration
        `Prelude.hashWithSalt` replicationGroupId
        `Prelude.hashWithSalt` nodeGroupCount
        `Prelude.hashWithSalt` applyImmediately

instance
  Prelude.NFData
    ModifyReplicationGroupShardConfiguration
  where
  rnf ModifyReplicationGroupShardConfiguration' {..} =
    Prelude.rnf nodeGroupsToRemove
      `Prelude.seq` Prelude.rnf nodeGroupsToRetain
      `Prelude.seq` Prelude.rnf reshardingConfiguration
      `Prelude.seq` Prelude.rnf replicationGroupId
      `Prelude.seq` Prelude.rnf nodeGroupCount
      `Prelude.seq` Prelude.rnf applyImmediately

instance
  Data.ToHeaders
    ModifyReplicationGroupShardConfiguration
  where
  toHeaders = Prelude.const Prelude.mempty

instance
  Data.ToPath
    ModifyReplicationGroupShardConfiguration
  where
  toPath = Prelude.const "/"

instance
  Data.ToQuery
    ModifyReplicationGroupShardConfiguration
  where
  toQuery ModifyReplicationGroupShardConfiguration' {..} =
    Prelude.mconcat
      [ "Action"
          Data.=: ( "ModifyReplicationGroupShardConfiguration" ::
                      Prelude.ByteString
                  ),
        "Version"
          Data.=: ("2015-02-02" :: Prelude.ByteString),
        "NodeGroupsToRemove"
          Data.=: Data.toQuery
            ( Data.toQueryList "NodeGroupToRemove"
                Prelude.<$> nodeGroupsToRemove
            ),
        "NodeGroupsToRetain"
          Data.=: Data.toQuery
            ( Data.toQueryList "NodeGroupToRetain"
                Prelude.<$> nodeGroupsToRetain
            ),
        "ReshardingConfiguration"
          Data.=: Data.toQuery
            ( Data.toQueryList "ReshardingConfiguration"
                Prelude.<$> reshardingConfiguration
            ),
        "ReplicationGroupId" Data.=: replicationGroupId,
        "NodeGroupCount" Data.=: nodeGroupCount,
        "ApplyImmediately" Data.=: applyImmediately
      ]

-- | /See:/ 'newModifyReplicationGroupShardConfigurationResponse' smart constructor.
data ModifyReplicationGroupShardConfigurationResponse = ModifyReplicationGroupShardConfigurationResponse'
  { replicationGroup :: Prelude.Maybe ReplicationGroup,
    -- | The response's http status code.
    httpStatus :: Prelude.Int
  }
  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)

-- |
-- Create a value of 'ModifyReplicationGroupShardConfigurationResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'replicationGroup', 'modifyReplicationGroupShardConfigurationResponse_replicationGroup' - Undocumented member.
--
-- 'httpStatus', 'modifyReplicationGroupShardConfigurationResponse_httpStatus' - The response's http status code.
newModifyReplicationGroupShardConfigurationResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  ModifyReplicationGroupShardConfigurationResponse
newModifyReplicationGroupShardConfigurationResponse
  pHttpStatus_ =
    ModifyReplicationGroupShardConfigurationResponse'
      { replicationGroup =
          Prelude.Nothing,
        httpStatus = pHttpStatus_
      }

-- | Undocumented member.
modifyReplicationGroupShardConfigurationResponse_replicationGroup :: Lens.Lens' ModifyReplicationGroupShardConfigurationResponse (Prelude.Maybe ReplicationGroup)
modifyReplicationGroupShardConfigurationResponse_replicationGroup = Lens.lens (\ModifyReplicationGroupShardConfigurationResponse' {replicationGroup} -> replicationGroup) (\s@ModifyReplicationGroupShardConfigurationResponse' {} a -> s {replicationGroup = a} :: ModifyReplicationGroupShardConfigurationResponse)

-- | The response's http status code.
modifyReplicationGroupShardConfigurationResponse_httpStatus :: Lens.Lens' ModifyReplicationGroupShardConfigurationResponse Prelude.Int
modifyReplicationGroupShardConfigurationResponse_httpStatus = Lens.lens (\ModifyReplicationGroupShardConfigurationResponse' {httpStatus} -> httpStatus) (\s@ModifyReplicationGroupShardConfigurationResponse' {} a -> s {httpStatus = a} :: ModifyReplicationGroupShardConfigurationResponse)

instance
  Prelude.NFData
    ModifyReplicationGroupShardConfigurationResponse
  where
  rnf
    ModifyReplicationGroupShardConfigurationResponse' {..} =
      Prelude.rnf replicationGroup
        `Prelude.seq` Prelude.rnf httpStatus