
kcli-provider-development
by karmab
Management tool for virtualization and kubernetes platforms
SKILL.md
name: kcli-provider-development description: Guides implementation of new virtualization providers for kcli. Use when adding support for a new cloud platform, hypervisor, or infrastructure provider.
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:
# 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):
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
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.
Score
Total Score
Based on repository quality metrics
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 500以上
1ヶ月以内に更新
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
Reviews
Reviews coming soon
