modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/cassandra-jvm.properties
| 2
modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
| 16 ++
modules/common/cassandra-util/src/test/java/org/rhq/cassandra/util/ConfigEditorTest.java
| 28 +++++
modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java
| 55 ++++++++++
modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
| 11 ++
modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeConfigDelegateTest.java
| 41 ++++++-
6 files changed, 143 insertions(+), 10 deletions(-)
New commits:
commit 13371f91328e26f66d687196acbc6b7e5aab4bd0
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Jul 30 14:28:38 2013 -0400
add resource config support for cql and gossip ports in rhq-storage plugin
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/cassandra-jvm.properties
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/cassandra-jvm.properties
index 1faee9d..2eb5ab5 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/cassandra-jvm.properties
+++
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/cassandra-jvm.properties
@@ -13,7 +13,7 @@ heap_new="-Xmn64M"
heap_dump_on_OOMError="-XX:+HeapDumpOnOutOfMemoryError"
-heap_dump_dir=""
+heap_dump_dir=
thread_stack_size="-Xss180k"
diff --git
a/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
b/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
index 5276c84..c53c19b 100644
---
a/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
+++
b/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
@@ -108,7 +108,7 @@ public class ConfigEditor {
return (Integer) config.get("native_transport_port");
}
- public void setNativeTransportPort(int port) {
+ public void setNativeTransportPort(Integer port) {
config.put("native_transport_port", port);
}
@@ -116,7 +116,7 @@ public class ConfigEditor {
return (Integer) config.get("storage_port");
}
- public void setStoragePort(int port) {
+ public void setStoragePort(Integer port) {
config.put("storage_port", port);
}
diff --git
a/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java
b/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java
index dd5b8a2..edaf9f9 100644
---
a/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java
+++
b/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java
@@ -5,6 +5,12 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.yaml.snakeyaml.error.YAMLException;
+
+import org.rhq.cassandra.util.ConfigEditor;
+import org.rhq.cassandra.util.ConfigEditorException;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.PropertySimple;
@@ -18,12 +24,16 @@ import org.rhq.core.util.StringUtil;
*/
public class StorageNodeConfigDelegate implements ConfigurationFacet {
+ private Log log = LogFactory.getLog(StorageNodeConfigDelegate.class);
+
private File jvmOptsFile;
private File wrapperEnvFile;
+ private File cassandraYamlFile;
public StorageNodeConfigDelegate(File basedir) {
File confDir = new File(basedir, "conf");
jvmOptsFile = new File(confDir, "cassandra-jvm.properties");
+ cassandraYamlFile = new File(confDir, "cassandra.yaml");
// for windows, config props also get propagated to the wrapper env
if (isWindows()) {
@@ -60,6 +70,11 @@ public class StorageNodeConfigDelegate implements ConfigurationFacet {
config.put(new PropertySimple("heapDumpDir", new File(basedir,
"bin").getAbsolutePath()));
}
+ ConfigEditor yamlEditor = new ConfigEditor(cassandraYamlFile);
+ yamlEditor.load();
+ config.put(new PropertySimple("cqlPort",
yamlEditor.getNativeTransportPort()));
+ config.put(new PropertySimple("gossipPort",
yamlEditor.getStoragePort()));
+
return config;
}
@@ -135,6 +150,7 @@ public class StorageNodeConfigDelegate implements ConfigurationFacet
{
Configuration config = configurationUpdateReport.getConfiguration();
updateCassandraJvmProps(config);
+ updateCassandraYaml(config);
if (isWindows()) {
updateWrapperEnv(config);
@@ -145,6 +161,8 @@ public class StorageNodeConfigDelegate implements ConfigurationFacet
{
configurationUpdateReport.setErrorMessage("No configuration update was
applied: " + e.getMessage());
} catch (IOException e) {
configurationUpdateReport.setErrorMessageFromThrowable(e);
+ } catch (ConfigEditorException e) {
+ configurationUpdateReport.setErrorMessageFromThrowable(e);
}
}
@@ -195,6 +213,43 @@ public class StorageNodeConfigDelegate implements ConfigurationFacet
{
propertiesUpdater.update(properties);
}
+ private void updateCassandraYaml(Configuration newConfig) {
+ ConfigEditor editor = new ConfigEditor(cassandraYamlFile);
+ try {
+ editor.load();
+
+ PropertySimple cqlPortProperty = newConfig.getSimple("cqlPort");
+ if (cqlPortProperty != null) {
+ editor.setNativeTransportPort(cqlPortProperty.getIntegerValue());
+ }
+
+ PropertySimple gossipPortProperty =
newConfig.getSimple("gossipPort");
+ if (gossipPortProperty != null) {
+ editor.setStoragePort(gossipPortProperty.getIntegerValue());
+ }
+
+ editor.save();
+ } catch (ConfigEditorException e) {
+ if (e.getCause() instanceof YAMLException) {
+ log.error("Failed to update " + cassandraYamlFile);
+ log.info("Attempting to restore " + cassandraYamlFile);
+ try {
+ editor.restore();
+ throw e;
+ } catch (ConfigEditorException e1) {
+ log.error("Failed to restore " + cassandraYamlFile +
". A copy of the file prior to any " +
+ "modifications can be found at " +
editor.getBackupFile());
+ throw new ConfigEditorException("There was an error updating
" + cassandraYamlFile + " and " +
+ "undoing the changes failed. A copy of the file can be found
at " + editor.getBackupFile() +
+ ". See the agent logs for more details.", e);
+ }
+ } else {
+ log.error("No updates were made to " + cassandraYamlFile +
" due to an unexpected error", e);
+ throw e;
+ }
+ }
+ }
+
private void updateWrapperEnv(Configuration config) throws IOException {
PropertiesFileUpdate propertiesUpdater = new
PropertiesFileUpdate(wrapperEnvFile.getAbsolutePath());
Properties properties = propertiesUpdater.loadExistingProperties();
diff --git a/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
b/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
index f5a4f6d..84bb832 100644
--- a/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
@@ -175,6 +175,17 @@
<c:simple-property name="heapDumpDir" displayName="Heap Dump
Directory" required="false"
description="The directory in which heap dumps will be
written."/>
</c:group>
+ <c:group name="Ports">
+ <c:simple-property name="cqlPort"
+ displayName="CQL Port"
+ type="integer"
+ description="The port on which to listen for client
requests over the native, CQL protocol.
+ This is a shared, cluster-wide setting."/>
+ <c:simple-property name="gossipPort"
+ type="integer"
+ description="The port used for internode communication.
This is a shared, cluster-wide setting."/>
+
+ </c:group>
</resource-configuration>
<server name="Cassandra Server JVM"
diff --git
a/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeConfigDelegateTest.java
b/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeConfigDelegateTest.java
index 64d14b2..15861c1 100644
---
a/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeConfigDelegateTest.java
+++
b/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeConfigDelegateTest.java
@@ -6,17 +6,20 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import org.rhq.cassandra.util.ConfigEditor;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.util.file.FileUtil;
+import org.rhq.core.util.stream.StreamUtil;
/**
* @author John Sanda
@@ -25,6 +28,8 @@ public class StorageNodeConfigDelegateTest {
private File basedir;
+ private File cassandraYamlFile;
+
private StorageNodeConfigDelegate configDelegate;
@BeforeMethod
@@ -33,6 +38,11 @@ public class StorageNodeConfigDelegateTest {
basedir = new File(dir, getClass().getSimpleName() + "/" +
test.getName());
FileUtil.purge(basedir, true);
configDelegate = new StorageNodeConfigDelegate(basedir);
+
+ cassandraYamlFile = new File(confDir(), "cassandra.yaml");
+ InputStream inputStream =
getClass().getResourceAsStream("/cassandra.yaml");
+ FileOutputStream outputStream = new FileOutputStream(cassandraYamlFile);
+ StreamUtil.copy(inputStream, outputStream);
}
@@ -55,13 +65,24 @@ public class StorageNodeConfigDelegateTest {
public void updateValidConfig() throws Exception {
createDefaultConfig();
- Configuration config = new Configuration();
- config.put(new PropertySimple("minHeapSize", "1024M"));
- config.put(new PropertySimple("maxHeapSize", "1024M"));
- config.put(new PropertySimple("heapNewSize", "256M"));
- config.put(new PropertySimple("threadStackSize", "240"));
- config.put(new PropertySimple("heapDumpOnOOMError", true));
- config.put(new PropertySimple("heapDumpDir", confDir()));
+ Configuration config = Configuration.builder()
+ .addSimple("minHeapSize", "1024M")
+ .addSimple("maxHeapSize", "1024M")
+ .addSimple("heapNewSize", "256M")
+ .addSimple("threadStackSize", "240")
+ .addSimple("heapDumpOnOOMError", true)
+ .addSimple("heapDumpDir", confDir())
+ .addSimple("cqlPort", 9595)
+ .addSimple("gossipPort", 9696)
+ .build();
+// config.put(new PropertySimple("minHeapSize", "1024M"));
+// config.put(new PropertySimple("maxHeapSize", "1024M"));
+// config.put(new PropertySimple("heapNewSize", "256M"));
+// config.put(new PropertySimple("threadStackSize", "240"));
+// config.put(new PropertySimple("heapDumpOnOOMError", true));
+// config.put(new PropertySimple("heapDumpDir", confDir()));
+// config.put(new PropertySimple("cqlPort", 9595));
+// config.put(new PropertySimple("gossipPort", 9696));
ConfigurationUpdateReport report = new ConfigurationUpdateReport(config);
@@ -78,6 +99,12 @@ public class StorageNodeConfigDelegateTest {
"Failed to update property [heap_dump_on_OOMError]");
assertEquals(properties.getProperty("heap_dump_dir"),
confDir().getAbsolutePath(),
"Failed to update property [heap_dump_dir]");
+
+ ConfigEditor yamlEditor = new ConfigEditor(cassandraYamlFile);
+ yamlEditor.load();
+
+ assertEquals(yamlEditor.getNativeTransportPort(), (Integer) 9595, "Failed to
update native_transport_port");
+ assertEquals(yamlEditor.getStoragePort(), (Integer) 9696, "Failed to update
storage_port");
}
@Test
commit 6de86c41792464bdab2197227ba32df34e77e16d
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Jul 30 13:17:15 2013 -0400
make dataFileDirectories property read/write
diff --git
a/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
b/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
index 9e1f86b..5276c84 100644
---
a/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
+++
b/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
@@ -88,6 +88,10 @@ public class ConfigEditor {
return (List<String>) config.get("data_file_directories");
}
+ public void setDataFileDirectories(List<String> dirs) {
+ config.put("data_file_directories", dirs);
+ }
+
public String getSavedCachesDirectory() {
return (String) config.get("saved_caches_directory");
}
diff --git
a/modules/common/cassandra-util/src/test/java/org/rhq/cassandra/util/ConfigEditorTest.java
b/modules/common/cassandra-util/src/test/java/org/rhq/cassandra/util/ConfigEditorTest.java
index f339b48..9c3cc16 100644
---
a/modules/common/cassandra-util/src/test/java/org/rhq/cassandra/util/ConfigEditorTest.java
+++
b/modules/common/cassandra-util/src/test/java/org/rhq/cassandra/util/ConfigEditorTest.java
@@ -1,5 +1,6 @@
package org.rhq.cassandra.util;
+import static java.util.Arrays.asList;
import static org.testng.Assert.assertEquals;
import java.io.File;
@@ -88,6 +89,24 @@ public class ConfigEditorTest {
assertEquals(editor.getStoragePort(), config.storage_port, "Failed to fetch
storage_port");
}
+ @Test
+ public void updateDataFilesDirectories() throws Exception {
+ ConfigEditor editor = new ConfigEditor(configFile);
+ editor.load();
+ editor.setDataFileDirectories(asList("/data/dir1",
"/data/dir2", "data/dir3"));
+ editor.save();
+
+ Config config = loadConfig();
+
+ assertEquals(config.data_file_directories, new String[] {"/data/dir1",
"/data/dir2", "data/dir3"},
+ "Failed to update data_file_directories");
+
+ editor.load();
+
+ assertEquals(editor.getDataFileDirectories().toArray(new String[3]),
config.data_file_directories,
+ "Failed to fetch data_file_directories");
+ }
+
private Config loadConfig() throws Exception {
FileInputStream inputStream = new FileInputStream(configFile);
org.yaml.snakeyaml.constructor.Constructor constructor =
commit 8affd85fb953f7b32e1439cefc436285546cb662
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Jul 30 12:57:25 2013 -0400
make storagePort and nativeTransportPort read/write properties
diff --git
a/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
b/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
index 0b4a127..9e1f86b 100644
---
a/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
+++
b/modules/common/cassandra-util/src/main/java/org/rhq/cassandra/util/ConfigEditor.java
@@ -100,10 +100,18 @@ public class ConfigEditor {
params.put("seeds", StringUtil.arrayToString(seeds));
}
+ public Integer getNativeTransportPort() {
+ return (Integer) config.get("native_transport_port");
+ }
+
public void setNativeTransportPort(int port) {
config.put("native_transport_port", port);
}
+ public Integer getStoragePort() {
+ return (Integer) config.get("storage_port");
+ }
+
public void setStoragePort(int port) {
config.put("storage_port", port);
}
diff --git
a/modules/common/cassandra-util/src/test/java/org/rhq/cassandra/util/ConfigEditorTest.java
b/modules/common/cassandra-util/src/test/java/org/rhq/cassandra/util/ConfigEditorTest.java
index cf344e2..f339b48 100644
---
a/modules/common/cassandra-util/src/test/java/org/rhq/cassandra/util/ConfigEditorTest.java
+++
b/modules/common/cassandra-util/src/test/java/org/rhq/cassandra/util/ConfigEditorTest.java
@@ -65,6 +65,11 @@ public class ConfigEditorTest {
Config config = loadConfig();
assertEquals(config.native_transport_port, (Integer) 9393, "Failed to update
native_transport_port");
+
+ editor.load();
+
+ assertEquals(editor.getNativeTransportPort(), config.native_transport_port,
+ "Failed to fetch native_transport_port");
}
@Test
@@ -77,6 +82,10 @@ public class ConfigEditorTest {
Config config = loadConfig();
assertEquals(config.storage_port, (Integer) 6767, "Failed to update
storage_port");
+
+ editor.load();
+
+ assertEquals(editor.getStoragePort(), config.storage_port, "Failed to fetch
storage_port");
}
private Config loadConfig() throws Exception {