#
# 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)
  instances=Default(Integer, 1)


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

GpuProfile = DefaultProfile(
  gpu=1
)

echo_ports = Process(
  name = 'echo_ports',
  cmdline = 'echo "tcp port: {{thermos.ports[tcp]}}; http port: {{thermos.ports[http]}}; alias: {{thermos.ports[alias]}}; health: {{thermos.ports[health]}}"'
)

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}}'
)

setup_env = Process(
  name = 'setup_env',
  cmdline='''cat <<EOF > .thermos_profile
export IT_WORKED=hello
EOF'''
)

read_env = Process(
  name = 'read_env',
  cmdline = 'echo "$IT_WORKED"'
)

verify_file_mount = Process(
  name = 'verify_file_mount',
  cmdline = 'cat /home/vagrant/aurora/.auroraversion'
)

# Regression test for quotation mark usage (AURORA-1782)
verify_command_escaping = Process(
  name = 'verify_command_escaping',
  cmdline = """
python -c 'import sys

if __name__ == "__main__":
  sys.exit(0)'
"""
)

verify_file_system = Process(
  name = 'check_fs',
  cmdline = 'check-fs.sh'
)

test_task = SequentialTask(
  name = 'http_example',
  resources = Resources(cpu=0.5, ram=32*MB, disk=64*MB, gpu='{{profile.gpu}}'),
  processes = [
      setup_env,
      read_env,
      echo_ports,
      verify_command_escaping,
      stage_server,
      run_server
  ]
)

no_python_task = SequentialTask(
  name = 'http_example_no_python',
  resources = Resources(cpu=0.4, ram=32*MB, disk=64*MB),
  processes = [
      setup_env,
      read_env,
      echo_ports,
      verify_command_escaping,
      verify_file_mount,
      verify_file_system,
      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)
update_config_var_batch = UpdateConfig(update_strategy = VariableBatchUpdateStrategy(batch_sizes = [1,2]))
health_check_config = HealthCheckConfig(initial_interval_secs=5, interval_secs=1)
shell_health_check_config = HealthCheckConfig(
  health_checker = HealthCheckerConfig(
    shell = ShellHealthChecker(shell_command='stat /usr/local/bin/run-server.sh')),
  initial_interval_secs=5,
  interval_secs=1,
  min_consecutive_successes=5
)

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

volumes = [
  Volume(container_path="etc/rsyslog.d.container", host_path="/etc/rsyslog.d", mode=Mode("RO")),
  Volume(container_path="etc/w3m.container", host_path="/etc/X11", mode=Mode("RO"))
]

jobs = [
  job(
    name = 'http_example'
  ).bind(profile=DefaultProfile()),
  job(
    name = 'http_example_maintenance'
  ).bind(profile=DefaultProfile()),
  job(
    name = 'http_example_watch_secs',
    update_config = update_config_watch_secs
  ).bind(profile=DefaultProfile()),
  job(
    name = 'http_example_var_batch_update',
    update_config = update_config_var_batch
  ).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}}'), volumes=volumes),
    task = no_python_task,
    health_check_config=shell_health_check_config
  ).bind(profile=DefaultProfile()),
  job(
    name = 'http_example_unified_docker',
    container = Mesos(image=DockerImage(name='http_example_netcat', tag='latest'), volumes=volumes),
    task = no_python_task,
    health_check_config=shell_health_check_config
  ).bind(profile=DefaultProfile())
]
