FEAT: add script to check for baseline updates
This commit is contained in:
parent
39351614a5
commit
2b2d28afe6
1 changed files with 85 additions and 0 deletions
85
bin/list_app_versions.py
Executable file
85
bin/list_app_versions.py
Executable file
|
@ -0,0 +1,85 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- encoding: utf-8; py-indent-offset: 4 -*-
|
||||
|
||||
# Author: Sebastian Mark
|
||||
# CC-BY-SA (https://creativecommons.org/licenses/by-sa/4.0/deed.de)
|
||||
# for civil use only
|
||||
|
||||
import os
|
||||
from urllib.request import Request, urlopen
|
||||
|
||||
import pandas as pd
|
||||
|
||||
import yaml
|
||||
|
||||
|
||||
def kubectl(cmd: str) -> str:
|
||||
cmd = f"kubectl -n argocd {cmd}"
|
||||
return os.popen(cmd).read()
|
||||
|
||||
|
||||
def get_latest_version(repo_url: str, chart: str) -> str:
|
||||
req = Request(
|
||||
repo_url + "/index.yaml",
|
||||
headers={"User-Agent": "Mozilla/5.0"},
|
||||
)
|
||||
with urlopen(req) as response:
|
||||
body = response.read()
|
||||
repos = yaml.safe_load(body)
|
||||
|
||||
chart_df = pd.DataFrame(repos["entries"][chart])
|
||||
chart_df = chart_df[
|
||||
~chart_df.version.str.contains("alpha") & ~chart_df.version.str.contains("beta")
|
||||
] # remove alpha versions
|
||||
|
||||
return chart_df.version.iloc[0]
|
||||
|
||||
|
||||
def get_argo_as_app() -> dict:
|
||||
cm = kubectl("get configmaps argocd-cm -o yaml")
|
||||
cm_formatted = yaml.safe_load(cm)
|
||||
version = cm_formatted["metadata"]["labels"]["helm.sh/chart"].lstrip("argo-cd-")
|
||||
|
||||
return dict(
|
||||
{
|
||||
"metadata": {
|
||||
"name": "argocd",
|
||||
},
|
||||
"spec": {
|
||||
"source": {
|
||||
"chart": "argo-cd",
|
||||
"repoURL": "https://argoproj.github.io/argo-helm",
|
||||
"targetRevision": version,
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def get_apps() -> list:
|
||||
apps = kubectl("get applications -o yaml")
|
||||
app_list = yaml.safe_load(apps)["items"]
|
||||
app_list.append(get_argo_as_app())
|
||||
return app_list
|
||||
|
||||
|
||||
def main():
|
||||
print("{:<20}{:<15}{:<10}".format("name", "installed", "latest"))
|
||||
|
||||
for app in get_apps():
|
||||
try:
|
||||
app["spec"]["source"]["chart"] # skip non-helm apps
|
||||
except KeyError:
|
||||
continue
|
||||
|
||||
name = app["metadata"]["name"]
|
||||
chart = app["spec"]["source"]["chart"]
|
||||
repo_url = app["spec"]["source"]["repoURL"]
|
||||
installed = app["spec"]["source"]["targetRevision"]
|
||||
latest = get_latest_version(repo_url, chart)
|
||||
|
||||
print("{:<20}{:<15}{:<10}".format(name, installed, latest))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in a new issue