From 96ec2209c576b762ec34775564905ef082054d38 Mon Sep 17 00:00:00 2001 From: Noahnc Date: Wed, 25 Oct 2023 20:39:24 +0200 Subject: [PATCH] implement tile version handling --- infrapatch/core/composition.py | 2 +- .../models/versioned_terraform_resources.py | 50 ++++++++++++++++--- requirements.txt | 5 +- setup.py | 3 +- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/infrapatch/core/composition.py b/infrapatch/core/composition.py index a0fcd5f..38b0078 100644 --- a/infrapatch/core/composition.py +++ b/infrapatch/core/composition.py @@ -40,7 +40,7 @@ def get_all_terraform_resources(self, project_root: Path) -> list[VersionedTerra for terraform_file in progress.track(terraform_files, description="Parsing .tf files..."): resources.extend(self.hcl_handler.get_terraform_resources_from_file(terraform_file)) for resource in progress.track(resources, description="Getting newest resource versions..."): - resource.set_newest_version(self.registry_handler.get_newest_version(resource)) + resource.newest_version = self.registry_handler.get_newest_version(resource) return resources def print_resource_table(self, resources: list[VersionedTerraformResource], only_upgradable: bool = False): diff --git a/infrapatch/core/models/versioned_terraform_resources.py b/infrapatch/core/models/versioned_terraform_resources.py index 97c102c..27690b8 100644 --- a/infrapatch/core/models/versioned_terraform_resources.py +++ b/infrapatch/core/models/versioned_terraform_resources.py @@ -1,7 +1,7 @@ import logging as log import re +import semantic_version from dataclasses import dataclass -from distutils.version import StrictVersion from pathlib import Path from typing import Optional @@ -17,7 +17,7 @@ class VersionedTerraformResource: name: str current_version: str source_file: Path - newest_version: Optional[str] = None + _newest_version: Optional[str] = None _status: str = ResourceStatus.UNPATCHED _base_domain: str = None _identifier: str = None @@ -43,21 +43,59 @@ def resource_name(self): def identifier(self) -> str: return self._identifier - def set_newest_version(self, version: str): - self.newest_version = version + @property + def newest_version(self) -> Optional[str]: + return self._newest_version + + @property + def newest_version_base(self): + if self.has_tile_constraint(): + return self.newest_version.strip("~>") + return self.newest_version + + @newest_version.setter + def newest_version(self, version: str): + if self.has_tile_constraint(): + self._newest_version = f"~>{version}" + return + self._newest_version = version def set_patched(self): self._status = ResourceStatus.PATCHED + def has_tile_constraint(self): + return re.match(r"^~>[0-9]+\.[0-9]+\.[0-9]+$", self.current_version) + def set_patch_error(self): self._status = ResourceStatus.PATCH_ERROR def installed_version_equal_or_newer_than_new_version(self): + if self.newest_version is None: raise Exception(f"Newest version of resource '{self.name}' is not set.") - if StrictVersion(self.newest_version) > StrictVersion(self.current_version): + + newest = semantic_version.Version(self.newest_version_base) + + # check if the current version has the following format: "1.2.3" + if re.match(r"^[0-9]+\.[0-9]+\.[0-9]+$", self.current_version): + current = semantic_version.Version(self.current_version) + if current >= newest: + return True + return False + + # chech if the current version has the following format: "~>3.76.0" + if self.has_tile_constraint(): + current = semantic_version.Version(self.current_version.strip("~>")) + if current.major > newest.major: + return True + if current.minor >= newest.minor: + return True return False - return True + + current_constraint = semantic_version.NpmSpec(self.current_version) + if newest in current_constraint: + return True + return False def check_if_up_to_date(self): if self.status == ResourceStatus.PATCH_ERROR: diff --git a/requirements.txt b/requirements.txt index b576c1d..7eb828c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,7 @@ click~=8.1.7 rich~=13.6.0 pygohcl~=1.0.7 GitPython~=3.1.40 -setuptools~=65.5.1 \ No newline at end of file +setuptools~=65.5.1 +pygit2~=1.13.1 +semantic_version~=2.10.0 +``` \ No newline at end of file diff --git a/setup.py b/setup.py index 7a320d7..0bca866 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,8 @@ "rich~=13.6.0", "pygohcl~=1.0.7", "GitPython~=3.1.40", - "setuptools~=65.5.1" + "setuptools~=65.5.1", + "semantic_version~=2.10.0" ], python_requires='>=3.11', entry_points='''