kcli-provider-development
π―Skillfrom karmab/kcli
Guides developers in implementing custom virtualization providers for kcli by defining a standardized interface and core method requirements.
Installation
npx skills add https://github.com/karmab/kcli --skill kcli-provider-developmentSkill Details
Guides implementation of new virtualization providers for kcli. Use when adding support for a new cloud platform, hypervisor, or infrastructure provider.
Overview
# kcli Provider Development
Provider Architecture
Providers are located in kvirt/providers/ as subdirectories. Each provider implements the interface defined in kvirt/providers/sampleprovider.py (class Kbase).
Required Implementation Steps
1. Create Provider Directory
```
kvirt/providers/yourprovider/
βββ __init__.py # Contains your Kyourprovider class
βββ (optional helpers)
```
2. Implement the Provider Class
Your class must:
- Set
self.connattribute in__init__(set toNoneif backend unreachable) - Set
self.debugfrom the debug parameter - Return standardized response dicts from methods
Return Value Pattern:
```python
# Success
return {'result': 'success'}
# Failure
return {'result': 'failure', 'reason': "VM %s not found" % name}
```
3. Core Methods to Implement
VM Lifecycle (required):
create()- Create VM with all parameters (cpus, memory, disks, nets, etc.)start(name)- Start VMstop(name, soft=False)- Stop VMrestart(name)- Restart VM (default calls start)delete(name, snapshots=False, keep_disks=False)- Delete VMlist()- Return list of[name, state, ip, source, plan, profile]info(name, output, fields, values, vm, debug)- Return VM details dictexists(name)- Check if VM existsstatus(name)- Return VM statusip(name)- Return IP stringclone(old, new, full=False, start=False)- Clone VMexport(name, image=None)- Export VM as imageconsole(name, tunnel, tunnelhost, tunnelport, tunneluser, web)- Graphical consoleserialconsole(name, web)- Serial console
Storage:
create_pool(name, poolpath, pooltype, user, thinpool)delete_pool(name, full)list_pools()- Return list of pool namesget_pool_path(pool)- Get pool pathadd_disk(name, size, pool, thin, image, shareable, existing, interface, novm, overrides)delete_disk(name, diskname, pool, novm)create_disk(name, size, pool, thin, image)- Create standalone disklist_disks()- Return dict{'diskname': {'pool': poolname, 'path': name}}disk_exists(pool, name)- Check if disk existsdetach_disks(name)- Detach all disks from VM
Networking:
create_network(name, cidr, dhcp, nat, domain, plan, overrides)delete_network(name, cidr, force)update_network(name, dhcp, nat, domain, plan, overrides)list_networks()- Return dict of networksinfo_network(name)- Get network infonet_exists(name)- Check if network existsnetwork_ports(name)- List ports on networkadd_nic(name, network, model)delete_nic(name, interface)update_nic(name, index, network)- Update NIC
Subnets (cloud providers):
create_subnet(name, cidr, dhcp, nat, domain, plan, overrides)delete_subnet(name, force)update_subnet(name, overrides)list_subnets()- Return subnet dictinfo_subnet(name)- Get subnet info
Images:
volumes(iso=False, extended=False)- List available imagesadd_image(url, pool, short, cmds, name, size, convert)delete_image(image, pool)
Snapshots:
create_snapshot(name, base)- Create snapshotdelete_snapshot(name, base)- Delete snapshotlist_snapshots(base)- List snapshots (returns list)revert_snapshot(name, base)- Revert to snapshot
Update Operations:
update_metadata(name, metatype, metavalue, append)update_memory(name, memory)update_cpus(name, numcpus)update_start(name, start)- Set autostartupdate_information(name, information)- Update info metadataupdate_iso(name, iso)- Change attached ISOupdate_flavor(name, flavor)- Change VM flavor
Buckets (object storage):
create_bucket(bucket, public)- Create storage bucketdelete_bucket(bucket)- Delete bucketlist_buckets()- List all bucketslist_bucketfiles(bucket)- List files in bucketupload_to_bucket(bucket, path, overrides, temp_url, public)download_from_bucket(bucket, path)delete_from_bucket(bucket, path)
Security Groups (cloud providers):
create_security_group(name, overrides)delete_security_group(name)update_security_group(name, overrides)list_security_groups(network)- List security groups
DNS:
reserve_dns(name, nets, domain, ip, alias, force, primary, instanceid)list_dns_zones()- List DNS zonesdnsinfo(name)- Return (dnsclient, domain) for VM
Other:
close()- Clean up connectioninfo_host()- Return host info dictvm_ports(name)- List ports on VMlist_flavors()- Return[[name, numcpus, memory], ...]if platform supports flavors
4. Register Provider in config.py
Add import and instantiation in kvirt/config.py (around lines 102-220):
```python
elif self.type == 'yourprovider':
# Get provider-specific options
option1 = options.get('option1')
if option1 is None:
error("Missing option1 in configuration. Leaving")
sys.exit(1)
try:
from kvirt.providers.yourprovider import Kyourprovider
except Exception as e:
exception = e if debug else None
dependency_error('yourprovider', exception)
k = Kyourprovider(option1=option1, debug=debug)
```
5. Add Dependencies to setup.py
```python
YOURPROVIDER = ['required-package1', 'required-package2']
# Add to extras_require dict:
extras_require={
'yourprovider': YOURPROVIDER,
# ...
}
# Add to ALL list if needed:
ALL = EXTRAS + AWS + ... + YOURPROVIDER
```
Info Method Structure
The info() method should build a dict with these keys:
name,autostart,plan,profile,image,ip,memory,numcpus,creationdatenets: list of{'device': device, 'mac': mac, 'net': network, 'type': network_type}disks: list of{'device': device, 'size': disksize, 'format': diskformat, 'type': drivertype, 'path': path}snapshots: list of{'snapshot': snapshot, 'current': current}
Then call: common.print_info(yamlinfo, output=output, fields=fields, values=values)
Reference Implementations
Study these existing providers:
kvirt/providers/kvm/- Libvirt (most complete reference, ~4300 lines)kvirt/providers/aws/- AWS cloud (~2200 lines)kvirt/providers/gcp/- Google Cloud Platform (~2100 lines)kvirt/providers/kubevirt/- KubeVirt on Kubernetes (~1900 lines)kvirt/providers/vsphere/- VMware vSphere (~1900 lines)kvirt/providers/azure/- Microsoft Azure (~1500 lines)kvirt/providers/ibm/- IBM Cloud (~1500 lines)kvirt/providers/ovirt/- oVirt/RHV (~1400 lines)kvirt/providers/openstack/- OpenStack (~1350 lines)kvirt/providers/proxmox/- Proxmox VE (~1200 lines)kvirt/providers/hcloud/- Hetzner Cloud (~550 lines)kvirt/providers/web/- Web-based provider (~530 lines)kvirt/providers/fake/- Minimal stub for testing (~20 lines)
Provider Complexity Guide
Not all providers need to implement every method. Focus on:
- Minimum viable:
create,delete,list,info,start,stop,exists,status,ip - Storage:
add_disk,delete_disk,list_disks,create_pool,delete_pool,list_pools - Networking:
create_network,delete_network,list_networks,net_exists - Images:
volumes,add_image,delete_image - Advanced: Snapshots, cloning, export, buckets, security groups (as needed)
Methods can return {'result': 'success'} with a print("not implemented") for optional features.
More from this repository6
Manages and interacts with virtual machines across multiple cloud and virtualization providers using a unified command-line interface for deployment, configuration, and lifecycle management.
Deploys and manages Kubernetes clusters across multiple distributions using kcli, supporting OpenShift, k3s, kubeadm, and cloud provider platforms.
Validates kcli code quality by running linting checks, spelling verification, and comprehensive test suites for the project.
Configures and manages cloud provider settings for kcli, supporting multiple providers like KVM, AWS, GCP, and Azure through a unified ~/.kcli/config.yml file.
Manages virtual machine lifecycle operations across providers using kcli, enabling creation, configuration, and management of VMs with flexible commands.
Guides developers in creating kcli plan files with Jinja2 templating for deploying VMs, networks, and infrastructure resources efficiently.