Skip to main content

Molecule aids in the development and testing of Ansible roles

Project description

PyPI Package https://github.com/jseguillon/molecule-kubevirt/workflows/tox/badge.svg Python Black Code Style Repository License

Molecule KubeVirt Plugin is designed to allow use of KubeVirt containers for provisioning test resources.

Very alpha version - All configuration fields and behaviours may be subject to breaking changes

Scope

Molecule-kubevirt enables running ansible roles tests in a Kubernetes cluster.

Usage

To use this plugin, you’ll need to set the driver and platform variables in your molecule.yml:

driver:
  name: kubevirt
platforms:
  - name: instance
    image: quay.io/kubevirt/fedora-cloud-container-disk-demo

Installation

Driver

This driver supports Ansible 2, 3 and 4.

# Ansible >2
python3 -m pip install molecule-kubevirt

# Ansible 2
python3 -m pip install molecule-kubevirt 'openshift<0.12.0' 'kubernetes<12.0'

KubeVirt Installation

Follow KubeVirt guides for kind, minkube, or cloud providers

SSH access

By default, the driver connects onto ssh via VirtualMachineInstance Pod ip and molecule needs to be able to ssh directly to Pod ip:

  • if running local Kubernetes with kind:

IP=$(docker container inspect kind-control-plane --format '{{ .NetworkSettings.Networks.kind.IPAddress }}')
sudo ip route add 10.244.0.0/16 via $IP # Linux
# sudo route -n add 10.244.0.0/16 $IP # MacOSX
  • if running local Kubernetes with minikube:

sudo ip route add 172.17.0.0/16 via $(minikube ip)
# sudo route -n add 172.17.0.0/16 $(minikube ip) # MacOSX
  • if running molecule inside the target Kubernetes cluster, routing is ensured by CNI.

A Kubernetes Service can de created by the driver for SSH access. Current supported Services are ClusterIP and NodePort.

NodePort

NodePort can be set. Static nodePort can be defined, also host target for port can be set:

ssh_service:
  type: NodePort
  # optional static port
  nodePort: 32569
  # host where nodePort can be reached
  nodePort_host: localhost

ClusterIP

Default SSH Service is ClusterIP and a static clusterIP can be set:

ssh_service:
  type: ClusterIP
  clusterIP: 10.96.102.231

Molecule then needs to be able to ssh on the ClusterIP ip:

  • if running local Kubernetes with Kind:

IP=$(docker container inspect kind-control-plane   --format '{{ .NetworkSettings.Networks.kind.IPAddress }}')
sudo ip route add 10.96.0.0/12 via $IP # Linux
# sudo route -n add 10.96.0.0/12 $IP # MacOSX
  • if running local Kubernetes with Minikube, no known solution yet.

  • if running molecule inside the target Kubernetes cluster, routing is ensured by CNI.

Virtual machines customisation

Virtual machines can be customised using domain, volumes, networks and user_data.

Since the driver already sets some values for molecule to start VMs with no customisation, values set in those fields will be merged with default configuration.

Full example

VirtualMachines setup can be fine tuned:

  • annotations is empty by default

  • domain is combined recursive with default, defaults lists are prepend

  • user_data cloud-config is combined recursive with default, defaults lists are prepend

  • volumes are appended to defaults

  • networks is empty by default

This example configures a specific network, adds a disk backed by an empty volume, then disk is formated and mounted via cloud config:

# ask for static IP with Calico
annotations:
  - cni.projectcalico.org/ipAddrs: "[\"10.244.25.25\"]"
# combine domain to default
domain:
  devices:
    disks:
      # add a new disk
      - name: emptydisk
        disk:
          bus: virtio
    interfaces:
      # prefer masquerade instead of default bridge
      - masquerade: {}
        name: default
networks:
  - name: default
    # prefer multus instead of pod network as first network
    multus:
      default: true
      networkName: macvlan-test
volumes:
  - name: emptydisk
    # create a disk inside the VM Pod
    # can also be backed by PVC, hotspath, etc...
    emptyDisk:
      capacity: 2Gi
# custom cloud config - additional disks starts at index 3
# because both boot and cloud-config disks are created by driver
# therefore example additional disk is named 'vd**c**'
user_data:
  fs_setup:
    - label: data_disk
      filesystem: 'ext4'
      device: /dev/vdc
      overwrite: true
  mounts:
   - [ /dev/vdc, /var/lib/software, "auto", "defaults,nofail", "0", "0" ]

Please take a look at KubeVirt examples to get more information about more uses cases including PersistenVolumes, Multus, Multi node bridge, and more.

Run from inside Kubernetes cluster

You can run this driver with a container running tox and/or molecule. Take a look at:

Demo

Testing nginx ansible role with KubeVirt, via github actions: jseguillon/ansible-role-nginx

Get Involved

License

The MIT License.

The logo is licensed under the Creative Commons NoDerivatives 4.0 License.

If you have some other use in mind, contact us.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

molecule-kubevirt-0.0.5.tar.gz (24.2 kB view hashes)

Uploaded Source

Built Distribution

molecule_kubevirt-0.0.5-py3-none-any.whl (14.3 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page