cbickel closed pull request #3785: Refactor invoker roles
URL: https://github.com/apache/incubator-openwhisk/pull/3785
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/ansible/invoker.yml b/ansible/invoker.yml
index 479764dc2c..9ab49e256f 100644
--- a/ansible/invoker.yml
+++ b/ansible/invoker.yml
@@ -4,5 +4,25 @@
# This playbook deploys Openwhisk Invokers.
- hosts: invokers
+ vars:
+ #
+ # host_group - usually "{{ groups['...'] }}" where '...' is what was used
+ # for 'hosts' above. The hostname of each host will be looked up in this
+ # group to assign a zero-based index. That index will be used in concert
+ # with 'name_prefix' below to assign a host/container name.
+ host_group: "{{ groups['invokers'] }}"
+ #
+ # name_prefix - a unique prefix for this set of invokers. The prefix
+ # will be used in combination with an index (determined using
+ # 'host_group' above) to name host/invokers.
+ name_prefix: "invoker"
+ #
+ # invoker_index_base - the deployment process allocates host docker
+ # ports to individual invokers based on their indices. This is an
+ # additional offset to prevent collisions between different invoker
+ # groups. Usually 0 if only one group is being deployed, otherwise
+ # something like "{{ groups['firstinvokergroup']|length }}"
+ invoker_index_base: 0
+
roles:
- - invoker
+ - invoker
diff --git a/ansible/roles/invoker/tasks/clean.yml
b/ansible/roles/invoker/tasks/clean.yml
index d9b2db32e7..9df25e713b 100644
--- a/ansible/roles/invoker/tasks/clean.yml
+++ b/ansible/roles/invoker/tasks/clean.yml
@@ -3,9 +3,14 @@
---
# Remove invoker containers.
+- name: get invoker name and index
+ set_fact:
+ invoker_name: "{{ name_prefix ~ ((invoker_index_base | int) +
host_group.index(inventory_hostname)) }}"
+ invoker_index: "{{ (invoker_index_base | int) +
host_group.index(inventory_hostname) }}"
+
- name: remove invoker
docker_container:
- name: "invoker{{ groups['invokers'].index(inventory_hostname) }}"
+ name: "{{ invoker_name }}"
image: "{{ docker_registry }}{{ docker.image.prefix }}/invoker:{{
docker.image.tag }}"
state: absent
stop_timeout: 60
@@ -15,9 +20,9 @@
# In case the invoker could not clean up completely in time.
- name: pause/resume at runc-level to restore docker consistency
shell: |
- DOCKER_PAUSED=$(docker ps --filter status=paused --filter name=wsk{{
groups['invokers'].index(inventory_hostname) }} -q --no-trunc)
+ DOCKER_PAUSED=$(docker ps --filter status=paused --filter name=wsk{{
invoker_index }} -q --no-trunc)
for C in $DOCKER_PAUSED; do docker-runc pause $C; done
- DOCKER_RUNNING=$(docker ps --filter status=running --filter name=wsk{{
groups['invokers'].index(inventory_hostname) }} -q --no-trunc)
+ DOCKER_RUNNING=$(docker ps --filter status=running --filter name=wsk{{
invoker_index }} -q --no-trunc)
for C2 in $DOCKER_RUNNING; do docker-runc resume $C2; done
TOTAL=$(($(echo $DOCKER_PAUSED | wc -w)+$(echo $DOCKER_RUNNING | wc
-w)))
echo "Handled $TOTAL remaining actions."
@@ -28,22 +33,22 @@
- debug: msg="{{ runc_output.stdout }}"
- name: unpause remaining actions
- shell: "docker unpause $(docker ps -aq --filter status=paused --filter
name=wsk{{ groups['invokers'].index(inventory_hostname) }})"
+ shell: "docker unpause $(docker ps -aq --filter status=paused --filter
name=wsk{{ invoker_index }})"
failed_when: False
- name: remove remaining actions
- shell: "docker rm -f $(docker ps -aq --filter name=wsk{{
groups['invokers'].index(inventory_hostname) }})"
+ shell: "docker rm -f $(docker ps -aq --filter name=wsk{{ invoker_index }})"
failed_when: False
- name: remove invoker log directory
file:
- path: "{{ whisk_logs_dir }}/invoker{{
groups['invokers'].index(inventory_hostname) }}"
+ path: "{{ whisk_logs_dir }}/{{ invoker_name }}"
state: absent
become: "{{ logs.dir.become }}"
- name: remove invoker conf directory
file:
- path: "{{ invoker.confdir }}/invoker{{
groups['invokers'].index(inventory_hostname) }}"
+ path: "{{ invoker.confdir }}/{{ invoker_name }}"
state: absent
become: "{{ invoker.dir.become }}"
diff --git a/ansible/roles/invoker/tasks/deploy.yml
b/ansible/roles/invoker/tasks/deploy.yml
index d7afdce03f..65d741cf73 100644
--- a/ansible/roles/invoker/tasks/deploy.yml
+++ b/ansible/roles/invoker/tasks/deploy.yml
@@ -5,6 +5,11 @@
- import_tasks: docker_login.yml
+- name: get invoker name and index
+ set_fact:
+ invoker_name: "{{ name_prefix ~ ((invoker_index_base | int) +
host_group.index(inventory_hostname)) }}"
+ invoker_index: "{{ (invoker_index_base | int) +
host_group.index(inventory_hostname) }}"
+
- name: "pull invoker image with tag {{docker.image.tag}}"
shell: "docker pull {{docker_registry}}{{ docker.image.prefix
}}/invoker:{{docker.image.tag}}"
when: docker_registry != ""
@@ -63,14 +68,14 @@
- name: ensure invoker log directory is created with permissions
file:
- path: "{{ whisk_logs_dir }}/invoker{{
groups['invokers'].index(inventory_hostname) }}"
+ path: "{{ whisk_logs_dir }}/{{ invoker_name }}"
state: directory
mode: 0777
become: "{{ logs.dir.become }}"
- name: ensure invoker config directory is created with permissions
file:
- path: "{{ invoker.confdir }}/invoker{{
groups['invokers'].index(inventory_hostname) }}"
+ path: "{{ invoker.confdir }}/{{ invoker_name }}"
state: directory
mode: 0777
become: "{{ invoker.dir.become }}"
@@ -79,7 +84,7 @@
when: kafka.protocol == 'SSL'
copy:
src: "{{ openwhisk_home }}/ansible/roles/kafka/files/{{
kafka.ssl.keystore.name }}"
- dest: "{{ invoker.confdir }}/invoker{{
groups['invokers'].index(inventory_hostname) }}"
+ dest: "{{ invoker.confdir }}/{{ invoker_name }}"
- name: check, that required databases exist
include_tasks: "{{ openwhisk_home }}/ansible/tasks/db/checkDb.yml"
@@ -124,20 +129,20 @@
fail:
msg: "invoker index is invalid. expected: /invoker{{
groups['invokers'].index(inventory_hostname) }} found: {{ item.Names[0] }}"
with_items: "{{ invokerInfo }}"
- when: not invoker.allowMultipleInstances and item.Names[0] != "/invoker{{
groups['invokers'].index(inventory_hostname) }}"
+ when: not invoker.allowMultipleInstances and item.Names[0] != "/{{
invoker_name }}"
- name: copy jmxremote password file
when: jmx.enabled
template:
src: "jmxremote.password.j2"
- dest: "{{ invoker.confdir }}/invoker{{
groups['invokers'].index(inventory_hostname) }}/jmxremote.password"
+ dest: "{{ invoker.confdir }}/{{ invoker_name }}/jmxremote.password"
mode: 0777
- name: copy jmxremote access file
when: jmx.enabled
template:
src: "jmxremote.access.j2"
- dest: "{{ invoker.confdir }}/invoker{{
groups['invokers'].index(inventory_hostname) }}/jmxremote.access"
+ dest: "{{ invoker.confdir }}/{{ invoker_name }}/jmxremote.access"
mode: 0777
- name: add additional jvm params if jmxremote is enabled
@@ -147,20 +152,20 @@
- name: prepare invoker ports
set_fact:
- ports_to_expose: ["{{ invoker.port +
groups['invokers'].index(inventory_hostname) }}:8080"]
+ ports_to_expose: ["{{ invoker.port + (invoker_index | int) }}:8080"]
- name: expose additional ports if jmxremote is enabled
when: jmx.enabled
set_fact:
- ports_to_expose: "{{ ports_to_expose }} + [ \"{{ jmx.basePortInvoker +
groups['invokers'].index(inventory_hostname) }}:{{ jmx.basePortInvoker +
groups['invokers'].index(inventory_hostname) }}\" ] + [ \"{{
jmx.rmiBasePortInvoker + groups['invokers'].index(inventory_hostname) }}:{{
jmx.rmiBasePortInvoker + groups['invokers'].index(inventory_hostname) }}\" ]"
+ ports_to_expose: "{{ ports_to_expose }} + [ \"{{ jmx.basePortInvoker +
(invoker_index | int) }}:{{ jmx.basePortInvoker + (invoker_index | int) }}\" ]
+ [ \"{{ jmx.rmiBasePortInvoker + (invoker_index | int) }}:{{
jmx.rmiBasePortInvoker + (invoker_index | int) }}\" ]"
-- name: prepare invoker env
+- name: populate environment variables for invoker
set_fact:
- invoker_env:
+ env:
"JAVA_OPTS": "-Xmx{{ invoker.heap }} -XX:+CrashOnOutOfMemoryError
-XX:+UseGCOverheadLimit -XX:ErrorFile=/logs/java_error.log"
"INVOKER_OPTS": "{{ invoker_args | default(invoker.arguments) }}"
"JMX_REMOTE": "{{ jmx.enabled }}"
- "COMPONENT_NAME": "invoker{{
groups['invokers'].index(inventory_hostname) }}"
+ "COMPONENT_NAME": "{{ invoker_name }}"
"PORT": 8080
"KAFKA_HOSTS": "{{ kafka_connect_string }}"
"CONFIG_whisk_kafka_replicationFactor": "{{ kafka.replicationFactor |
default() }}"
@@ -201,7 +206,7 @@
"CONFIG_whisk_containerPool_numCore": "{{ invoker.numcore }}"
"CONFIG_whisk_containerPool_coreShare": "{{ invoker.coreshare }}"
"CONFIG_whisk_docker_containerFactory_useRunc": "{{ invoker.useRunc }}"
- "INVOKER_NAME": "{{ groups['invokers'].index(inventory_hostname) }}"
+ "INVOKER_NAME": "{{ invoker_index }}"
"WHISK_LOGS_DIR": "{{ whisk_logs_dir }}"
"METRICS_KAMON": "{{ metrics.kamon.enabled }}"
"METRICS_KAMON_TAGS": "{{ metrics.kamon.tags }}"
@@ -221,18 +226,22 @@
- name: extend invoker dns env
set_fact:
- invoker_env: "{{ invoker_env | default({}) | combine(
{'CONFIG_whisk_containerFactory_containerArgs_dnsServers_' ~ item.0: item.1} )
}}"
+ env: "{{ env | default({}) | combine(
{'CONFIG_whisk_containerFactory_containerArgs_dnsServers_' ~ item.0: item.1} )
}}"
with_indexed_items: "{{ (invoker_container_network_dns_servers |
default()).split(' ')}}"
- name: merge extra env variables
set_fact:
- invoker_env: "{{ invoker_env | combine(invoker.extraEnv) }}"
+ env: "{{ env | combine(invoker.extraEnv) }}"
+
+- name: include plugins
+ include_tasks: "{{ item }}.yml"
+ with_items: "{{ invoker_plugins | default([]) }}"
- name: set invoker volumes
set_fact:
volumes: "/sys/fs/cgroup:/sys/fs/cgroup,/run/runc:/run/runc,\
- {{ whisk_logs_dir }}/invoker{{
groups['invokers'].index(inventory_hostname) }}:/logs,\
- {{ invoker.confdir }}/invoker{{
groups['invokers'].index(inventory_hostname) }}:/conf,\
+ {{ whisk_logs_dir }}/{{ invoker_name }}:/logs,\
+ {{ invoker.confdir }}/{{ invoker_name }}:/conf,\
{{ dockerInfo['DockerRootDir'] }}/containers/:/containers,\
{{ docker_sock | default('/var/run/docker.sock') }}:/var/run/docker.sock"
@@ -246,20 +255,20 @@
userns_mode: "host"
pid_mode: "host"
privileged: "yes"
- name: invoker{{ groups['invokers'].index(inventory_hostname) }}
- hostname: "invoker{{ groups['invokers'].index(inventory_hostname) }}"
+ name: "{{ invoker_name }}"
+ hostname: "{{ invoker_name }}"
restart_policy: "{{ docker.restart.policy }}"
image: "{{ docker_registry }}{{ docker.image.prefix }}/invoker:{{
docker.image.tag }}"
state: started
recreate: true
- env: "{{ invoker_env }}"
+ env: "{{ env }}"
volumes: "{{ volumes }}"
ports: "{{ ports_to_expose }}"
- command: /bin/sh -c "exec /init.sh {{
groups['invokers'].index(inventory_hostname) }} >> /logs/invoker{{
groups['invokers'].index(inventory_hostname) }}_logs.log 2>&1"
+ command: /bin/sh -c "exec /init.sh {{ invoker_index }} >> /logs/{{
invoker_name }}_logs.log 2>&1"
- name: wait until Invoker is up and running
uri:
- url: "http://{{ ansible_host }}:{{ invoker.port +
groups['invokers'].index(inventory_hostname) }}/ping"
+ url: "http://{{ ansible_host }}:{{ invoker.port + (invoker_index | int)
}}/ping"
register: result
until: result.status == 200
retries: 12
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services