Skip to content

Commit

Permalink
upgrade: statefulset patching refactor
Browse files Browse the repository at this point in the history
- patching all containers (fix)
- patching init containers also (fix)
- removing include_tasks statements (speedup)
  • Loading branch information
sk4zuzu committed Jul 22, 2020
1 parent b32770d commit 1989cc4
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
- name: k8s/master | Patch keycloak's statefulset
include_tasks: utils/patch-statefulset.yml
vars:
image_regexp: 'jboss/keycloak:'
image_regexp: 'jboss/keycloak:.*'
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
- name: k8s/master | Patch rabbitmq's statefulset
include_tasks: utils/patch-statefulset.yml
vars:
image_regexp: 'rabbitmq:'
image_regexp: 'rabbitmq:.*'

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

- name: k8s/utils | Get all statefulsets
environment:
KUBECONFIG: /etc/kubernetes/admin.conf
KUBECONFIG: &KUBECONFIG /etc/kubernetes/admin.conf
command: |
kubectl get statefulsets.apps \
--all-namespaces \
Expand All @@ -14,24 +14,103 @@
changed_when: false

- name: k8s/utils | Patch all statefulsets
environment:
KUBECONFIG: *KUBECONFIG
block:
- name: k8s/utils | Patch statefulset {{ _statefulset }}
include_tasks: patch-statefulset-step.yml
- name: k8s/utils | Patch statefulset (containers)
when:
- _item.changed
command: |
kubectl patch statefulsets.apps {{ _item.metadata.name }} \
--namespace {{ _item.metadata.namespace }} \
--patch '{{ _patch | to_json }}'
vars:
_patch:
spec:
template:
spec:
containers:
- "{{ _item.data }}"
loop_control:
loop_var: _item
loop: >-
{{ _updates.containers }}
- name: k8s/utils | Patch statefulset (initContainers)
when:
- _item.changed
command: |
kubectl patch statefulsets.apps {{ _item.metadata.name }} \
--namespace {{ _item.metadata.namespace }} \
--patch '{{ _patch | to_json }}'
vars:
_namespace: "{{ item.0 }}"
_statefulset: "{{ item.1 }}"
_patch:
spec:
template:
spec:
initContainers:
- "{{ _item.data }}"
loop_control:
loop_var: _item
loop: >-
{{ _namespaces | zip(_statefulsets) | list }}
{{ _updates.initContainers }}
vars:
# Parse output from kubeadm
_documents: >-
{{ (command_statefulsets.stdout | from_json)['items'] }}
# Extract namespaces from all documents
_namespaces: >-
{{ _documents | map(attribute='metadata.namespace') | list }}
_updates: >-
{%- set ns = namespace() -%}
{%- set ns.containers = [] -%}
{%- set ns.initContainers = [] -%}
{%- for document in _documents -%}
{%- set ns.images = document.spec.template.spec.containers | map(attribute='image') | list -%}
{%- if ns.images | map('regex_search', image_regexp) | select | list -%}
{%- set ns.prefixes = (ns.images | map('regex_replace', image_regexp) | unique | list) + [image_registry_address ~ '/'] -%}
{%- set ns.lengths = ns.prefixes | map('length') | list -%}
{%- set ns.prefixes_sorted = ns.prefixes | zip(ns.lengths) | sort(attribute=1, reverse=true) | list -%}
{%- for container in document.spec.template.spec.containers -%}
{%- set ns.image = container.image -%}
{%- for prefix, _ in ns.prefixes_sorted -%}
{%- set ns.image = ns.image | regex_replace('^' ~ prefix) -%}
{%- endfor -%}
{%- set ns.image = image_registry_address ~ '/' ~ ns.image -%}
{{-
ns.containers.append({
"metadata": { "name": document.metadata.name, "namespace": document.metadata.namespace },
"data": { "name": container.name, "image": ns.image },
"changed": ns.image != container.image,
})
-}}
{%- endfor -%}
{%- for container in document.spec.template.spec.initContainers | default([]) -%}
{%- set ns.image = container.image -%}
{%- for prefix, _ in ns.prefixes_sorted -%}
{%- set ns.image = ns.image | regex_replace('^' ~ prefix) -%}
{%- endfor -%}
{%- set ns.image = image_registry_address ~ '/' ~ ns.image -%}
{{-
ns.initContainers.append({
"metadata": { "name": document.metadata.name, "namespace": document.metadata.namespace },
"data": { "name": container.name, "image": ns.image },
"changed": ns.image != container.image,
})
-}}
{%- endfor -%}
{%- endif -%}
{%- endfor -%}
# Extract statefulset names from all documents
_statefulsets: >-
{{ _documents | map(attribute='metadata.name') | list }}
{{- dict(containers=ns.containers, initContainers=ns.initContainers) -}}

0 comments on commit 1989cc4

Please sign in to comment.