Enable netchecker for CI
* Enable netchecker app for CI postinstall tests * Rework outputs and better coverage to the ping between pods post intall test case. With netchecker deployed, the test covers hostnet to hostnet and standard to standrad pods ping check as well. Signed-off-by: Bogdan Dobrelya <bdobrelia@mirantis.com>
This commit is contained in:
parent
dcbadcbff3
commit
85f8dfbca0
4 changed files with 115 additions and 13 deletions
|
@ -127,7 +127,7 @@ script:
|
||||||
-e inventory_path=${PWD}/inventory/inventory.ini
|
-e inventory_path=${PWD}/inventory/inventory.ini
|
||||||
-e cloud_region=${CLOUD_REGION}
|
-e cloud_region=${CLOUD_REGION}
|
||||||
|
|
||||||
# Create cluster
|
# Create cluster with netchecker app deployed
|
||||||
- >
|
- >
|
||||||
$HOME/.local/bin/ansible-playbook -i inventory/inventory.ini -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS
|
$HOME/.local/bin/ansible-playbook -i inventory/inventory.ini -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS
|
||||||
-b --become-user=root -e cloud_provider=gce $LOG_LEVEL -e kube_network_plugin=${KUBE_NETWORK_PLUGIN}
|
-b --become-user=root -e cloud_provider=gce $LOG_LEVEL -e kube_network_plugin=${KUBE_NETWORK_PLUGIN}
|
||||||
|
@ -136,15 +136,16 @@ script:
|
||||||
-e download_run_once=true
|
-e download_run_once=true
|
||||||
-e download_localhost=true
|
-e download_localhost=true
|
||||||
-e local_release_dir=/var/tmp/releases
|
-e local_release_dir=/var/tmp/releases
|
||||||
|
-e deploy_netchecker=true
|
||||||
cluster.yml
|
cluster.yml
|
||||||
|
|
||||||
# Tests Cases
|
# Tests Cases
|
||||||
## Test Master API
|
## Test Master API
|
||||||
- $HOME/.local/bin/ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH} tests/testcases/010_check-apiserver.yml $LOG_LEVEL
|
- $HOME/.local/bin/ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root tests/testcases/010_check-apiserver.yml $LOG_LEVEL
|
||||||
## Create a POD
|
|
||||||
- $HOME/.local/bin/ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root tests/testcases/020_check-create-pod.yml $LOG_LEVEL
|
|
||||||
## Ping the between 2 pod
|
## Ping the between 2 pod
|
||||||
- $HOME/.local/bin/ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root tests/testcases/030_check-network.yml $LOG_LEVEL
|
- $HOME/.local/bin/ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root tests/testcases/030_check-network.yml $LOG_LEVEL
|
||||||
|
## Advanced DNS checks
|
||||||
|
- $HOME/.local/bin/ansible-playbook -i inventory/inventory.ini -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root tests/testcases/040_check-network-adv.yml $LOG_LEVEL
|
||||||
|
|
||||||
after_script:
|
after_script:
|
||||||
- >
|
- >
|
||||||
|
|
|
@ -39,14 +39,14 @@ should_api_server_respond() {
|
||||||
assertion__status_code_is_success $?
|
assertion__status_code_is_success $?
|
||||||
}
|
}
|
||||||
|
|
||||||
should_create_pod() {
|
|
||||||
ansible-playbook -i inventory.ini -s ${private_key} testcases/020_check-create-pod.yml -vv
|
|
||||||
|
|
||||||
assertion__status_code_is_success $?
|
|
||||||
}
|
|
||||||
|
|
||||||
should_pod_be_in_expected_subnet() {
|
should_pod_be_in_expected_subnet() {
|
||||||
ansible-playbook -i inventory.ini -s ${private_key} testcases/030_check-network.yml -vv
|
ansible-playbook -i inventory.ini -s ${private_key} testcases/030_check-network.yml -vv
|
||||||
|
|
||||||
assertion__status_code_is_success $?
|
assertion__status_code_is_success $?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
should_resolve_cluster_dns() {
|
||||||
|
ansible-playbook -i inventory.ini -s ${private_key} testcases/040_check-network-adv.yml -vv
|
||||||
|
|
||||||
|
assertion__status_code_is_success $?
|
||||||
|
}
|
||||||
|
|
|
@ -15,16 +15,44 @@
|
||||||
- name: Get pod names
|
- name: Get pod names
|
||||||
shell: "{{bin_dir}}/kubectl get pods -o json"
|
shell: "{{bin_dir}}/kubectl get pods -o json"
|
||||||
register: pods
|
register: pods
|
||||||
|
no_log: true
|
||||||
|
|
||||||
|
- name: Get hostnet pods
|
||||||
|
command: "{{bin_dir}}/kubectl get pods -o
|
||||||
|
jsonpath='{range .items[?(.spec.hostNetwork)]}{.metadata.name} {.status.podIP} {end}'"
|
||||||
|
register: hostnet_pods
|
||||||
|
|
||||||
|
- name: Get running pods
|
||||||
|
command: "{{bin_dir}}/kubectl get pods -o
|
||||||
|
jsonpath='{range .items[?(.status.phase==\"Running\")]}{.metadata.name} {.status.podIP} {end}'"
|
||||||
|
register: running_pods
|
||||||
|
|
||||||
- set_fact:
|
- set_fact:
|
||||||
pod_names: "{{ (pods.stdout | from_json)['items'] | map(attribute = 'metadata.name') | list }}"
|
pod_names: "{{ (pods.stdout | from_json)['items'] | map(attribute = 'metadata.name') | list }}"
|
||||||
pod_ips: "{{ (pods.stdout | from_json)['items'] | map(attribute = 'status.podIP') | list }}"
|
pod_ips: "{{ (pods.stdout | from_json)['items'] | selectattr('status.podIP', 'defined') | map(attribute = 'status.podIP') | list }}"
|
||||||
|
pods_hostnet: |
|
||||||
|
{% set list = hostnet_pods.stdout.split(" ") %}
|
||||||
|
{{list}}
|
||||||
|
pods_running: |
|
||||||
|
{% set list = running_pods.stdout.split(" ") %}
|
||||||
|
{{list}}
|
||||||
|
|
||||||
- name: Check pods IP are in correct network
|
- name: Check pods IP are in correct network
|
||||||
assert:
|
assert:
|
||||||
that: item | ipaddr(kube_pods_subnet)
|
that: item | ipaddr(kube_pods_subnet)
|
||||||
|
when: not item in pods_hostnet and item in pods_running
|
||||||
with_items: "{{pod_ips}}"
|
with_items: "{{pod_ips}}"
|
||||||
|
|
||||||
|
|
||||||
- name: Ping between pods is working
|
- name: Ping between pods is working
|
||||||
shell: "{{bin_dir}}/kubectl exec {{pod_names[0]}} -- ping -c 4 {{ pod_ips[1] }}"
|
shell: "{{bin_dir}}/kubectl exec {{item[0]}} -- ping -c 4 {{ item[1] }}"
|
||||||
|
when: not item[0] in pods_hostnet and not item[1] in pods_hostnet
|
||||||
|
with_nested:
|
||||||
|
- "{{pod_names}}"
|
||||||
|
- "{{pod_ips}}"
|
||||||
|
|
||||||
|
- name: Ping between hostnet pods is working
|
||||||
|
shell: "{{bin_dir}}/kubectl exec {{item[0]}} -- ping -c 4 {{ item[1] }}"
|
||||||
|
when: item[0] in pods_hostnet and item[1] in pods_hostnet
|
||||||
|
with_nested:
|
||||||
|
- "{{pod_names}}"
|
||||||
|
- "{{pod_ips}}"
|
||||||
|
|
73
tests/testcases/040_check-network-adv.yml
Normal file
73
tests/testcases/040_check-network-adv.yml
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
---
|
||||||
|
- hosts: kube-node
|
||||||
|
tasks:
|
||||||
|
- name: Test tunl0 routes
|
||||||
|
shell: "! /sbin/ip ro | grep '/26 via' | grep -v tunl0"
|
||||||
|
when: (ipip|default(false) or cloud_provider is defined) and (kube_network_plugin == 'calico')
|
||||||
|
|
||||||
|
- hosts: k8s-cluster
|
||||||
|
vars:
|
||||||
|
agent_report_interval: 10
|
||||||
|
netcheck_namespace: default
|
||||||
|
netchecker_port: 31081
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Force binaries directory for CoreOS
|
||||||
|
set_fact:
|
||||||
|
bin_dir: "/opt/bin"
|
||||||
|
when: ansible_os_family == "CoreOS"
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
bin_dir: "/usr/local/bin"
|
||||||
|
when: ansible_os_family != "CoreOS"
|
||||||
|
|
||||||
|
- name: Wait for netchecker server
|
||||||
|
shell: "{{ bin_dir }}/kubectl get pods --namespace {{netcheck_namespace}} | grep ^netchecker-server"
|
||||||
|
delegate_to: "{{groups['kube-master'][0]}}"
|
||||||
|
run_once: true
|
||||||
|
register: ncs_pod
|
||||||
|
until: ncs_pod.stdout.find('Running') != -1
|
||||||
|
retries: 3
|
||||||
|
delay: 10
|
||||||
|
|
||||||
|
- name: Wait for netchecker agents
|
||||||
|
shell: "{{ bin_dir }}/kubectl get pods --namespace {{netcheck_namespace}} | grep '^netchecker-agent-.*Running'"
|
||||||
|
run_once: true
|
||||||
|
delegate_to: "{{groups['kube-master'][0]}}"
|
||||||
|
register: nca_pod
|
||||||
|
until: "{{ nca_pod.stdout_lines|length }} >= {{ groups['kube-node']|length * 2 }}"
|
||||||
|
retries: 3
|
||||||
|
delay: 10
|
||||||
|
|
||||||
|
- name: Get netchecker agents
|
||||||
|
uri: url=http://localhost:{{netchecker_port}}/api/v1/agents/ return_content=yes
|
||||||
|
run_once: true
|
||||||
|
delegate_to: "{{groups['kube-node'][0]}}"
|
||||||
|
register: agents
|
||||||
|
retries: 3
|
||||||
|
delay: "{{ agent_report_interval }}"
|
||||||
|
until: "{{ agents.content|length > 0 and
|
||||||
|
agents.content[0] == '{' and
|
||||||
|
agents.content|from_json|length >= groups['kube-node']|length * 2 }}"
|
||||||
|
ignore_errors: true
|
||||||
|
no_log: true
|
||||||
|
|
||||||
|
- debug: var=agents.content|from_json
|
||||||
|
failed_when: not agents|success
|
||||||
|
delegate_to: "{{groups['kube-node'][0]}}"
|
||||||
|
run_once: true
|
||||||
|
|
||||||
|
- name: Check netchecker status
|
||||||
|
uri: url=http://localhost:{{netchecker_port}}/api/v1/connectivity_check status_code=200 return_content=yes
|
||||||
|
delegate_to: "{{groups['kube-node'][0]}}"
|
||||||
|
run_once: true
|
||||||
|
register: result
|
||||||
|
retries: 3
|
||||||
|
delay: "{{ agent_report_interval }}"
|
||||||
|
no_log: true
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- debug: var=result.content|from_json
|
||||||
|
failed_when: not result|success
|
||||||
|
delegate_to: "{{groups['kube-node'][0]}}"
|
||||||
|
run_once: true
|
Loading…
Reference in a new issue