#
# 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.
#

import getpass

class DefaultProfile(Struct):
  role=Default(String, getpass.getuser())
  cmd=Default(String, 'cp /vagrant/src/test/sh/org/apache/aurora/e2e/http_example.py .')
  gpu=Default(Integer, 0)


ContainerProfile = DefaultProfile(
  cmd = 'cp /tmp/http_example.py .'
)

GpuProfile = DefaultProfile(
  gpu=1
)

run_server = Process(
  name = 'run_server',
  cmdline = 'python http_example.py {{thermos.ports[http]}} {{thermos.ports[health]}}'
)

stage_server = Process(
  name = 'stage_server',
  cmdline = '{{profile.cmd}}'
)

test_task = Task(
  name = 'http_example',
  resources = Resources(cpu=0.5, ram=32*MB, disk=64*MB, gpu='{{profile.gpu}}'),
  processes = [stage_server, run_server],
  constraints = order(stage_server, run_server)
)

no_python_task = Task(
  name = 'http_example_no_python',
  resources = Resources(cpu=0.4, ram=32*MB, disk=64*MB),
  processes = [Process(name='run_server', cmdline='run-server.sh {{thermos.ports[http]}}')])

update_config = UpdateConfig(watch_secs=0, batch_size=2)
update_config_watch_secs = UpdateConfig(watch_secs=10, batch_size=2)
# "I am going to fail" config.
shell_config = ShellHealthChecker(
  # This shell validates two things:
  # 1. the shell command is not run as a privileged user
  # 2. a failed shell command results in a health check failure
  shell_command='rm -f /etc/passwd'
)
health_check_config = HealthCheckConfig(
  health_checker=HealthCheckerConfig(shell=shell_config),
  initial_interval_secs=5,
  interval_secs=1,
  min_consecutive_successes=5
)

job = Service(
  cluster = 'devcluster',
  instances = 2,
  update_config = update_config,
  health_check_config = health_check_config,
  task = test_task,
  role = '{{profile.role}}',
  environment = 'test',
  contact = '{{profile.role}}@localhost',
  announce = Announcer(),
)

jobs = [
  job(
    name = 'http_example'
  ).bind(profile=DefaultProfile()),
  job(
    name = 'http_example_watch_secs',
    update_config = update_config_watch_secs
  ).bind(profile=DefaultProfile()),
  job(
    name = 'http_example_revocable',
    tier = 'revocable'
  ).bind(profile=DefaultProfile()),
  job(
    name = 'http_example_docker',
    container = Docker(image='{{docker.image[http_example][latest]}}'),
  ).bind(profile=ContainerProfile),
  job(
    name = 'http_example_gpu'
  ).bind(profile=GpuProfile),
  job(
    name = 'http_example_unified_appc',
    container = Mesos(image=AppcImage(name='http_example_netcat', image_id='{{appc_image_id}}')),
    task = no_python_task
  ).bind(profile=DefaultProfile()),
  job(
    name = 'http_example_unified_docker',
    container = Mesos(image=DockerImage(name='http_example_netcat', tag='latest')),
    task = no_python_task
  ).bind(profile=DefaultProfile())
]
