{-# 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.CodeDeploy.Types.TrafficRoutingConfig
-- 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.CodeDeploy.Types.TrafficRoutingConfig where

import Amazonka.CodeDeploy.Types.TimeBasedCanary
import Amazonka.CodeDeploy.Types.TimeBasedLinear
import Amazonka.CodeDeploy.Types.TrafficRoutingType
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 configuration that specifies how traffic is shifted from one version
-- of a Lambda function to another version during an Lambda deployment, or
-- from one Amazon ECS task set to another during an Amazon ECS deployment.
--
-- /See:/ 'newTrafficRoutingConfig' smart constructor.
data TrafficRoutingConfig = TrafficRoutingConfig'
  { -- | A configuration that shifts traffic from one version of a Lambda
    -- function or ECS task set to another in two increments. The original and
    -- target Lambda function versions or ECS task sets are specified in the
    -- deployment\'s AppSpec file.
    TrafficRoutingConfig -> Maybe TimeBasedCanary
timeBasedCanary :: Prelude.Maybe TimeBasedCanary,
    -- | A configuration that shifts traffic from one version of a Lambda
    -- function or Amazon ECS task set to another in equal increments, with an
    -- equal number of minutes between each increment. The original and target
    -- Lambda function versions or Amazon ECS task sets are specified in the
    -- deployment\'s AppSpec file.
    TrafficRoutingConfig -> Maybe TimeBasedLinear
timeBasedLinear :: Prelude.Maybe TimeBasedLinear,
    -- | The type of traffic shifting (@TimeBasedCanary@ or @TimeBasedLinear@)
    -- used by a deployment configuration.
    TrafficRoutingConfig -> Maybe TrafficRoutingType
type' :: Prelude.Maybe TrafficRoutingType
  }
  deriving (TrafficRoutingConfig -> TrafficRoutingConfig -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TrafficRoutingConfig -> TrafficRoutingConfig -> Bool
$c/= :: TrafficRoutingConfig -> TrafficRoutingConfig -> Bool
== :: TrafficRoutingConfig -> TrafficRoutingConfig -> Bool
$c== :: TrafficRoutingConfig -> TrafficRoutingConfig -> Bool
Prelude.Eq, ReadPrec [TrafficRoutingConfig]
ReadPrec TrafficRoutingConfig
Int -> ReadS TrafficRoutingConfig
ReadS [TrafficRoutingConfig]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [TrafficRoutingConfig]
$creadListPrec :: ReadPrec [TrafficRoutingConfig]
readPrec :: ReadPrec TrafficRoutingConfig
$creadPrec :: ReadPrec TrafficRoutingConfig
readList :: ReadS [TrafficRoutingConfig]
$creadList :: ReadS [TrafficRoutingConfig]
readsPrec :: Int -> ReadS TrafficRoutingConfig
$creadsPrec :: Int -> ReadS TrafficRoutingConfig
Prelude.Read, Int -> TrafficRoutingConfig -> ShowS
[TrafficRoutingConfig] -> ShowS
TrafficRoutingConfig -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TrafficRoutingConfig] -> ShowS
$cshowList :: [TrafficRoutingConfig] -> ShowS
show :: TrafficRoutingConfig -> String
$cshow :: TrafficRoutingConfig -> String
showsPrec :: Int -> TrafficRoutingConfig -> ShowS
$cshowsPrec :: Int -> TrafficRoutingConfig -> ShowS
Prelude.Show, forall x. Rep TrafficRoutingConfig x -> TrafficRoutingConfig
forall x. TrafficRoutingConfig -> Rep TrafficRoutingConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TrafficRoutingConfig x -> TrafficRoutingConfig
$cfrom :: forall x. TrafficRoutingConfig -> Rep TrafficRoutingConfig x
Prelude.Generic)

-- |
-- Create a value of 'TrafficRoutingConfig' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'timeBasedCanary', 'trafficRoutingConfig_timeBasedCanary' - A configuration that shifts traffic from one version of a Lambda
-- function or ECS task set to another in two increments. The original and
-- target Lambda function versions or ECS task sets are specified in the
-- deployment\'s AppSpec file.
--
-- 'timeBasedLinear', 'trafficRoutingConfig_timeBasedLinear' - A configuration that shifts traffic from one version of a Lambda
-- function or Amazon ECS task set to another in equal increments, with an
-- equal number of minutes between each increment. The original and target
-- Lambda function versions or Amazon ECS task sets are specified in the
-- deployment\'s AppSpec file.
--
-- 'type'', 'trafficRoutingConfig_type' - The type of traffic shifting (@TimeBasedCanary@ or @TimeBasedLinear@)
-- used by a deployment configuration.
newTrafficRoutingConfig ::
  TrafficRoutingConfig
newTrafficRoutingConfig :: TrafficRoutingConfig
newTrafficRoutingConfig =
  TrafficRoutingConfig'
    { $sel:timeBasedCanary:TrafficRoutingConfig' :: Maybe TimeBasedCanary
timeBasedCanary =
        forall a. Maybe a
Prelude.Nothing,
      $sel:timeBasedLinear:TrafficRoutingConfig' :: Maybe TimeBasedLinear
timeBasedLinear = forall a. Maybe a
Prelude.Nothing,
      $sel:type':TrafficRoutingConfig' :: Maybe TrafficRoutingType
type' = forall a. Maybe a
Prelude.Nothing
    }

-- | A configuration that shifts traffic from one version of a Lambda
-- function or ECS task set to another in two increments. The original and
-- target Lambda function versions or ECS task sets are specified in the
-- deployment\'s AppSpec file.
trafficRoutingConfig_timeBasedCanary :: Lens.Lens' TrafficRoutingConfig (Prelude.Maybe TimeBasedCanary)
trafficRoutingConfig_timeBasedCanary :: Lens' TrafficRoutingConfig (Maybe TimeBasedCanary)
trafficRoutingConfig_timeBasedCanary = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TrafficRoutingConfig' {Maybe TimeBasedCanary
timeBasedCanary :: Maybe TimeBasedCanary
$sel:timeBasedCanary:TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TimeBasedCanary
timeBasedCanary} -> Maybe TimeBasedCanary
timeBasedCanary) (\s :: TrafficRoutingConfig
s@TrafficRoutingConfig' {} Maybe TimeBasedCanary
a -> TrafficRoutingConfig
s {$sel:timeBasedCanary:TrafficRoutingConfig' :: Maybe TimeBasedCanary
timeBasedCanary = Maybe TimeBasedCanary
a} :: TrafficRoutingConfig)

-- | A configuration that shifts traffic from one version of a Lambda
-- function or Amazon ECS task set to another in equal increments, with an
-- equal number of minutes between each increment. The original and target
-- Lambda function versions or Amazon ECS task sets are specified in the
-- deployment\'s AppSpec file.
trafficRoutingConfig_timeBasedLinear :: Lens.Lens' TrafficRoutingConfig (Prelude.Maybe TimeBasedLinear)
trafficRoutingConfig_timeBasedLinear :: Lens' TrafficRoutingConfig (Maybe TimeBasedLinear)
trafficRoutingConfig_timeBasedLinear = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TrafficRoutingConfig' {Maybe TimeBasedLinear
timeBasedLinear :: Maybe TimeBasedLinear
$sel:timeBasedLinear:TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TimeBasedLinear
timeBasedLinear} -> Maybe TimeBasedLinear
timeBasedLinear) (\s :: TrafficRoutingConfig
s@TrafficRoutingConfig' {} Maybe TimeBasedLinear
a -> TrafficRoutingConfig
s {$sel:timeBasedLinear:TrafficRoutingConfig' :: Maybe TimeBasedLinear
timeBasedLinear = Maybe TimeBasedLinear
a} :: TrafficRoutingConfig)

-- | The type of traffic shifting (@TimeBasedCanary@ or @TimeBasedLinear@)
-- used by a deployment configuration.
trafficRoutingConfig_type :: Lens.Lens' TrafficRoutingConfig (Prelude.Maybe TrafficRoutingType)
trafficRoutingConfig_type :: Lens' TrafficRoutingConfig (Maybe TrafficRoutingType)
trafficRoutingConfig_type = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TrafficRoutingConfig' {Maybe TrafficRoutingType
type' :: Maybe TrafficRoutingType
$sel:type':TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TrafficRoutingType
type'} -> Maybe TrafficRoutingType
type') (\s :: TrafficRoutingConfig
s@TrafficRoutingConfig' {} Maybe TrafficRoutingType
a -> TrafficRoutingConfig
s {$sel:type':TrafficRoutingConfig' :: Maybe TrafficRoutingType
type' = Maybe TrafficRoutingType
a} :: TrafficRoutingConfig)

instance Data.FromJSON TrafficRoutingConfig where
  parseJSON :: Value -> Parser TrafficRoutingConfig
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"TrafficRoutingConfig"
      ( \Object
x ->
          Maybe TimeBasedCanary
-> Maybe TimeBasedLinear
-> Maybe TrafficRoutingType
-> TrafficRoutingConfig
TrafficRoutingConfig'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"timeBasedCanary")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"timeBasedLinear")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"type")
      )

instance Prelude.Hashable TrafficRoutingConfig where
  hashWithSalt :: Int -> TrafficRoutingConfig -> Int
hashWithSalt Int
_salt TrafficRoutingConfig' {Maybe TimeBasedCanary
Maybe TimeBasedLinear
Maybe TrafficRoutingType
type' :: Maybe TrafficRoutingType
timeBasedLinear :: Maybe TimeBasedLinear
timeBasedCanary :: Maybe TimeBasedCanary
$sel:type':TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TrafficRoutingType
$sel:timeBasedLinear:TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TimeBasedLinear
$sel:timeBasedCanary:TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TimeBasedCanary
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TimeBasedCanary
timeBasedCanary
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TimeBasedLinear
timeBasedLinear
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TrafficRoutingType
type'

instance Prelude.NFData TrafficRoutingConfig where
  rnf :: TrafficRoutingConfig -> ()
rnf TrafficRoutingConfig' {Maybe TimeBasedCanary
Maybe TimeBasedLinear
Maybe TrafficRoutingType
type' :: Maybe TrafficRoutingType
timeBasedLinear :: Maybe TimeBasedLinear
timeBasedCanary :: Maybe TimeBasedCanary
$sel:type':TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TrafficRoutingType
$sel:timeBasedLinear:TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TimeBasedLinear
$sel:timeBasedCanary:TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TimeBasedCanary
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe TimeBasedCanary
timeBasedCanary
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TimeBasedLinear
timeBasedLinear
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TrafficRoutingType
type'

instance Data.ToJSON TrafficRoutingConfig where
  toJSON :: TrafficRoutingConfig -> Value
toJSON TrafficRoutingConfig' {Maybe TimeBasedCanary
Maybe TimeBasedLinear
Maybe TrafficRoutingType
type' :: Maybe TrafficRoutingType
timeBasedLinear :: Maybe TimeBasedLinear
timeBasedCanary :: Maybe TimeBasedCanary
$sel:type':TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TrafficRoutingType
$sel:timeBasedLinear:TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TimeBasedLinear
$sel:timeBasedCanary:TrafficRoutingConfig' :: TrafficRoutingConfig -> Maybe TimeBasedCanary
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"timeBasedCanary" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe TimeBasedCanary
timeBasedCanary,
            (Key
"timeBasedLinear" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe TimeBasedLinear
timeBasedLinear,
            (Key
"type" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe TrafficRoutingType
type'
          ]
      )