Switch tests to use Molecule.

This commit is contained in:
Jeff Geerling 2018-09-27 22:17:50 -05:00
parent 8fb27abcc8
commit 6798a05d0b
16 changed files with 115 additions and 72 deletions

3
.gitignore vendored
View File

@ -1,2 +1,3 @@
*.retry *.retry
tests/test.sh */__pycache__
*.pyc

View File

@ -1,25 +1,29 @@
--- ---
language: python
services: docker services: docker
env: env:
- distro: centos7 global:
- distro: ubuntu1604 - ROLE_NAME: kubernetes
- distro: debian9 matrix:
- MOLECULE_DISTRO: centos7
MOLECULE_DOCKER_COMMAND: /usr/lib/systemd/systemd
- MOLECULE_DISTRO: ubuntu1604
- MOLECULE_DISTRO: debian9
install:
# Install test dependencies.
- pip install molecule docker
before_script:
# Use actual Ansible Galaxy role name for the project directory.
- cd ../
- mv ansible-role-$ROLE_NAME geerlingguy.$ROLE_NAME
- cd geerlingguy.$ROLE_NAME
script: script:
# Configure test script so we can run extra tests after playbook is run.
- export container_id=$(date +%s)
- export cleanup=false
# Download test shim.
- wget -O ${PWD}/tests/test.sh https://gist.githubusercontent.com/geerlingguy/73ef1e5ee45d8694570f334be385e181/raw/
- chmod +x ${PWD}/tests/test.sh
# Run tests. # Run tests.
- ${PWD}/tests/test.sh - molecule test
# Test whether Kubernetes is running correctly.
# - docker exec --tty ${container_id} command-goes-here
notifications: notifications:
webhooks: https://galaxy.ansible.com/api/v1/notifications/ webhooks: https://galaxy.ansible.com/api/v1/notifications/

View File

@ -31,15 +31,15 @@ Whether the particular server will serve as a Kubernetes `master` (default) or `
Extra args to pass to `kubelet` during startup. E.g. to allow `kubelet` to start up even if there is swap is enabled on your server, set this to: `"--fail-swap-on=false"`. Or to specify the node-ip advertised by `kubelet`, set this to `"--node-ip={{ ansible_host }}"`. Extra args to pass to `kubelet` during startup. E.g. to allow `kubelet` to start up even if there is swap is enabled on your server, set this to: `"--fail-swap-on=false"`. Or to specify the node-ip advertised by `kubelet`, set this to `"--node-ip={{ ansible_host }}"`.
kubernetes_allow_pods_on_master: True kubernetes_allow_pods_on_master: true
Whether to remove the taint that denies pods from being deployed to the Kubernetes master. If you have a single-node cluster, this should definitely be `True`. Otherwise, set to `False` if you want a dedicated Kubernetes master which doesn't run any other pods. Whether to remove the taint that denies pods from being deployed to the Kubernetes master. If you have a single-node cluster, this should definitely be `True`. Otherwise, set to `False` if you want a dedicated Kubernetes master which doesn't run any other pods.
kubernetes_enable_web_ui: False kubernetes_enable_web_ui: false
Whether to enable the Kubernetes web dashboard UI (only accessible on the master itself, or proxied). Whether to enable the Kubernetes web dashboard UI (only accessible on the master itself, or proxied).
kuberenetes_debug: False kuberenetes_debug: false
Whether to show extra debug info in Ansible's logs (e.g. the output of the `kubeadm init` command). Whether to show extra debug info in Ansible's logs (e.g. the output of the `kubeadm init` command).
@ -52,7 +52,7 @@ Options passed to `kubeadm init` when initializing the Kubernetes master. The `a
kubernetes_apt_release_channel: main kubernetes_apt_release_channel: main
kubernetes_apt_repository: "deb http://apt.kubernetes.io/ kubernetes-xenial {{ kubernetes_apt_release_channel }}" kubernetes_apt_repository: "deb http://apt.kubernetes.io/ kubernetes-xenial {{ kubernetes_apt_release_channel }}"
kubernetes_apt_ignore_key_error: False kubernetes_apt_ignore_key_error: false
Apt repository options for Kubernetes installation. Apt repository options for Kubernetes installation.

View File

@ -13,9 +13,9 @@ kubernetes_role: master
kubernetes_kubelet_extra_args: "" kubernetes_kubelet_extra_args: ""
kubernetes_allow_pods_on_master: True kubernetes_allow_pods_on_master: true
kubernetes_enable_web_ui: True kubernetes_enable_web_ui: true
kuberenetes_debug: False kuberenetes_debug: false
kubernetes_pod_network_cidr: '10.0.1.0/16' kubernetes_pod_network_cidr: '10.0.1.0/16'
kubernetes_apiserver_advertise_address: '' kubernetes_apiserver_advertise_address: ''
@ -25,7 +25,7 @@ kubernetes_ignore_preflight_errors: 'all'
kubernetes_apt_release_channel: main kubernetes_apt_release_channel: main
# Note that xenial repo is used for all Debian derivatives at this time. # Note that xenial repo is used for all Debian derivatives at this time.
kubernetes_apt_repository: "deb http://apt.kubernetes.io/ kubernetes-xenial {{ kubernetes_apt_release_channel }}" kubernetes_apt_repository: "deb http://apt.kubernetes.io/ kubernetes-xenial {{ kubernetes_apt_release_channel }}"
kubernetes_apt_ignore_key_error: False kubernetes_apt_ignore_key_error: false
kubernetes_yum_arch: x86_64 kubernetes_yum_arch: x86_64

View File

@ -8,16 +8,16 @@ galaxy_info:
license: "license (BSD, MIT)" license: "license (BSD, MIT)"
min_ansible_version: 2.4 min_ansible_version: 2.4
platforms: platforms:
- name: EL - name: EL
versions: versions:
- 7 - 7
- name: Debian - name: Debian
versions: versions:
- stretch - stretch
- name: Ubuntu - name: Ubuntu
versions: versions:
- xenial - xenial
- bionic - bionic
galaxy_tags: galaxy_tags:
- system - system
- containers - containers

View File

@ -0,0 +1,27 @@
---
dependency:
name: galaxy
driver:
name: docker
lint:
name: yamllint
options:
config-file: molecule/default/yaml-lint.yml
platforms:
- name: instance
image: geerlingguy/docker-${MOLECULE_DISTRO:-centos7}-ansible
command: ${MOLECULE_DOCKER_COMMAND:-"sleep infinity"}
privileged: true
pre_build_image: true
provisioner:
name: ansible
lint:
name: ansible-lint
playbooks:
converge: ${MOLECULE_PLAYBOOK:-playbook.yml}
scenario:
name: default
verifier:
name: testinfra
lint:
name: flake8

View File

@ -1,20 +1,23 @@
--- ---
- hosts: all - name: Converge
hosts: all
become: true
vars: vars:
# Allow swap in test environments (hard to control in some Docker envs). # Allow swap in test environments (hard to control in some Docker envs).
kubernetes_kubelet_extra_args: "--fail-swap-on=false" kubernetes_kubelet_extra_args: "--fail-swap-on=false"
docker_install_compose: False docker_install_compose: false
pre_tasks: pre_tasks:
- name: Update apt cache. - name: Update apt cache.
apt: update_cache=yes cache_valid_time=600 apt: update_cache=true cache_valid_time=600
when: ansible_os_family == 'Debian' when: ansible_os_family == 'Debian'
- name: Ensure test dependencies are installed. - name: Ensure test dependencies are installed.
package: name=iproute state=present package: name=iproute state=present
- action: setup - name: Gather facts.
action: setup
- name: Use cgroupfs cgroup driver instead of systemd (Red Hat). - name: Use cgroupfs cgroup driver instead of systemd (Red Hat).
set_fact: set_fact:
@ -22,5 +25,5 @@
when: ansible_os_family == 'RedHat' when: ansible_os_family == 'RedHat'
roles: roles:
- geerlingguy.docker - role: geerlingguy.docker
- role_under_test - role: geerlingguy.kubernetes

View File

@ -0,0 +1,14 @@
import os
import testinfra.utils.ansible_runner
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')
def test_hosts_file(host):
f = host.file('/etc/hosts')
assert f.exists
assert f.user == 'root'
assert f.group == 'root'

View File

@ -0,0 +1,6 @@
---
extends: default
rules:
line-length:
max: 150
level: warning

View File

@ -16,7 +16,7 @@
kubelet_args_path: '/etc/systemd/system/kubelet.service.d/10-kubeadm.conf' kubelet_args_path: '/etc/systemd/system/kubelet.service.d/10-kubeadm.conf'
kubelet_args_line: "{{ 'Environment=\"KUBELET_EXTRA_ARGS=' + kubernetes_kubelet_extra_args + '\"' }}" kubelet_args_line: "{{ 'Environment=\"KUBELET_EXTRA_ARGS=' + kubernetes_kubelet_extra_args + '\"' }}"
kubelet_args_regexp: '^Environment=' kubelet_args_regexp: '^Environment='
when: kubelet_environment_file.stat.exists == False when: kubelet_environment_file.stat.exists == false
- name: Configure KUBELET_EXTRA_ARGS. - name: Configure KUBELET_EXTRA_ARGS.
lineinfile: lineinfile:
@ -29,6 +29,6 @@
- name: Reload systemd unit if args were changed. - name: Reload systemd unit if args were changed.
systemd: systemd:
state: restarted state: restarted
daemon_reload: yes daemon_reload: true
name: kubelet name: kubelet
when: kubelet_config_file is changed when: kubelet_config_file is changed

View File

@ -24,7 +24,7 @@
service: service:
name: kubelet name: kubelet
state: started state: started
enabled: yes enabled: true
- name: Check if Kubernetes has already been initialized. - name: Check if Kubernetes has already been initialized.
stat: stat:
@ -37,8 +37,8 @@
# Set up nodes. # Set up nodes.
- name: Get the kubeadm join command from the Kubernetes master. - name: Get the kubeadm join command from the Kubernetes master.
shell: kubeadm token create --print-join-command command: kubeadm token create --print-join-command
changed_when: False changed_when: false
when: kubernetes_role == 'master' when: kubernetes_role == 'master'
register: kubernetes_join_command_result register: kubernetes_join_command_result
@ -47,7 +47,7 @@
kubernetes_join_command: "{{ kubernetes_join_command_result.stdout }}" kubernetes_join_command: "{{ kubernetes_join_command_result.stdout }}"
when: kubernetes_join_command_result.stdout is defined when: kubernetes_join_command_result.stdout is defined
delegate_to: "{{ item }}" delegate_to: "{{ item }}"
delegate_facts: True delegate_facts: true
with_items: "{{ groups['all'] }}" with_items: "{{ groups['all'] }}"
- include_tasks: node-setup.yml - include_tasks: node-setup.yml

View File

@ -7,14 +7,14 @@
--kubernetes-version {{ kubernetes_version }} --kubernetes-version {{ kubernetes_version }}
--ignore-preflight-errors={{ kubernetes_ignore_preflight_errors }} --ignore-preflight-errors={{ kubernetes_ignore_preflight_errors }}
register: kubeadmin_init register: kubeadmin_init
failed_when: False failed_when: false
when: kubernetes_init_stat.stat.exists == False when: kubernetes_init_stat.stat.exists == false
- name: Print the init output to screen. - name: Print the init output to screen.
debug: var=kubeadmin_init.stdout debug: var=kubeadmin_init.stdout
when: when:
- kuberenetes_debug - kuberenetes_debug
- kubernetes_init_stat.stat.exists == False - kubernetes_init_stat.stat.exists == false
- name: Ensure .kube directory exists. - name: Ensure .kube directory exists.
file: file:
@ -41,12 +41,12 @@
command: "kubectl taint nodes --all node-role.kubernetes.io/master-" command: "kubectl taint nodes --all node-role.kubernetes.io/master-"
when: when:
- kubernetes_allow_pods_on_master - kubernetes_allow_pods_on_master
- kubernetes_init_stat.stat.exists == False - kubernetes_init_stat.stat.exists == false
- name: Check if Kubernetes Dashboard UI service already exists. - name: Check if Kubernetes Dashboard UI service already exists.
shell: kubectl get services --namespace kube-system | grep -q kubernetes-dashboard shell: kubectl get services --namespace kube-system | grep -q kubernetes-dashboard
changed_when: False changed_when: false
failed_when: False failed_when: false
register: kubernetes_dashboard_service register: kubernetes_dashboard_service
when: kubernetes_enable_web_ui when: kubernetes_enable_web_ui

View File

@ -1,11 +1,10 @@
--- ---
- name: Ensure dependencies are installed. - name: Ensure dependencies are installed.
apt: apt:
name: "{{ item }}" name:
- apt-transport-https
- ca-certificates
state: present state: present
with_items:
- apt-transport-https
- ca-certificates
- name: Add Kubernetes apt key. - name: Add Kubernetes apt key.
apt_key: apt_key:
@ -18,4 +17,4 @@
apt_repository: apt_repository:
repo: "{{ kubernetes_apt_repository }}" repo: "{{ kubernetes_apt_repository }}"
state: present state: present
update_cache: yes update_cache: false

View File

@ -3,9 +3,9 @@
yum_repository: yum_repository:
name: kubernetes name: kubernetes
description: Kubernetes description: Kubernetes
enabled: yes enabled: true
gpgcheck: yes gpgcheck: true
repo_gpgcheck: yes repo_gpgcheck: true
baseurl: https://packages.cloud.google.com/yum/repos/kubernetes-el7-{{ kubernetes_yum_arch }} baseurl: https://packages.cloud.google.com/yum/repos/kubernetes-el7-{{ kubernetes_yum_arch }}
gpgkey: gpgkey:
- https://packages.cloud.google.com/yum/doc/yum-key.gpg - https://packages.cloud.google.com/yum/doc/yum-key.gpg
@ -24,4 +24,4 @@
command: "yum -q makecache -y --disablerepo='*' --enablerepo='kubernetes'" command: "yum -q makecache -y --disablerepo='*' --enablerepo='kubernetes'"
when: kubernetes_rpm_key is changed when: kubernetes_rpm_key is changed
args: args:
warn: no warn: false

View File

@ -1,11 +0,0 @@
# Ansible Role tests
To run the test playbook(s) in this directory:
1. Install and start Docker.
1. Download the test shim (see .travis.yml file for the URL) into `tests/test.sh`:
- `wget -O tests/test.sh https://gist.githubusercontent.com/geerlingguy/73ef1e5ee45d8694570f334be385e181/raw/`
1. Make the test shim executable: `chmod +x tests/test.sh`.
1. Run (from the role root directory) `distro=[distro] playbook=[playbook] ./tests/test.sh`
If you don't want the container to be automatically deleted after the test playbook is run, add the following environment variables: `cleanup=false container_id=$(date +%s)`