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

Reply via email to