def install(version='stable', cluster_name='cassandra', **kwargs):
    """Install cassandra via ccm"""
    java_home = setup_java()
    cluster_path = os.path.join(ccm_home, cluster_name)

    if os.path.exists(cluster_path):
        print("Cassandra cluster already created at {cluster_path}".format(**locals()))
        return

    if is_cassandra_running():
        print("Another Cassandra process is already running. You must stop it (cqs stop --force) before you can install Cassandra with this tool.")
        return

    makedirs(ccm_home)    

    try:
        cluster = ccmlib.cluster.Cluster(ccm_home, cluster_name, cassandra_version=version, verbose=True)
        with open(os.path.join(cluster_path, 'cassandra.in.sh'), 'w') as f:
            f.write("JAVA_HOME={java_home}\n".format(**locals()))
        cluster.populate(1)
        start(cluster_name=cluster_name)
    except:
        # If any problem occurs, clean things up by destroying the cluster:
        destroy(cluster_name)
        raise

    print("Cassandra started.")
def download_install_java(version, cqs_home=None):
    if cqs_home is None:
        cqs_home = os.path.join(os.path.expanduser("~"),'.cassandra-quickstart')
    jre_root = os.path.join(cqs_home,'java')
    sys_platform = platform.system() + "_" + platform.architecture()[0]
    
    try:
        java_pkg = PLATFORM_JAVA[version][sys_platform]
    except KeyError:
        raise AssertionError("Could not find a suitable java download for platform: {sys_platform}".format(sys_platform=sys_platform))

    makedirs(jre_root)
    java_home = os.path.join(jre_root, version)
    download_path = java_home + '.zip'
    # Delete any previous installs :
    try:
        shutil.rmtree(java_home)
        os.delete(download_path)
    except OSError:
        pass
    # Download:
    download(java_pkg['url'], download_path, show_progress=True)

    # Check sha256sum of downloaded java package:
    with open(download_path) as f:
        if hashlib.sha256(f.read()).hexdigest() != java_pkg['sha256']:
            raise AssertionError(
                'Java zip file from {download_url} did not have '
                'expected SHA256: {sha}. Not installing.'.format(
                    download_url=java_pkg['url'], sha=java_pkg['sha256']))

    # Extract java zip file to home dir:
    with ZipFile(download_path) as z:
        z.extractall(jre_root)
        try:
            java_pkg_dir = [d for d in z.namelist() if d.startswith(version) and '/' in d][0].strip('/')
        except:
            raise AssertionError('Could not find java directory name inside package: {download_path}'.format(**locals()))
        extracted_java_dir = os.path.join(jre_root, java_pkg_dir)
        os.rename(extracted_java_dir, java_home)
    # Set executable bits:
    for path in os.listdir(os.path.join(java_home,'bin')):
        os.chmod(os.path.join(java_home,'bin',path), 0o755)
    for path in os.listdir(os.path.join(java_home,'jre','bin')):
        os.chmod(os.path.join(java_home,'jre','bin',path), 0o755)

    # Write the sha of the original package we installed:
    with open(os.path.join(java_home, 'SHA.txt'), 'w') as f:
        f.write(java_pkg['sha256'])

    meta = {'java_home':java_home, 'version':version}
    meta.update(java_pkg)
    return meta