"""A Pulumi deployment with libvirt and Python""" # vim:sts=4:sw=4 import yaml from dotmap import DotMap import pulumi import pulumi_libvirt as lv from passlib.hash import sha512_crypt from jinja2 import Template conf = DotMap(yaml.safe_load(open("input.yaml").read())) cloudimages = DotMap(yaml.safe_load(open("cloud-images.yaml").read())) conf.password = sha512_crypt.hash(conf.password, rounds=4096) config = pulumi.Config() pool = lv.Pool("mypool", type="dir", path=conf.poolpath) baseimg = lv.Volume("myimage", pool=pool.name, source=cloudimages[conf.image]) volume = lv.Volume("mydisk", base_volume_id=baseimg.id, pool=pool.name, size=int(conf.disksize) * 1024 ** 3 ) # Stream configuration files userdata = Template(open("./cloud-init/user-data.jinja").read()).render(conf) metadata = Template(open("./cloud-init/meta-data.jinja").read()).render(conf) networkconfig = open("./cloud-init/network-config").read() cloudinit = lv.CloudInitDisk("cloud-init", meta_data=metadata, user_data=userdata, network_config=networkconfig ) vm = lv.Domain(conf.name, boot_devices=[lv.DomainBootDeviceArgs(devs=["hd", "cdrom"])], cloudinit=cloudinit.id, vcpu=conf.vcpu, disks=[lv.DomainDiskArgs(volume_id=volume.id)], memory=int(conf.ram), network_interfaces=[lv.DomainNetworkInterfaceArgs( network_name="default", wait_for_lease=True ) ], consoles=[lv.DomainConsoleArgs( type="pty", target_port='0', target_type="serial" )], opts=pulumi.ResourceOptions( custom_timeouts=pulumi.CustomTimeouts(create="3m") ) ) pulumi.export("ip", vm.network_interfaces[0]['addresses'][0])