{-# 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.ECS.CreateService
-- Copyright   : (c) 2013-2021 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Runs and maintains a desired number of tasks from a specified task
-- definition. If the number of tasks running in a service drops below the
-- @desiredCount@, Amazon ECS runs another copy of the task in the
-- specified cluster. To update an existing service, see the UpdateService
-- action.
--
-- In addition to maintaining the desired count of tasks in your service,
-- you can optionally run your service behind one or more load balancers.
-- The load balancers distribute traffic across the tasks that are
-- associated with the service. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html Service Load Balancing>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- Tasks for services that /do not/ use a load balancer are considered
-- healthy if they\'re in the @RUNNING@ state. Tasks for services that /do/
-- use a load balancer are considered healthy if they\'re in the @RUNNING@
-- state and the container instance that they\'re hosted on is reported as
-- healthy by the load balancer.
--
-- There are two service scheduler strategies available:
--
-- -   @REPLICA@ - The replica scheduling strategy places and maintains the
--     desired number of tasks across your cluster. By default, the service
--     scheduler spreads tasks across Availability Zones. You can use task
--     placement strategies and constraints to customize task placement
--     decisions. For more information, see
--     <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html Service Scheduler Concepts>
--     in the /Amazon Elastic Container Service Developer Guide/.
--
-- -   @DAEMON@ - The daemon scheduling strategy deploys exactly one task
--     on each active container instance that meets all of the task
--     placement constraints that you specify in your cluster. The service
--     scheduler also evaluates the task placement constraints for running
--     tasks and will stop tasks that do not meet the placement
--     constraints. When using this strategy, you don\'t need to specify a
--     desired number of tasks, a task placement strategy, or use Service
--     Auto Scaling policies. For more information, see
--     <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html Service Scheduler Concepts>
--     in the /Amazon Elastic Container Service Developer Guide/.
--
-- You can optionally specify a deployment configuration for your service.
-- The deployment is triggered by changing properties, such as the task
-- definition or the desired count of a service, with an UpdateService
-- operation. The default value for a replica service for
-- @minimumHealthyPercent@ is 100%. The default value for a daemon service
-- for @minimumHealthyPercent@ is 0%.
--
-- If a service is using the @ECS@ deployment controller, the minimum
-- healthy percent represents a lower limit on the number of tasks in a
-- service that must remain in the @RUNNING@ state during a deployment, as
-- a percentage of the desired number of tasks (rounded up to the nearest
-- integer), and while any container instances are in the @DRAINING@ state
-- if the service contains tasks using the EC2 launch type. This parameter
-- enables you to deploy without using additional cluster capacity. For
-- example, if your service has a desired number of four tasks and a
-- minimum healthy percent of 50%, the scheduler might stop two existing
-- tasks to free up cluster capacity before starting two new tasks. Tasks
-- for services that /do not/ use a load balancer are considered healthy if
-- they\'re in the @RUNNING@ state. Tasks for services that /do/ use a load
-- balancer are considered healthy if they\'re in the @RUNNING@ state and
-- they\'re reported as healthy by the load balancer. The default value for
-- minimum healthy percent is 100%.
--
-- If a service is using the @ECS@ deployment controller, the __maximum
-- percent__ parameter represents an upper limit on the number of tasks in
-- a service that are allowed in the @RUNNING@ or @PENDING@ state during a
-- deployment, as a percentage of the desired number of tasks (rounded down
-- to the nearest integer), and while any container instances are in the
-- @DRAINING@ state if the service contains tasks using the EC2 launch
-- type. This parameter enables you to define the deployment batch size.
-- For example, if your service has a desired number of four tasks and a
-- maximum percent value of 200%, the scheduler may start four new tasks
-- before stopping the four older tasks (provided that the cluster
-- resources required to do this are available). The default value for
-- maximum percent is 200%.
--
-- If a service is using either the @CODE_DEPLOY@ or @EXTERNAL@ deployment
-- controller types and tasks that use the EC2 launch type, the __minimum
-- healthy percent__ and __maximum percent__ values are used only to define
-- the lower and upper limit on the number of the tasks in the service that
-- remain in the @RUNNING@ state while the container instances are in the
-- @DRAINING@ state. If the tasks in the service use the Fargate launch
-- type, the minimum healthy percent and maximum percent values aren\'t
-- used, although they\'re currently visible when describing your service.
--
-- When creating a service that uses the @EXTERNAL@ deployment controller,
-- you can specify only parameters that aren\'t controlled at the task set
-- level. The only required parameter is the service name. You control your
-- services using the CreateTaskSet operation. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html Amazon ECS Deployment Types>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- When the service scheduler launches new tasks, it determines task
-- placement in your cluster using the following logic:
--
-- -   Determine which of the container instances in your cluster can
--     support your service\'s task definition (for example, they have the
--     required CPU, memory, ports, and container instance attributes).
--
-- -   By default, the service scheduler attempts to balance tasks across
--     Availability Zones in this manner (although you can choose a
--     different placement strategy) with the @placementStrategy@
--     parameter):
--
--     -   Sort the valid container instances, giving priority to instances
--         that have the fewest number of running tasks for this service in
--         their respective Availability Zone. For example, if zone A has
--         one running service task and zones B and C each have zero, valid
--         container instances in either zone B or C are considered optimal
--         for placement.
--
--     -   Place the new service task on a valid container instance in an
--         optimal Availability Zone (based on the previous steps),
--         favoring container instances with the fewest number of running
--         tasks for this service.
module Amazonka.ECS.CreateService
  ( -- * Creating a Request
    CreateService (..),
    newCreateService,

    -- * Request Lenses
    createService_cluster,
    createService_clientToken,
    createService_propagateTags,
    createService_platformVersion,
    createService_enableECSManagedTags,
    createService_desiredCount,
    createService_loadBalancers,
    createService_role,
    createService_placementConstraints,
    createService_placementStrategy,
    createService_deploymentController,
    createService_launchType,
    createService_taskDefinition,
    createService_schedulingStrategy,
    createService_healthCheckGracePeriodSeconds,
    createService_networkConfiguration,
    createService_serviceRegistries,
    createService_capacityProviderStrategy,
    createService_enableExecuteCommand,
    createService_tags,
    createService_deploymentConfiguration,
    createService_serviceName,

    -- * Destructuring the Response
    CreateServiceResponse (..),
    newCreateServiceResponse,

    -- * Response Lenses
    createServiceResponse_service,
    createServiceResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import Amazonka.ECS.Types
import qualified Amazonka.Lens as Lens
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newCreateService' smart constructor.
data CreateService = CreateService'
  { -- | The short name or full Amazon Resource Name (ARN) of the cluster on
    -- which to run your service. If you do not specify a cluster, the default
    -- cluster is assumed.
    CreateService -> Maybe Text
cluster :: Prelude.Maybe Prelude.Text,
    -- | Unique, case-sensitive identifier that you provide to ensure the
    -- idempotency of the request. Up to 32 ASCII characters are allowed.
    CreateService -> Maybe Text
clientToken :: Prelude.Maybe Prelude.Text,
    -- | Specifies whether to propagate the tags from the task definition or the
    -- service to the tasks in the service. If no value is specified, the tags
    -- are not propagated. Tags can only be propagated to the tasks within the
    -- service during service creation. To add tags to a task after service
    -- creation or task creation, use the TagResource API action.
    CreateService -> Maybe PropagateTags
propagateTags :: Prelude.Maybe PropagateTags,
    -- | The platform version that your tasks in the service are running on. A
    -- platform version is specified only for tasks using the Fargate launch
    -- type. If one isn\'t specified, the @LATEST@ platform version is used by
    -- default. For more information, see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html Fargate platform versions>
    -- in the /Amazon Elastic Container Service Developer Guide/.
    CreateService -> Maybe Text
platformVersion :: Prelude.Maybe Prelude.Text,
    -- | Specifies whether to enable Amazon ECS managed tags for the tasks within
    -- the service. For more information, see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html Tagging Your Amazon ECS Resources>
    -- in the /Amazon Elastic Container Service Developer Guide/.
    CreateService -> Maybe Bool
enableECSManagedTags :: Prelude.Maybe Prelude.Bool,
    -- | The number of instantiations of the specified task definition to place
    -- and keep running on your cluster.
    --
    -- This is required if @schedulingStrategy@ is @REPLICA@ or is not
    -- specified. If @schedulingStrategy@ is @DAEMON@ then this is not
    -- required.
    CreateService -> Maybe Int
desiredCount :: Prelude.Maybe Prelude.Int,
    -- | A load balancer object representing the load balancers to use with your
    -- service. For more information, see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html Service Load Balancing>
    -- in the /Amazon Elastic Container Service Developer Guide/.
    --
    -- If the service is using the rolling update (@ECS@) deployment controller
    -- and using either an Application Load Balancer or Network Load Balancer,
    -- you must specify one or more target group ARNs to attach to the service.
    -- The service-linked role is required for services that make use of
    -- multiple target groups. For more information, see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html Using service-linked roles for Amazon ECS>
    -- in the /Amazon Elastic Container Service Developer Guide/.
    --
    -- If the service is using the @CODE_DEPLOY@ deployment controller, the
    -- service is required to use either an Application Load Balancer or
    -- Network Load Balancer. When creating an CodeDeploy deployment group, you
    -- specify two target groups (referred to as a @targetGroupPair@). During a
    -- deployment, CodeDeploy determines which task set in your service has the
    -- status @PRIMARY@ and associates one target group with it, and then
    -- associates the other target group with the replacement task set. The
    -- load balancer can also have up to two listeners: a required listener for
    -- production traffic and an optional listener that allows you perform
    -- validation tests with Lambda functions before routing production traffic
    -- to it.
    --
    -- After you create a service using the @ECS@ deployment controller, the
    -- load balancer name or target group ARN, container name, and container
    -- port specified in the service definition are immutable. If you are using
    -- the @CODE_DEPLOY@ deployment controller, these values can be changed
    -- when updating the service.
    --
    -- For Application Load Balancers and Network Load Balancers, this object
    -- must contain the load balancer target group ARN, the container name (as
    -- it appears in a container definition), and the container port to access
    -- from the load balancer. The load balancer name parameter must be
    -- omitted. When a task from this service is placed on a container
    -- instance, the container instance and port combination is registered as a
    -- target in the target group specified here.
    --
    -- For Classic Load Balancers, this object must contain the load balancer
    -- name, the container name (as it appears in a container definition), and
    -- the container port to access from the load balancer. The target group
    -- ARN parameter must be omitted. When a task from this service is placed
    -- on a container instance, the container instance is registered with the
    -- load balancer specified here.
    --
    -- Services with tasks that use the @awsvpc@ network mode (for example,
    -- those with the Fargate launch type) only support Application Load
    -- Balancers and Network Load Balancers. Classic Load Balancers are not
    -- supported. Also, when you create any target groups for these services,
    -- you must choose @ip@ as the target type, not @instance@, because tasks
    -- that use the @awsvpc@ network mode are associated with an elastic
    -- network interface, not an Amazon EC2 instance.
    CreateService -> Maybe [LoadBalancer]
loadBalancers :: Prelude.Maybe [LoadBalancer],
    -- | The name or full Amazon Resource Name (ARN) of the IAM role that allows
    -- Amazon ECS to make calls to your load balancer on your behalf. This
    -- parameter is only permitted if you are using a load balancer with your
    -- service and your task definition does not use the @awsvpc@ network mode.
    -- If you specify the @role@ parameter, you must also specify a load
    -- balancer object with the @loadBalancers@ parameter.
    --
    -- If your account has already created the Amazon ECS service-linked role,
    -- that role is used by default for your service unless you specify a role
    -- here. The service-linked role is required if your task definition uses
    -- the @awsvpc@ network mode or if the service is configured to use service
    -- discovery, an external deployment controller, multiple target groups, or
    -- Elastic Inference accelerators in which case you should not specify a
    -- role here. For more information, see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html Using service-linked roles for Amazon ECS>
    -- in the /Amazon Elastic Container Service Developer Guide/.
    --
    -- If your specified role has a path other than @\/@, then you must either
    -- specify the full role ARN (this is recommended) or prefix the role name
    -- with the path. For example, if a role with the name @bar@ has a path of
    -- @\/foo\/@ then you would specify @\/foo\/bar@ as the role name. For more
    -- information, see
    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names Friendly names and paths>
    -- in the /IAM User Guide/.
    CreateService -> Maybe Text
role' :: Prelude.Maybe Prelude.Text,
    -- | An array of placement constraint objects to use for tasks in your
    -- service. You can specify a maximum of 10 constraints per task (this
    -- limit includes constraints in the task definition and those specified at
    -- runtime).
    CreateService -> Maybe [PlacementConstraint]
placementConstraints :: Prelude.Maybe [PlacementConstraint],
    -- | The placement strategy objects to use for tasks in your service. You can
    -- specify a maximum of 5 strategy rules per service.
    CreateService -> Maybe [PlacementStrategy]
placementStrategy :: Prelude.Maybe [PlacementStrategy],
    -- | The deployment controller to use for the service. If no deployment
    -- controller is specified, the default value of @ECS@ is used.
    CreateService -> Maybe DeploymentController
deploymentController :: Prelude.Maybe DeploymentController,
    -- | The infrastructure on which to run your service. For more information,
    -- see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html Amazon ECS launch types>
    -- in the /Amazon Elastic Container Service Developer Guide/.
    --
    -- The @FARGATE@ launch type runs your tasks on Fargate On-Demand
    -- infrastructure.
    --
    -- Fargate Spot infrastructure is available for use but a capacity provider
    -- strategy must be used. For more information, see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/userguide/fargate-capacity-providers.html Fargate capacity providers>
    -- in the /Amazon ECS User Guide for Fargate/.
    --
    -- The @EC2@ launch type runs your tasks on Amazon EC2 instances registered
    -- to your cluster.
    --
    -- The @EXTERNAL@ launch type runs your tasks on your on-premise server or
    -- virtual machine (VM) capacity registered to your cluster.
    --
    -- A service can use either a launch type or a capacity provider strategy.
    -- If a @launchType@ is specified, the @capacityProviderStrategy@ parameter
    -- must be omitted.
    CreateService -> Maybe LaunchType
launchType :: Prelude.Maybe LaunchType,
    -- | The @family@ and @revision@ (@family:revision@) or full ARN of the task
    -- definition to run in your service. If a @revision@ is not specified, the
    -- latest @ACTIVE@ revision is used.
    --
    -- A task definition must be specified if the service is using either the
    -- @ECS@ or @CODE_DEPLOY@ deployment controllers.
    CreateService -> Maybe Text
taskDefinition :: Prelude.Maybe Prelude.Text,
    -- | The scheduling strategy to use for the service. For more information,
    -- see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html Services>.
    --
    -- There are two service scheduler strategies available:
    --
    -- -   @REPLICA@-The replica scheduling strategy places and maintains the
    --     desired number of tasks across your cluster. By default, the service
    --     scheduler spreads tasks across Availability Zones. You can use task
    --     placement strategies and constraints to customize task placement
    --     decisions. This scheduler strategy is required if the service is
    --     using the @CODE_DEPLOY@ or @EXTERNAL@ deployment controller types.
    --
    -- -   @DAEMON@-The daemon scheduling strategy deploys exactly one task on
    --     each active container instance that meets all of the task placement
    --     constraints that you specify in your cluster. The service scheduler
    --     also evaluates the task placement constraints for running tasks and
    --     will stop tasks that do not meet the placement constraints. When
    --     you\'re using this strategy, you don\'t need to specify a desired
    --     number of tasks, a task placement strategy, or use Service Auto
    --     Scaling policies.
    --
    --     Tasks using the Fargate launch type or the @CODE_DEPLOY@ or
    --     @EXTERNAL@ deployment controller types don\'t support the @DAEMON@
    --     scheduling strategy.
    CreateService -> Maybe SchedulingStrategy
schedulingStrategy :: Prelude.Maybe SchedulingStrategy,
    -- | The period of time, in seconds, that the Amazon ECS service scheduler
    -- should ignore unhealthy Elastic Load Balancing target health checks
    -- after a task has first started. This is only used when your service is
    -- configured to use a load balancer. If your service has a load balancer
    -- defined and you don\'t specify a health check grace period value, the
    -- default value of @0@ is used.
    --
    -- If your service\'s tasks take a while to start and respond to Elastic
    -- Load Balancing health checks, you can specify a health check grace
    -- period of up to 2,147,483,647 seconds. During that time, the Amazon ECS
    -- service scheduler ignores health check status. This grace period can
    -- prevent the service scheduler from marking tasks as unhealthy and
    -- stopping them before they have time to come up.
    CreateService -> Maybe Int
healthCheckGracePeriodSeconds :: Prelude.Maybe Prelude.Int,
    -- | The network configuration for the service. This parameter is required
    -- for task definitions that use the @awsvpc@ network mode to receive their
    -- own elastic network interface, and it is not supported for other network
    -- modes. For more information, see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html Task networking>
    -- in the /Amazon Elastic Container Service Developer Guide/.
    CreateService -> Maybe NetworkConfiguration
networkConfiguration :: Prelude.Maybe NetworkConfiguration,
    -- | The details of the service discovery registry to associate with this
    -- service. For more information, see
    -- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html Service discovery>.
    --
    -- Each service may be associated with one service registry. Multiple
    -- service registries per service isn\'t supported.
    CreateService -> Maybe [ServiceRegistry]
serviceRegistries :: Prelude.Maybe [ServiceRegistry],
    -- | The capacity provider strategy to use for the service.
    --
    -- If a @capacityProviderStrategy@ is specified, the @launchType@ parameter
    -- must be omitted. If no @capacityProviderStrategy@ or @launchType@ is
    -- specified, the @defaultCapacityProviderStrategy@ for the cluster is
    -- used.
    --
    -- A capacity provider strategy may contain a maximum of 6 capacity
    -- providers.
    CreateService -> Maybe [CapacityProviderStrategyItem]
capacityProviderStrategy :: Prelude.Maybe [CapacityProviderStrategyItem],
    -- | Whether or not the execute command functionality is enabled for the
    -- service. If @true@, this enables execute command functionality on all
    -- containers in the service tasks.
    CreateService -> Maybe Bool
enableExecuteCommand :: Prelude.Maybe Prelude.Bool,
    -- | The metadata that you apply to the service to help you categorize and
    -- organize them. Each tag consists of a key and an optional value, both of
    -- which you define. When a service is deleted, the tags are deleted as
    -- well.
    --
    -- The following basic restrictions apply to tags:
    --
    -- -   Maximum number of tags per resource - 50
    --
    -- -   For each resource, each tag key must be unique, and each tag key can
    --     have only one value.
    --
    -- -   Maximum key length - 128 Unicode characters in UTF-8
    --
    -- -   Maximum value length - 256 Unicode characters in UTF-8
    --
    -- -   If your tagging schema is used across multiple services and
    --     resources, remember that other services may have restrictions on
    --     allowed characters. Generally allowed characters are: letters,
    --     numbers, and spaces representable in UTF-8, and the following
    --     characters: + - = . _ : \/ \@.
    --
    -- -   Tag keys and values are case-sensitive.
    --
    -- -   Do not use @aws:@, @AWS:@, or any upper or lowercase combination of
    --     such as a prefix for either keys or values as it is reserved for
    --     Amazon Web Services use. You cannot edit or delete tag keys or
    --     values with this prefix. Tags with this prefix do not count against
    --     your tags per resource limit.
    CreateService -> Maybe [Tag]
tags :: Prelude.Maybe [Tag],
    -- | Optional deployment parameters that control how many tasks run during
    -- the deployment and the ordering of stopping and starting tasks.
    CreateService -> Maybe DeploymentConfiguration
deploymentConfiguration :: Prelude.Maybe DeploymentConfiguration,
    -- | The name of your service. Up to 255 letters (uppercase and lowercase),
    -- numbers, underscores, and hyphens are allowed. Service names must be
    -- unique within a cluster, but you can have similarly named services in
    -- multiple clusters within a Region or across multiple Regions.
    CreateService -> Text
serviceName :: Prelude.Text
  }
  deriving (CreateService -> CreateService -> Bool
(CreateService -> CreateService -> Bool)
-> (CreateService -> CreateService -> Bool) -> Eq CreateService
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateService -> CreateService -> Bool
$c/= :: CreateService -> CreateService -> Bool
== :: CreateService -> CreateService -> Bool
$c== :: CreateService -> CreateService -> Bool
Prelude.Eq, ReadPrec [CreateService]
ReadPrec CreateService
Int -> ReadS CreateService
ReadS [CreateService]
(Int -> ReadS CreateService)
-> ReadS [CreateService]
-> ReadPrec CreateService
-> ReadPrec [CreateService]
-> Read CreateService
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateService]
$creadListPrec :: ReadPrec [CreateService]
readPrec :: ReadPrec CreateService
$creadPrec :: ReadPrec CreateService
readList :: ReadS [CreateService]
$creadList :: ReadS [CreateService]
readsPrec :: Int -> ReadS CreateService
$creadsPrec :: Int -> ReadS CreateService
Prelude.Read, Int -> CreateService -> ShowS
[CreateService] -> ShowS
CreateService -> String
(Int -> CreateService -> ShowS)
-> (CreateService -> String)
-> ([CreateService] -> ShowS)
-> Show CreateService
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateService] -> ShowS
$cshowList :: [CreateService] -> ShowS
show :: CreateService -> String
$cshow :: CreateService -> String
showsPrec :: Int -> CreateService -> ShowS
$cshowsPrec :: Int -> CreateService -> ShowS
Prelude.Show, (forall x. CreateService -> Rep CreateService x)
-> (forall x. Rep CreateService x -> CreateService)
-> Generic CreateService
forall x. Rep CreateService x -> CreateService
forall x. CreateService -> Rep CreateService x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateService x -> CreateService
$cfrom :: forall x. CreateService -> Rep CreateService x
Prelude.Generic)

-- |
-- Create a value of 'CreateService' 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:
--
-- 'cluster', 'createService_cluster' - The short name or full Amazon Resource Name (ARN) of the cluster on
-- which to run your service. If you do not specify a cluster, the default
-- cluster is assumed.
--
-- 'clientToken', 'createService_clientToken' - Unique, case-sensitive identifier that you provide to ensure the
-- idempotency of the request. Up to 32 ASCII characters are allowed.
--
-- 'propagateTags', 'createService_propagateTags' - Specifies whether to propagate the tags from the task definition or the
-- service to the tasks in the service. If no value is specified, the tags
-- are not propagated. Tags can only be propagated to the tasks within the
-- service during service creation. To add tags to a task after service
-- creation or task creation, use the TagResource API action.
--
-- 'platformVersion', 'createService_platformVersion' - The platform version that your tasks in the service are running on. A
-- platform version is specified only for tasks using the Fargate launch
-- type. If one isn\'t specified, the @LATEST@ platform version is used by
-- default. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html Fargate platform versions>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- 'enableECSManagedTags', 'createService_enableECSManagedTags' - Specifies whether to enable Amazon ECS managed tags for the tasks within
-- the service. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html Tagging Your Amazon ECS Resources>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- 'desiredCount', 'createService_desiredCount' - The number of instantiations of the specified task definition to place
-- and keep running on your cluster.
--
-- This is required if @schedulingStrategy@ is @REPLICA@ or is not
-- specified. If @schedulingStrategy@ is @DAEMON@ then this is not
-- required.
--
-- 'loadBalancers', 'createService_loadBalancers' - A load balancer object representing the load balancers to use with your
-- service. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html Service Load Balancing>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- If the service is using the rolling update (@ECS@) deployment controller
-- and using either an Application Load Balancer or Network Load Balancer,
-- you must specify one or more target group ARNs to attach to the service.
-- The service-linked role is required for services that make use of
-- multiple target groups. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html Using service-linked roles for Amazon ECS>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- If the service is using the @CODE_DEPLOY@ deployment controller, the
-- service is required to use either an Application Load Balancer or
-- Network Load Balancer. When creating an CodeDeploy deployment group, you
-- specify two target groups (referred to as a @targetGroupPair@). During a
-- deployment, CodeDeploy determines which task set in your service has the
-- status @PRIMARY@ and associates one target group with it, and then
-- associates the other target group with the replacement task set. The
-- load balancer can also have up to two listeners: a required listener for
-- production traffic and an optional listener that allows you perform
-- validation tests with Lambda functions before routing production traffic
-- to it.
--
-- After you create a service using the @ECS@ deployment controller, the
-- load balancer name or target group ARN, container name, and container
-- port specified in the service definition are immutable. If you are using
-- the @CODE_DEPLOY@ deployment controller, these values can be changed
-- when updating the service.
--
-- For Application Load Balancers and Network Load Balancers, this object
-- must contain the load balancer target group ARN, the container name (as
-- it appears in a container definition), and the container port to access
-- from the load balancer. The load balancer name parameter must be
-- omitted. When a task from this service is placed on a container
-- instance, the container instance and port combination is registered as a
-- target in the target group specified here.
--
-- For Classic Load Balancers, this object must contain the load balancer
-- name, the container name (as it appears in a container definition), and
-- the container port to access from the load balancer. The target group
-- ARN parameter must be omitted. When a task from this service is placed
-- on a container instance, the container instance is registered with the
-- load balancer specified here.
--
-- Services with tasks that use the @awsvpc@ network mode (for example,
-- those with the Fargate launch type) only support Application Load
-- Balancers and Network Load Balancers. Classic Load Balancers are not
-- supported. Also, when you create any target groups for these services,
-- you must choose @ip@ as the target type, not @instance@, because tasks
-- that use the @awsvpc@ network mode are associated with an elastic
-- network interface, not an Amazon EC2 instance.
--
-- 'role'', 'createService_role' - The name or full Amazon Resource Name (ARN) of the IAM role that allows
-- Amazon ECS to make calls to your load balancer on your behalf. This
-- parameter is only permitted if you are using a load balancer with your
-- service and your task definition does not use the @awsvpc@ network mode.
-- If you specify the @role@ parameter, you must also specify a load
-- balancer object with the @loadBalancers@ parameter.
--
-- If your account has already created the Amazon ECS service-linked role,
-- that role is used by default for your service unless you specify a role
-- here. The service-linked role is required if your task definition uses
-- the @awsvpc@ network mode or if the service is configured to use service
-- discovery, an external deployment controller, multiple target groups, or
-- Elastic Inference accelerators in which case you should not specify a
-- role here. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html Using service-linked roles for Amazon ECS>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- If your specified role has a path other than @\/@, then you must either
-- specify the full role ARN (this is recommended) or prefix the role name
-- with the path. For example, if a role with the name @bar@ has a path of
-- @\/foo\/@ then you would specify @\/foo\/bar@ as the role name. For more
-- information, see
-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names Friendly names and paths>
-- in the /IAM User Guide/.
--
-- 'placementConstraints', 'createService_placementConstraints' - An array of placement constraint objects to use for tasks in your
-- service. You can specify a maximum of 10 constraints per task (this
-- limit includes constraints in the task definition and those specified at
-- runtime).
--
-- 'placementStrategy', 'createService_placementStrategy' - The placement strategy objects to use for tasks in your service. You can
-- specify a maximum of 5 strategy rules per service.
--
-- 'deploymentController', 'createService_deploymentController' - The deployment controller to use for the service. If no deployment
-- controller is specified, the default value of @ECS@ is used.
--
-- 'launchType', 'createService_launchType' - The infrastructure on which to run your service. For more information,
-- see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html Amazon ECS launch types>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- The @FARGATE@ launch type runs your tasks on Fargate On-Demand
-- infrastructure.
--
-- Fargate Spot infrastructure is available for use but a capacity provider
-- strategy must be used. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/userguide/fargate-capacity-providers.html Fargate capacity providers>
-- in the /Amazon ECS User Guide for Fargate/.
--
-- The @EC2@ launch type runs your tasks on Amazon EC2 instances registered
-- to your cluster.
--
-- The @EXTERNAL@ launch type runs your tasks on your on-premise server or
-- virtual machine (VM) capacity registered to your cluster.
--
-- A service can use either a launch type or a capacity provider strategy.
-- If a @launchType@ is specified, the @capacityProviderStrategy@ parameter
-- must be omitted.
--
-- 'taskDefinition', 'createService_taskDefinition' - The @family@ and @revision@ (@family:revision@) or full ARN of the task
-- definition to run in your service. If a @revision@ is not specified, the
-- latest @ACTIVE@ revision is used.
--
-- A task definition must be specified if the service is using either the
-- @ECS@ or @CODE_DEPLOY@ deployment controllers.
--
-- 'schedulingStrategy', 'createService_schedulingStrategy' - The scheduling strategy to use for the service. For more information,
-- see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html Services>.
--
-- There are two service scheduler strategies available:
--
-- -   @REPLICA@-The replica scheduling strategy places and maintains the
--     desired number of tasks across your cluster. By default, the service
--     scheduler spreads tasks across Availability Zones. You can use task
--     placement strategies and constraints to customize task placement
--     decisions. This scheduler strategy is required if the service is
--     using the @CODE_DEPLOY@ or @EXTERNAL@ deployment controller types.
--
-- -   @DAEMON@-The daemon scheduling strategy deploys exactly one task on
--     each active container instance that meets all of the task placement
--     constraints that you specify in your cluster. The service scheduler
--     also evaluates the task placement constraints for running tasks and
--     will stop tasks that do not meet the placement constraints. When
--     you\'re using this strategy, you don\'t need to specify a desired
--     number of tasks, a task placement strategy, or use Service Auto
--     Scaling policies.
--
--     Tasks using the Fargate launch type or the @CODE_DEPLOY@ or
--     @EXTERNAL@ deployment controller types don\'t support the @DAEMON@
--     scheduling strategy.
--
-- 'healthCheckGracePeriodSeconds', 'createService_healthCheckGracePeriodSeconds' - The period of time, in seconds, that the Amazon ECS service scheduler
-- should ignore unhealthy Elastic Load Balancing target health checks
-- after a task has first started. This is only used when your service is
-- configured to use a load balancer. If your service has a load balancer
-- defined and you don\'t specify a health check grace period value, the
-- default value of @0@ is used.
--
-- If your service\'s tasks take a while to start and respond to Elastic
-- Load Balancing health checks, you can specify a health check grace
-- period of up to 2,147,483,647 seconds. During that time, the Amazon ECS
-- service scheduler ignores health check status. This grace period can
-- prevent the service scheduler from marking tasks as unhealthy and
-- stopping them before they have time to come up.
--
-- 'networkConfiguration', 'createService_networkConfiguration' - The network configuration for the service. This parameter is required
-- for task definitions that use the @awsvpc@ network mode to receive their
-- own elastic network interface, and it is not supported for other network
-- modes. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html Task networking>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- 'serviceRegistries', 'createService_serviceRegistries' - The details of the service discovery registry to associate with this
-- service. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html Service discovery>.
--
-- Each service may be associated with one service registry. Multiple
-- service registries per service isn\'t supported.
--
-- 'capacityProviderStrategy', 'createService_capacityProviderStrategy' - The capacity provider strategy to use for the service.
--
-- If a @capacityProviderStrategy@ is specified, the @launchType@ parameter
-- must be omitted. If no @capacityProviderStrategy@ or @launchType@ is
-- specified, the @defaultCapacityProviderStrategy@ for the cluster is
-- used.
--
-- A capacity provider strategy may contain a maximum of 6 capacity
-- providers.
--
-- 'enableExecuteCommand', 'createService_enableExecuteCommand' - Whether or not the execute command functionality is enabled for the
-- service. If @true@, this enables execute command functionality on all
-- containers in the service tasks.
--
-- 'tags', 'createService_tags' - The metadata that you apply to the service to help you categorize and
-- organize them. Each tag consists of a key and an optional value, both of
-- which you define. When a service is deleted, the tags are deleted as
-- well.
--
-- The following basic restrictions apply to tags:
--
-- -   Maximum number of tags per resource - 50
--
-- -   For each resource, each tag key must be unique, and each tag key can
--     have only one value.
--
-- -   Maximum key length - 128 Unicode characters in UTF-8
--
-- -   Maximum value length - 256 Unicode characters in UTF-8
--
-- -   If your tagging schema is used across multiple services and
--     resources, remember that other services may have restrictions on
--     allowed characters. Generally allowed characters are: letters,
--     numbers, and spaces representable in UTF-8, and the following
--     characters: + - = . _ : \/ \@.
--
-- -   Tag keys and values are case-sensitive.
--
-- -   Do not use @aws:@, @AWS:@, or any upper or lowercase combination of
--     such as a prefix for either keys or values as it is reserved for
--     Amazon Web Services use. You cannot edit or delete tag keys or
--     values with this prefix. Tags with this prefix do not count against
--     your tags per resource limit.
--
-- 'deploymentConfiguration', 'createService_deploymentConfiguration' - Optional deployment parameters that control how many tasks run during
-- the deployment and the ordering of stopping and starting tasks.
--
-- 'serviceName', 'createService_serviceName' - The name of your service. Up to 255 letters (uppercase and lowercase),
-- numbers, underscores, and hyphens are allowed. Service names must be
-- unique within a cluster, but you can have similarly named services in
-- multiple clusters within a Region or across multiple Regions.
newCreateService ::
  -- | 'serviceName'
  Prelude.Text ->
  CreateService
newCreateService :: Text -> CreateService
newCreateService Text
pServiceName_ =
  CreateService' :: Maybe Text
-> Maybe Text
-> Maybe PropagateTags
-> Maybe Text
-> Maybe Bool
-> Maybe Int
-> Maybe [LoadBalancer]
-> Maybe Text
-> Maybe [PlacementConstraint]
-> Maybe [PlacementStrategy]
-> Maybe DeploymentController
-> Maybe LaunchType
-> Maybe Text
-> Maybe SchedulingStrategy
-> Maybe Int
-> Maybe NetworkConfiguration
-> Maybe [ServiceRegistry]
-> Maybe [CapacityProviderStrategyItem]
-> Maybe Bool
-> Maybe [Tag]
-> Maybe DeploymentConfiguration
-> Text
-> CreateService
CreateService'
    { $sel:cluster:CreateService' :: Maybe Text
cluster = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:clientToken:CreateService' :: Maybe Text
clientToken = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:propagateTags:CreateService' :: Maybe PropagateTags
propagateTags = Maybe PropagateTags
forall a. Maybe a
Prelude.Nothing,
      $sel:platformVersion:CreateService' :: Maybe Text
platformVersion = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:enableECSManagedTags:CreateService' :: Maybe Bool
enableECSManagedTags = Maybe Bool
forall a. Maybe a
Prelude.Nothing,
      $sel:desiredCount:CreateService' :: Maybe Int
desiredCount = Maybe Int
forall a. Maybe a
Prelude.Nothing,
      $sel:loadBalancers:CreateService' :: Maybe [LoadBalancer]
loadBalancers = Maybe [LoadBalancer]
forall a. Maybe a
Prelude.Nothing,
      $sel:role':CreateService' :: Maybe Text
role' = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:placementConstraints:CreateService' :: Maybe [PlacementConstraint]
placementConstraints = Maybe [PlacementConstraint]
forall a. Maybe a
Prelude.Nothing,
      $sel:placementStrategy:CreateService' :: Maybe [PlacementStrategy]
placementStrategy = Maybe [PlacementStrategy]
forall a. Maybe a
Prelude.Nothing,
      $sel:deploymentController:CreateService' :: Maybe DeploymentController
deploymentController = Maybe DeploymentController
forall a. Maybe a
Prelude.Nothing,
      $sel:launchType:CreateService' :: Maybe LaunchType
launchType = Maybe LaunchType
forall a. Maybe a
Prelude.Nothing,
      $sel:taskDefinition:CreateService' :: Maybe Text
taskDefinition = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:schedulingStrategy:CreateService' :: Maybe SchedulingStrategy
schedulingStrategy = Maybe SchedulingStrategy
forall a. Maybe a
Prelude.Nothing,
      $sel:healthCheckGracePeriodSeconds:CreateService' :: Maybe Int
healthCheckGracePeriodSeconds = Maybe Int
forall a. Maybe a
Prelude.Nothing,
      $sel:networkConfiguration:CreateService' :: Maybe NetworkConfiguration
networkConfiguration = Maybe NetworkConfiguration
forall a. Maybe a
Prelude.Nothing,
      $sel:serviceRegistries:CreateService' :: Maybe [ServiceRegistry]
serviceRegistries = Maybe [ServiceRegistry]
forall a. Maybe a
Prelude.Nothing,
      $sel:capacityProviderStrategy:CreateService' :: Maybe [CapacityProviderStrategyItem]
capacityProviderStrategy = Maybe [CapacityProviderStrategyItem]
forall a. Maybe a
Prelude.Nothing,
      $sel:enableExecuteCommand:CreateService' :: Maybe Bool
enableExecuteCommand = Maybe Bool
forall a. Maybe a
Prelude.Nothing,
      $sel:tags:CreateService' :: Maybe [Tag]
tags = Maybe [Tag]
forall a. Maybe a
Prelude.Nothing,
      $sel:deploymentConfiguration:CreateService' :: Maybe DeploymentConfiguration
deploymentConfiguration = Maybe DeploymentConfiguration
forall a. Maybe a
Prelude.Nothing,
      $sel:serviceName:CreateService' :: Text
serviceName = Text
pServiceName_
    }

-- | The short name or full Amazon Resource Name (ARN) of the cluster on
-- which to run your service. If you do not specify a cluster, the default
-- cluster is assumed.
createService_cluster :: Lens.Lens' CreateService (Prelude.Maybe Prelude.Text)
createService_cluster :: (Maybe Text -> f (Maybe Text)) -> CreateService -> f CreateService
createService_cluster = (CreateService -> Maybe Text)
-> (CreateService -> Maybe Text -> CreateService)
-> Lens CreateService CreateService (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe Text
cluster :: Maybe Text
$sel:cluster:CreateService' :: CreateService -> Maybe Text
cluster} -> Maybe Text
cluster) (\s :: CreateService
s@CreateService' {} Maybe Text
a -> CreateService
s {$sel:cluster:CreateService' :: Maybe Text
cluster = Maybe Text
a} :: CreateService)

-- | Unique, case-sensitive identifier that you provide to ensure the
-- idempotency of the request. Up to 32 ASCII characters are allowed.
createService_clientToken :: Lens.Lens' CreateService (Prelude.Maybe Prelude.Text)
createService_clientToken :: (Maybe Text -> f (Maybe Text)) -> CreateService -> f CreateService
createService_clientToken = (CreateService -> Maybe Text)
-> (CreateService -> Maybe Text -> CreateService)
-> Lens CreateService CreateService (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe Text
clientToken :: Maybe Text
$sel:clientToken:CreateService' :: CreateService -> Maybe Text
clientToken} -> Maybe Text
clientToken) (\s :: CreateService
s@CreateService' {} Maybe Text
a -> CreateService
s {$sel:clientToken:CreateService' :: Maybe Text
clientToken = Maybe Text
a} :: CreateService)

-- | Specifies whether to propagate the tags from the task definition or the
-- service to the tasks in the service. If no value is specified, the tags
-- are not propagated. Tags can only be propagated to the tasks within the
-- service during service creation. To add tags to a task after service
-- creation or task creation, use the TagResource API action.
createService_propagateTags :: Lens.Lens' CreateService (Prelude.Maybe PropagateTags)
createService_propagateTags :: (Maybe PropagateTags -> f (Maybe PropagateTags))
-> CreateService -> f CreateService
createService_propagateTags = (CreateService -> Maybe PropagateTags)
-> (CreateService -> Maybe PropagateTags -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe PropagateTags)
     (Maybe PropagateTags)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe PropagateTags
propagateTags :: Maybe PropagateTags
$sel:propagateTags:CreateService' :: CreateService -> Maybe PropagateTags
propagateTags} -> Maybe PropagateTags
propagateTags) (\s :: CreateService
s@CreateService' {} Maybe PropagateTags
a -> CreateService
s {$sel:propagateTags:CreateService' :: Maybe PropagateTags
propagateTags = Maybe PropagateTags
a} :: CreateService)

-- | The platform version that your tasks in the service are running on. A
-- platform version is specified only for tasks using the Fargate launch
-- type. If one isn\'t specified, the @LATEST@ platform version is used by
-- default. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html Fargate platform versions>
-- in the /Amazon Elastic Container Service Developer Guide/.
createService_platformVersion :: Lens.Lens' CreateService (Prelude.Maybe Prelude.Text)
createService_platformVersion :: (Maybe Text -> f (Maybe Text)) -> CreateService -> f CreateService
createService_platformVersion = (CreateService -> Maybe Text)
-> (CreateService -> Maybe Text -> CreateService)
-> Lens CreateService CreateService (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe Text
platformVersion :: Maybe Text
$sel:platformVersion:CreateService' :: CreateService -> Maybe Text
platformVersion} -> Maybe Text
platformVersion) (\s :: CreateService
s@CreateService' {} Maybe Text
a -> CreateService
s {$sel:platformVersion:CreateService' :: Maybe Text
platformVersion = Maybe Text
a} :: CreateService)

-- | Specifies whether to enable Amazon ECS managed tags for the tasks within
-- the service. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html Tagging Your Amazon ECS Resources>
-- in the /Amazon Elastic Container Service Developer Guide/.
createService_enableECSManagedTags :: Lens.Lens' CreateService (Prelude.Maybe Prelude.Bool)
createService_enableECSManagedTags :: (Maybe Bool -> f (Maybe Bool)) -> CreateService -> f CreateService
createService_enableECSManagedTags = (CreateService -> Maybe Bool)
-> (CreateService -> Maybe Bool -> CreateService)
-> Lens CreateService CreateService (Maybe Bool) (Maybe Bool)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe Bool
enableECSManagedTags :: Maybe Bool
$sel:enableECSManagedTags:CreateService' :: CreateService -> Maybe Bool
enableECSManagedTags} -> Maybe Bool
enableECSManagedTags) (\s :: CreateService
s@CreateService' {} Maybe Bool
a -> CreateService
s {$sel:enableECSManagedTags:CreateService' :: Maybe Bool
enableECSManagedTags = Maybe Bool
a} :: CreateService)

-- | The number of instantiations of the specified task definition to place
-- and keep running on your cluster.
--
-- This is required if @schedulingStrategy@ is @REPLICA@ or is not
-- specified. If @schedulingStrategy@ is @DAEMON@ then this is not
-- required.
createService_desiredCount :: Lens.Lens' CreateService (Prelude.Maybe Prelude.Int)
createService_desiredCount :: (Maybe Int -> f (Maybe Int)) -> CreateService -> f CreateService
createService_desiredCount = (CreateService -> Maybe Int)
-> (CreateService -> Maybe Int -> CreateService)
-> Lens CreateService CreateService (Maybe Int) (Maybe Int)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe Int
desiredCount :: Maybe Int
$sel:desiredCount:CreateService' :: CreateService -> Maybe Int
desiredCount} -> Maybe Int
desiredCount) (\s :: CreateService
s@CreateService' {} Maybe Int
a -> CreateService
s {$sel:desiredCount:CreateService' :: Maybe Int
desiredCount = Maybe Int
a} :: CreateService)

-- | A load balancer object representing the load balancers to use with your
-- service. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html Service Load Balancing>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- If the service is using the rolling update (@ECS@) deployment controller
-- and using either an Application Load Balancer or Network Load Balancer,
-- you must specify one or more target group ARNs to attach to the service.
-- The service-linked role is required for services that make use of
-- multiple target groups. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html Using service-linked roles for Amazon ECS>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- If the service is using the @CODE_DEPLOY@ deployment controller, the
-- service is required to use either an Application Load Balancer or
-- Network Load Balancer. When creating an CodeDeploy deployment group, you
-- specify two target groups (referred to as a @targetGroupPair@). During a
-- deployment, CodeDeploy determines which task set in your service has the
-- status @PRIMARY@ and associates one target group with it, and then
-- associates the other target group with the replacement task set. The
-- load balancer can also have up to two listeners: a required listener for
-- production traffic and an optional listener that allows you perform
-- validation tests with Lambda functions before routing production traffic
-- to it.
--
-- After you create a service using the @ECS@ deployment controller, the
-- load balancer name or target group ARN, container name, and container
-- port specified in the service definition are immutable. If you are using
-- the @CODE_DEPLOY@ deployment controller, these values can be changed
-- when updating the service.
--
-- For Application Load Balancers and Network Load Balancers, this object
-- must contain the load balancer target group ARN, the container name (as
-- it appears in a container definition), and the container port to access
-- from the load balancer. The load balancer name parameter must be
-- omitted. When a task from this service is placed on a container
-- instance, the container instance and port combination is registered as a
-- target in the target group specified here.
--
-- For Classic Load Balancers, this object must contain the load balancer
-- name, the container name (as it appears in a container definition), and
-- the container port to access from the load balancer. The target group
-- ARN parameter must be omitted. When a task from this service is placed
-- on a container instance, the container instance is registered with the
-- load balancer specified here.
--
-- Services with tasks that use the @awsvpc@ network mode (for example,
-- those with the Fargate launch type) only support Application Load
-- Balancers and Network Load Balancers. Classic Load Balancers are not
-- supported. Also, when you create any target groups for these services,
-- you must choose @ip@ as the target type, not @instance@, because tasks
-- that use the @awsvpc@ network mode are associated with an elastic
-- network interface, not an Amazon EC2 instance.
createService_loadBalancers :: Lens.Lens' CreateService (Prelude.Maybe [LoadBalancer])
createService_loadBalancers :: (Maybe [LoadBalancer] -> f (Maybe [LoadBalancer]))
-> CreateService -> f CreateService
createService_loadBalancers = (CreateService -> Maybe [LoadBalancer])
-> (CreateService -> Maybe [LoadBalancer] -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe [LoadBalancer])
     (Maybe [LoadBalancer])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe [LoadBalancer]
loadBalancers :: Maybe [LoadBalancer]
$sel:loadBalancers:CreateService' :: CreateService -> Maybe [LoadBalancer]
loadBalancers} -> Maybe [LoadBalancer]
loadBalancers) (\s :: CreateService
s@CreateService' {} Maybe [LoadBalancer]
a -> CreateService
s {$sel:loadBalancers:CreateService' :: Maybe [LoadBalancer]
loadBalancers = Maybe [LoadBalancer]
a} :: CreateService) ((Maybe [LoadBalancer] -> f (Maybe [LoadBalancer]))
 -> CreateService -> f CreateService)
-> ((Maybe [LoadBalancer] -> f (Maybe [LoadBalancer]))
    -> Maybe [LoadBalancer] -> f (Maybe [LoadBalancer]))
-> (Maybe [LoadBalancer] -> f (Maybe [LoadBalancer]))
-> CreateService
-> f CreateService
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso [LoadBalancer] [LoadBalancer] [LoadBalancer] [LoadBalancer]
-> Iso
     (Maybe [LoadBalancer])
     (Maybe [LoadBalancer])
     (Maybe [LoadBalancer])
     (Maybe [LoadBalancer])
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso [LoadBalancer] [LoadBalancer] [LoadBalancer] [LoadBalancer]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The name or full Amazon Resource Name (ARN) of the IAM role that allows
-- Amazon ECS to make calls to your load balancer on your behalf. This
-- parameter is only permitted if you are using a load balancer with your
-- service and your task definition does not use the @awsvpc@ network mode.
-- If you specify the @role@ parameter, you must also specify a load
-- balancer object with the @loadBalancers@ parameter.
--
-- If your account has already created the Amazon ECS service-linked role,
-- that role is used by default for your service unless you specify a role
-- here. The service-linked role is required if your task definition uses
-- the @awsvpc@ network mode or if the service is configured to use service
-- discovery, an external deployment controller, multiple target groups, or
-- Elastic Inference accelerators in which case you should not specify a
-- role here. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html Using service-linked roles for Amazon ECS>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- If your specified role has a path other than @\/@, then you must either
-- specify the full role ARN (this is recommended) or prefix the role name
-- with the path. For example, if a role with the name @bar@ has a path of
-- @\/foo\/@ then you would specify @\/foo\/bar@ as the role name. For more
-- information, see
-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names Friendly names and paths>
-- in the /IAM User Guide/.
createService_role :: Lens.Lens' CreateService (Prelude.Maybe Prelude.Text)
createService_role :: (Maybe Text -> f (Maybe Text)) -> CreateService -> f CreateService
createService_role = (CreateService -> Maybe Text)
-> (CreateService -> Maybe Text -> CreateService)
-> Lens CreateService CreateService (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe Text
role' :: Maybe Text
$sel:role':CreateService' :: CreateService -> Maybe Text
role'} -> Maybe Text
role') (\s :: CreateService
s@CreateService' {} Maybe Text
a -> CreateService
s {$sel:role':CreateService' :: Maybe Text
role' = Maybe Text
a} :: CreateService)

-- | An array of placement constraint objects to use for tasks in your
-- service. You can specify a maximum of 10 constraints per task (this
-- limit includes constraints in the task definition and those specified at
-- runtime).
createService_placementConstraints :: Lens.Lens' CreateService (Prelude.Maybe [PlacementConstraint])
createService_placementConstraints :: (Maybe [PlacementConstraint] -> f (Maybe [PlacementConstraint]))
-> CreateService -> f CreateService
createService_placementConstraints = (CreateService -> Maybe [PlacementConstraint])
-> (CreateService -> Maybe [PlacementConstraint] -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe [PlacementConstraint])
     (Maybe [PlacementConstraint])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe [PlacementConstraint]
placementConstraints :: Maybe [PlacementConstraint]
$sel:placementConstraints:CreateService' :: CreateService -> Maybe [PlacementConstraint]
placementConstraints} -> Maybe [PlacementConstraint]
placementConstraints) (\s :: CreateService
s@CreateService' {} Maybe [PlacementConstraint]
a -> CreateService
s {$sel:placementConstraints:CreateService' :: Maybe [PlacementConstraint]
placementConstraints = Maybe [PlacementConstraint]
a} :: CreateService) ((Maybe [PlacementConstraint] -> f (Maybe [PlacementConstraint]))
 -> CreateService -> f CreateService)
-> ((Maybe [PlacementConstraint]
     -> f (Maybe [PlacementConstraint]))
    -> Maybe [PlacementConstraint] -> f (Maybe [PlacementConstraint]))
-> (Maybe [PlacementConstraint] -> f (Maybe [PlacementConstraint]))
-> CreateService
-> f CreateService
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso
  [PlacementConstraint]
  [PlacementConstraint]
  [PlacementConstraint]
  [PlacementConstraint]
-> Iso
     (Maybe [PlacementConstraint])
     (Maybe [PlacementConstraint])
     (Maybe [PlacementConstraint])
     (Maybe [PlacementConstraint])
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso
  [PlacementConstraint]
  [PlacementConstraint]
  [PlacementConstraint]
  [PlacementConstraint]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The placement strategy objects to use for tasks in your service. You can
-- specify a maximum of 5 strategy rules per service.
createService_placementStrategy :: Lens.Lens' CreateService (Prelude.Maybe [PlacementStrategy])
createService_placementStrategy :: (Maybe [PlacementStrategy] -> f (Maybe [PlacementStrategy]))
-> CreateService -> f CreateService
createService_placementStrategy = (CreateService -> Maybe [PlacementStrategy])
-> (CreateService -> Maybe [PlacementStrategy] -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe [PlacementStrategy])
     (Maybe [PlacementStrategy])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe [PlacementStrategy]
placementStrategy :: Maybe [PlacementStrategy]
$sel:placementStrategy:CreateService' :: CreateService -> Maybe [PlacementStrategy]
placementStrategy} -> Maybe [PlacementStrategy]
placementStrategy) (\s :: CreateService
s@CreateService' {} Maybe [PlacementStrategy]
a -> CreateService
s {$sel:placementStrategy:CreateService' :: Maybe [PlacementStrategy]
placementStrategy = Maybe [PlacementStrategy]
a} :: CreateService) ((Maybe [PlacementStrategy] -> f (Maybe [PlacementStrategy]))
 -> CreateService -> f CreateService)
-> ((Maybe [PlacementStrategy] -> f (Maybe [PlacementStrategy]))
    -> Maybe [PlacementStrategy] -> f (Maybe [PlacementStrategy]))
-> (Maybe [PlacementStrategy] -> f (Maybe [PlacementStrategy]))
-> CreateService
-> f CreateService
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso
  [PlacementStrategy]
  [PlacementStrategy]
  [PlacementStrategy]
  [PlacementStrategy]
-> Iso
     (Maybe [PlacementStrategy])
     (Maybe [PlacementStrategy])
     (Maybe [PlacementStrategy])
     (Maybe [PlacementStrategy])
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso
  [PlacementStrategy]
  [PlacementStrategy]
  [PlacementStrategy]
  [PlacementStrategy]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The deployment controller to use for the service. If no deployment
-- controller is specified, the default value of @ECS@ is used.
createService_deploymentController :: Lens.Lens' CreateService (Prelude.Maybe DeploymentController)
createService_deploymentController :: (Maybe DeploymentController -> f (Maybe DeploymentController))
-> CreateService -> f CreateService
createService_deploymentController = (CreateService -> Maybe DeploymentController)
-> (CreateService -> Maybe DeploymentController -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe DeploymentController)
     (Maybe DeploymentController)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe DeploymentController
deploymentController :: Maybe DeploymentController
$sel:deploymentController:CreateService' :: CreateService -> Maybe DeploymentController
deploymentController} -> Maybe DeploymentController
deploymentController) (\s :: CreateService
s@CreateService' {} Maybe DeploymentController
a -> CreateService
s {$sel:deploymentController:CreateService' :: Maybe DeploymentController
deploymentController = Maybe DeploymentController
a} :: CreateService)

-- | The infrastructure on which to run your service. For more information,
-- see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html Amazon ECS launch types>
-- in the /Amazon Elastic Container Service Developer Guide/.
--
-- The @FARGATE@ launch type runs your tasks on Fargate On-Demand
-- infrastructure.
--
-- Fargate Spot infrastructure is available for use but a capacity provider
-- strategy must be used. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/userguide/fargate-capacity-providers.html Fargate capacity providers>
-- in the /Amazon ECS User Guide for Fargate/.
--
-- The @EC2@ launch type runs your tasks on Amazon EC2 instances registered
-- to your cluster.
--
-- The @EXTERNAL@ launch type runs your tasks on your on-premise server or
-- virtual machine (VM) capacity registered to your cluster.
--
-- A service can use either a launch type or a capacity provider strategy.
-- If a @launchType@ is specified, the @capacityProviderStrategy@ parameter
-- must be omitted.
createService_launchType :: Lens.Lens' CreateService (Prelude.Maybe LaunchType)
createService_launchType :: (Maybe LaunchType -> f (Maybe LaunchType))
-> CreateService -> f CreateService
createService_launchType = (CreateService -> Maybe LaunchType)
-> (CreateService -> Maybe LaunchType -> CreateService)
-> Lens
     CreateService CreateService (Maybe LaunchType) (Maybe LaunchType)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe LaunchType
launchType :: Maybe LaunchType
$sel:launchType:CreateService' :: CreateService -> Maybe LaunchType
launchType} -> Maybe LaunchType
launchType) (\s :: CreateService
s@CreateService' {} Maybe LaunchType
a -> CreateService
s {$sel:launchType:CreateService' :: Maybe LaunchType
launchType = Maybe LaunchType
a} :: CreateService)

-- | The @family@ and @revision@ (@family:revision@) or full ARN of the task
-- definition to run in your service. If a @revision@ is not specified, the
-- latest @ACTIVE@ revision is used.
--
-- A task definition must be specified if the service is using either the
-- @ECS@ or @CODE_DEPLOY@ deployment controllers.
createService_taskDefinition :: Lens.Lens' CreateService (Prelude.Maybe Prelude.Text)
createService_taskDefinition :: (Maybe Text -> f (Maybe Text)) -> CreateService -> f CreateService
createService_taskDefinition = (CreateService -> Maybe Text)
-> (CreateService -> Maybe Text -> CreateService)
-> Lens CreateService CreateService (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe Text
taskDefinition :: Maybe Text
$sel:taskDefinition:CreateService' :: CreateService -> Maybe Text
taskDefinition} -> Maybe Text
taskDefinition) (\s :: CreateService
s@CreateService' {} Maybe Text
a -> CreateService
s {$sel:taskDefinition:CreateService' :: Maybe Text
taskDefinition = Maybe Text
a} :: CreateService)

-- | The scheduling strategy to use for the service. For more information,
-- see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html Services>.
--
-- There are two service scheduler strategies available:
--
-- -   @REPLICA@-The replica scheduling strategy places and maintains the
--     desired number of tasks across your cluster. By default, the service
--     scheduler spreads tasks across Availability Zones. You can use task
--     placement strategies and constraints to customize task placement
--     decisions. This scheduler strategy is required if the service is
--     using the @CODE_DEPLOY@ or @EXTERNAL@ deployment controller types.
--
-- -   @DAEMON@-The daemon scheduling strategy deploys exactly one task on
--     each active container instance that meets all of the task placement
--     constraints that you specify in your cluster. The service scheduler
--     also evaluates the task placement constraints for running tasks and
--     will stop tasks that do not meet the placement constraints. When
--     you\'re using this strategy, you don\'t need to specify a desired
--     number of tasks, a task placement strategy, or use Service Auto
--     Scaling policies.
--
--     Tasks using the Fargate launch type or the @CODE_DEPLOY@ or
--     @EXTERNAL@ deployment controller types don\'t support the @DAEMON@
--     scheduling strategy.
createService_schedulingStrategy :: Lens.Lens' CreateService (Prelude.Maybe SchedulingStrategy)
createService_schedulingStrategy :: (Maybe SchedulingStrategy -> f (Maybe SchedulingStrategy))
-> CreateService -> f CreateService
createService_schedulingStrategy = (CreateService -> Maybe SchedulingStrategy)
-> (CreateService -> Maybe SchedulingStrategy -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe SchedulingStrategy)
     (Maybe SchedulingStrategy)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe SchedulingStrategy
schedulingStrategy :: Maybe SchedulingStrategy
$sel:schedulingStrategy:CreateService' :: CreateService -> Maybe SchedulingStrategy
schedulingStrategy} -> Maybe SchedulingStrategy
schedulingStrategy) (\s :: CreateService
s@CreateService' {} Maybe SchedulingStrategy
a -> CreateService
s {$sel:schedulingStrategy:CreateService' :: Maybe SchedulingStrategy
schedulingStrategy = Maybe SchedulingStrategy
a} :: CreateService)

-- | The period of time, in seconds, that the Amazon ECS service scheduler
-- should ignore unhealthy Elastic Load Balancing target health checks
-- after a task has first started. This is only used when your service is
-- configured to use a load balancer. If your service has a load balancer
-- defined and you don\'t specify a health check grace period value, the
-- default value of @0@ is used.
--
-- If your service\'s tasks take a while to start and respond to Elastic
-- Load Balancing health checks, you can specify a health check grace
-- period of up to 2,147,483,647 seconds. During that time, the Amazon ECS
-- service scheduler ignores health check status. This grace period can
-- prevent the service scheduler from marking tasks as unhealthy and
-- stopping them before they have time to come up.
createService_healthCheckGracePeriodSeconds :: Lens.Lens' CreateService (Prelude.Maybe Prelude.Int)
createService_healthCheckGracePeriodSeconds :: (Maybe Int -> f (Maybe Int)) -> CreateService -> f CreateService
createService_healthCheckGracePeriodSeconds = (CreateService -> Maybe Int)
-> (CreateService -> Maybe Int -> CreateService)
-> Lens CreateService CreateService (Maybe Int) (Maybe Int)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe Int
healthCheckGracePeriodSeconds :: Maybe Int
$sel:healthCheckGracePeriodSeconds:CreateService' :: CreateService -> Maybe Int
healthCheckGracePeriodSeconds} -> Maybe Int
healthCheckGracePeriodSeconds) (\s :: CreateService
s@CreateService' {} Maybe Int
a -> CreateService
s {$sel:healthCheckGracePeriodSeconds:CreateService' :: Maybe Int
healthCheckGracePeriodSeconds = Maybe Int
a} :: CreateService)

-- | The network configuration for the service. This parameter is required
-- for task definitions that use the @awsvpc@ network mode to receive their
-- own elastic network interface, and it is not supported for other network
-- modes. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html Task networking>
-- in the /Amazon Elastic Container Service Developer Guide/.
createService_networkConfiguration :: Lens.Lens' CreateService (Prelude.Maybe NetworkConfiguration)
createService_networkConfiguration :: (Maybe NetworkConfiguration -> f (Maybe NetworkConfiguration))
-> CreateService -> f CreateService
createService_networkConfiguration = (CreateService -> Maybe NetworkConfiguration)
-> (CreateService -> Maybe NetworkConfiguration -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe NetworkConfiguration)
     (Maybe NetworkConfiguration)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe NetworkConfiguration
networkConfiguration :: Maybe NetworkConfiguration
$sel:networkConfiguration:CreateService' :: CreateService -> Maybe NetworkConfiguration
networkConfiguration} -> Maybe NetworkConfiguration
networkConfiguration) (\s :: CreateService
s@CreateService' {} Maybe NetworkConfiguration
a -> CreateService
s {$sel:networkConfiguration:CreateService' :: Maybe NetworkConfiguration
networkConfiguration = Maybe NetworkConfiguration
a} :: CreateService)

-- | The details of the service discovery registry to associate with this
-- service. For more information, see
-- <https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html Service discovery>.
--
-- Each service may be associated with one service registry. Multiple
-- service registries per service isn\'t supported.
createService_serviceRegistries :: Lens.Lens' CreateService (Prelude.Maybe [ServiceRegistry])
createService_serviceRegistries :: (Maybe [ServiceRegistry] -> f (Maybe [ServiceRegistry]))
-> CreateService -> f CreateService
createService_serviceRegistries = (CreateService -> Maybe [ServiceRegistry])
-> (CreateService -> Maybe [ServiceRegistry] -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe [ServiceRegistry])
     (Maybe [ServiceRegistry])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe [ServiceRegistry]
serviceRegistries :: Maybe [ServiceRegistry]
$sel:serviceRegistries:CreateService' :: CreateService -> Maybe [ServiceRegistry]
serviceRegistries} -> Maybe [ServiceRegistry]
serviceRegistries) (\s :: CreateService
s@CreateService' {} Maybe [ServiceRegistry]
a -> CreateService
s {$sel:serviceRegistries:CreateService' :: Maybe [ServiceRegistry]
serviceRegistries = Maybe [ServiceRegistry]
a} :: CreateService) ((Maybe [ServiceRegistry] -> f (Maybe [ServiceRegistry]))
 -> CreateService -> f CreateService)
-> ((Maybe [ServiceRegistry] -> f (Maybe [ServiceRegistry]))
    -> Maybe [ServiceRegistry] -> f (Maybe [ServiceRegistry]))
-> (Maybe [ServiceRegistry] -> f (Maybe [ServiceRegistry]))
-> CreateService
-> f CreateService
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso
  [ServiceRegistry]
  [ServiceRegistry]
  [ServiceRegistry]
  [ServiceRegistry]
-> Iso
     (Maybe [ServiceRegistry])
     (Maybe [ServiceRegistry])
     (Maybe [ServiceRegistry])
     (Maybe [ServiceRegistry])
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso
  [ServiceRegistry]
  [ServiceRegistry]
  [ServiceRegistry]
  [ServiceRegistry]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The capacity provider strategy to use for the service.
--
-- If a @capacityProviderStrategy@ is specified, the @launchType@ parameter
-- must be omitted. If no @capacityProviderStrategy@ or @launchType@ is
-- specified, the @defaultCapacityProviderStrategy@ for the cluster is
-- used.
--
-- A capacity provider strategy may contain a maximum of 6 capacity
-- providers.
createService_capacityProviderStrategy :: Lens.Lens' CreateService (Prelude.Maybe [CapacityProviderStrategyItem])
createService_capacityProviderStrategy :: (Maybe [CapacityProviderStrategyItem]
 -> f (Maybe [CapacityProviderStrategyItem]))
-> CreateService -> f CreateService
createService_capacityProviderStrategy = (CreateService -> Maybe [CapacityProviderStrategyItem])
-> (CreateService
    -> Maybe [CapacityProviderStrategyItem] -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe [CapacityProviderStrategyItem])
     (Maybe [CapacityProviderStrategyItem])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe [CapacityProviderStrategyItem]
capacityProviderStrategy :: Maybe [CapacityProviderStrategyItem]
$sel:capacityProviderStrategy:CreateService' :: CreateService -> Maybe [CapacityProviderStrategyItem]
capacityProviderStrategy} -> Maybe [CapacityProviderStrategyItem]
capacityProviderStrategy) (\s :: CreateService
s@CreateService' {} Maybe [CapacityProviderStrategyItem]
a -> CreateService
s {$sel:capacityProviderStrategy:CreateService' :: Maybe [CapacityProviderStrategyItem]
capacityProviderStrategy = Maybe [CapacityProviderStrategyItem]
a} :: CreateService) ((Maybe [CapacityProviderStrategyItem]
  -> f (Maybe [CapacityProviderStrategyItem]))
 -> CreateService -> f CreateService)
-> ((Maybe [CapacityProviderStrategyItem]
     -> f (Maybe [CapacityProviderStrategyItem]))
    -> Maybe [CapacityProviderStrategyItem]
    -> f (Maybe [CapacityProviderStrategyItem]))
-> (Maybe [CapacityProviderStrategyItem]
    -> f (Maybe [CapacityProviderStrategyItem]))
-> CreateService
-> f CreateService
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso
  [CapacityProviderStrategyItem]
  [CapacityProviderStrategyItem]
  [CapacityProviderStrategyItem]
  [CapacityProviderStrategyItem]
-> Iso
     (Maybe [CapacityProviderStrategyItem])
     (Maybe [CapacityProviderStrategyItem])
     (Maybe [CapacityProviderStrategyItem])
     (Maybe [CapacityProviderStrategyItem])
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso
  [CapacityProviderStrategyItem]
  [CapacityProviderStrategyItem]
  [CapacityProviderStrategyItem]
  [CapacityProviderStrategyItem]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | Whether or not the execute command functionality is enabled for the
-- service. If @true@, this enables execute command functionality on all
-- containers in the service tasks.
createService_enableExecuteCommand :: Lens.Lens' CreateService (Prelude.Maybe Prelude.Bool)
createService_enableExecuteCommand :: (Maybe Bool -> f (Maybe Bool)) -> CreateService -> f CreateService
createService_enableExecuteCommand = (CreateService -> Maybe Bool)
-> (CreateService -> Maybe Bool -> CreateService)
-> Lens CreateService CreateService (Maybe Bool) (Maybe Bool)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe Bool
enableExecuteCommand :: Maybe Bool
$sel:enableExecuteCommand:CreateService' :: CreateService -> Maybe Bool
enableExecuteCommand} -> Maybe Bool
enableExecuteCommand) (\s :: CreateService
s@CreateService' {} Maybe Bool
a -> CreateService
s {$sel:enableExecuteCommand:CreateService' :: Maybe Bool
enableExecuteCommand = Maybe Bool
a} :: CreateService)

-- | The metadata that you apply to the service to help you categorize and
-- organize them. Each tag consists of a key and an optional value, both of
-- which you define. When a service is deleted, the tags are deleted as
-- well.
--
-- The following basic restrictions apply to tags:
--
-- -   Maximum number of tags per resource - 50
--
-- -   For each resource, each tag key must be unique, and each tag key can
--     have only one value.
--
-- -   Maximum key length - 128 Unicode characters in UTF-8
--
-- -   Maximum value length - 256 Unicode characters in UTF-8
--
-- -   If your tagging schema is used across multiple services and
--     resources, remember that other services may have restrictions on
--     allowed characters. Generally allowed characters are: letters,
--     numbers, and spaces representable in UTF-8, and the following
--     characters: + - = . _ : \/ \@.
--
-- -   Tag keys and values are case-sensitive.
--
-- -   Do not use @aws:@, @AWS:@, or any upper or lowercase combination of
--     such as a prefix for either keys or values as it is reserved for
--     Amazon Web Services use. You cannot edit or delete tag keys or
--     values with this prefix. Tags with this prefix do not count against
--     your tags per resource limit.
createService_tags :: Lens.Lens' CreateService (Prelude.Maybe [Tag])
createService_tags :: (Maybe [Tag] -> f (Maybe [Tag]))
-> CreateService -> f CreateService
createService_tags = (CreateService -> Maybe [Tag])
-> (CreateService -> Maybe [Tag] -> CreateService)
-> Lens CreateService CreateService (Maybe [Tag]) (Maybe [Tag])
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe [Tag]
tags :: Maybe [Tag]
$sel:tags:CreateService' :: CreateService -> Maybe [Tag]
tags} -> Maybe [Tag]
tags) (\s :: CreateService
s@CreateService' {} Maybe [Tag]
a -> CreateService
s {$sel:tags:CreateService' :: Maybe [Tag]
tags = Maybe [Tag]
a} :: CreateService) ((Maybe [Tag] -> f (Maybe [Tag]))
 -> CreateService -> f CreateService)
-> ((Maybe [Tag] -> f (Maybe [Tag]))
    -> Maybe [Tag] -> f (Maybe [Tag]))
-> (Maybe [Tag] -> f (Maybe [Tag]))
-> CreateService
-> f CreateService
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso [Tag] [Tag] [Tag] [Tag]
-> Iso (Maybe [Tag]) (Maybe [Tag]) (Maybe [Tag]) (Maybe [Tag])
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso [Tag] [Tag] [Tag] [Tag]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | Optional deployment parameters that control how many tasks run during
-- the deployment and the ordering of stopping and starting tasks.
createService_deploymentConfiguration :: Lens.Lens' CreateService (Prelude.Maybe DeploymentConfiguration)
createService_deploymentConfiguration :: (Maybe DeploymentConfiguration
 -> f (Maybe DeploymentConfiguration))
-> CreateService -> f CreateService
createService_deploymentConfiguration = (CreateService -> Maybe DeploymentConfiguration)
-> (CreateService
    -> Maybe DeploymentConfiguration -> CreateService)
-> Lens
     CreateService
     CreateService
     (Maybe DeploymentConfiguration)
     (Maybe DeploymentConfiguration)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Maybe DeploymentConfiguration
deploymentConfiguration :: Maybe DeploymentConfiguration
$sel:deploymentConfiguration:CreateService' :: CreateService -> Maybe DeploymentConfiguration
deploymentConfiguration} -> Maybe DeploymentConfiguration
deploymentConfiguration) (\s :: CreateService
s@CreateService' {} Maybe DeploymentConfiguration
a -> CreateService
s {$sel:deploymentConfiguration:CreateService' :: Maybe DeploymentConfiguration
deploymentConfiguration = Maybe DeploymentConfiguration
a} :: CreateService)

-- | The name of your service. Up to 255 letters (uppercase and lowercase),
-- numbers, underscores, and hyphens are allowed. Service names must be
-- unique within a cluster, but you can have similarly named services in
-- multiple clusters within a Region or across multiple Regions.
createService_serviceName :: Lens.Lens' CreateService Prelude.Text
createService_serviceName :: (Text -> f Text) -> CreateService -> f CreateService
createService_serviceName = (CreateService -> Text)
-> (CreateService -> Text -> CreateService)
-> Lens CreateService CreateService Text Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateService' {Text
serviceName :: Text
$sel:serviceName:CreateService' :: CreateService -> Text
serviceName} -> Text
serviceName) (\s :: CreateService
s@CreateService' {} Text
a -> CreateService
s {$sel:serviceName:CreateService' :: Text
serviceName = Text
a} :: CreateService)

instance Core.AWSRequest CreateService where
  type
    AWSResponse CreateService =
      CreateServiceResponse
  request :: CreateService -> Request CreateService
request = Service -> CreateService -> Request CreateService
forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON Service
defaultService
  response :: Logger
-> Service
-> Proxy CreateService
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateService)))
response =
    (Int
 -> ResponseHeaders
 -> Object
 -> Either String (AWSResponse CreateService))
-> Logger
-> Service
-> Proxy CreateService
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateService)))
forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> Logger
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe ContainerService -> Int -> CreateServiceResponse
CreateServiceResponse'
            (Maybe ContainerService -> Int -> CreateServiceResponse)
-> Either String (Maybe ContainerService)
-> Either String (Int -> CreateServiceResponse)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x Object -> Text -> Either String (Maybe ContainerService)
forall a. FromJSON a => Object -> Text -> Either String (Maybe a)
Core..?> Text
"service")
            Either String (Int -> CreateServiceResponse)
-> Either String Int -> Either String CreateServiceResponse
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Int -> Either String Int
forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (Int -> Int
forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable CreateService

instance Prelude.NFData CreateService

instance Core.ToHeaders CreateService where
  toHeaders :: CreateService -> ResponseHeaders
toHeaders =
    ResponseHeaders -> CreateService -> ResponseHeaders
forall a b. a -> b -> a
Prelude.const
      ( [ResponseHeaders] -> ResponseHeaders
forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              HeaderName -> ByteString -> ResponseHeaders
forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Core.=# ( ByteString
"AmazonEC2ContainerServiceV20141113.CreateService" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              HeaderName -> ByteString -> ResponseHeaders
forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Core.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Core.ToJSON CreateService where
  toJSON :: CreateService -> Value
toJSON CreateService' {Maybe Bool
Maybe Int
Maybe [CapacityProviderStrategyItem]
Maybe [LoadBalancer]
Maybe [PlacementConstraint]
Maybe [PlacementStrategy]
Maybe [ServiceRegistry]
Maybe [Tag]
Maybe Text
Maybe DeploymentConfiguration
Maybe DeploymentController
Maybe LaunchType
Maybe NetworkConfiguration
Maybe PropagateTags
Maybe SchedulingStrategy
Text
serviceName :: Text
deploymentConfiguration :: Maybe DeploymentConfiguration
tags :: Maybe [Tag]
enableExecuteCommand :: Maybe Bool
capacityProviderStrategy :: Maybe [CapacityProviderStrategyItem]
serviceRegistries :: Maybe [ServiceRegistry]
networkConfiguration :: Maybe NetworkConfiguration
healthCheckGracePeriodSeconds :: Maybe Int
schedulingStrategy :: Maybe SchedulingStrategy
taskDefinition :: Maybe Text
launchType :: Maybe LaunchType
deploymentController :: Maybe DeploymentController
placementStrategy :: Maybe [PlacementStrategy]
placementConstraints :: Maybe [PlacementConstraint]
role' :: Maybe Text
loadBalancers :: Maybe [LoadBalancer]
desiredCount :: Maybe Int
enableECSManagedTags :: Maybe Bool
platformVersion :: Maybe Text
propagateTags :: Maybe PropagateTags
clientToken :: Maybe Text
cluster :: Maybe Text
$sel:serviceName:CreateService' :: CreateService -> Text
$sel:deploymentConfiguration:CreateService' :: CreateService -> Maybe DeploymentConfiguration
$sel:tags:CreateService' :: CreateService -> Maybe [Tag]
$sel:enableExecuteCommand:CreateService' :: CreateService -> Maybe Bool
$sel:capacityProviderStrategy:CreateService' :: CreateService -> Maybe [CapacityProviderStrategyItem]
$sel:serviceRegistries:CreateService' :: CreateService -> Maybe [ServiceRegistry]
$sel:networkConfiguration:CreateService' :: CreateService -> Maybe NetworkConfiguration
$sel:healthCheckGracePeriodSeconds:CreateService' :: CreateService -> Maybe Int
$sel:schedulingStrategy:CreateService' :: CreateService -> Maybe SchedulingStrategy
$sel:taskDefinition:CreateService' :: CreateService -> Maybe Text
$sel:launchType:CreateService' :: CreateService -> Maybe LaunchType
$sel:deploymentController:CreateService' :: CreateService -> Maybe DeploymentController
$sel:placementStrategy:CreateService' :: CreateService -> Maybe [PlacementStrategy]
$sel:placementConstraints:CreateService' :: CreateService -> Maybe [PlacementConstraint]
$sel:role':CreateService' :: CreateService -> Maybe Text
$sel:loadBalancers:CreateService' :: CreateService -> Maybe [LoadBalancer]
$sel:desiredCount:CreateService' :: CreateService -> Maybe Int
$sel:enableECSManagedTags:CreateService' :: CreateService -> Maybe Bool
$sel:platformVersion:CreateService' :: CreateService -> Maybe Text
$sel:propagateTags:CreateService' :: CreateService -> Maybe PropagateTags
$sel:clientToken:CreateService' :: CreateService -> Maybe Text
$sel:cluster:CreateService' :: CreateService -> Maybe Text
..} =
    [Pair] -> Value
Core.object
      ( [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Text
"cluster" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=) (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
cluster,
            (Text
"clientToken" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=) (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
clientToken,
            (Text
"propagateTags" Text -> PropagateTags -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=) (PropagateTags -> Pair) -> Maybe PropagateTags -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe PropagateTags
propagateTags,
            (Text
"platformVersion" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
platformVersion,
            (Text
"enableECSManagedTags" Text -> Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (Bool -> Pair) -> Maybe Bool -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Bool
enableECSManagedTags,
            (Text
"desiredCount" Text -> Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=) (Int -> Pair) -> Maybe Int -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Int
desiredCount,
            (Text
"loadBalancers" Text -> [LoadBalancer] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=) ([LoadBalancer] -> Pair) -> Maybe [LoadBalancer] -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [LoadBalancer]
loadBalancers,
            (Text
"role" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=) (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
role',
            (Text
"placementConstraints" Text -> [PlacementConstraint] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              ([PlacementConstraint] -> Pair)
-> Maybe [PlacementConstraint] -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [PlacementConstraint]
placementConstraints,
            (Text
"placementStrategy" Text -> [PlacementStrategy] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              ([PlacementStrategy] -> Pair)
-> Maybe [PlacementStrategy] -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [PlacementStrategy]
placementStrategy,
            (Text
"deploymentController" Text -> DeploymentController -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (DeploymentController -> Pair)
-> Maybe DeploymentController -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe DeploymentController
deploymentController,
            (Text
"launchType" Text -> LaunchType -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=) (LaunchType -> Pair) -> Maybe LaunchType -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe LaunchType
launchType,
            (Text
"taskDefinition" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
taskDefinition,
            (Text
"schedulingStrategy" Text -> SchedulingStrategy -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (SchedulingStrategy -> Pair)
-> Maybe SchedulingStrategy -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe SchedulingStrategy
schedulingStrategy,
            (Text
"healthCheckGracePeriodSeconds" Text -> Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (Int -> Pair) -> Maybe Int -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Int
healthCheckGracePeriodSeconds,
            (Text
"networkConfiguration" Text -> NetworkConfiguration -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (NetworkConfiguration -> Pair)
-> Maybe NetworkConfiguration -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe NetworkConfiguration
networkConfiguration,
            (Text
"serviceRegistries" Text -> [ServiceRegistry] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              ([ServiceRegistry] -> Pair)
-> Maybe [ServiceRegistry] -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [ServiceRegistry]
serviceRegistries,
            (Text
"capacityProviderStrategy" Text -> [CapacityProviderStrategyItem] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              ([CapacityProviderStrategyItem] -> Pair)
-> Maybe [CapacityProviderStrategyItem] -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [CapacityProviderStrategyItem]
capacityProviderStrategy,
            (Text
"enableExecuteCommand" Text -> Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (Bool -> Pair) -> Maybe Bool -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Bool
enableExecuteCommand,
            (Text
"tags" Text -> [Tag] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=) ([Tag] -> Pair) -> Maybe [Tag] -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [Tag]
tags,
            (Text
"deploymentConfiguration" Text -> DeploymentConfiguration -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (DeploymentConfiguration -> Pair)
-> Maybe DeploymentConfiguration -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe DeploymentConfiguration
deploymentConfiguration,
            Pair -> Maybe Pair
forall a. a -> Maybe a
Prelude.Just (Text
"serviceName" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..= Text
serviceName)
          ]
      )

instance Core.ToPath CreateService where
  toPath :: CreateService -> ByteString
toPath = ByteString -> CreateService -> ByteString
forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Core.ToQuery CreateService where
  toQuery :: CreateService -> QueryString
toQuery = QueryString -> CreateService -> QueryString
forall a b. a -> b -> a
Prelude.const QueryString
forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newCreateServiceResponse' smart constructor.
data CreateServiceResponse = CreateServiceResponse'
  { -- | The full description of your service following the create call.
    --
    -- A service will return either a @capacityProviderStrategy@ or
    -- @launchType@ parameter, but not both, depending on which one was
    -- specified during creation.
    --
    -- If a service is using the @ECS@ deployment controller, the
    -- @deploymentController@ and @taskSets@ parameters will not be returned.
    --
    -- If the service is using the @CODE_DEPLOY@ deployment controller, the
    -- @deploymentController@, @taskSets@ and @deployments@ parameters will be
    -- returned, however the @deployments@ parameter will be an empty list.
    CreateServiceResponse -> Maybe ContainerService
service :: Prelude.Maybe ContainerService,
    -- | The response's http status code.
    CreateServiceResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateServiceResponse -> CreateServiceResponse -> Bool
(CreateServiceResponse -> CreateServiceResponse -> Bool)
-> (CreateServiceResponse -> CreateServiceResponse -> Bool)
-> Eq CreateServiceResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateServiceResponse -> CreateServiceResponse -> Bool
$c/= :: CreateServiceResponse -> CreateServiceResponse -> Bool
== :: CreateServiceResponse -> CreateServiceResponse -> Bool
$c== :: CreateServiceResponse -> CreateServiceResponse -> Bool
Prelude.Eq, ReadPrec [CreateServiceResponse]
ReadPrec CreateServiceResponse
Int -> ReadS CreateServiceResponse
ReadS [CreateServiceResponse]
(Int -> ReadS CreateServiceResponse)
-> ReadS [CreateServiceResponse]
-> ReadPrec CreateServiceResponse
-> ReadPrec [CreateServiceResponse]
-> Read CreateServiceResponse
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateServiceResponse]
$creadListPrec :: ReadPrec [CreateServiceResponse]
readPrec :: ReadPrec CreateServiceResponse
$creadPrec :: ReadPrec CreateServiceResponse
readList :: ReadS [CreateServiceResponse]
$creadList :: ReadS [CreateServiceResponse]
readsPrec :: Int -> ReadS CreateServiceResponse
$creadsPrec :: Int -> ReadS CreateServiceResponse
Prelude.Read, Int -> CreateServiceResponse -> ShowS
[CreateServiceResponse] -> ShowS
CreateServiceResponse -> String
(Int -> CreateServiceResponse -> ShowS)
-> (CreateServiceResponse -> String)
-> ([CreateServiceResponse] -> ShowS)
-> Show CreateServiceResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateServiceResponse] -> ShowS
$cshowList :: [CreateServiceResponse] -> ShowS
show :: CreateServiceResponse -> String
$cshow :: CreateServiceResponse -> String
showsPrec :: Int -> CreateServiceResponse -> ShowS
$cshowsPrec :: Int -> CreateServiceResponse -> ShowS
Prelude.Show, (forall x. CreateServiceResponse -> Rep CreateServiceResponse x)
-> (forall x. Rep CreateServiceResponse x -> CreateServiceResponse)
-> Generic CreateServiceResponse
forall x. Rep CreateServiceResponse x -> CreateServiceResponse
forall x. CreateServiceResponse -> Rep CreateServiceResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateServiceResponse x -> CreateServiceResponse
$cfrom :: forall x. CreateServiceResponse -> Rep CreateServiceResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateServiceResponse' 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:
--
-- 'service', 'createServiceResponse_service' - The full description of your service following the create call.
--
-- A service will return either a @capacityProviderStrategy@ or
-- @launchType@ parameter, but not both, depending on which one was
-- specified during creation.
--
-- If a service is using the @ECS@ deployment controller, the
-- @deploymentController@ and @taskSets@ parameters will not be returned.
--
-- If the service is using the @CODE_DEPLOY@ deployment controller, the
-- @deploymentController@, @taskSets@ and @deployments@ parameters will be
-- returned, however the @deployments@ parameter will be an empty list.
--
-- 'httpStatus', 'createServiceResponse_httpStatus' - The response's http status code.
newCreateServiceResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateServiceResponse
newCreateServiceResponse :: Int -> CreateServiceResponse
newCreateServiceResponse Int
pHttpStatus_ =
  CreateServiceResponse' :: Maybe ContainerService -> Int -> CreateServiceResponse
CreateServiceResponse'
    { $sel:service:CreateServiceResponse' :: Maybe ContainerService
service = Maybe ContainerService
forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateServiceResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The full description of your service following the create call.
--
-- A service will return either a @capacityProviderStrategy@ or
-- @launchType@ parameter, but not both, depending on which one was
-- specified during creation.
--
-- If a service is using the @ECS@ deployment controller, the
-- @deploymentController@ and @taskSets@ parameters will not be returned.
--
-- If the service is using the @CODE_DEPLOY@ deployment controller, the
-- @deploymentController@, @taskSets@ and @deployments@ parameters will be
-- returned, however the @deployments@ parameter will be an empty list.
createServiceResponse_service :: Lens.Lens' CreateServiceResponse (Prelude.Maybe ContainerService)
createServiceResponse_service :: (Maybe ContainerService -> f (Maybe ContainerService))
-> CreateServiceResponse -> f CreateServiceResponse
createServiceResponse_service = (CreateServiceResponse -> Maybe ContainerService)
-> (CreateServiceResponse
    -> Maybe ContainerService -> CreateServiceResponse)
-> Lens
     CreateServiceResponse
     CreateServiceResponse
     (Maybe ContainerService)
     (Maybe ContainerService)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateServiceResponse' {Maybe ContainerService
service :: Maybe ContainerService
$sel:service:CreateServiceResponse' :: CreateServiceResponse -> Maybe ContainerService
service} -> Maybe ContainerService
service) (\s :: CreateServiceResponse
s@CreateServiceResponse' {} Maybe ContainerService
a -> CreateServiceResponse
s {$sel:service:CreateServiceResponse' :: Maybe ContainerService
service = Maybe ContainerService
a} :: CreateServiceResponse)

-- | The response's http status code.
createServiceResponse_httpStatus :: Lens.Lens' CreateServiceResponse Prelude.Int
createServiceResponse_httpStatus :: (Int -> f Int) -> CreateServiceResponse -> f CreateServiceResponse
createServiceResponse_httpStatus = (CreateServiceResponse -> Int)
-> (CreateServiceResponse -> Int -> CreateServiceResponse)
-> Lens CreateServiceResponse CreateServiceResponse Int Int
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateServiceResponse' {Int
httpStatus :: Int
$sel:httpStatus:CreateServiceResponse' :: CreateServiceResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: CreateServiceResponse
s@CreateServiceResponse' {} Int
a -> CreateServiceResponse
s {$sel:httpStatus:CreateServiceResponse' :: Int
httpStatus = Int
a} :: CreateServiceResponse)

instance Prelude.NFData CreateServiceResponse