class CouchbaseInstaller(object): def __init__(self, cluster_spec, options): self.options = options self.remote = RemoteHelper(cluster_spec, None, options.verbose) self.cluster_spec = cluster_spec arch = self.remote.detect_arch() pkg = self.remote.detect_pkg() release = None build = None if options.version: release, build = options.version.split('-') self.build = Build(arch, pkg, options.cluster_edition, options.version, release, build, options.url) logger.info('Target build info: {}'.format(self.build)) def get_expected_filenames(self): if self.build.pkg == 'rpm': os_release = self.remote.detect_os_release() patterns = ( 'couchbase-server-{{edition}}-{{version}}-centos{}.{{arch}}.{{pkg}}'.format(os_release), 'couchbase-server-{edition}_centos6_{arch}_{version}-rel.{pkg}', ) elif self.build.pkg == 'deb': patterns = ( 'couchbase-server-{edition}_{arch}_{version}-rel.{pkg}', 'couchbase-server-{edition}_{version}-ubuntu12.04_{arch}.{pkg}', ) elif self.build.pkg == 'exe': patterns = ( 'couchbase-server-{edition}_{arch}_{version}-rel.setup.{pkg}', 'couchbase-server-{edition}_{version}-windows_{arch}.{pkg}', 'couchbase_server-{edition}-windows-{arch}-{version}.{pkg}', ) else: patterns = () # Sentinel for pattern in patterns: yield pattern.format(**self.build.__dict__) @staticmethod def is_exist(url): try: status_code = requests.head(url).status_code except ConnectionError: return False if status_code == 200: return True return False def find_package(self): for filename in self.get_expected_filenames(): for location in LOCATIONS: url = '{}{}'.format(location.format(**self.build.__dict__), filename) if self.is_exist(url): return filename, url logger.interrupt('Target build not found') def kill_processes(self): self.remote.kill_processes() def uninstall_package(self): self.remote.uninstall_couchbase(self.build.pkg) def clean_data(self): self.remote.clean_data() def install_package(self): if self.options.version: filename, url = self.find_package() else: url = self.options.url filename = urlparse(url).path.split('/')[-1] logger.info('Using this URL: {}'.format(url)) self.remote.install_couchbase(self.build.pkg, url, filename, self.build.release) def install(self): self.kill_processes() self.uninstall_package() self.clean_data() self.install_package()