Molecule KubeVirt Plugin is designed to allow use of KubeVirt containers for provisioning test resources.
Works with any OS distributed as cloud-config compatible image (also known as "Cloud images").
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
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'
Follow KubeVirt guides for kind, minkube, or cloud providers
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 be created by the driver for SSH access. Current supported Services are ClusterIP and 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
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.
A few defaults are created if not provided in platfom definition:
- if no interface with
name: default
is defined indomain.devices.interfaces
, then a default one is created withbrige: {}
andbus: virtio
, - if no disk with
name: boot
is defined indomain.devices.disks
, then a default one is created withbus: virtio
, - if no network with
name: default
is defined innetworks
, then a default one is created withpod: {}
andmodel: virtio
, - if no volume with
name: boot
is defined involumes
, then a default one is created as:- a
containerDisk
- with
image
,path
andimagePullPolicy
respectively set to plaformimage
,image_path
andimage_pull_policy
- a
- if cloud-config is defined in
user_data
it is merged default one wich sets ssh public key for 'molecule' user.
This example configuration demonstrates how to:
- use Kubevirt's CDI in place of an
image
usingdataVolumeTemplates
and overriding defaultboot
volume. - set customs ressources and annotation
- and a second interface/network
- adds a second disk/volume
- make use of cloud-config to format and mount additional disk
---
dependency:
name: galaxy
driver:
name: kubevirt
platforms:
- name: instance
# annotate for calico static ip
annotations:
cni.projectcalico.org/ipAddrs: "[\"10.244.25.25\"]"
# use data volume facility in place of using 'image:'
dataVolumeTemplates:
- metadata:
name: disk-dv
spec:
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
preallocation: true
source:
http:
url: https://download.fedoraproject.org/pub/fedora/linux/releases/35/Cloud/x86_64/images/Fedora-Cloud-Base-35-1.2.x86_64.raw.xz
domain:
resources:
limits:
cpu: "1"
memory: 3Gi
requests:
cpu: 200m
memory: 1Gi
devices:
interfaces:
# add a second device interface
- bridge: {}
name: multus
model: virtio
ports:
- port: 22
disks:
# add a second device disk
- name: emptydisk
disk:
bus: virtio
volumes:
# override default 'boot' volume with cdi data volume template source
- name: boot
dataVolume:
name: disk-dv
# add a second volume, must be same name as defined in device
- name: emptydisk
emptyDisk:
capacity: 2Gi
networks:
# add a second network for added device interface
- name: multus
multus:
# use a NetworkAttachement
networkName: macvlan-conf
# cloud-config format and mount additional disk
user_data:
# format additional disk
fs_setup:
- label: data_disk
filesystem: 'ext4'
device: /dev/vdb
overwrite: true
# mount additional disk
mounts:
- [ /dev/vdb, /var/lib/software, "auto", "defaults,nofail", "0", "0" ]
See molecule/tests/molecule.yml from source code for full example.
You can run this driver with a container running tox and/or molecule. Take a look at:
- Dockerfile as a base image
- test-rolebinding file for ServiceAccount example
- github_workflow in step named "Launch test" for a Kubernetes Job running tox
- Join us in the
#ansible-molecule
channel on Freenode. - Join the discussion in molecule-users Forum.
- Join the community working group by checking the wiki.
- Want to know about releases, subscribe to ansible-announce list.
- For the full list of Ansible email Lists, IRC channels see the communication page.
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.