Skip to content

Commit

Permalink
ccmlib/common.py: make java logic more comprehensive
Browse files Browse the repository at this point in the history
Before this commit `make_cassandra_env` would only find java at
`/usr/lib/jvm/*` directory and could have misconstrue
`java-18-openjdk-amd64` as `java-8`.
This commit makes `make_cassandra_env` to look at any directory under `/usr/lib/jvm` and
to read version from java output
  • Loading branch information
dkropachev committed Sep 8, 2024
1 parent 81076bc commit 453ad28
Showing 1 changed file with 34 additions and 11 deletions.
45 changes: 34 additions & 11 deletions ccmlib/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -389,23 +389,46 @@ def make_cassandra_env(install_dir, node_path, update_conf=True, hardcode_java_v

if hardcode_java_version:
known_jvm_names = {
'8': ('8-openjdk', '8-jdk', '1.8.0-openjdk'),
'11': ('11-openjdk', '11-jdk', '1.11.0-openjdk'),
'8': ['1.8', '8'],
'11': ['11']
}
assert hardcode_java_version in known_jvm_names.keys(), \
jvm_root_path = "/usr/lib/jvm/"
assert hardcode_java_version in known_jvm_names, \
f"hardcode_java_version={hardcode_java_version} not supported in:\n{known_jvm_names}"

for java_path in pathlib.Path('/usr/lib/jvm/').iterdir():
if (java_path.is_dir
and any(name in java_path.name for name in known_jvm_names[hardcode_java_version])
and list(java_path.rglob('java'))):
env['JAVA_HOME'] = str(java_path)
break
else:
raise ArgumentError(f"java-8 wasn't found in /usr/lib/jvm/\n {list(pathlib.Path('/usr/lib/jvm/').iterdir())}")
java_home_path = get_java_home_path(pathlib.Path(jvm_root_path), known_jvm_names[hardcode_java_version])
if java_home_path is None:
raise ArgumentError(f"java-{hardcode_java_version} wasn't found in {jvm_root_path}")

env['JAVA_HOME'] = str(java_home_path.as_posix())
return env

def get_java_home_path(parent_path: pathlib.Path, hardcode_java_version: List[str]) -> [pathlib.Path]:
for path in parent_path.iterdir():
if not path.is_dir():
if path.name == "java" and get_jvm_spec_version(path) in hardcode_java_version:
return path.parent.parent
continue
ret = get_java_home_path(path, hardcode_java_version)
if ret is not None:
return ret
return None

def get_jvm_spec_version(java_bin_path: pathlib.Path) -> Optional[str]:
if not java_bin_path.is_file():
return None
try:
properties = subprocess.check_output([java_bin_path.as_posix(), '-XshowSettings:properties', '-version'], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
return None
for line in properties.splitlines():
parts = line.strip().decode().split('=', 1)
if len(parts) < 2:
continue
name, value = [part.strip() for part in parts]
if name == 'java.specification.version':
return value
return None

def make_dse_env(install_dir, node_path):
env = os.environ.copy()
Expand Down

0 comments on commit 453ad28

Please sign in to comment.