[docs]def__init__(self,config:Config,log:BoundLoggerLazyProxy)->None:"""Main class of the package. Args: config (Config): Uptainer Config class, it will contain all the infos. log (BoundLoggerLazyProxy): Log class to inject into the vars. Class: structlog Returns: None """self.config=configself.log=logbind_contextvars(reponame=self.config.name)self.provider=BaseProvider(log=self.log)self.image_provider=Noneself.yamlcontent=None
[docs]defget_image_provider(self,image_repository:str)->TyperImageProvider:"""Return container image provider. Args: image_repository (str): Container Image repository url Returns: Return a dict that have image provider object. Its like: {"error": <bool>, "data": "<provider object>"} """out=TyperImageProvider(error=False,data=BaseProvider(log=self.log))DOCKERHUB_SPLITSLASHES=2image_repository=image_repository.replace("https://","").replace("http://","")ifimage_repository:urlparsed=urlparse(f"//{image_repository}")ifurlparsed.netloc=="ghcr.io":out["data"]=GitHub(log=self.log)ifurlparsed.netloc=="docker.io":out["data"]=DockerHub(log=self.log)iflen(image_repository.split("/"))<=DOCKERHUB_SPLITSLASHES:# Match Dockerhub default format when the hostname its not specified.out["data"]=DockerHub(log=self.log)else:out["error"]=Truereturnout
[docs]defdetect_version(self,tags:list[TyperImageList])->TyperDetectedVersion:"""Find the latest version to apply. Args: tags (list): The list of the tags found from the remote repo. Returns: Return a dict that have version matched. Its like: {"error": <bool>, "data": "<matched version>"} """matched=Falseout=TyperDetectedVersion(error=False,data=None)self.log.debug(f"Regex to match: {self.config.version_match}")fortagiterintags:ifmatched:breakfortagintagiter["name"]:version=re.match(self.config.version_match,tag)ifversion:matched=Trueout["data"]=version.stringbreakifnotmatched:out["error"]=Trueself.log.error("Error during detecting version.")returnout
[docs]defdetect_current_version(self,fpath:str,key:str)->TyperDetectedVersion:"""Reading and return the tag image used on the git project. Args: fpath (str): Absolute path of the yaml file to read. key (str): Key path to read on the yaml, like "image.tag". Returns: TyperDetectedVersion object """out=TyperDetectedVersion(error=False,data=None)ifexists(fpath):box=Box.from_yaml(filename=fpath,Loader=yaml.FullLoader,default_box=True,box_dots=True)out["data"]=box[key]else:self.log.error(f"File '{fpath}' not exists")out["error"]=Truereturnout
[docs]defupdate_version(self,fpath:str,key:str,newversion:str)->TyperGenericReturn:"""Update the tag image used on the git project in the values file specified. Args: fpath (str): Absolute path of the yaml file to read. key (str): Key path to read on the yaml, like "image.tag". newversion (str): New version to apply. Returns: TyperDetectedVersion object """out=TyperGenericReturn(error=False,data=None)ifexists(fpath):box=Box.from_yaml(filename=fpath,Loader=yaml.FullLoader,default_box=True,box_dots=True)box[key]=newversionfopen=open(fpath,"w")fopen.write(box.to_yaml())fopen.close()self.log.info(f"Pushing the key '{key}' into '{fpath}'")else:self.log.error(f"File '{fpath}' not exists")out["error"]=Truereturnout
[docs]defrun(self)->None:"""Main function to check repos. Args: None Returns: None """self.log.info(f"Running check named: '{self.config.name}'")image_provider=self.get_image_provider(image_repository=self.config.image_repository)ifnotimage_provider["error"]:self.provider=image_provider["data"]else:self.log.error("Image provider detecting fail, please check it.")returnself.log.info(f"Image provider detected: '{self.provider}'")self.log.info("Getting the image tags from the provider")metadata=self.provider.get_metadata(image_repository=self.config.image_repository)ifmetadata["error"]:self.log.error("Error during getting the tags.")returntags=self.provider.get_image_versions(metadata["data"]["parent"],metadata["data"]["project"])iftags["error"]:self.log.error("Error getting the tags")returnversion=self.detect_version(tags=tags["data"])ifversion["error"]:self.log.error("Error during matching the version.")returnself.log.info(f"The version to apply: {version['data']}")git_obj=Git(log=self.log,remote_url=self.config.git_ssh_url,branch=self.config.git_branch,ssh_private_key=self.config.git_ssh_privatekey,)git_obj.create_workdir()pull_check=git_obj.clone_repo()ifpull_check["error"]:returncurrent_version=self.detect_current_version(fpath=f"{git_obj.work_directory}/{self.config.git_values_filename}",key=self.config.values_key)ifcurrent_version["error"]:returnself.log.info(f"Version detected Current: {current_version['data']} / To apply: {version['data']}")self.update_version(fpath=f"{git_obj.work_directory}/{self.config.git_values_filename}",key=self.config.values_key,newversion=version["data"],)git_obj.push_repo(fpath=self.config.git_values_filename,newversion=version["data"])self.log.info("---> Done.")