{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}
{-# LANGUAGE TypeFamilies       #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Network.AWS.EMR.AddJobFlowSteps
-- Copyright   : (c) 2013-2015 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- AddJobFlowSteps adds new steps to a running job flow. A maximum of 256
-- steps are allowed in each job flow.
--
-- If your job flow is long-running (such as a Hive data warehouse) or
-- complex, you may require more than 256 steps to process your data. You
-- can bypass the 256-step limitation in various ways, including using the
-- SSH shell to connect to the master node and submitting queries directly
-- to the software running on the master node, such as Hive and Hadoop. For
-- more information on how to do this, go to
-- <http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/AddMoreThan256Steps.html Add More than 256 Steps to a Job Flow>
-- in the /Amazon Elastic MapReduce Developer\'s Guide/.
--
-- A step specifies the location of a JAR file stored either on the master
-- node of the job flow or in Amazon S3. Each step is performed by the main
-- function of the main class of the JAR file. The main class can be
-- specified either in the manifest of the JAR or by using the MainFunction
-- parameter of the step.
--
-- Elastic MapReduce executes each step in the order listed. For a step to
-- be considered complete, the main function must exit with a zero exit
-- code and all Hadoop jobs started while the step was running must have
-- completed and run successfully.
--
-- You can only add steps to a job flow that is in one of the following
-- states: STARTING, BOOTSTRAPPING, RUNNING, or WAITING.
--
-- /See:/ <http://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_AddJobFlowSteps.html AWS API Reference> for AddJobFlowSteps.
module Network.AWS.EMR.AddJobFlowSteps
    (
    -- * Creating a Request
      addJobFlowSteps
    , AddJobFlowSteps
    -- * Request Lenses
    , ajfsJobFlowId
    , ajfsSteps

    -- * Destructuring the Response
    , addJobFlowStepsResponse
    , AddJobFlowStepsResponse
    -- * Response Lenses
    , ajfsrsStepIds
    , ajfsrsResponseStatus
    ) where

import           Network.AWS.EMR.Types
import           Network.AWS.EMR.Types.Product
import           Network.AWS.Lens
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response

-- | The input argument to the AddJobFlowSteps operation.
--
-- /See:/ 'addJobFlowSteps' smart constructor.
data AddJobFlowSteps = AddJobFlowSteps'
    { _ajfsJobFlowId :: !Text
    , _ajfsSteps     :: ![StepConfig]
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'AddJobFlowSteps' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ajfsJobFlowId'
--
-- * 'ajfsSteps'
addJobFlowSteps
    :: Text -- ^ 'ajfsJobFlowId'
    -> AddJobFlowSteps
addJobFlowSteps pJobFlowId_ =
    AddJobFlowSteps'
    { _ajfsJobFlowId = pJobFlowId_
    , _ajfsSteps = mempty
    }

-- | A string that uniquely identifies the job flow. This identifier is
-- returned by RunJobFlow and can also be obtained from ListClusters.
ajfsJobFlowId :: Lens' AddJobFlowSteps Text
ajfsJobFlowId = lens _ajfsJobFlowId (\ s a -> s{_ajfsJobFlowId = a});

-- | A list of StepConfig to be executed by the job flow.
ajfsSteps :: Lens' AddJobFlowSteps [StepConfig]
ajfsSteps = lens _ajfsSteps (\ s a -> s{_ajfsSteps = a}) . _Coerce;

instance AWSRequest AddJobFlowSteps where
        type Rs AddJobFlowSteps = AddJobFlowStepsResponse
        request = postJSON eMR
        response
          = receiveJSON
              (\ s h x ->
                 AddJobFlowStepsResponse' <$>
                   (x .?> "StepIds" .!@ mempty) <*> (pure (fromEnum s)))

instance ToHeaders AddJobFlowSteps where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("ElasticMapReduce.AddJobFlowSteps" :: ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])

instance ToJSON AddJobFlowSteps where
        toJSON AddJobFlowSteps'{..}
          = object
              (catMaybes
                 [Just ("JobFlowId" .= _ajfsJobFlowId),
                  Just ("Steps" .= _ajfsSteps)])

instance ToPath AddJobFlowSteps where
        toPath = const "/"

instance ToQuery AddJobFlowSteps where
        toQuery = const mempty

-- | The output for the AddJobFlowSteps operation.
--
-- /See:/ 'addJobFlowStepsResponse' smart constructor.
data AddJobFlowStepsResponse = AddJobFlowStepsResponse'
    { _ajfsrsStepIds        :: !(Maybe [Text])
    , _ajfsrsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'AddJobFlowStepsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ajfsrsStepIds'
--
-- * 'ajfsrsResponseStatus'
addJobFlowStepsResponse
    :: Int -- ^ 'ajfsrsResponseStatus'
    -> AddJobFlowStepsResponse
addJobFlowStepsResponse pResponseStatus_ =
    AddJobFlowStepsResponse'
    { _ajfsrsStepIds = Nothing
    , _ajfsrsResponseStatus = pResponseStatus_
    }

-- | The identifiers of the list of steps added to the job flow.
ajfsrsStepIds :: Lens' AddJobFlowStepsResponse [Text]
ajfsrsStepIds = lens _ajfsrsStepIds (\ s a -> s{_ajfsrsStepIds = a}) . _Default . _Coerce;

-- | The response status code.
ajfsrsResponseStatus :: Lens' AddJobFlowStepsResponse Int
ajfsrsResponseStatus = lens _ajfsrsResponseStatus (\ s a -> s{_ajfsrsResponseStatus = a});