{-# 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.DataPipeline.PollForTask
-- 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)
--
-- Task runners call 'PollForTask' to receive a task to perform from AWS
-- Data Pipeline. The task runner specifies which tasks it can perform by
-- setting a value for the 'workerGroup' parameter. The task returned can
-- come from any of the pipelines that match the 'workerGroup' value passed
-- in by the task runner and that was launched using the IAM user
-- credentials specified by the task runner.
--
-- If tasks are ready in the work queue, 'PollForTask' returns a response
-- immediately. If no tasks are available in the queue, 'PollForTask' uses
-- long-polling and holds on to a poll connection for up to a 90 seconds,
-- during which time the first newly scheduled task is handed to the task
-- runner. To accomodate this, set the socket timeout in your task runner
-- to 90 seconds. The task runner should not call 'PollForTask' again on
-- the same 'workerGroup' until it receives a response, and this can take
-- up to 90 seconds.
--
-- /See:/ <http://docs.aws.amazon.com/datapipeline/latest/APIReference/API_PollForTask.html AWS API Reference> for PollForTask.
module Network.AWS.DataPipeline.PollForTask
    (
    -- * Creating a Request
      pollForTask
    , PollForTask
    -- * Request Lenses
    , pftHostname
    , pftInstanceIdentity
    , pftWorkerGroup

    -- * Destructuring the Response
    , pollForTaskResponse
    , PollForTaskResponse
    -- * Response Lenses
    , pftrsTaskObject
    , pftrsResponseStatus
    ) where

import           Network.AWS.DataPipeline.Types
import           Network.AWS.DataPipeline.Types.Product
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response

-- | Contains the parameters for PollForTask.
--
-- /See:/ 'pollForTask' smart constructor.
data PollForTask = PollForTask'
    { _pftHostname         :: !(Maybe Text)
    , _pftInstanceIdentity :: !(Maybe InstanceIdentity)
    , _pftWorkerGroup      :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'PollForTask' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pftHostname'
--
-- * 'pftInstanceIdentity'
--
-- * 'pftWorkerGroup'
pollForTask
    :: Text -- ^ 'pftWorkerGroup'
    -> PollForTask
pollForTask pWorkerGroup_ =
    PollForTask'
    { _pftHostname = Nothing
    , _pftInstanceIdentity = Nothing
    , _pftWorkerGroup = pWorkerGroup_
    }

-- | The public DNS name of the calling task runner.
pftHostname :: Lens' PollForTask (Maybe Text)
pftHostname = lens _pftHostname (\ s a -> s{_pftHostname = a});

-- | Identity information for the EC2 instance that is hosting the task
-- runner. You can get this value from the instance using
-- 'http:\/\/169.254.169.254\/latest\/meta-data\/instance-id'. For more
-- information, see
-- <http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html Instance Metadata>
-- in the /Amazon Elastic Compute Cloud User Guide./ Passing in this value
-- proves that your task runner is running on an EC2 instance, and ensures
-- the proper AWS Data Pipeline service charges are applied to your
-- pipeline.
pftInstanceIdentity :: Lens' PollForTask (Maybe InstanceIdentity)
pftInstanceIdentity = lens _pftInstanceIdentity (\ s a -> s{_pftInstanceIdentity = a});

-- | The type of task the task runner is configured to accept and process.
-- The worker group is set as a field on objects in the pipeline when they
-- are created. You can only specify a single value for 'workerGroup' in
-- the call to 'PollForTask'. There are no wildcard values permitted in
-- 'workerGroup'; the string must be an exact, case-sensitive, match.
pftWorkerGroup :: Lens' PollForTask Text
pftWorkerGroup = lens _pftWorkerGroup (\ s a -> s{_pftWorkerGroup = a});

instance AWSRequest PollForTask where
        type Rs PollForTask = PollForTaskResponse
        request = postJSON dataPipeline
        response
          = receiveJSON
              (\ s h x ->
                 PollForTaskResponse' <$>
                   (x .?> "taskObject") <*> (pure (fromEnum s)))

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

instance ToJSON PollForTask where
        toJSON PollForTask'{..}
          = object
              (catMaybes
                 [("hostname" .=) <$> _pftHostname,
                  ("instanceIdentity" .=) <$> _pftInstanceIdentity,
                  Just ("workerGroup" .= _pftWorkerGroup)])

instance ToPath PollForTask where
        toPath = const "/"

instance ToQuery PollForTask where
        toQuery = const mempty

-- | Contains the output of PollForTask.
--
-- /See:/ 'pollForTaskResponse' smart constructor.
data PollForTaskResponse = PollForTaskResponse'
    { _pftrsTaskObject     :: !(Maybe TaskObject)
    , _pftrsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'PollForTaskResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pftrsTaskObject'
--
-- * 'pftrsResponseStatus'
pollForTaskResponse
    :: Int -- ^ 'pftrsResponseStatus'
    -> PollForTaskResponse
pollForTaskResponse pResponseStatus_ =
    PollForTaskResponse'
    { _pftrsTaskObject = Nothing
    , _pftrsResponseStatus = pResponseStatus_
    }

-- | The information needed to complete the task that is being assigned to
-- the task runner. One of the fields returned in this object is 'taskId',
-- which contains an identifier for the task being assigned. The calling
-- task runner uses 'taskId' in subsequent calls to ReportTaskProgress and
-- SetTaskStatus.
pftrsTaskObject :: Lens' PollForTaskResponse (Maybe TaskObject)
pftrsTaskObject = lens _pftrsTaskObject (\ s a -> s{_pftrsTaskObject = a});

-- | The response status code.
pftrsResponseStatus :: Lens' PollForTaskResponse Int
pftrsResponseStatus = lens _pftrsResponseStatus (\ s a -> s{_pftrsResponseStatus = a});
