diff --git a/playbooks/vino-collect-logs.yaml b/playbooks/vino-collect-logs.yaml new file mode 100644 index 0000000..0ff1132 --- /dev/null +++ b/playbooks/vino-collect-logs.yaml @@ -0,0 +1,21 @@ +# Copyright 2017 The Openstack-Helm Authors. +# +# 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. + +- hosts: all + vars: + logs_dir: "/tmp/vino_log" + environment: + LIBVIRT_DEFAULT_URI: qemu:///system + roles: + - vino-gather-pod-logs diff --git a/roles/vino-gather-pod-logs/defaults/main.yaml b/roles/vino-gather-pod-logs/defaults/main.yaml new file mode 100644 index 0000000..2417cad --- /dev/null +++ b/roles/vino-gather-pod-logs/defaults/main.yaml @@ -0,0 +1,13 @@ +# 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. + +kubeconfig: "{{ airshipctl_config_dir_default | default(ansible_env.HOME) }}/.kube/config" diff --git a/roles/vino-gather-pod-logs/tasks/get-contexts.yaml b/roles/vino-gather-pod-logs/tasks/get-contexts.yaml new file mode 100644 index 0000000..60886d8 --- /dev/null +++ b/roles/vino-gather-pod-logs/tasks/get-contexts.yaml @@ -0,0 +1,20 @@ +# 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. + + - name: "Save kubeconfig contexts" + shell: |- + kubectl --kubeconfig {{ kubeconfig }} config get-contexts -o name + register: kctl_context_command + + - name: "Save kubeconfig contexts to list" + set_fact: + kctl_context_list: "{{ kctl_context_command.stdout.split('\n') }}" diff --git a/roles/vino-gather-pod-logs/tasks/main.yaml b/roles/vino-gather-pod-logs/tasks/main.yaml new file mode 100644 index 0000000..59a58fa --- /dev/null +++ b/roles/vino-gather-pod-logs/tasks/main.yaml @@ -0,0 +1,29 @@ +# 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. + +## This task will populate kctl_context_list variable with list of contexts if they exist +- name: "Get context list" + include_tasks: get-contexts.yaml + +- name: "Save logs for each context" + include_tasks: save-context-logs.yaml + when: kctl_context_list | length > 0 + with_items: "{{ kctl_context_list }}" + loop_control: + loop_var: kctl_context + +- name: "Downloads pod logs to executor" + synchronize: + src: "{{ logs_dir }}/pod-logs" + dest: "{{ zuul.executor.log_root }}/{{ inventory_hostname }}" + mode: pull + ignore_errors: True diff --git a/roles/vino-gather-pod-logs/tasks/save-context-logs.yaml b/roles/vino-gather-pod-logs/tasks/save-context-logs.yaml new file mode 100644 index 0000000..eee04aa --- /dev/null +++ b/roles/vino-gather-pod-logs/tasks/save-context-logs.yaml @@ -0,0 +1,60 @@ +# 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" + done + } + export -f get_pod_logs + kubectl config use-context {{ kctl_context }} + 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 + register: vino_pod_log + ignore_errors: True +- debug: var=vino_pod_log.stdout diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml index c44b37e..02bbd90 100644 --- a/zuul.d/jobs.yaml +++ b/zuul.d/jobs.yaml @@ -24,6 +24,7 @@ - job: name: airship-deploy-vino run: playbooks/integration-test.yaml + post-run: playbooks/vino-collect-logs.yaml description: Deploys kubernetes and vino timeout: 9600