def update(self, mode=None): """Update Orchest. Args: mode: The mode in which to update Orchest. This is either ``None`` or ``"web"``, where the latter is used when update is invoked through the update-server. """ # Get all installed containers. pulled_images = self.resource_manager.get_images() # Pull images. It is possible to pull new image whilst the older # versions of those images are running. # TODO: remove the warning from the orchest.sh script that # containers will be shut down. utils.echo("Updating...") _, running_containers = self.resource_manager.get_containers(state="running") if self.is_running(running_containers): utils.echo("Using Orchest whilst updating is NOT recommended.") # Update the Orchest git repo to get the latest changes to the # "userdir/" structure. exit_code = utils.update_git_repo() if exit_code != 0: utils.echo("Cancelling update...") utils.echo( "It seems like you have unstaged changes in the 'orchest'" " repository. Please commit or stash them as 'orchest update'" " pulls the newest changes to the 'userdir/' using a rebase.", wrap=WRAP_LINES, ) logger.error("Failed update due to unstaged changes.") return logger.info("Updating images:\n" + "\n".join(pulled_images)) self.docker_client.pull_images(pulled_images, prog_bar=True, force=True) # Delete user-built environment images to avoid the issue of # having environments with mismatching Orchest SDK versions. logger.info("Deleting user-built environment images.") self.resource_manager.remove_env_build_imgs() # Restart the application in case the update-server invoked the # update, since the user called the update through the UI and # most likely does not want to invoke "orchest restart" # manually. if mode == "web": utils.echo("Update completed.") container_config = spec.get_container_config("reg") self.restart(container_config) return # Let the user know they need to restart the application for the # changes to take effect. NOTE: otherwise Orchest might also be # running a mix of containers on different versions. utils.echo("Don't forget to restart Orchest for the changes to take effect:") utils.echo("\torchest restart")
def update(self, mode=None, dev: bool = False): """Update Orchest. Args: mode: The mode in which to update Orchest. This is either ``None`` or ``"web"``, where the latter is used when update is invoked through the update-server. """ utils.echo("Updating...") _, running_containers = self.resource_manager.get_containers( state="running") if utils.is_orchest_running(running_containers): utils.echo( "Using Orchest whilst updating is NOT supported and will be shut" " down, killing all active pipeline runs and session. You have 2s" " to cancel the update operation.") # Give the user the option to cancel the update operation # using a keyboard interrupt. time.sleep(2) # It is possible to pull new image whilst the older versions # of those images are running. self.stop(skip_containers=[ "orchest/update-server:latest", "orchest/auth-server:latest", "orchest/nginx-proxy:latest", "postgres:13.1", ]) # Update the Orchest git repo to get the latest changes to the # "userdir/" structure. if not dev: exit_code = utils.update_git_repo() if exit_code != 0: utils.echo("Cancelling update...") utils.echo( "It seems like you have unstaged changes in the 'orchest'" " repository. Please commit or stash them as 'orchest update'" " pulls the newest changes to the 'userdir/' using a rebase.", ) logger.error("Failed update due to unstaged changes.") return # Get all installed images and pull new versions. The pulled # images are checked to make sure optional images, e.g. lang # specific images, are updated as well. pulled_images = self.resource_manager.get_images() to_pull_images = set(ORCHEST_IMAGES["minimal"]) | set(pulled_images) logger.info("Updating images:\n" + "\n".join(to_pull_images)) self.docker_client.pull_images(to_pull_images, prog_bar=True, force=True) # Delete user-built environment images to avoid the issue of # having environments with mismatching Orchest SDK versions. logger.info("Deleting user-built environment images.") self.resource_manager.remove_env_build_imgs() # Delete user-built Jupyter image to make sure the Jupyter # server is updated to the latest version of Orchest. logger.info("Deleting user-built Jupyter image.") self.resource_manager.remove_jupyter_build_imgs() # Delete Orchest dangling images. self.resource_manager.remove_orchest_dangling_imgs() # We invoke the Orchest restart from the webserver ui-updater. # Hence we do not show the message to restart manually. if mode == "web": utils.echo("Update completed.") else: # Let the user know they need to restart the application # for the changes to take effect. NOTE: otherwise Orchest # might also be running a mix of containers on different # versions. utils.echo( "Don't forget to restart Orchest for the changes to take effect:" ) utils.echo("\torchest restart")
def update(self, mode=None, dev: bool = False): """Update Orchest. Args: mode: The mode in which to update Orchest. This is either ``None`` or ``"web"``, where the latter is used when update is invoked through the update-server. """ utils.echo("Updating...") _, running_containers = self.resource_manager.get_containers(state="running") if utils.is_orchest_running(running_containers): if mode != "web": # In the web updater it is not possible to cancel the # update once started. So there is no value in showing # this message or sleeping. utils.echo( "Using Orchest whilst updating is NOT supported and will be shut" " down, killing all active pipeline runs and session. You have 2s" " to cancel the update operation." ) # Give the user the option to cancel the update # operation using a keyboard interrupt. time.sleep(2) skip_containers = [] if mode == "web": # It is possible to pull new images whilst the older # versions of those images are running. We will invoke # Orchest restart from the webserver ui-updater. skip_containers = [ "orchest/update-server:latest", "orchest/auth-server:latest", "orchest/nginx-proxy:latest", "postgres:13.1", ] self.stop(skip_containers=skip_containers) # Update the Orchest git repo to get the latest changes to the # "userdir/" structure. if not dev: exit_code = utils.update_git_repo() if exit_code == 0: logger.info("Successfully updated git repo during update.") elif exit_code == 21: utils.echo("Cancelling update...") utils.echo( "Make sure you have the master branch checked out before updating." ) logger.error( "Failed update due to master branch not being checked out." ) return else: utils.echo("Cancelling update...") utils.echo( "It seems like you have unstaged changes in the 'orchest'" " repository. Please commit or stash them as 'orchest update'" " pulls the newest changes to the 'userdir/' using a rebase.", ) logger.error("Failed update due to unstaged changes.") return # Get all installed images and pull new versions. The pulled # images are checked to make sure optional images, e.g. lang # specific images, are updated as well. pulled_images = self.resource_manager.get_images() to_pull_images = set(ORCHEST_IMAGES["minimal"]) | set(pulled_images) logger.info("Updating images:\n" + "\n".join(to_pull_images)) self.docker_client.pull_images(to_pull_images, prog_bar=True, force=True) # Delete user-built environment images to avoid the issue of # having environments with mismatching Orchest SDK versions. logger.info("Deleting user-built environment images.") self.resource_manager.remove_env_build_imgs() # Delete user-built Jupyter image to make sure the Jupyter # server is updated to the latest version of Orchest. logger.info("Deleting user-built Jupyter image.") self.resource_manager.remove_jupyter_build_imgs() # Delete Orchest dangling images. self.resource_manager.remove_orchest_dangling_imgs() if mode == "web": utils.echo("Update completed.") else: utils.echo("Update completed. To start Orchest again, run:") utils.echo("\torchest start") utils.echo( "Checking whether all containers are running the same version of Orchest." ) self.version(ext=True)