Skip to content

Commit 1af67d7

Browse files
viniciusdcpre-commit-ci[bot]Adam-D-Lewis
authored
[RELEASE] Add upgrade step for Nebari version 2025.10.1 (#3147)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Adam Lewis <23342526+Adam-D-Lewis@users.noreply.github.com>
1 parent 8311f1f commit 1af67d7

File tree

3 files changed

+217
-2
lines changed

3 files changed

+217
-2
lines changed

src/_nebari/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CURRENT_RELEASE = "2025.6.1"
1+
CURRENT_RELEASE = "2025.10.1"
22

33
HELM_VERSION = "v3.15.3"
44
KUSTOMIZE_VERSION = "5.4.3"

src/_nebari/provider/helm.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ def download_helm_binary(version=constants.HELM_VERSION) -> Path:
5959
def run_helm_subprocess(processargs, **kwargs) -> None:
6060
helm_path = download_helm_binary()
6161
logger.info("helm at %s", helm_path)
62-
if run_subprocess_cmd([helm_path] + processargs, **kwargs):
62+
return_code, output = run_subprocess_cmd(
63+
[helm_path] + processargs, capture_output=True, **kwargs
64+
)
65+
if return_code:
6366
raise HelmException("Helm returned an error")
6467

6568

src/_nebari/upgrade.py

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,6 +1841,218 @@ def _version_specific_upgrade(
18411841
return config
18421842

18431843

1844+
class Upgrade_2025_10_1(UpgradeStep):
1845+
"""
1846+
Upgrade step for Nebari version 2025.10.1
1847+
1848+
This upgrade includes:
1849+
- Patching deprecated Bitnami images to avoid deployment issues during Helm chart upgrades
1850+
"""
1851+
1852+
version = "2025.10.1"
1853+
1854+
@override
1855+
def _version_specific_upgrade(
1856+
self, config, start_version, config_filename: Path, *args, **kwargs
1857+
):
1858+
# Define the deprecated Bitnami images that need to be patched via Helm
1859+
# Format: release_name, chart (direct .tgz URL), set_values (list of --set flags)
1860+
# Note: Using direct URLs to .tgz files to avoid needing to add repos
1861+
deprecated_helm_releases = [
1862+
{
1863+
"name": "keycloak",
1864+
"chart": "https://github.com/codecentric/helm-charts/releases/download/keycloak-15.0.2/keycloak-15.0.2.tgz",
1865+
"description": "Keycloak PostgreSQL",
1866+
"set_values": [
1867+
"postgresql.image.registry=docker.io",
1868+
"postgresql.image.repository=bitnamilegacy/postgresql",
1869+
"postgresql.image.tag=11.14.0",
1870+
],
1871+
},
1872+
{
1873+
"name": "nebari-conda-store-postgresql",
1874+
"chart": "https://charts.bitnami.com/bitnami/postgresql-10.13.12.tgz",
1875+
"description": "Conda-store PostgreSQL",
1876+
"set_values": [
1877+
"image.registry=docker.io",
1878+
"image.repository=bitnamilegacy/postgresql",
1879+
"image.tag=11.14.0",
1880+
],
1881+
},
1882+
{
1883+
"name": "nebari-conda-store-minio",
1884+
"chart": "https://charts.bitnami.com/bitnami/minio-6.7.4.tgz",
1885+
"description": "Conda-store MinIO",
1886+
"set_values": [
1887+
"image.registry=docker.io",
1888+
"image.repository=bitnamilegacy/minio",
1889+
"image.tag=2021.4.22",
1890+
],
1891+
},
1892+
{
1893+
"name": "nebari-conda-store-redis",
1894+
"chart": "https://charts.bitnami.com/bitnami/redis-17.0.6.tgz",
1895+
"description": "Conda-store Redis",
1896+
"set_values": [
1897+
"image.registry=docker.io",
1898+
"image.repository=bitnamilegacy/redis",
1899+
"image.tag=7.0.4-debian-11-r4",
1900+
],
1901+
},
1902+
]
1903+
1904+
loki_minio_release = {
1905+
"name": None, # Will be determined from config
1906+
"chart": "https://charts.bitnami.com/bitnami/minio-6.7.4.tgz",
1907+
"description": "Loki MinIO",
1908+
"set_values": [
1909+
"image.registry=docker.io",
1910+
"image.repository=bitnamilegacy/minio",
1911+
"image.tag=2021.4.22",
1912+
],
1913+
}
1914+
1915+
# Filter releases based on enabled services
1916+
releases_to_patch = []
1917+
1918+
# PostgreSQL for Keycloak is always enabled if keycloak is enabled
1919+
if config.get("security", {}).get("keycloak", {}).get("enabled", True):
1920+
releases_to_patch.append(deprecated_helm_releases[0])
1921+
1922+
# PostgreSQL, MinIO, and Redis for conda-store
1923+
if config.get("conda_store", {}).get("enabled", True):
1924+
releases_to_patch.append(deprecated_helm_releases[1])
1925+
releases_to_patch.append(deprecated_helm_releases[2])
1926+
releases_to_patch.append(deprecated_helm_releases[3])
1927+
1928+
# MinIO for Loki (monitoring)
1929+
if config.get("monitoring", {}).get("enabled", True):
1930+
# Get the minio release name from config (defaults to "nebari-loki-minio")
1931+
loki_minio_name = (
1932+
config.get("monitoring", {})
1933+
.get("overrides", {})
1934+
.get("minio-release-name", "nebari-loki-minio")
1935+
)
1936+
loki_minio_release["name"] = loki_minio_name
1937+
releases_to_patch.append(loki_minio_release)
1938+
1939+
if releases_to_patch:
1940+
namespace = config.get("namespace", "dev")
1941+
1942+
rich.print(
1943+
"\n ⚠️ Warning ⚠️"
1944+
"\n-> [red bold]Nebari version 2025.10.1 updates Bitnami images that have been deprecated.[/red bold]"
1945+
"\n-> [red bold]Before upgrading, the following Helm releases need to be patched to avoid deployment issues during Helm chart upgrades.[/red bold]"
1946+
"\n-> For more information, see: [link=https://github.com/nebari-dev/nebari/issues/3137]https://github.com/nebari-dev/nebari/issues/3137[/link]"
1947+
)
1948+
1949+
# Display releases to be patched
1950+
rich.print("\n[cyan bold]Helm releases to be patched:[/cyan bold]")
1951+
for release in releases_to_patch:
1952+
rich.print(f" • {release['description']} ({release['name']})")
1953+
1954+
run_patches = kwargs.get("attempt_fixes", False) or Confirm.ask(
1955+
"\nDo you want Nebari to run the Helm upgrade commands for you? (You'll confirm each command individually)",
1956+
default=False,
1957+
)
1958+
1959+
# Prepare helm commands for manual execution (all using direct .tgz URLs)
1960+
commands = "[cyan bold]"
1961+
for release in releases_to_patch:
1962+
set_flags = " ".join([f"--set {val}" for val in release["set_values"]])
1963+
commands += f"helm upgrade {release['name']} {release['chart']} --reuse-values {set_flags} --namespace {namespace}\n"
1964+
commands += "[/cyan bold]"
1965+
1966+
# Use a rich console with a larger width to print commands without wrapping
1967+
console = rich.console.Console(width=220)
1968+
1969+
if run_patches:
1970+
from _nebari.provider.helm import run_helm_subprocess
1971+
1972+
try:
1973+
kubernetes.config.load_kube_config()
1974+
except kubernetes.config.config_exception.ConfigException:
1975+
rich.print(
1976+
"[red bold]No default kube configuration file was found. Make sure to [link=https://www.nebari.dev/docs/how-tos/debug-nebari#generating-the-kubeconfig]have one pointing to your Nebari cluster[/link] before upgrading.[/red bold]"
1977+
)
1978+
exit()
1979+
1980+
current_kube_context = kubernetes.config.list_kube_config_contexts()[1]
1981+
cluster_name = current_kube_context["context"]["cluster"]
1982+
rich.print(
1983+
f"\nThe following Helm upgrade commands will be run for the [cyan bold]{cluster_name}[/cyan bold] cluster.\n"
1984+
)
1985+
1986+
# Patch the images using Helm upgrade --reuse-values with direct chart URLs
1987+
for release in releases_to_patch:
1988+
# Build the command for display
1989+
set_flags = " ".join(
1990+
[f"--set {val}" for val in release["set_values"]]
1991+
)
1992+
command_str = f"helm upgrade {release['name']} {release['chart']} --reuse-values {set_flags} --namespace {namespace}"
1993+
1994+
rich.print(
1995+
f"\n[cyan bold]Next command for {release['description']}:[/cyan bold]"
1996+
)
1997+
console.print(f"\t[cyan]{command_str}[/cyan]")
1998+
1999+
if not kwargs.get("attempt_fixes", False):
2000+
run_command = Confirm.ask(
2001+
f"\nRun this command for {release['description']}?",
2002+
default=True,
2003+
)
2004+
if not run_command:
2005+
rich.print(
2006+
f"[yellow]⊘[/yellow] Skipped {release['description']} ({release['name']})"
2007+
)
2008+
continue
2009+
2010+
try:
2011+
helm_args = [
2012+
"upgrade",
2013+
release["name"],
2014+
release["chart"],
2015+
"--reuse-values",
2016+
"--namespace",
2017+
namespace,
2018+
]
2019+
for set_value in release["set_values"]:
2020+
helm_args.extend(["--set", set_value])
2021+
2022+
run_helm_subprocess(helm_args)
2023+
rich.print(
2024+
f"[green]✓[/green] Patched {release['description']} ({release['name']})"
2025+
)
2026+
except Exception as e:
2027+
rich.print(
2028+
f"[yellow]⚠[/yellow] Could not patch {release['description']} ({release['name']}): {e}"
2029+
)
2030+
2031+
rich.print(
2032+
"\n[green]Helm release patching complete.[/green] The pods will restart with the new images."
2033+
)
2034+
else:
2035+
rich.print(
2036+
"[red bold]Before upgrading, you need to manually patch the deprecated Bitnami images using Helm. To do that, please run the following commands:[/red bold]"
2037+
)
2038+
console.print(textwrap.indent(commands, prefix="\t"))
2039+
2040+
_ = Prompt.ask("Hit enter to continue")
2041+
continue_ = Confirm.ask(
2042+
"Have you patched the deprecated Bitnami images using the Helm commands above?",
2043+
default=False,
2044+
)
2045+
if not continue_:
2046+
rich.print(
2047+
f"[red bold]You must patch the deprecated Bitnami images using Helm before upgrading to [green]{self.version}[/green].[/bold red]"
2048+
)
2049+
exit()
2050+
2051+
rich.print("\nReady to upgrade to Nebari version [green]2025.10.1[/green].")
2052+
2053+
return config
2054+
2055+
18442056
__rounded_version__ = str(rounded_ver_parse(__version__))
18452057

18462058
# Manually-added upgrade steps must go above this line

0 commit comments

Comments
 (0)