{-# 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.EFS.Types.LifecyclePolicy
-- 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.EFS.Types.LifecyclePolicy where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.EFS.Types.TransitionToIARules
import Amazonka.EFS.Types.TransitionToPrimaryStorageClassRules
import qualified Amazonka.Prelude as Prelude

-- | Describes a policy used by EFS lifecycle management and EFS
-- Intelligent-Tiering that specifies when to transition files into and out
-- of the file system\'s Infrequent Access (IA) storage class. For more
-- information, see
-- <https://docs.aws.amazon.com/efs/latest/ug/lifecycle-management-efs.html EFS Intelligent‐Tiering and EFS Lifecycle Management>.
--
-- When using the @put-lifecycle-configuration@ CLI command or the
-- @PutLifecycleConfiguration@ API action, Amazon EFS requires that each
-- @LifecyclePolicy@ object have only a single transition. This means that
-- in a request body, @LifecyclePolicies@ must be structured as an array of
-- @LifecyclePolicy@ objects, one object for each transition,
-- @TransitionToIA@, @TransitionToPrimaryStorageClass@. For more
-- information, see the request examples in PutLifecycleConfiguration.
--
-- /See:/ 'newLifecyclePolicy' smart constructor.
data LifecyclePolicy = LifecyclePolicy'
  { -- | Describes the period of time that a file is not accessed, after which it
    -- transitions to IA storage. Metadata operations such as listing the
    -- contents of a directory don\'t count as file access events.
    LifecyclePolicy -> Maybe TransitionToIARules
transitionToIA :: Prelude.Maybe TransitionToIARules,
    -- | Describes when to transition a file from IA storage to primary storage.
    -- Metadata operations such as listing the contents of a directory don\'t
    -- count as file access events.
    LifecyclePolicy -> Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass :: Prelude.Maybe TransitionToPrimaryStorageClassRules
  }
  deriving (LifecyclePolicy -> LifecyclePolicy -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LifecyclePolicy -> LifecyclePolicy -> Bool
$c/= :: LifecyclePolicy -> LifecyclePolicy -> Bool
== :: LifecyclePolicy -> LifecyclePolicy -> Bool
$c== :: LifecyclePolicy -> LifecyclePolicy -> Bool
Prelude.Eq, ReadPrec [LifecyclePolicy]
ReadPrec LifecyclePolicy
Int -> ReadS LifecyclePolicy
ReadS [LifecyclePolicy]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [LifecyclePolicy]
$creadListPrec :: ReadPrec [LifecyclePolicy]
readPrec :: ReadPrec LifecyclePolicy
$creadPrec :: ReadPrec LifecyclePolicy
readList :: ReadS [LifecyclePolicy]
$creadList :: ReadS [LifecyclePolicy]
readsPrec :: Int -> ReadS LifecyclePolicy
$creadsPrec :: Int -> ReadS LifecyclePolicy
Prelude.Read, Int -> LifecyclePolicy -> ShowS
[LifecyclePolicy] -> ShowS
LifecyclePolicy -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LifecyclePolicy] -> ShowS
$cshowList :: [LifecyclePolicy] -> ShowS
show :: LifecyclePolicy -> String
$cshow :: LifecyclePolicy -> String
showsPrec :: Int -> LifecyclePolicy -> ShowS
$cshowsPrec :: Int -> LifecyclePolicy -> ShowS
Prelude.Show, forall x. Rep LifecyclePolicy x -> LifecyclePolicy
forall x. LifecyclePolicy -> Rep LifecyclePolicy x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep LifecyclePolicy x -> LifecyclePolicy
$cfrom :: forall x. LifecyclePolicy -> Rep LifecyclePolicy x
Prelude.Generic)

-- |
-- Create a value of 'LifecyclePolicy' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'transitionToIA', 'lifecyclePolicy_transitionToIA' - Describes the period of time that a file is not accessed, after which it
-- transitions to IA storage. Metadata operations such as listing the
-- contents of a directory don\'t count as file access events.
--
-- 'transitionToPrimaryStorageClass', 'lifecyclePolicy_transitionToPrimaryStorageClass' - Describes when to transition a file from IA storage to primary storage.
-- Metadata operations such as listing the contents of a directory don\'t
-- count as file access events.
newLifecyclePolicy ::
  LifecyclePolicy
newLifecyclePolicy :: LifecyclePolicy
newLifecyclePolicy =
  LifecyclePolicy'
    { $sel:transitionToIA:LifecyclePolicy' :: Maybe TransitionToIARules
transitionToIA = forall a. Maybe a
Prelude.Nothing,
      $sel:transitionToPrimaryStorageClass:LifecyclePolicy' :: Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass = forall a. Maybe a
Prelude.Nothing
    }

-- | Describes the period of time that a file is not accessed, after which it
-- transitions to IA storage. Metadata operations such as listing the
-- contents of a directory don\'t count as file access events.
lifecyclePolicy_transitionToIA :: Lens.Lens' LifecyclePolicy (Prelude.Maybe TransitionToIARules)
lifecyclePolicy_transitionToIA :: Lens' LifecyclePolicy (Maybe TransitionToIARules)
lifecyclePolicy_transitionToIA = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\LifecyclePolicy' {Maybe TransitionToIARules
transitionToIA :: Maybe TransitionToIARules
$sel:transitionToIA:LifecyclePolicy' :: LifecyclePolicy -> Maybe TransitionToIARules
transitionToIA} -> Maybe TransitionToIARules
transitionToIA) (\s :: LifecyclePolicy
s@LifecyclePolicy' {} Maybe TransitionToIARules
a -> LifecyclePolicy
s {$sel:transitionToIA:LifecyclePolicy' :: Maybe TransitionToIARules
transitionToIA = Maybe TransitionToIARules
a} :: LifecyclePolicy)

-- | Describes when to transition a file from IA storage to primary storage.
-- Metadata operations such as listing the contents of a directory don\'t
-- count as file access events.
lifecyclePolicy_transitionToPrimaryStorageClass :: Lens.Lens' LifecyclePolicy (Prelude.Maybe TransitionToPrimaryStorageClassRules)
lifecyclePolicy_transitionToPrimaryStorageClass :: Lens' LifecyclePolicy (Maybe TransitionToPrimaryStorageClassRules)
lifecyclePolicy_transitionToPrimaryStorageClass = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\LifecyclePolicy' {Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass :: Maybe TransitionToPrimaryStorageClassRules
$sel:transitionToPrimaryStorageClass:LifecyclePolicy' :: LifecyclePolicy -> Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass} -> Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass) (\s :: LifecyclePolicy
s@LifecyclePolicy' {} Maybe TransitionToPrimaryStorageClassRules
a -> LifecyclePolicy
s {$sel:transitionToPrimaryStorageClass:LifecyclePolicy' :: Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass = Maybe TransitionToPrimaryStorageClassRules
a} :: LifecyclePolicy)

instance Data.FromJSON LifecyclePolicy where
  parseJSON :: Value -> Parser LifecyclePolicy
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"LifecyclePolicy"
      ( \Object
x ->
          Maybe TransitionToIARules
-> Maybe TransitionToPrimaryStorageClassRules -> LifecyclePolicy
LifecyclePolicy'
            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
"TransitionToIA")
            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
"TransitionToPrimaryStorageClass")
      )

instance Prelude.Hashable LifecyclePolicy where
  hashWithSalt :: Int -> LifecyclePolicy -> Int
hashWithSalt Int
_salt LifecyclePolicy' {Maybe TransitionToIARules
Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass :: Maybe TransitionToPrimaryStorageClassRules
transitionToIA :: Maybe TransitionToIARules
$sel:transitionToPrimaryStorageClass:LifecyclePolicy' :: LifecyclePolicy -> Maybe TransitionToPrimaryStorageClassRules
$sel:transitionToIA:LifecyclePolicy' :: LifecyclePolicy -> Maybe TransitionToIARules
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TransitionToIARules
transitionToIA
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass

instance Prelude.NFData LifecyclePolicy where
  rnf :: LifecyclePolicy -> ()
rnf LifecyclePolicy' {Maybe TransitionToIARules
Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass :: Maybe TransitionToPrimaryStorageClassRules
transitionToIA :: Maybe TransitionToIARules
$sel:transitionToPrimaryStorageClass:LifecyclePolicy' :: LifecyclePolicy -> Maybe TransitionToPrimaryStorageClassRules
$sel:transitionToIA:LifecyclePolicy' :: LifecyclePolicy -> Maybe TransitionToIARules
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe TransitionToIARules
transitionToIA
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass

instance Data.ToJSON LifecyclePolicy where
  toJSON :: LifecyclePolicy -> Value
toJSON LifecyclePolicy' {Maybe TransitionToIARules
Maybe TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass :: Maybe TransitionToPrimaryStorageClassRules
transitionToIA :: Maybe TransitionToIARules
$sel:transitionToPrimaryStorageClass:LifecyclePolicy' :: LifecyclePolicy -> Maybe TransitionToPrimaryStorageClassRules
$sel:transitionToIA:LifecyclePolicy' :: LifecyclePolicy -> Maybe TransitionToIARules
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"TransitionToIA" 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 TransitionToIARules
transitionToIA,
            (Key
"TransitionToPrimaryStorageClass" 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 TransitionToPrimaryStorageClassRules
transitionToPrimaryStorageClass
          ]
      )