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


hello_loop = Process(
  name = 'hello',
  cmdline = """
    while true; do
      echo hello world
      sleep 10
    done
  """)

# Write out a python program that self daemonizes via double forking.
# Asserts that thermos doesn't lose track of double forking proceses. On task
# tear down it should be given a SIGTERM so it can shut down cleanly.
write_program = Process(
  name = "write_program",
  cmdline = """
    cat >./daemon.py <<EOL
import os
import signal
import sys
import time

def handler(signum, frame):
    os.remove("{{term_file}}")
    sys.exit(0)

def main():
    pid = os.fork()
    if pid > 0:
        sys.exit(0)

    os.setsid()
    os.umask(0)

    pid = os.fork()
    if pid > 0:
        sys.exit(0)

    signal.signal(signal.SIGTERM, handler)
    while True:
        time.sleep(1)

if __name__ == '__main__':
    main()

EOL
  """
)

run_daemon = Process(
  name = 'run_daemon',
  cmdline = 'python ./daemon.py'
)

task = Task(
  processes = [hello_loop, write_program, run_daemon],
  constraints = order(write_program, run_daemon),
  resources = Resources(cpu=1, ram=1*MB, disk=100*MB)
)

jobs = [
  Service(
    cluster = 'devcluster',
    environment = 'test',
    role = 'vagrant',
    name = 'daemonize',
    task = task
  )
]
