Skip to content

Commit 6ae39ba

Browse files
committed
fix profile inheritance
1 parent de9c58f commit 6ae39ba

File tree

3 files changed

+116
-262
lines changed

3 files changed

+116
-262
lines changed

kvirt/baseconfig.py

Lines changed: 16 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,6 @@
2929
import yaml
3030

3131

32-
def other_client(profile, clients):
33-
for cli in clients:
34-
if profile.startswith(f"{cli}_"):
35-
return True
36-
return False
37-
38-
3932
def libvirt_macosx():
4033
return which('brew') is not None and 'libvirt started' in os.popen('brew services list').read()
4134

@@ -712,85 +705,22 @@ def process_inputfile(self, plan, inputfile, overrides={}, onfly=None, full=Fals
712705
return entries, overrides, basefile, basedir
713706

714707
def list_profiles(self):
715-
default_disksize = '10'
716-
default = self.default
717-
results = []
718-
other_clients = [cli for cli in self.clients if cli != self.client]
719-
for profile in [p for p in self.profiles if 'base' not in self.profiles[p]] + [p for p in self.profiles
720-
if 'base' in self.profiles[p]]:
721-
if other_client(profile, other_clients):
722-
continue
723-
info = self.profiles[profile]
724-
if 'base' in info:
725-
father = self.profiles[info['base']]
726-
default_numcpus = father.get('numcpus', default['numcpus'])
727-
default_memory = father.get('memory', default['memory'])
728-
default_pool = father.get('pool', default['pool'])
729-
default_disks = father.get('disks', default['disks'])
730-
default_nets = father.get('nets', default['nets'])
731-
default_image = father.get('image', '')
732-
default_cloudinit = father.get('cloudinit', default['cloudinit'])
733-
default_nested = father.get('nested', default['nested'])
734-
default_reservedns = father.get('reservedns', default['reservedns'])
735-
default_reservehost = father.get('reservehost', default['reservehost'])
736-
default_flavor = father.get('flavor', default['flavor'])
737-
else:
738-
default_numcpus = default['numcpus']
739-
default_memory = default['memory']
740-
default_pool = default['pool']
741-
default_disks = default['disks']
742-
default_nets = default['nets']
743-
default_image = ''
744-
default_cloudinit = default['cloudinit']
745-
default_nested = default['nested']
746-
default_reservedns = default['reservedns']
747-
default_reservehost = default['reservehost']
748-
default_flavor = default['flavor']
749-
profiletype = info.get('type', '')
750-
if profiletype == 'container':
751-
continue
752-
numcpus = info.get('numcpus', default_numcpus)
753-
memory = info.get('memory', default_memory)
754-
pool = info.get('pool', default_pool)
755-
diskinfo = []
756-
disks = info.get('disks')
757-
if disks is None:
758-
if 'disksize' in info:
759-
disks = [info['disksize']]
760-
else:
761-
disks = default_disks
762-
for disk in disks:
763-
if disk is None:
764-
size = default_disksize
765-
elif isinstance(disk, int):
766-
size = str(disk)
767-
elif isinstance(disk, dict):
768-
size = str(disk.get('size', default_disksize))
769-
diskinfo.append(size)
770-
diskinfo = ','.join(diskinfo)
771-
netinfo = []
772-
nets = info.get('nets', default_nets)
773-
for net in nets:
774-
if isinstance(net, str):
775-
netname = net
776-
elif isinstance(net, dict) and 'name' in net:
777-
netname = net['name']
778-
netinfo.append(netname)
779-
netinfo = ','.join(netinfo)
780-
template = info.get('template', default_image)
781-
image = info.get('image', template)
782-
cloudinit = info.get('cloudinit', default_cloudinit)
783-
nested = info.get('nested', default_nested)
784-
reservedns = info.get('reservedns', default_reservedns)
785-
reservehost = info.get('reservehost', default_reservehost)
786-
flavor = info.get('flavor', default_flavor)
787-
if flavor is None:
788-
flavor = f"{numcpus}cpus {memory}Mb ram"
789-
if profile.startswith(f'{self.client}_'):
790-
profile = profile.replace(f'{self.client}_', '')
791-
results.append([profile, flavor, pool, diskinfo, image, netinfo, cloudinit, nested,
792-
reservedns, reservehost])
793-
return sorted(results, key=lambda x: x[0])
708+
cli = self.client
709+
all_profiles = self.profiles
710+
valid_profiles = {p: all_profiles[p] for p in all_profiles if all_profiles[p].get('type', 'vm') == 'vm'}
711+
for profile in valid_profiles:
712+
entry = self.default.copy()
713+
base_profiles = []
714+
base_profile = valid_profiles[profile].get('base')
715+
while base_profile is not None:
716+
base_profiles.append(base_profile)
717+
base_profile = valid_profiles[base_profile].get('base')
718+
for base_profile in reversed(base_profiles):
719+
entry.update(valid_profiles[base_profile])
720+
entry.update(valid_profiles[profile])
721+
valid_profiles[profile] = entry
722+
valid_profiles = {p: valid_profiles[p] for p in valid_profiles if all_profiles[p].get('client', cli) == cli}
723+
return valid_profiles
794724

795725
def list_clusterprofiles(self):
796726
return self.clusterprofiles

kvirt/cli.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,26 +1002,15 @@ def info_confpool(args):
10021002

10031003

10041004
def info_profile(args):
1005-
profile = args.profile
1005+
profilename = args.profile
10061006
baseconfig = Kbaseconfig(client=args.client, debug=args.debug)
10071007
profiles = baseconfig.list_profiles()
1008-
for entry in profiles:
1009-
if entry[0] == profile:
1010-
profile, flavor, pool, disks, image, nets, cloudinit, nested, reservedns, reservehost = entry
1011-
print(f"profile: {profile}")
1012-
print(f"flavor: {flavor}")
1013-
print(f"pool: {pool}")
1014-
print(f"disks: {disks}")
1015-
print(f"image: {image}")
1016-
print(f"nets: {nets}")
1017-
print(f"cloudinit: {cloudinit}")
1018-
print(f"nested: {nested}")
1019-
print(f"reservedns: {reservedns}")
1020-
print(f"reservehost: {reservehost}")
1021-
sys.exit(0)
1022-
break
1023-
error(f"Profile {profile} not found")
1024-
sys.exit(1)
1008+
if profilename not in profiles:
1009+
error(f"Profile {profilename} not found")
1010+
sys.exit(1)
1011+
profile = profiles[profilename]
1012+
for key in sorted(profile):
1013+
print(f"{key}: {profile[key]}")
10251014

10261015

10271016
def list_profile(args):
@@ -1033,15 +1022,26 @@ def list_profile(args):
10331022
_list_output(profiles, output)
10341023
if short:
10351024
profilestable = PrettyTable(["Profile"])
1036-
for profile in sorted(profiles):
1037-
profilename = profile[0]
1025+
for profilename in sorted(profiles):
10381026
profilestable.add_row([profilename])
10391027
else:
1040-
profilestable = PrettyTable(["Profile", "Flavor",
1041-
"Pool", "Disks", "Image",
1042-
"Nets", "Cloudinit", "Nested",
1043-
"Reservedns", "Reservehost"])
1044-
for profile in sorted(profiles):
1028+
profilestable = PrettyTable(["Profile", "Flavor", "Numcpus", "Memory", "Pool", "Disks", "Image", "Nets"])
1029+
for profilename in sorted(profiles):
1030+
profile = profiles[profilename]
1031+
numcpus = profile['numcpus']
1032+
memory = profile['memory']
1033+
flavor = profile['flavor']
1034+
pool = profile['pool']
1035+
disks = []
1036+
for disk in profile['disks']:
1037+
if isinstance(disk, int):
1038+
disks.append(str(disk))
1039+
else:
1040+
disks.append(str(disk['size']))
1041+
disks = ','.join([d for d in disks])
1042+
image = profile['image']
1043+
nets = ','.join([n for n in profile['nets']])
1044+
profile = [profilename, flavor, numcpus, memory, pool, disks, image, nets]
10451045
profilestable.add_row(profile)
10461046
profilestable.align["Profile"] = "l"
10471047
print(profilestable)

0 commit comments

Comments
 (0)