This is an automated email from the ASF dual-hosted git repository.

cbickel pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk.git


The following commit(s) were added to refs/heads/master by this push:
     new 818cebf  Refactor invoker roles (#3785)
818cebf is described below

commit 818cebf941e66beef553e79831740f8632e78c68
Author: James Dubee <jwdu...@us.ibm.com>
AuthorDate: Fri Jul 6 10:01:33 2018 -0400

    Refactor invoker roles (#3785)
    
    * Refactor invoker roles
    
    * Make invoker environment variable name generic
    
    * Use base index for invoker name
---
 ansible/invoker.yml                    | 22 ++++++++++++++-
 ansible/roles/invoker/tasks/clean.yml  | 19 ++++++++-----
 ansible/roles/invoker/tasks/deploy.yml | 51 ++++++++++++++++++++--------------
 3 files changed, 63 insertions(+), 29 deletions(-)

diff --git a/ansible/invoker.yml b/ansible/invoker.yml
index 479764d..9ab49e2 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 d9b2db3..9df25e7 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 d7afdce..65d741c 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

Reply via email to