blob: 5e35d936f47c9ad824c96421cb5c602c47c4e50c [file] [log] [blame]
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Disable checkstyle for this entire file as it is a pystachio schema.
# checkstyle: noqa
from pystachio import Choice
from apache.thermos.config.schema import *
from gen.apache.aurora.api.constants import AURORA_EXECUTOR_NAME
# TODO(wickman) Bind {{mesos.instance}} to %shard_id%
class MesosContext(Struct):
# The instance id (i.e. replica id, shard id) in the context of a task
instance = Required(Integer)
hostname = Required(String)
class QueueUpdateStrategy(Struct):
batch_size = Default(Integer, 1)
class BatchUpdateStrategy(Struct):
batch_size = Default(Integer, 1)
class VariableBatchUpdateStrategy(Struct):
batch_sizes = Required(List(Integer))
class UpdateConfig(Struct):
batch_size = Default(Integer, 1)
watch_secs = Default(Integer, 45)
max_per_shard_failures = Default(Integer, 0)
max_total_failures = Default(Integer, 0)
rollback_on_failure = Default(Boolean, True)
wait_for_batch_completion = Default(Boolean, False)
pulse_interval_secs = Integer
sla_aware = Default(Boolean, False)
update_strategy = Choice([QueueUpdateStrategy,
BatchUpdateStrategy,
VariableBatchUpdateStrategy])
class HttpHealthChecker(Struct):
endpoint = Default(String, '/health')
expected_response = Default(String, 'ok')
expected_response_code = Default(Integer, 0)
class ShellHealthChecker(Struct):
shell_command = Required(String)
class HealthCheckerConfig(Struct):
http = HttpHealthChecker
shell = ShellHealthChecker
DefaultHealthChecker = HealthCheckerConfig(http=HttpHealthChecker())
class HealthCheckConfig(Struct):
health_checker = Default(HealthCheckerConfig, DefaultHealthChecker)
initial_interval_secs = Default(Float, 15.0)
interval_secs = Default(Float, 10.0)
max_consecutive_failures = Default(Integer, 0)
min_consecutive_successes = Default(Integer, 1)
timeout_secs = Default(Float, 1.0)
class HttpLifecycleConfig(Struct):
# Named port to POST shutdown endpoints
port = Default(String, 'health')
# Endpoint to hit to indicate that a task should gracefully shutdown.
graceful_shutdown_endpoint = Default(String, '/quitquitquit')
# Endpoint to hit to give a task it's final warning before being killed.
shutdown_endpoint = Default(String, '/abortabortabort')
# How much time to wait in seconds after calling the graceful shutdown endpoint
graceful_shutdown_wait_secs = Default(Integer, 5)
# How much time to wait in seconds after calling the shutdown endpoint
shutdown_wait_secs = Default(Integer, 5)
class LifecycleConfig(Struct):
http = HttpLifecycleConfig
DisableLifecycle = LifecycleConfig()
DefaultLifecycleConfig = LifecycleConfig(http = HttpLifecycleConfig())
class Announcer(Struct):
primary_port = Default(String, 'http')
# Portmap can either alias two ports together, e.g.
# aurora <= http
# Or it can be used to alias static ports to endpoints, e.g.
# http <= 80
# https <= 443
# aurora <= https
portmap = Default(Map(String, String), {
'aurora': '{{primary_port}}'
})
# Root of tree where annoucements are stored. If specified, this overrides the
# default path (executor must be started with --announcer-allow-custom-serverset-path for
# this setting to take effect)
zk_path = String
# The executorConfig populated inside of TaskConfig.
class MesosTaskInstance(Struct):
task = Required(Task)
instance = Required(Integer)
role = Required(String)
announce = Announcer
environment = Required(String)
health_check_config = Default(HealthCheckConfig, HealthCheckConfig())
lifecycle = LifecycleConfig
class Parameter(Struct):
name = Required(String)
value = Required(String)
class Docker(Struct):
image = Required(String)
parameters = Default(List(Parameter), [])
class AppcImage(Struct):
name = Required(String)
image_id = Required(String)
class DockerImage(Struct):
name = Required(String)
tag = Required(String)
Mode = Enum('RO', 'RW')
class Volume(Struct):
container_path = Required(String)
host_path = Required(String)
mode = Required(Mode)
class Mesos(Struct):
image = Choice([AppcImage, DockerImage])
volumes = Default(List(Volume), [])
class Container(Struct):
docker = Docker
class PartitionPolicy(Struct):
reschedule = Default(Boolean, True)
delay_secs = Default(Integer, 0)
class Metadata(Struct):
key = Required(String)
value = Required(String)
class ExecutorConfig(Struct):
name = Default(String, AURORA_EXECUTOR_NAME)
data = Default(String, "")
class PercentageSlaPolicy(Struct):
percentage = Required(Float)
duration_secs = Required(Integer)
class CountSlaPolicy(Struct):
count = Required(Integer)
duration_secs = Required(Integer)
class CoordinatorSlaPolicy(Struct):
coordinator_url = Required(String)
status_key = Default(String, "drain")
class MesosJob(Struct):
name = Default(String, '{{task.name}}')
role = Required(String)
contact = String
cluster = Required(String)
environment = Required(String)
instances = Default(Integer, 1)
task = Required(Task)
announce = Announcer
tier = String
cron_schedule = String
cron_collision_policy = Default(String, "KILL_EXISTING")
update_config = Default(UpdateConfig, UpdateConfig())
constraints = Map(String, String)
metadata = Default(List(Metadata), [])
service = Default(Boolean, False)
max_task_failures = Default(Integer, 1)
production = Default(Boolean, False)
priority = Default(Integer, 0)
health_check_config = Default(HealthCheckConfig, HealthCheckConfig())
# TODO(wickman) Make Default(Any, LifecycleConfig()) once pystachio #17 is addressed.
lifecycle = Default(LifecycleConfig, DefaultLifecycleConfig)
task_links = Map(String, String) # Unsupported. See AURORA-739
executor_config = Default(ExecutorConfig, ExecutorConfig())
enable_hooks = Default(Boolean, False) # enable client API hooks; from env python-list 'hooks'
partition_policy = PartitionPolicy
sla_policy = Choice([CoordinatorSlaPolicy, CountSlaPolicy, PercentageSlaPolicy])
# Specifying a `Container` with a `docker` property for Docker jobs is deprecated, instead just
# specify the value of the container property to be a `Docker` container directly.
container = Choice([Container, Docker, Mesos])
Job = MesosJob
Service = Job(service = True)