Commit Graph

807 Commits

Author SHA1 Message Date
David Wilson 135b3738ba ansible: don't wait on FileService response
Any (unlikely) execption will show up in the debug logs.
2018-04-09 03:00:47 +01:00
David Wilson 70a735f23a ansible: tidy up service.py docstrings. 2018-04-09 03:00:31 +01:00
David Wilson 79b75aabae ansilbe: remove unused class variables 2018-04-09 02:37:17 +01:00
David Wilson 43ecbe350c docs: rearrange more ansible risks 2018-04-09 00:32:52 +01:00
David Wilson 19a418cc6f docs: document mitogen_task_isolation. 2018-04-09 00:10:21 +01:00
David Wilson ba74f8f743 docs: remove Ansible risk 2018-04-09 00:05:57 +01:00
David Wilson 3613162bc0 ansible: enable forking when requested and for async jobs.
Closes #105.
References #155.

mitogen/service.py:
    Refactor services to support individually exposed methods with
    different security policies for each method.

    - @mitogen.service.expose() to expose a method and set its policy
    - @mitogen.service.arg_spec() to validate input.
    - Require basic service message format to be a tuple of
      `(method, kwargs)`, where kwargs is always a dict.
    - Update DeduplicatingService to match the new scheme.

ansible_mitogen/connection.py:
    - Rename 'method' to 'method_name' to disambiguate it from the
      service.call()'s method= argument.

ansible_mitogen/planner.py:
    - Generate an ID for every job, sync or not, and fetch job results
      from JobResultService rather than via the initiating function
      call's return value.
    - Planner subclasses now get to select whether their Runner should
      run in a forked process. The base implementation requests this if
      the 'mitogen_isolation_mode=fork' task variable is present.

ansible_mitogen/runner.py:
    Teach runners to deliver their result via JobResultService executing
    in their indirect parent mux process.

ansible_mitogen/plugins/actions/mitogen_async_status.py:
    Split the implementation up into methods, and more compatibly
    emulate Ansible's existing output.

ansible_mitogen/process.py:
    Mux processes now host JobResultService.

ansible_mitogen/services.py:
    Update existing services to the new mitogen.service scheme, and
    implement JobResultService:

    * listen() method for synchronous jobs. planner.invoke() registers a
      Sender with the service prior to invoking the job, then sleeps
      waiting for the service to write the job result to the
      corresponding Receiver.

    * Non-blocking get() method for implementing mitogen_async_status
      action.

    * Child-accessible push() method for delivering task results.

ansible_mitogen/target.py:
    New helpers for spawning a virginal subprocess on startup, from
    which asynchronous and mitogen_task_isolation=fork jobs are forked.
    Necessary to avoid a task inheriting potentially
    polluted/monkey-patched parent environment, since remaining jobs
    continue to run in the original child process.

docs/ansible.rst:
    Add/merge/remove some behaviours/risks.

tests/ansible/integration:
    New tests for forking/async.
2018-04-09 00:03:09 +01:00
David Wilson 71057c78f9 ansible: rename helpers.py to target.py, to reflect its purpose 2018-04-08 19:34:03 +01:00
David Wilson a643f13ebe issue #106: docs: tidyup. 2018-04-06 17:18:37 +01:00
David Wilson 432ebbca89 issue #106: docs: initial docs for how modules execute. 2018-04-06 17:09:14 +01:00
David Wilson b595314619 docs: fix intensely annoying _prefix, 2 years later. 2018-04-06 16:50:36 +01:00
David Wilson b247c320d2 issue #164: rename tests for clarity 2018-04-06 15:10:33 +01:00
David Wilson f655be1455 ssh: fix password prompt check when running with -vvv
Can only happen by hacking -vvv into ssh.py at present, but that will
probably be exposed via a constructor parameter in future.
2018-04-05 22:53:19 +01:00
David Wilson bc4a6b39bf issue #164: teach debops_tests.sh to use SSH
Login with a non-privileged account over SSH rather than just jumping
straight in as root via Docker.
2018-04-05 22:52:02 +01:00
David Wilson cd098ef158 issue #183: re-raise StreamError in calling context.
This allows catching just StreamError regardless of via=None or
via=<context>. Deserves a more general solution, but it's easy to fix up
later.
2018-04-05 22:40:02 +01:00
David Wilson 998a1209cc issue #183: make PasswordErrors subclass of StreamError. 2018-04-05 21:48:43 +01:00
David Wilson 35fdd97f9a issue #164: utility to print Docker hostname for use from shell scripts. 2018-04-05 20:24:11 +01:00
David Wilson 7fd88868a6 ansible: raise AnsibleConnectionFailure on connection failure; closes #183
Before:

    $ ANSIBLE_STRATEGY=mitogen ansible -i derp, derp -m setup
    An exception occurred during task execution. To see the full traceback, use -vvv. The error was:     (''.join(bits)[-300:],)
    derp | FAILED! => {
        "msg": "Unexpected failure during module execution.",
        "stdout": ""
    }

After:

    $ ANSIBLE_STRATEGY=mitogen ansible -i derp, derp -m setup
    derp | UNREACHABLE! => {
        "changed": false,
        "msg": "EOF on stream; last 300 bytes received: 'ssh: Could not resolve hostname derp: nodename nor servname provided, or not known\\r\\n'",
        "unreachable": true
    }
2018-04-05 20:14:14 +01:00
David Wilson b9d4ec57b3 issue #164: some more ActionMixin tests. 2018-04-05 19:36:08 +01:00
David Wilson 4a823c7a27 issue #164: missing cast() for _remote_file_exists(). 2018-04-05 19:35:03 +01:00
David Wilson 29288b236b issue #164: import run_ansible_playbook.sh. 2018-04-05 19:34:44 +01:00
David Wilson db894478f8 issue #164: make become_flags work without FOO=2 env var. 2018-04-05 17:42:43 +01:00
David Wilson e4b49997d6 issue #164: whups, delete checked in binaries. 2018-04-05 16:34:54 +00:00
David Wilson d068a36c1e issue #164: more dir layout contortions.
all.yml slurps in tests from each file/subdir in the CWD.
2018-04-05 17:32:56 +01:00
David Wilson 680dc1bf68 issue #164: basic connection loader tests. 2018-04-05 17:27:42 +01:00
David Wilson 20ecd0af02 issue #164: fix makefile 2018-04-05 17:27:16 +01:00
David Wilson 48a0938d04 issue #164: add action module to return active strategy. 2018-04-05 17:27:02 +01:00
David Wilson 0247561fc7 issue #164: rename lib/modules 2018-04-05 17:26:43 +01:00
David Wilson d503956493 ansible: Remove duplicate casts already done in Connection 2018-04-05 02:55:27 +01:00
David Wilson 6aeb4e9f05 issue #164: precisely emulate Ansible's stdio behaviour.
* Use identical logic to select when stdout/stderr are merged, so
  'stdout', 'stdout_lines', 'stderr', 'stderr_lines' contain the same
  output before/after the extension.

* When stdout/stderr are merged, synthesize carriage returns just like
  the TTY layer.

* Mimic the SSH connection multiplexing message on stderr. Not really
  for user code, but so compare_output_test.sh needs fewer fixups.
2018-04-05 01:16:34 +01:00
David Wilson c5ca2e87ea issue #164: stop tests on first failure 2018-04-05 00:11:29 +01:00
David Wilson 26cc0f2724 issue #164: fix remote_tmp handling on <2.5 2018-04-04 20:19:46 +01:00
David Wilson 3ebe600389 issue #164: convert "examples" into actual tests
- Add new Travis mode, "ansible_tests.sh" that runs
  integrations/all.yml. Slowly build this up over time to cover more of
  the existing junk.

- Add basic assertions on the output of the existing runner__* files.

- Wire up 2.4.3/2.5.0 jobs in Travis.
2018-04-04 20:01:23 +01:00
David Wilson ae75a0ca8c issue #164: rearrange playbooks a little more 2018-04-04 16:11:19 +01:00
David Wilson 563639961d issue #164: dir structure is gross, but at least tab completion works :> 2018-04-04 16:08:38 +01:00
David Wilson 475d459185 issue #164: rename 'test' to 'run_tests' to avoid tab complete conflict 2018-04-04 16:00:09 +01:00
David Wilson 49aa8834b0 issue #164: split "examples" out into regression/integration tests. 2018-04-04 15:59:29 +01:00
David Wilson aa8d7a0250 issue #164: verify remote_tmp respected by code running remotely. 2018-04-04 15:41:57 +01:00
David Wilson e0381606af Ensure remote_tmp is respected everywhere.
Logic is still somewhat different from Ansible: we don't have to care
about sudo/non-sudo cases, etc.
2018-04-04 14:05:57 +01:00
David Wilson 4805f3cf36 issue #164: slightly flatten docker image layers 2018-04-04 14:04:22 +01:00
David Wilson 8249fa2019 issue #164: typo x2. 2018-04-04 13:22:02 +01:00
David Wilson b9afde0e61 issue #164: typo. 2018-04-04 13:11:35 +01:00
David Wilson 058ddeee58 issue #164: run against 4 targets. 2018-04-04 12:59:22 +01:00
David Wilson 4c842751d0 issue #164: run twice to make timing comparable to old reports 2018-04-04 12:48:25 +01:00
David Wilson 2128ffafce issue #164: cure type error. 2018-04-04 12:35:07 +01:00
David Wilson 5bf5664667 issue #164: speed up DH generation step 2018-04-04 12:30:48 +01:00
David Wilson de5028ac18 issue #164: arrange for DebOps common.yml to run under Travis. 2018-04-04 11:00:24 +01:00
David Wilson 38311336e1 docs: link to Ansible video demo 2018-04-03 11:13:41 +01:00
David Wilson 0e648dbd53 ansible: tidy up planner.py. 2018-04-02 11:35:39 +01:00
David Wilson a731be32a2 ansible: use _ansible_shell_executable in ScriptRunner.
Now we match Ansible error output and exit status. Ansible:

    $ ansible localhost -e end=2 -m custom_binary_single_null
    localhost | FAILED! => {
        "changed": false,
        "module_stderr": "Shared connection to localhost closed.\r\n",
        "module_stdout": "/bin/sh: /Users/dmw/.ansible/tmp/ansible-tmp-1522661797.42-158833651208060/custom_binary_single_null: cannot execute binary file\r\n",
        "msg": "MODULE FAILURE",
        "rc": 126
    }

Mitogen now:

    localhost | FAILED! => {
        "changed": false,
        "module_stderr": "/bin/sh: /var/folders/gw/f6w3dgy16fsg5y4kdthbqycw0000gn/T/ansible_mitogenAYF8LM-binary: cannot execute binary file\n",
        "module_stdout": "",
        "msg": "MODULE FAILURE",
        "rc": 126
    }

Previously:

    localhost | FAILED! => {
        "changed": false,
        "module_stderr": "<type 'exceptions.OSError'>: [Errno 8] Exec format error",
        "module_stdout": "",
        "msg": "MODULE FAILURE",
        "rc": 1
    }
2018-04-02 10:37:23 +01:00