@@ -194,6 +194,7 @@ public class CCMBridge implements CCMAccess {
194
194
static {
195
195
String inputCassandraVersion = System .getProperty ("cassandra.version" );
196
196
String inputScyllaVersion = System .getProperty ("scylla.version" );
197
+ GLOBAL_SCYLLA_VERSION_NUMBER = parseScyllaInputVersion (inputScyllaVersion );
197
198
198
199
String installDirectory = System .getProperty ("cassandra.directory" );
199
200
String branch = System .getProperty ("cassandra.branch" );
@@ -206,8 +207,11 @@ public class CCMBridge implements CCMAccess {
206
207
installArgs .add ("-v git:" + branch .trim ().replaceAll ("\" " , "" ));
207
208
} else if (inputScyllaVersion != null && !inputScyllaVersion .trim ().isEmpty ()) {
208
209
installArgs .add (" --scylla " );
209
- installArgs .add ("-v release:" + inputScyllaVersion );
210
-
210
+ if (isVersionNumber (inputScyllaVersion )) {
211
+ installArgs .add ("-v release:" + inputScyllaVersion );
212
+ } else {
213
+ installArgs .add ("-v " + inputScyllaVersion );
214
+ }
211
215
// Detect Scylla Enterprise - it should start with
212
216
// a 4-digit year.
213
217
if (inputScyllaVersion .matches ("\\ d{4}\\ ..*" )) {
@@ -246,8 +250,6 @@ public class CCMBridge implements CCMAccess {
246
250
}
247
251
ENVIRONMENT_MAP = ImmutableMap .copyOf (envMap );
248
252
249
- GLOBAL_SCYLLA_VERSION_NUMBER = VersionNumber .parse (inputScyllaVersion );
250
-
251
253
if (isDse ()) {
252
254
GLOBAL_DSE_VERSION_NUMBER = VersionNumber .parse (inputCassandraVersion );
253
255
GLOBAL_CASSANDRA_VERSION_NUMBER = CCMBridge .getCassandraVersion (GLOBAL_DSE_VERSION_NUMBER );
@@ -338,6 +340,28 @@ public static boolean isWindows() {
338
340
return osName != null && osName .startsWith ("Windows" );
339
341
}
340
342
343
+ private static boolean isVersionNumber (String versionString ) {
344
+ try {
345
+ VersionNumber .parse (versionString );
346
+ } catch (IllegalArgumentException e ) {
347
+ return false ;
348
+ }
349
+ return true ;
350
+ }
351
+
352
+ private static VersionNumber parseScyllaInputVersion (String versionString ) {
353
+ VersionNumber parsedScyllaVersionNumber = null ;
354
+ try {
355
+ parsedScyllaVersionNumber = VersionNumber .parse (versionString );
356
+ } catch (IllegalArgumentException e ) {
357
+ logger .warn (
358
+ "Failed to parse scylla.version: " + versionString + ". Trying to get it through CCM." ,
359
+ e );
360
+ parsedScyllaVersionNumber = getScyllaVersionThroughCcm (versionString );
361
+ }
362
+ return parsedScyllaVersionNumber ;
363
+ }
364
+
341
365
private final String clusterName ;
342
366
343
367
private final VersionNumber cassandraVersion ;
@@ -792,7 +816,25 @@ public void setWorkload(int node, Workload... workload) {
792
816
execute (CCM_COMMAND + " node%d setworkload %s" , node , workloadStr );
793
817
}
794
818
795
- private String execute (String command , Object ... args ) {
819
+ private static VersionNumber getScyllaVersionThroughCcm (String versionString ) {
820
+ File configDir = Files .createTempDir ();
821
+ try {
822
+ execute (configDir , "ccm create get_version -n 1 --scylla --version %s" , versionString );
823
+ String versionOutput = execute (configDir , "ccm node1 versionfrombuild" );
824
+ return VersionNumber .parse (versionOutput .replace ("ccmout> " , "" ).trim ());
825
+ } catch (RuntimeException cause ) {
826
+ throw new RuntimeException (
827
+ "Error during getting Scylla version through ccm commands." , cause );
828
+ } finally {
829
+ try {
830
+ execute (configDir , "ccm remove get_version" );
831
+ } catch (Exception ignored ) {
832
+ }
833
+ }
834
+ }
835
+
836
+ private static String execute (File ccmDir , String command , Object ... args ) {
837
+ Logger logger = CCMBridge .logger ;
796
838
String fullCommand = String .format (command , args ) + " --config-dir=" + ccmDir ;
797
839
Closer closer = Closer .create ();
798
840
// 10 minutes timeout
@@ -856,6 +898,10 @@ protected void processLine(String line, int logLevel) {
856
898
return sw .toString ();
857
899
}
858
900
901
+ private String execute (String command , Object ... args ) {
902
+ return execute (this .ccmDir , command , args );
903
+ }
904
+
859
905
/**
860
906
* Waits for a host to be up by pinging the TCP socket directly, without using the Java driver's
861
907
* API.
0 commit comments