import subprocess
import sys
import xmltodict
import json


def get_rbd_size(id):
    r=subprocess.run("rbd info --pretty-format --format json".split()+[id], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    x=json.loads(r.stdout)
    return x['size']

vmname=sys.argv[1]
host=sys.argv[2]
vmid=sys.argv[3]
vlanid=sys.argv[4]
print("convert",vmname,host,vmid,vlanid)

r=subprocess.run(["ssh","-T",host,"virsh dumpxml "+vmname], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
xml_s=r.stdout

d = xmltodict.parse(xml_s)
vmd={"name":d['domain']['name'],
     "ip":d['domain']['metadata']['ttnn:config']['ttnn:network']['ttnn:tap']['#text'],
     "mem":d['domain']['memory']['#text'],
     "memunit":d['domain']['memory']['@unit'],
     "cpu":d['domain']['cpu']['topology']['@cores'],
     "mac":d['domain']['devices']['interface']['mac']['@address'],
     "disks":[],"disks_size_b":{}
}
print(vmd)
unit_d={"KiB":1024}
memory=str(int(int(vmd["mem"])*unit_d[vmd["memunit"]]/1024/1024))

#print(d['domain']['name'])
#print(d['domain']['metadata']['ttnn:config']['ttnn:network']['ttnn:tap']['#text'])
#print(d['domain']['memory']['#text'])
#print(d['domain']['memory']['@unit'])
#print(d['domain']['cpu']['topology']['@cores'])
#print(d['domain']['devices']['interface']['mac']['@address'])
#print(d['domain']['devices']['disk']['source']['@name'])
x=d['domain']['devices']['disk']
if type(x) is list:
    for i in range(len(x)):
        #print(i,x[i]['source']['@name'])
        vmd["disks"].append(x[i]['source']['@name'])
else:
    n=x['source']['@name']
    vmd["disks"].append(n)


i_disk=0
disk_s=""
for xd in vmd["disks"]:
    s_b=get_rbd_size(xd)
    vmd["disks_size_b"][xd]=s_b
    dk_name="tmp20/vm-"+vmid+"-disk-"+str(i_disk)
    #print(xd, s_b, dk_name)
    print("ssh -p 22 pve20 zfs create -s -b 128k -V "+str(s_b)+" "+dk_name )
    print("rbd export "+xd+" - | ssh -p 22 pve20"+' "cat > /dev/'+dk_name+'" #'+vmname)
    disk_s+=" --scsi%d tmp20:vm-%s-disk-%d,discard=on,iothread=1,ssd=1"%(i_disk,vmid,i_disk)
    i_disk+=1


qm_s="ssh -p 22 pve20 qm create "+vmid+" --name "+vmname+" --memory "+memory+" --cpu host --cores "+str(vmd["cpu"])+" --numa 0 --sockets 1 --net0 virtio="+vmd["mac"]+",bridge=vmbr0,tag="+vlanid+" --ostype l26 --serial0 socket --vga serial0 --scsihw virtio-scsi-single --ide2 none,media=cdrom "+disk_s
#--scsi0 tmp20:vm-106-disk-0,discard=on,iothread=1,ssd=1 --scsi1 tmp20:vm-106-disk-1,discard=on,iothread=1,ssd=1"
print(qm_s)
#ssh -p 22 pve20 zfs create -s -b 128k -V 21474836480 tmp20/vm-100-disk-1
#rbd export ssds/volume-de430206-edaf-4760-93a5-64b06753b363 - | ssh -p 22 pve20 "cat > /dev/tmp20/vm-100-disk-1"
#qm create 106 -name vm106 --memory 1024 --cpu host --cores 1 --numa 0 --sockets 1 --net0 virtio=fa:16:3e:1e:ce:d4,bridge=vmbr0,tag=1002 --ostype l26 --serial0 socket --vga serial0 --scsihw virtio-scsi-single --ide2 none,media=cdrom --scsi0 tmp20:vm-106-disk-0,discard=on,iothread=1,ssd=1 --scsi1 tmp20:vm-106-disk-1,discard=on,iothread=1,ssd=1 --boot 'order=scsi0;ide2;net0'
