diff --git a/playbooks/airship-collect-logs.yaml b/playbooks/airship-collect-logs.yaml index 7c376bf92..2fb51d775 100644 --- a/playbooks/airship-collect-logs.yaml +++ b/playbooks/airship-collect-logs.yaml @@ -24,3 +24,7 @@ environment: LIBVIRT_DEFAULT_URI: qemu:///system + tasks: + - name: save logs for ephemeral cluster + include_role: + name: airship-gather-pod-logs diff --git a/roles/airship-gather-pod-logs/defaults/main.yaml b/roles/airship-gather-pod-logs/defaults/main.yaml new file mode 100644 index 000000000..75185655a --- /dev/null +++ b/roles/airship-gather-pod-logs/defaults/main.yaml @@ -0,0 +1,14 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +kctl_context: dummy_cluster +kubeconfig: "{{ airshipctl_config_dir_default | default(ansible_env.HOME) }}/.airship/kubeconfig" diff --git a/roles/airship-gather-pod-logs/tasks/main.yaml b/roles/airship-gather-pod-logs/tasks/main.yaml new file mode 100644 index 000000000..5f587816b --- /dev/null +++ b/roles/airship-gather-pod-logs/tasks/main.yaml @@ -0,0 +1,66 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# NOTE this role has been copied from https://github.com/openstack/openstack-helm-infra/blob/8617c8c1e0ea5fc55d652ccd2a8c2eedf16f69ad/roles/gather-pod-logs/tasks/main.yaml + +- name: "creating directory for pod logs" + file: + path: "{{ logs_dir }}/pod-logs/{{ kctl_context }}" + state: directory + +- name: "creating directory for failed pod logs" + file: + path: "{{ logs_dir }}/pod-logs/{{ kctl_context }}/failed-pods" + state: directory + +- name: "retrieve all container logs, current and previous (if they exist)" + shell: |- + set -e + export KUBECONFIG="{{ kubeconfig }}" + PARALLELISM_FACTOR=2 + function get_namespaces () { + kubectl get namespaces -o name | awk -F '/' '{ print $NF }' + } + function get_pods () { + NAMESPACE=$1 + kubectl get pods -n ${NAMESPACE} -o name | awk -F '/' '{ print $NF }' | xargs -L1 -P 1 -I {} echo ${NAMESPACE} {} + } + export -f get_pods + function get_pod_logs () { + NAMESPACE=${1% *} + POD=${1#* } + INIT_CONTAINERS=$(kubectl get pod $POD -n ${NAMESPACE} -o jsonpath='{.spec.initContainers[*].name}') + CONTAINERS=$(kubectl get pod $POD -n ${NAMESPACE} -o jsonpath='{.spec.containers[*].name}') + for CONTAINER in ${INIT_CONTAINERS} ${CONTAINERS}; do + echo "${NAMESPACE}/${POD}/${CONTAINER}" + mkdir -p "{{ logs_dir }}/pod-logs/{{ kctl_context }}/${NAMESPACE}/${POD}" + mkdir -p "{{ logs_dir }}/pod-logs/{{ kctl_context }}/failed-pods/${NAMESPACE}/${POD}" + kubectl logs ${POD} -n ${NAMESPACE} -c ${CONTAINER} > "{{ logs_dir }}/pod-logs/{{ kctl_context }}/${NAMESPACE}/${POD}/${CONTAINER}.txt" + kubectl logs --previous ${POD} -n ${NAMESPACE} -c ${CONTAINER} > "{{ logs_dir }}/pod-logs/{{ kctl_context }}/failed-pods/${NAMESPACE}/${POD}/${CONTAINER}.txt" + done + } + export -f get_pod_logs + kubectl config use-context {{ kctl_context | default("dummy_cluster") }} + get_namespaces | \ + xargs -r -n 1 -P ${PARALLELISM_FACTOR} -I {} bash -c 'get_pods "$@"' _ {} | \ + xargs -r -n 2 -P ${PARALLELISM_FACTOR} -I {} bash -c 'get_pod_logs "$@"' _ {} + args: + executable: /bin/bash + ignore_errors: True + +- name: "Downloads pod logs to executor" + synchronize: + src: "{{ logs_dir }}/pod-logs" + dest: "{{ zuul.executor.log_root }}/{{ inventory_hostname }}" + mode: pull + ignore_errors: True