Skip to content

Commit f135835

Browse files
committed
Improve KVM support
1 parent 9e8725f commit f135835

2 files changed

Lines changed: 32 additions & 14 deletions

File tree

chi/lease.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -484,14 +484,25 @@ def add_fip_reservation(self, amount: int):
484484
"""
485485
add_fip_reservation(reservation_list=self.fip_reservations, count=amount)
486486

487-
def add_flavor_reservation(self, id, amount=1):
487+
def add_flavor_reservation(self, id=None, name=None, amount=1):
488488
"""
489-
Add a reservation for a KVM flavor to the list of reservations.
489+
Add a reservation for a KVM flavor to the list of reservations by name or ID.
490490
491491
Args:
492492
id (str): The ID of the flavor to reserve
493-
count (int): The number of floating IPs to reserve.
493+
name (str): The name of the flavor to reserve
494+
amount (int): The number of instances of this flavor to reserve
494495
"""
496+
# Do not permit both or neither name and id.
497+
if (name and id) or not (name or id):
498+
raise CHIValueError(
499+
"You must specify exactly one of id or name"
500+
)
501+
502+
# Blazar API requires flavor ID, so we must convert from name
503+
if not id:
504+
id = server.get_flavor(name).id
505+
495506
self.flavor_reservations.append(
496507
{
497508
"resource_type": "flavor:instance",
@@ -784,7 +795,7 @@ def get_reserved_flavors(self):
784795
flavors = []
785796
for res in self.flavor_reservations:
786797
flavors.extend(
787-
server.list_flavors(reservable=True, reservation_id=res.get("id"))
798+
server.list_flavors(reservation_id=res.get("id"))
788799
)
789800
return flavors
790801

chi/server.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -699,11 +699,12 @@ def __repr__(self):
699699
return f"<{self.__class__.__name__} '{self.name}' {self.description} (disk={self.disk}) (ram={self.ram}) (vcpus={self.vcpus})>"
700700

701701

702-
def list_flavors(reservable=None, reservation_id=None) -> List[Flavor]:
703-
"""Get a list of all available flavors.
702+
def list_flavors(reservable=None, gpu=None, reservation_id=None) -> List[Flavor]:
703+
"""Get a list of flavors
704704
705705
Args:
706-
reservable (bool): Whether to filter by reservable flavors. Defaults to True.
706+
reservable (bool): If given, whether to filter by reservable flavors.
707+
gpu (bool): If given, whether to filter by GPU flavors.
707708
reservation_id (str, optional): The reservation ID to filter by. Defaults to None.
708709
709710
Returns:
@@ -715,13 +716,19 @@ def list_flavors(reservable=None, reservation_id=None) -> List[Flavor]:
715716
chi_flavors = []
716717
for f in flavors:
717718
extras = f.get_keys()
718-
# include a flavor if:
719-
# - not filtering by reservable
720-
# - is reservable in blazar & not an active reservation flavor
721-
if not reservable or (
722-
extras.get("aggregate_instance_extra_specs:reservation")
723-
== reservation_id
724-
and extras.get("trait:CUSTOM_BLAZAR_FLAVOR_RESERVATION") == "required"
719+
is_reservable = not any(
720+
e.startswith("resources:CUSTOM_RESERVATION_")
721+
for e in extras
722+
)
723+
is_gpu = f.extra_specs.get("trait:CUSTOM_GPU") == "required"
724+
matching_reservation = (
725+
reservation_id is None or
726+
extras.get("aggregate_instance_extra_specs:reservation", None) == reservation_id
727+
)
728+
if (
729+
(reservable is None or reservable == is_reservable)
730+
and (gpu is None or gpu == is_gpu)
731+
and matching_reservation
725732
):
726733
chi_flavors.append(
727734
Flavor(

0 commit comments

Comments
 (0)