def uninstall_mongodb(version_number, edition=None): version_info = make_version_info(version_number, edition=edition) # validate version string if not is_valid_version_info(version_info): raise MongoctlException("Invalid version '%s'. Please provide a" " valid MongoDB version." % version_info) mongo_installation = get_mongo_installation(version_info) if mongo_installation is None: # no-op msg = ("Cannot find a MongoDB installation for version '%s'. Please" " use list-versions to see all possible versions " % version_info) log_info(msg) return log_info("Found MongoDB '%s' in '%s'" % (version_info, mongo_installation)) def rm_mongodb(): # make sure that the mongo installation to be removed does not have # any running processes ensure_mongo_home_not_used(mongo_installation) log_info("Deleting '%s'" % mongo_installation) shutil.rmtree(mongo_installation) log_info("MongoDB '%s' Uninstalled successfully!" % version_info) prompt_execute_task("Proceed uninstall?" , rm_mongodb)
def push_mongodb(repo_name, mongodb_version, mongodb_edition=None, access_key=None, secret_key=None): """ :param repo_name: :param mongodb_version: :param mongodb_edition: :return: """ mongodb_edition = mongodb_edition or MongoDBEdition.COMMUNITY repo = get_binary_repository(repo_name) if access_key and isinstance(repo, S3MongoDBBinaryRepository): repo.access_key = access_key repo.secret_key = secret_key repo.validate() version_info = make_version_info(mongodb_version, mongodb_edition) mongodb_install_dir = get_mongo_installation(version_info) if not mongodb_install_dir: raise MongoctlException("No mongodb installation found for '%s'" % version_info) mongodb_install_home = os.path.dirname(mongodb_install_dir) target_archive_name = repo.get_archive_name(mongodb_version, mongodb_edition) target_archive_path = os.path.join(mongodb_install_home, target_archive_name) mongodb_install_dir_name = os.path.basename(mongodb_install_dir) log_info("Taring MongoDB at '%s'" % mongodb_install_dir_name) tar_exe = which("tar") tar_cmd = [tar_exe, "-cvzf", target_archive_name, mongodb_install_dir_name] call_command(tar_cmd, cwd=mongodb_install_home) log_info("Uploading tar to repo") repo.upload_file(mongodb_version, mongodb_edition, target_archive_path) # cleanup log_info("Cleanup") try: os.remove(target_archive_path) except Exception, e: log_error(str(e)) log_exception(e)
def install_mongodb(mongodb_version=None, mongodb_edition=None, from_source=False, build_threads=1, build_tmp_dir=None, include_only=None): if mongodb_version is None: mongodb_version = fetch_latest_stable_version() log_info("Installing latest stable MongoDB version '%s'..." % mongodb_version) version_info = make_version_info(mongodb_version, mongodb_edition) mongo_installation = get_mongo_installation(version_info) mongodb_edition = version_info.edition if mongo_installation is not None: # no-op log_info("You already have MongoDB %s installed ('%s'). " "Nothing to do." % (version_info, mongo_installation)) return mongo_installation target_dir = get_install_target_dir(mongodb_version, mongodb_edition) if os.path.exists(target_dir): raise MongoctlException("Target directory '%s' already exists" % target_dir) if mongodb_edition not in MongoDBEdition.ALL: raise MongoctlException("Unknown edition '%s'. Please select from %s" % (mongodb_edition, MongoDBEdition.ALL)) if from_source: install_from_source(mongodb_version, mongodb_edition, build_threads=build_threads, build_tmp_dir=build_tmp_dir) return bits = platform.architecture()[0].replace("bit", "") os_name = platform.system().lower() if os_name == 'darwin' and platform.mac_ver(): os_name = "osx" mongodb_installs_dir = config.get_mongodb_installs_dir() if not mongodb_installs_dir: raise MongoctlException("No mongoDBInstallationsDirectory configured" " in mongoctl.config") # ensure the mongo installs dir ensure_dir(mongodb_installs_dir) platform_spec = get_validate_platform_spec(os_name, bits) log_verbose("INSTALL_MONGODB: OS='%s' , BITS='%s' , VERSION='%s', " "PLATFORM_SPEC='%s'" % (os_name, bits, version_info, platform_spec)) # XXX LOOK OUT! Two processes installing same version simultaneously => BAD. # TODO: mutex to protect the following try: ## download the url archive_path = download_mongodb_binary(mongodb_version, mongodb_edition) archive_name = os.path.basename(archive_path) mongo_dir_name = extract_archive(archive_name) # apply include_only if specified if include_only: apply_include_only(mongo_dir_name, include_only) log_info("Deleting archive %s" % archive_name) os.remove(archive_name) target_dir_name = os.path.basename(target_dir) os.rename(mongo_dir_name, target_dir_name) # move target to mongodb install dir (Unless target is already there! # i.e current working dir == mongodb_installs_dir if os.getcwd() != mongodb_installs_dir: log_info("Moving extracted folder to %s" % mongodb_installs_dir) shutil.move(target_dir_name, mongodb_installs_dir) install_dir = os.path.join(mongodb_installs_dir, mongo_dir_name) # install validation validate_mongodb_install(target_dir) log_info("MongoDB %s installed successfully!" % version_info) return install_dir except Exception, e: log_exception(e) msg = "Failed to install MongoDB '%s'. Cause: %s" % (version_info, e) raise MongoctlException(msg)