@@ -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+ "\n Do 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"\n The 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"\n Run 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 ("\n Ready 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