@@ -3,6 +3,7 @@ use std::fmt::Display;
33
44use serde:: { Deserialize , Serialize } ;
55use snafu:: { ResultExt , Snafu } ;
6+ use tokio:: task:: block_in_place;
67use tracing:: { debug, error, info, instrument} ;
78use url:: Url ;
89
@@ -202,62 +203,66 @@ pub fn install_release_from_repo(
202203 namespace : & str ,
203204 suppress_output : bool ,
204205) -> Result < InstallReleaseStatus , Error > {
205- debug ! ( "Install Helm release from repo" ) ;
206-
207- if check_release_exists ( release_name, namespace) ? {
208- let release = get_release ( release_name, namespace) ?. ok_or ( Error :: InstallRelease {
209- source : InstallReleaseError :: NoSuchRelease {
210- name : release_name. to_owned ( ) ,
211- } ,
212- } ) ?;
213-
214- let current_version = release. version ;
215-
216- match chart_version {
217- Some ( chart_version) => {
218- if chart_version == current_version {
219- return Ok ( InstallReleaseStatus :: ReleaseAlreadyInstalledWithVersion {
220- requested_version : chart_version. to_string ( ) ,
206+ // Ideally, each Helm invocation would spawn_blocking instead in/around helm_sys,
207+ // but that requires a larger refactoring
208+ block_in_place ( || {
209+ debug ! ( "Install Helm release from repo" ) ;
210+
211+ if check_release_exists ( release_name, namespace) ? {
212+ let release = get_release ( release_name, namespace) ?. ok_or ( Error :: InstallRelease {
213+ source : InstallReleaseError :: NoSuchRelease {
214+ name : release_name. to_owned ( ) ,
215+ } ,
216+ } ) ?;
217+
218+ let current_version = release. version ;
219+
220+ match chart_version {
221+ Some ( chart_version) => {
222+ if chart_version == current_version {
223+ return Ok ( InstallReleaseStatus :: ReleaseAlreadyInstalledWithVersion {
224+ requested_version : chart_version. to_string ( ) ,
225+ release_name : release_name. to_string ( ) ,
226+ current_version,
227+ } ) ;
228+ } else {
229+ return Err ( Error :: InstallRelease {
230+ source : InstallReleaseError :: ReleaseAlreadyInstalled {
231+ requested_version : chart_version. into ( ) ,
232+ name : release_name. into ( ) ,
233+ current_version,
234+ } ,
235+ } ) ;
236+ }
237+ }
238+ None => {
239+ return Ok ( InstallReleaseStatus :: ReleaseAlreadyInstalledUnspecified {
221240 release_name : release_name. to_string ( ) ,
222241 current_version,
223- } ) ;
224- } else {
225- return Err ( Error :: InstallRelease {
226- source : InstallReleaseError :: ReleaseAlreadyInstalled {
227- requested_version : chart_version. into ( ) ,
228- name : release_name. into ( ) ,
229- current_version,
230- } ,
231- } ) ;
242+ } )
232243 }
233244 }
234- None => {
235- return Ok ( InstallReleaseStatus :: ReleaseAlreadyInstalledUnspecified {
236- release_name : release_name. to_string ( ) ,
237- current_version,
238- } )
239- }
240245 }
241- }
242246
243- let full_chart_name = format ! ( "{repo_name}/{chart_name}" ) ;
244- let chart_version = chart_version. unwrap_or ( HELM_DEFAULT_CHART_VERSION ) ;
247+ let full_chart_name = format ! ( "{repo_name}/{chart_name}" ) ;
248+ let chart_version = chart_version. unwrap_or ( HELM_DEFAULT_CHART_VERSION ) ;
245249
246- debug ! (
247- "Installing Helm release {} ({}) from chart {}" ,
248- release_name, chart_version, full_chart_name
249- ) ;
250-
251- install_release (
252- release_name,
253- & full_chart_name,
254- chart_version,
255- values_yaml,
256- namespace,
257- suppress_output,
258- ) ?;
250+ debug ! (
251+ "Installing Helm release {} ({}) from chart {}" ,
252+ release_name, chart_version, full_chart_name
253+ ) ;
259254
260- Ok ( InstallReleaseStatus :: Installed ( release_name. to_string ( ) ) )
255+ install_release (
256+ release_name,
257+ & full_chart_name,
258+ chart_version,
259+ values_yaml,
260+ namespace,
261+ suppress_output,
262+ ) ?;
263+
264+ Ok ( InstallReleaseStatus :: Installed ( release_name. to_string ( ) ) )
265+ } )
261266}
262267
263268/// Installs a Helm release.
0 commit comments