Beispiel #1
0
def test_combine_tasks():
  p1 = Process(name='p1')
  p2 = Process(name='p2')
  p3 = Process(name='p3')
  p4 = Process(name='p4')
  r100 = Resources(cpu=1, ram=0, disk=0)
  r010 = Resources(cpu=0, ram=1, disk=0)
  r001 = Resources(cpu=0, ram=0, disk=1)
  r111 = Units.resources_sum(r100, r010, r001)

  t1 = Task(name="p1p2", processes=[p1, p2], constraints=order(p1, p2),
            resources=Units.resources_sum(r100, r010))
  t2 = Task(name="p3p4", processes=[p3, p4], constraints=order(p3, p4),
            resources=r001)

  assert combine_tasks() == Task()
  assert combine_tasks(t1) == t1
  assert combine_tasks(t2) == t2

  t3 = combine_tasks(t1, t2)
  assert t3.name() == t2.name()
  assert t3.resources() == r111
  assert set(t3.processes()) == set([p1, p2, p3, p4])
  assert set(t3.constraints()) == set(order(p1, p2) + order(p3, p4))

  t4 = concat_tasks(t1, t2)
  assert t4.name() == t2.name()
  assert t4.resources() == r111
  assert set(t4.processes()) == set([p1, p2, p3, p4])
  assert set(t4.constraints()) == set(
      order(p1, p2) + order(p3, p4) + order(p1, p3) + order(p1, p4) +
      order(p2, p3) + order(p2, p4))
 def task(cls):
     task = Task(name="task_with_ephemeral",
                 processes=[
                     Process(name="ephemeral_sleepy",
                             ephemeral=True,
                             cmdline="sleep 10"),
                     Process(name="sleepy", cmdline="sleep 1")
                 ])
     return task.interpolate()[0]
 def task(cls):
     main = Process(name="main", cmdline="date && echo hello world")
     finalizer = Process(name="finalizer", cmdline="date", final=True)
     task = Task(
         name="task_with_finalizer",
         processes=[
             main,
             finalizer(name='finalizer1', cmdline='exit 1'),
             finalizer(name='finalizer2')
         ],
         constraints=[Constraint(order=['finalizer1', 'finalizer2'])])
     return task.interpolate()[0]
 def task(cls):
     main = Process(name="main", cmdline="echo hello world")
     finalizer = Process(cmdline="date", final=True)
     task = Task(name="task_with_finalizer",
                 processes=[
                     main,
                     finalizer(name='finalizer1',
                               cmdline='exit 1',
                               max_failures=2),
                     finalizer(name='finalizer2')
                 ])
     return task.interpolate()[0]
Beispiel #5
0
 def task(cls):
   task = Task(
     name = "failing_task",
     resources = Resources(cpu = 1.0, ram = 16*1024*1024, disk = 16*1024),
     max_failures = 2,
     processes = [
       Process(name = "a", max_failures=1, min_duration=1, cmdline="echo hello world"),
       Process(name = "b", max_failures=1, min_duration=1, cmdline="exit 1"),
       Process(name = "c", max_failures=1, min_duration=1, cmdline="echo hello world")
     ],
     constraints = [{'order': ['a', 'b', 'c']}]
   )
   return task.interpolate()[0]
Beispiel #6
0
def test_order():
  p1 = Process(name='p1')
  p2 = Process(name='p2')

  p1p2 = [Constraint(order=['p1', 'p2'])]
  assert order(p1, p2) == p1p2
  assert order('p1', p2) == p1p2
  assert order(p1, 'p2') == p1p2
  assert order('p1', 'p2') == p1p2
  assert order(u'p1', 'p2') == p1p2

  with pytest.raises(ValueError):
    order([p1])

  with pytest.raises(ValueError):
    order(None)
Beispiel #7
0
def test_tasklets():
  install_thermosrc = Process(name='install_thermosrc')
  setup_py3k = Process(name='setup_py3k')
  setup_ruby19 = Process(name='setup_ruby19')
  setup_php = Process(name='setup_php')
  recipe_py3k = SequentialTask(processes=[install_thermosrc, setup_py3k])
  recipe_ruby19 = SequentialTask(processes=[install_thermosrc, setup_ruby19])
  recipe_php = SequentialTask(processes=[install_thermosrc, setup_php])
  all_recipes = Tasks.combine(recipe_py3k, recipe_ruby19, recipe_php)
  my_task = Task(processes = [Process(name='my_process')])
  my_new_task = Tasks.concat(all_recipes, my_task)(name = 'my_task')

  # TODO(wickman) Probably should have Tasks.combine/concat do constraint
  # minimization since many constraints are redundant.
  for p in (install_thermosrc, setup_py3k, setup_ruby19, setup_php):
    assert p in my_new_task.processes()
Beispiel #8
0
 def task(cls):
     hello_template = Process(cmdline="echo 1")
     t1 = hello_template(
         name="t1", cmdline="echo 1 port {{thermos.ports[named_port]}}")
     t2 = hello_template(name="t2")
     t3 = hello_template(name="t3")
     t4 = hello_template(name="t4")
     t5 = hello_template(name="t5")
     t6 = hello_template(name="t6")
     tsk = Task(name="complex", processes=[t1, t2, t3, t4, t5, t6])
     # three ways of tasks: t1 t2, t3 t4, t5 t6
     tsk = tsk(constraints=[{
         'order': ['t1', 't3']
     }, {
         'order': ['t1', 't4']
     }, {
         'order': ['t2', 't3']
     }, {
         'order': ['t2', 't4']
     }, {
         'order': ['t3', 't5']
     }, {
         'order': ['t3', 't6']
     }, {
         'order': ['t4', 't5']
     }, {
         'order': ['t4', 't6']
     }])
     return tsk
Beispiel #9
0
def test_config_with_ports():
    hwc = HELLO_WORLD(task=HELLO_WORLD.task()(processes=[
        Process(
            name='hello_world',
            cmdline='echo {{thermos.ports[http]}} {{thermos.ports[admin]}}')
    ]))
    config = AuroraConfig(hwc)
    job = config.job()
    assert job.taskConfig.requestedPorts == set(['http', 'admin'])
Beispiel #10
0
 def task(cls):
   base = Process(max_failures=2, min_duration=1)
   ex = base(cmdline="exit 1")
   hw = base(cmdline="echo hello world")
   task = Task(
     name = "failing_task",
     resources = Resources(cpu = 1.0, ram = 16*1024*1024, disk = 16*1024),
     max_failures = 0,
     processes = [ex(name='f1'), ex(name='f2'), ex(name='f3'),
                  hw(name='s1'), hw(name='s2'), hw(name='s3')])
   return task.interpolate()[0]
Beispiel #11
0
    def task(cls):
        setup_bashrc = Process(name="setup_bashrc",
                               cmdline=dedent("""
    mkdir -p .profile.d
    cat <<EOF > .thermos_profile
    for i in .profile.d/*.sh ; do
      if [ -r "\\$i" ]; then
        . \\$i
      fi
    done
    EOF
    """))

        setup_foo = Process(name="setup_foo",
                            cmdline=dedent("""
    cat <<EOF > .profile.d/setup_foo.sh
    export FOO=1
    EOF
    """))

        setup_bar = Process(name="setup_bar",
                            cmdline=dedent("""
    cat <<EOF > .profile.d/setup_bar.sh
    export BAR=2
    EOF
    """))

        foo_recipe = SequentialTask(processes=[setup_bashrc, setup_foo])
        bar_recipe = SequentialTask(processes=[setup_bashrc, setup_bar])
        all_recipes = Tasks.combine(foo_recipe, bar_recipe)

        run = Process(name="run",
                      cmdline=dedent("""
    echo $FOO $BAR > expected_output.txt
    """))

        my_task = Task(processes=[run],
                       resources=Resources(cpu=1.0,
                                           ram=16 * 1024 * 1024,
                                           disk=16 * 1024))
        return Tasks.concat(all_recipes, my_task, name="my_task")
Beispiel #12
0
def flaky_task():
    task = Task(name="failing_task",
                max_failures=2,
                processes=[
                    Process(name="a",
                            max_failures=1,
                            min_duration=1,
                            cmdline="echo hello world"),
                    Process(name="b",
                            max_failures=2,
                            min_duration=1,
                            cmdline="exit 1"),
                    Process(name="c",
                            max_failures=1,
                            min_duration=1,
                            final=True,
                            cmdline="echo hello world")
                ],
                constraints=[{
                    'order': ['a', 'b']
                }])
    return task.interpolate()[0]
Beispiel #13
0
 def task(cls):
     hello_template = Process(cmdline="sleep 1")
     tsk = Task(name="complex",
                processes=[
                    hello_template(name="process1"),
                    hello_template(name="process2"),
                    hello_template(name="process3")
                ],
                resources=Resources(cpu=1.0,
                                    ram=16 * 1024 * 1024,
                                    disk=16 * 1024),
                max_concurrency=1)
     return tsk
 def task(cls):
   ping_template = Process(
     name="{{process_name}}",
     min_duration=1,
     max_failures=5,
     cmdline = "echo {{process_name}} pinging;                                "
               "echo ping >> {{process_name}};                                "
               "echo current count $(cat {{process_name}} | wc -l);           "
               "if [ $(cat {{process_name}} | wc -l) -eq {{num_runs}} ]; then "
               "  exit 0;                                             "
               "else                                                  "
               "  exit 1;                                             "
               "fi                                                    ")
   tsk = Task(
     name = "pingping",
     resources = Resources(cpu = 1.0, ram = 16*1024*1024, disk = 16*1024),
     processes = [
       ping_template.bind(process_name = "p1", num_runs = 1),
       ping_template.bind(process_name = "p2", num_runs = 2),
       ping_template.bind(process_name = "p3", num_runs = 3),
     ]
   )
   return tsk.interpolate()[0]
 def task(cls):
     ping_template = Process(
         name="{{process_name}}",
         min_duration=1,
         max_failures=5,
         cmdline=
         "echo {{process_name}} pinging;                                "
         "echo ping >> {{process_name}};                                "
         "echo current count $(cat {{process_name}} | wc -l);           "
         "if [ $(cat {{process_name}} | wc -l) -eq {{num_runs}} ]; then "
         "  exit 0;                                             "
         "else                                                  "
         "  exit 1;                                             "
         "fi                                                    ")
     tsk = Task(name="pingping",
                resources=Resources(cpu=1.0,
                                    ram=16 * 1024 * 1024,
                                    disk=16 * 1024),
                processes=[
                    ping_template.bind(process_name="p1", num_runs=1),
                    ping_template.bind(process_name="p2", num_runs=2),
                    ping_template.bind(process_name="p3", num_runs=3),
                ])
     return tsk.interpolate()[0]
Beispiel #16
0
def simplerun(args, options):
    """Run a simple command line as a thermos task.

    Usage: thermos simplerun [options] [--] commandline
    Options:
      --user=USER		   run as this user.  if not $USER, must have setuid privilege.
      --name=STRING		   the name to give this task. ('simple' by default)
      --task_id=STRING		   the id to which this task should be bound, synthesized from the
                                   task name if none provided.
      -P/--port=NAME:PORT	   bind the named port NAME to port number PORT (may be specified
                                   multiple times to bind multiple names.)
      -E/--environment=NAME=VALUE  bind the configuration environment variable NAME to
                                   VALUE.
      --daemon			   Fork and daemonize the task.
  """
    try:
        cutoff = args.index('--')
        cmdline = ' '.join(args[cutoff + 1:])
    except ValueError:
        cmdline = ' '.join(args)

    print("Running command: '%s'" % cmdline)

    thermos_task = ThermosTaskWrapper(
        Task(name=options.name,
             resources=Resources(cpu=1.0, ram=256 * 1024 * 1024, disk=0),
             processes=[Process(name=options.name, cmdline=cmdline)]))

    _really_run(thermos_task,
                options.root,
                None,
                task_id=options.task_id,
                user=options.user,
                prebound_ports=options.prebound_ports,
                chroot=False,
                daemon=options.daemon)
Beispiel #17
0
    JobKey,
    Identity,
)

from pystachio import Map, String
from pystachio.naming import frozendict
import pytest

HELLO_WORLD = Job(name='hello_world',
                  role='john_doe',
                  environment='staging66',
                  cluster='smf1-test',
                  task=Task(
                      name='main',
                      processes=[
                          Process(name='hello_world',
                                  cmdline='echo {{mesos.instance}}')
                      ],
                      resources=Resources(cpu=0.1,
                                          ram=64 * 1048576,
                                          disk=64 * 1048576),
                  ))


def test_simple_config():
    job = convert_pystachio_to_thrift(HELLO_WORLD)
    assert job.instanceCount == 1
    tti = job.taskConfig
    assert job.key == JobKey(role=HELLO_WORLD.role().get(),
                             environment=HELLO_WORLD.environment().get(),
                             name=HELLO_WORLD.name().get())
    assert job.owner == Identity(role=HELLO_WORLD.role().get(),
import sys
import threading
import time

from twitter.common.process import ProcessProviderFactory
from twitter.common.quantity import Amount, Time
from twitter.thermos.config.schema import (Task, Resources, Process)
from twitter.thermos.core.runner import TaskRunner
from twitter.thermos.monitoring.monitor import TaskMonitor
from twitter.thermos.testing.runner import Runner

from gen.twitter.thermos.ttypes import (TaskState, ProcessState)

import pytest

sleepy_process = Process(name="sleepy", cmdline="sleep 3", min_duration=1)

ignore_script = [
    "import time, signal", "signal.signal(signal.SIGTERM, signal.SIG_IGN)",
    "time.sleep(1000)"
]

ignorant_process = Process(name="ignorant",
                           cmdline="%s -c '%s'" %
                           (sys.executable, ';'.join(ignore_script)),
                           min_duration=1)


class RunnerBase(object):
    @classmethod
    def task(cls):
 def task(cls):
     task = Task(
         name="task",
         processes=[Process(name="process", cmdline=SIMPLEFORK_SCRIPT)])
     return task.interpolate()[0]
 def task(cls):
     main = Process(name="main", cmdline="date && echo hello world")
     finalizer = Process(name="finalizer", cmdline="date", final=True)
     task = Task(name="task_with_finalizer", processes=[main, finalizer])
     return task.interpolate()[0]