From 3fcecd451e2d08cbc76cc7b2e941cc22f4061215 Mon Sep 17 00:00:00 2001 From: Tewfik Ghariani Date: Tue, 5 May 2020 22:25:46 -0400 Subject: [PATCH 1/2] Account for tagging the root volume after spot loss. Once a spot instance is lost or a spot request in cancelled, the root volume re- created is not appended to the block device mapping because the 'first_boot' was set to False. With this update, we are sure that all mapped volumes are consist ently tagged Other - Tag using root vol Name as depl name instead of description - Deletion of the condition to tag the volumes - Use of generic 'update_tags' method - Removal of first_boot ec2 attribute --- nixops_aws/backends/ec2.py | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/nixops_aws/backends/ec2.py b/nixops_aws/backends/ec2.py index dacaf366..7b1e0fb6 100644 --- a/nixops_aws/backends/ec2.py +++ b/nixops_aws/backends/ec2.py @@ -147,7 +147,6 @@ def get_type(cls): ) spot_instance_price = nixops.util.attr_property("ec2.spotInstancePrice", None) subnet_id = nixops.util.attr_property("ec2.subnetId", None) - first_boot = nixops.util.attr_property("ec2.firstBoot", True, type=bool) virtualization_type = nixops.util.attr_property("ec2.virtualizationType", None) def __init__(self, depl, name, id): @@ -1521,14 +1520,12 @@ def create(self, defn, check, allow_reboot, allow_recreate): nixops.known_hosts.add(self._ip_for_ssh_key(), self.public_host_key) # Add disks that were in the original device mapping of image. - if self.first_boot: - for device_stored, dm in self._get_instance().block_device_mapping.items(): - if device_stored not in self.block_device_mapping and dm.volume_id: - bdm = {"volumeId": dm.volume_id, "partOfImage": True} - self.update_block_device_mapping( - device_stored, bdm - ) # TODO: it stores root device as sd though its really attached as nvme - self.first_boot = False + for device_stored, dm in self._get_instance().block_device_mapping.items(): + if device_stored not in self.block_device_mapping and dm.volume_id: + bdm = {"volumeId": dm.volume_id, "partOfImage": True} + self.update_block_device_mapping( + device_stored, bdm + ) # TODO: it stores root device as sd though its really attached as nvme # Detect if volumes were manually detached. If so, reattach # them. @@ -1666,32 +1663,19 @@ def create(self, defn, check, allow_reboot, allow_recreate): self._conn, volume.id, self.logger ) - # Always apply tags to the volumes we just created. + # Always apply tags to the volumes created for device_stored, v in self.block_device_mapping.items(): device_real = device_name_stored_to_real(device_stored) - if not ( - ( - "disk" in v - and not ( - v["disk"].startswith("ephemeral") - or v["disk"].startswith("res-") - or v["disk"].startswith("vol-") - ) - ) - or "partOfImage" in v - ): - continue volume_tags = {} volume_tags.update(common_tags) volume_tags.update(defn.tags) volume_tags["Name"] = "{0} [{1} - {2}]".format( - self.depl.description, self.name, device_real + self.depl.name, self.name, device_real ) - self._retry(lambda: self._conn.create_tags([v["volumeId"]], volume_tags)) + self.update_tags(v["volumeId"], user_tags=volume_tags, check=check) # Attach missing volumes. - for device_stored, v in self.sorted_block_device_mapping(): if v.get("needsAttach", False): self.attach_volume(device_stored, v["volumeId"]) From 45849248b96048031c686b6f449b836ecc765b45 Mon Sep 17 00:00:00 2001 From: Tewfik Ghariani Date: Wed, 6 May 2020 14:28:34 +0100 Subject: [PATCH 2/2] Reverting the tagging condition --- nixops_aws/backends/ec2.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/nixops_aws/backends/ec2.py b/nixops_aws/backends/ec2.py index 7b1e0fb6..6aff1685 100644 --- a/nixops_aws/backends/ec2.py +++ b/nixops_aws/backends/ec2.py @@ -1667,6 +1667,18 @@ def create(self, defn, check, allow_reboot, allow_recreate): for device_stored, v in self.block_device_mapping.items(): device_real = device_name_stored_to_real(device_stored) + if not ( + ( + "disk" in v + and not ( + v["disk"].startswith("ephemeral") + or v["disk"].startswith("res-") + or v["disk"].startswith("vol-") + ) + ) + or "partOfImage" in v + ): + continue volume_tags = {} volume_tags.update(common_tags) volume_tags.update(defn.tags)