From 666b6a434c35a19f293f77eb1e53808b94cf189f Mon Sep 17 00:00:00 2001 From: pkrupa Date: Wed, 21 Mar 2018 12:17:45 +0100 Subject: [PATCH] add molecule and testinfra test suite --- .molecule/ansible.cfg | 16 +++++++++++ .molecule/ansible_inventory | 5 ++++ .molecule/rakefile | 30 ++++++++++++++++++++ .molecule/state.yml | 18 ++++++++++++ .travis.yml | 39 ++++++++++---------------- .travis/images.sh | 7 +++++ Vagrantfile | 32 --------------------- molecule.yml | 43 +++++++++++++++++++++++++++++ tests/inventory | 1 - tests/playbook.yml | 11 ++++++++ tests/test.yml | 6 ---- tests/test_default.py | 55 +++++++++++++++++++++++++++++++++++++ tests/vagrant.yml | 24 ---------------- 13 files changed, 200 insertions(+), 87 deletions(-) create mode 100644 .molecule/ansible.cfg create mode 100644 .molecule/ansible_inventory create mode 100644 .molecule/rakefile create mode 100644 .molecule/state.yml create mode 100755 .travis/images.sh delete mode 100644 Vagrantfile create mode 100644 molecule.yml delete mode 100644 tests/inventory create mode 100644 tests/playbook.yml delete mode 100644 tests/test.yml create mode 100644 tests/test_default.py delete mode 100644 tests/vagrant.yml diff --git a/.molecule/ansible.cfg b/.molecule/ansible.cfg new file mode 100644 index 0000000..4c598b5 --- /dev/null +++ b/.molecule/ansible.cfg @@ -0,0 +1,16 @@ +# Molecule managed + +[defaults] +roles_path = .molecule/roles/:.molecule/../roles/:../:../../ +library = .molecule/library/:library/ +action_plugins = .molecule/plugins/actions/:plugins/actions/ +callback_plugins = .molecule/plugins/callbacks/:plugins/callbacks/ +connection_plugins = .molecule/plugins/connections/:plugins/connections/ +lookup_plugins = .molecule/plugins/lookups/:plugins/lookups/ +vars_plugins = .molecule/plugins/vars/:plugins/vars/ +filter_plugins = .molecule/plugins/filters/:plugins/filters/ +ansible_managed = Ansible managed: Do NOT edit this file manually! +nocows = 1 +retry_files_enabled = False + +[ssh_connection] diff --git a/.molecule/ansible_inventory b/.molecule/ansible_inventory new file mode 100644 index 0000000..dc5d291 --- /dev/null +++ b/.molecule/ansible_inventory @@ -0,0 +1,5 @@ +[all] +xenial ansible_connection=docker +stretch ansible_connection=docker +jessie ansible_connection=docker +centos7 ansible_connection=docker diff --git a/.molecule/rakefile b/.molecule/rakefile new file mode 100644 index 0000000..301d5a0 --- /dev/null +++ b/.molecule/rakefile @@ -0,0 +1,30 @@ +# Molecule managed + +require 'rake' +require 'rspec/core/rake_task' +require 'yaml' +require 'fileutils' + +task spec: 'serverspec:all' +task default: :spec + +hosts = YAML.load_file('.molecule/state.yml')['hosts'] + +namespace :serverspec do + task all: hosts.keys + hosts.each do |name, host| + desc "Run serverspec on #{name}" + pattern = ['spec/*_spec.rb', "spec/#{name}/*_spec.rb", "spec/hosts/#{name}/*_spec.rb"] + + host['groups'].each do |group| + pattern << "spec/#{group}/*_spec.rb" + pattern << "spec/groups/#{group}/*_spec.rb" + end + + RSpec::Core::RakeTask.new(name.to_sym) do |target| + puts "*** Run serverspec on #{name} ***" + ENV['TARGET_HOST'] = name + target.pattern = pattern.join(',') + end + end +end diff --git a/.molecule/state.yml b/.molecule/state.yml new file mode 100644 index 0000000..18a779c --- /dev/null +++ b/.molecule/state.yml @@ -0,0 +1,18 @@ +--- +converged: null +created: true +default_platform: null +default_provider: null +driver: docker +driver_config: {} +hosts: + centos7: + groups: [] + jessie: + groups: [] + stretch: + groups: [] + xenial: + groups: [] +installed_deps: true +multiple_platforms: null diff --git a/.travis.yml b/.travis.yml index 49e7e1c..badbc0f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,29 +1,20 @@ ---- +sudo: required language: python -python: "2.7" - -# Use the new container infrastructure -sudo: false - -# Install ansible -addons: - apt: - packages: - - python-pip - +cache: pip +services: + - docker +env: + - ANSIBLE=2.2.3 + - ANSIBLE=2.3.2 + - ANSIBLE=2.4.2 install: - # Install ansible - - pip install ansible - - # Check ansible version - - ansible --version - - # Create ansible.cfg with correct roles_path - - printf '[defaults]\nroles_path=../' >ansible.cfg - + - pip install ansible==${ANSIBLE} ansible-lint>=3.4.15 molecule==1.25.0 docker git-semver testinfra>=1.7.0 +before_script: + - ansible-lint tests/playbook.yml script: - # Basic role syntax check - - ansible-playbook tests/test.yml -i tests/inventory --syntax-check - + - molecule test +branches: + only: + - master notifications: webhooks: https://galaxy.ansible.com/api/v1/notifications/ diff --git a/.travis/images.sh b/.travis/images.sh new file mode 100755 index 0000000..20395a7 --- /dev/null +++ b/.travis/images.sh @@ -0,0 +1,7 @@ +#!/bin/bash +for i in ubuntu-molecule:16.04 debian-molecule:9 debian-molecule:8 centos-molecule:7 fedora-molecule:27 +do + docker pull paulfantom/$i & +done + +wait diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index 290859e..0000000 --- a/Vagrantfile +++ /dev/null @@ -1,32 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -Vagrant.configure(2) do |config| - config.vm.provider "virtualbox" do |vb| - vb.memory = "512" - end - - config.vm.define "centos-7" do |machine| - machine.vm.box = "minimal/centos7" - machine.vm.provision "shell", inline: "yum update -y" - machine.vm.provision "ansible" do |ansible| - ansible.playbook = "tests/vagrant.yml" - end - end - - config.vm.define "debian-jessie" do |machine| - machine.vm.box = "minimal/jessie64" - machine.vm.provision "shell", inline: "apt-get update && apt-get install -y python" - machine.vm.provision "ansible" do |ansible| - ansible.playbook = "tests/vagrant.yml" - end - end - - config.vm.define "ubuntu-xenial" do |machine| - machine.vm.box = "ubuntu/xenial64" - machine.vm.provision "shell", inline: "apt-get update && apt-get install -y python" - machine.vm.provision "ansible" do |ansible| - ansible.playbook = "tests/vagrant.yml" - end - end -end diff --git a/molecule.yml b/molecule.yml new file mode 100644 index 0000000..ff1f1af --- /dev/null +++ b/molecule.yml @@ -0,0 +1,43 @@ +--- +ansible: + playbook: tests/playbook.yml +driver: + name: docker +verifier: + name: testinfra +dependency: + name: shell + command: ./.travis/images.sh +docker: + build_image: False + containers: + - name: xenial + image: paulfantom/ubuntu-molecule + image_version: 16.04 + privileged: true + volume_mounts: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - name: stretch + image: paulfantom/debian-molecule + image_version: 9 + privileged: true + volume_mounts: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - name: jessie + image: paulfantom/debian-molecule + image_version: 8 + privileged: true + volume_mounts: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - name: centos7 + image: paulfantom/centos-molecule + image_version: 7 + privileged: true + volume_mounts: + - /sys/fs/cgroup:/sys/fs/cgroup:ro +# - name: fedora +# image: paulfantom/fedora-molecule +# image_version: 27 +# privileged: true +# volume_mounts: +# - /sys/fs/cgroup:/sys/fs/cgroup:ro diff --git a/tests/inventory b/tests/inventory deleted file mode 100644 index d18580b..0000000 --- a/tests/inventory +++ /dev/null @@ -1 +0,0 @@ -localhost \ No newline at end of file diff --git a/tests/playbook.yml b/tests/playbook.yml new file mode 100644 index 0000000..23a7fca --- /dev/null +++ b/tests/playbook.yml @@ -0,0 +1,11 @@ +--- +- hosts: all + become: yes + roles: + - ansible-role-docker + vars: + default_docker_config: + storage-driver: vfs + log-level: info + + diff --git a/tests/test.yml b/tests/test.yml deleted file mode 100644 index 352cff1..0000000 --- a/tests/test.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- hosts: localhost - become: yes - become_user: root - roles: - - . diff --git a/tests/test_default.py b/tests/test_default.py new file mode 100644 index 0000000..cae0c54 --- /dev/null +++ b/tests/test_default.py @@ -0,0 +1,55 @@ +from testinfra.utils.ansible_runner import AnsibleRunner + +testinfra_hosts = AnsibleRunner('.molecule/ansible_inventory').get_hosts('all') + + +def test_directories(host): + present = [ + "/etc/docker", + ] + absent = [] + if present: + for directory in present: + d = host.file(directory) + assert d.is_directory + assert d.exists + if absent: + for directory in absent: + d = host.file(directory) + assert not d.exists + + +def test_files(host): + present = [ + "/etc/docker/daemon.json", + ] + if present: + for file in present: + f = host.file(file) + assert f.exists + assert f.is_file + + +# def test_socket(host): +# assert host.socket("unix:///var/run/docker.sock").is_listening + + +def test_service(host): + present = [ + "docker" + ] + if present: + for service in present: + s = host.service(service) + assert s.is_running + assert s.is_enabled + + +def test_packages(host): + if host.system_info.distribution == 'ol': + DOCKER = 'docker-engine' + else: + DOCKER = 'docker-ce' + + assert host.package(DOCKER).is_installed + diff --git a/tests/vagrant.yml b/tests/vagrant.yml deleted file mode 100644 index a0af3bf..0000000 --- a/tests/vagrant.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -- hosts: all - become: yes - become_user: root - vars: - docker_clusterstore: yes - vagrant: yes - roles: - - ../docker - tasks: - - name: check consul state - command: docker ps -q -f name=consul - register: consulcheck - changed_when: no - - - name: ensure consul is running - command: > - docker run \ - -d \ - --name consul \ - -p "8500:8500" \ - --restart always \ - progrium/consul -server -bootstrap - when: consulcheck.stdout_lines | length == 0