modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
| 74 ++++++----
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
| 60 ++++++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
| 14 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
| 2
4 files changed, 108 insertions(+), 42 deletions(-)
New commits:
commit 16af52a8cdbf0f87f8c092c5987e82daa564c78e
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Sep 16 16:10:55 2011 -0400
Updating test to set change set version from headers
diff --git
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
index b46f003..1e1cc90 100644
---
a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
+++
b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftManagerBeanTest.java
@@ -145,6 +145,7 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
headers.setDriftConfigurationName("test-1");
headers.setBasedir(rootDir.getAbsolutePath());
headers.setType(COVERAGE);
+ headers.setVersion(0);
String file1Hash = sha256("test-1-file-1");
@@ -176,6 +177,7 @@ public class DriftManagerBeanTest extends AbstractEJB3Test {
// the second change set should report drift
String modifiedFile1Hash = sha256("test-2-file-1-modified");
headers.setType(DRIFT);
+ headers.setVersion(1);
File changeSet2 = new File(changeSetsDir, "changeset-2.txt");
writer = new ChangeSetWriterImpl(changeSet2, headers);
commit 2b6b27a9e973264dec03743660da82583e751b4e
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Sep 16 16:03:36 2011 -0400
Have the agent track and store the change set version number
DriftDetector now updates the version header in the snapshot file and in
the drift change set file. The server now gets the change set version
that it stores in the db from the headers.
This change will allow the server to determine whether or not the agent
and server are in sync.
diff --git
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 6bad1b1..0beeb19 100644
---
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -22,8 +22,9 @@ package org.rhq.core.pc.drift;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -42,6 +43,7 @@ import static org.rhq.common.drift.FileEntry.changedFileEntry;
import static org.rhq.common.drift.FileEntry.removedFileEntry;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
+import static org.rhq.core.util.file.FileUtil.copyFile;
import static org.rhq.core.util.file.FileUtil.forEachFile;
public class DriftDetector implements Runnable {
@@ -102,12 +104,12 @@ public class DriftDetector implements Runnable {
int changes = 0;
try {
- if (changeSetMgr.changeSetExists(schedule.getResourceId(),
createHeaders(schedule, COVERAGE))) {
+ if (changeSetMgr.changeSetExists(schedule.getResourceId(),
createHeaders(schedule, COVERAGE, 0))) {
changeSetType = DRIFT;
changes = generateDriftChangeSet(schedule);
} else {
changeSetType = COVERAGE;
- generateCoverageChangeSet(schedule);
+ generateSnapshot(schedule);
}
} catch (IOException e) {
// TODO Call ChangeSetManager here to rollback any thing that was written
to disk.
@@ -138,17 +140,14 @@ public class DriftDetector implements Runnable {
private int generateDriftChangeSet(final DriftDetectionSchedule schedule) throws
IOException {
log.debug("Generating drift change set for " + schedule);
- final File basedir = new File(basedir(schedule.getResourceId(),
schedule.getDriftConfiguration()));
- final ChangeSetWriter driftWriter =
changeSetMgr.getChangeSetWriter(schedule.getResourceId(), createHeaders(
- schedule, DRIFT));
+ final File basedir = new File(basedir(schedule.getResourceId(),
schedule.getDriftConfiguration()));
final ChangeSetReader coverageReader =
changeSetMgr.getChangeSetReader(schedule.getResourceId(), schedule
.getDriftConfiguration().getName());
- final ChangeSetWriter coverageWriter =
changeSetMgr.getChangeSetWriterForUpdate(schedule.getResourceId(),
- createHeaders(schedule, COVERAGE));
- final AtomicInteger changes = new AtomicInteger(0);
-
final Set<File> processedFiles = new HashSet<File>();
+ final List<FileEntry> snapshotEntries = new LinkedList<FileEntry>();
+ final List<FileEntry> deltaEntries = new LinkedList<FileEntry>();
+ int newVersion = coverageReader.getHeaders().getVersion() + 1;
// First look for files that have either been modified or deleted
for (FileEntry entry : coverageReader) {
@@ -158,26 +157,24 @@ public class DriftDetector implements Runnable {
if (log.isInfoEnabled()) {
log.info("Detected deleted file for " + schedule + "
--> " + file.getAbsolutePath());
}
- driftWriter.write(removedFileEntry(entry.getFile(), entry.getNewSHA()));
- changes.incrementAndGet();
+ deltaEntries.add(removedFileEntry(entry.getFile(), entry.getNewSHA()));
} else {
processedFiles.add(file);
String currentSHA = sha256(file);
if (!currentSHA.equals(entry.getNewSHA())) {
- // The file has been updated
if (log.isInfoEnabled()) {
log.info("Detected modified file for " + schedule +
" --> " + file.getAbsolutePath());
}
FileEntry modifiedEntry = changedFileEntry(entry.getFile(),
entry.getNewSHA(), currentSHA);
- driftWriter.write(modifiedEntry);
- coverageWriter.write(modifiedEntry);
- changes.incrementAndGet();
+ deltaEntries.add(modifiedEntry);
+ snapshotEntries.add(modifiedEntry);
} else {
// The file has not changed
- coverageWriter.write(entry);
+ snapshotEntries.add(entry);
}
}
}
+ coverageReader.close();
// If the basedir is still valid we need to do a directory tree scan to look for
newly added files
if (basedir.isDirectory()) {
@@ -195,9 +192,8 @@ public class DriftDetector implements Runnable {
}
FileEntry newEntry = addedFileEntry(relativePath(basedir,
file), sha256(file));
- driftWriter.write(newEntry);
- coverageWriter.write(newEntry);
- changes.incrementAndGet();
+ deltaEntries.add(newEntry);
+ snapshotEntries.add(newEntry);
} catch (IOException e) {
log.error("An error occurred while generating a drift
change set for " + schedule + ": "
+ e.getMessage());
@@ -208,18 +204,41 @@ public class DriftDetector implements Runnable {
}));
}
- driftWriter.close();
- coverageWriter.close();
- changeSetMgr.updateChangeSet(schedule.getResourceId(), createHeaders(schedule,
COVERAGE));
+ if (deltaEntries.isEmpty()) {
+ // If nothing has changed, there is no need to add/update any files
+ return 0;
+ }
+
+ File snapshotFile = changeSetMgr.findChangeSet(schedule.getResourceId(),
+ schedule.getDriftConfiguration().getName(), COVERAGE);
+ File backupSnapshotFile = new File(snapshotFile.getParentFile(),
snapshotFile.getName() + ".bak");
+ copyFile(snapshotFile, snapshotFile);
+
+ Headers deltaHeaders = createHeaders(schedule, DRIFT, newVersion);
+ Headers snapshotHeaders = createHeaders(schedule, COVERAGE, newVersion);
+
+ ChangeSetWriter deltaWriter =
changeSetMgr.getChangeSetWriter(schedule.getResourceId(), deltaHeaders);
+ ChangeSetWriter snapshotWriter =
changeSetMgr.getChangeSetWriter(schedule.getResourceId(), snapshotHeaders);
+
+ for (FileEntry entry : deltaEntries) {
+ deltaWriter.write(entry);
+ }
+ deltaWriter.close();
+
+ for (FileEntry entry : snapshotEntries) {
+ snapshotWriter.write(entry);
+ }
+ snapshotWriter.close();
+ backupSnapshotFile.delete();
- return changes.get();
+ return deltaEntries.size();
}
- private void generateCoverageChangeSet(final DriftDetectionSchedule schedule) throws
IOException {
+ private void generateSnapshot(final DriftDetectionSchedule schedule) throws
IOException {
log.debug("Generating coverage change set for " + schedule);
final ChangeSetWriter writer =
changeSetMgr.getChangeSetWriter(schedule.getResourceId(), createHeaders(
- schedule, COVERAGE));
+ schedule, COVERAGE, 0));
final DriftConfiguration config = schedule.getDriftConfiguration();
final File basedir = new File(basedir(schedule.getResourceId(), config));
if (basedir.isDirectory()) {
@@ -262,13 +281,14 @@ public class DriftDetector implements Runnable {
return driftClient.getAbsoluteBaseDirectory(resourceId,
driftConfig).getAbsolutePath();
}
- private Headers createHeaders(DriftDetectionSchedule schedule, DriftChangeSetCategory
type) {
+ private Headers createHeaders(DriftDetectionSchedule schedule, DriftChangeSetCategory
type, int version) {
Headers headers = new Headers();
headers.setResourceId(schedule.getResourceId());
headers.setDriftCofigurationId(schedule.getDriftConfiguration().getId());
headers.setDriftConfigurationName(schedule.getDriftConfiguration().getName());
headers.setBasedir(basedir(schedule.getResourceId(),
schedule.getDriftConfiguration()));
headers.setType(type);
+ headers.setVersion(version);
return headers;
}
diff --git
a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
index 5d25e9d..21ec45b 100644
---
a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
+++
b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
@@ -46,6 +46,8 @@ import static
org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT;
import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder;
import static org.rhq.test.AssertUtils.assertPropertiesMatch;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
public class DriftDetectorTest extends DriftTest {
@@ -163,6 +165,34 @@ public class DriftDetectorTest extends DriftTest {
@SuppressWarnings("unchecked")
@Test
+ public void doNotUpdateSnapshotOrGenerateDriftChangeSetIfNothingChanges() throws
Exception {
+ File confDir = mkdir(resourceDir, "conf");
+ File serverConf = createRandomFile(confDir, "server.conf");
+
+ DriftConfiguration config = driftConfiguration("nothing-to-update",
resourceDir.getAbsolutePath());
+
+ scheduleQueue.addSchedule(new DriftDetectionSchedule(resourceId(), config));
+ detector.run();
+
+ File changeSet = changeSet(config.getName(), COVERAGE);
+ String originalHash = sha256(changeSet);
+
+ // Run the detector again. Note that nothing has changed so the snapshot should
+ // remain the same and no drift change set file should be generated.
+ detector.run();
+
+ String newHash = sha256(changeSet);
+
+ assertEquals(newHash, originalHash, "The snapshot file should not have
changed since there was no drift.");
+
+ File driftChangeSet = changeSet(config.getName(), DRIFT);
+
+ assertFalse(driftChangeSet.exists(), "A drift change set file should not
have been generated since there was "
+ + "no drift");
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
public void skipScheduledThatHasConfigDisabled() throws Exception {
detector.setDriftClient(new DriftClientTestStub() {
{
@@ -210,7 +240,7 @@ public class DriftDetectorTest extends DriftTest {
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set
" + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected
values", driftEntries, driftChangeSet);
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
@@ -219,7 +249,7 @@ public class DriftDetectorTest extends DriftTest {
addedFileEntry("conf/server-2.conf", sha256(server2Conf)));
// verify that the coverage change set was updated
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as
expected", coverageEntries,
coverageChangeSet);
}
@@ -250,14 +280,14 @@ public class DriftDetectorTest extends DriftTest {
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set
" + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected
values", driftEntries, driftChangeSet);
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
List<FileEntry> coverageEntries =
asList(changedFileEntry("conf/server-1.conf", oldHash, newHash));
// verify that the coverage change set was updated
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as
expected", coverageEntries,
coverageChangeSet);
}
@@ -286,7 +316,7 @@ public class DriftDetectorTest extends DriftTest {
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set
" + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected
values", driftEntries, driftChangeSet);
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
@@ -295,7 +325,7 @@ public class DriftDetectorTest extends DriftTest {
addedFileEntry("conf/subconf/server-2.conf",
sha256(server2Conf)));
// verify that the coverage change set was updated
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as
expected", coverageEntries,
coverageChangeSet);
}
@@ -327,20 +357,20 @@ public class DriftDetectorTest extends DriftTest {
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set
" + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected
values", driftEntries, driftChangeSet);
// verify that the coverage change set was updated
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
List<FileEntry> coverageEntries =
asList(addedFileEntry("conf/server-1.conf", sha256(server1Conf)));
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as
expected", coverageEntries,
coverageChangeSet);
}
@SuppressWarnings("unchecked")
- @Test(enabled = false)
+ @Test
public void includeFilesInRemovedDirectoryInDriftChangeSet() throws Exception {
DriftConfiguration config = driftConfiguration("dir-removed-test",
resourceDir.getAbsolutePath());
@@ -356,19 +386,22 @@ public class DriftDetectorTest extends DriftTest {
server1Conf.delete();
confDir.delete();
+ scheduleQueue.addSchedule(new DriftDetectionSchedule(resourceId(), config));
+ detector.run();
+
File driftChangeSet = changeSet(config.getName(), DRIFT);
List<FileEntry> driftEntries =
asList(removedFileEntry("conf/server-1.conf", server1Hash));
// verify that the drift change set was generated
assertTrue(driftChangeSet.exists(), "Expected to find drift change set
" + driftChangeSet.getPath());
- assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT));
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
assertFileEntriesMatch("The drift change set does not match the expected
values", driftEntries, driftChangeSet);
// verify that the coverage change set was updated
File coverageChangeSet = changeSet(config.getName(), COVERAGE);
List<FileEntry> coverageEntries = emptyList();
- assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE));
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
assertFileEntriesMatch("The coverage change set was not updated as
expected", coverageEntries,
coverageChangeSet);
}
@@ -392,12 +425,17 @@ public class DriftDetectorTest extends DriftTest {
}
Headers createHeaders(DriftConfiguration driftConfig, DriftChangeSetCategory type) {
+ return createHeaders(driftConfig, type, 0);
+ }
+
+ Headers createHeaders(DriftConfiguration driftConfig, DriftChangeSetCategory type,
int version) {
Headers headers = new Headers();
headers.setResourceId(resourceId());
headers.setDriftCofigurationId(driftConfig.getId());
headers.setDriftConfigurationName(driftConfig.getName());
headers.setBasedir(resourceDir.getAbsolutePath());
headers.setType(type);
+ headers.setVersion(version);
return headers;
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
index f44000f..03705cd 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java
@@ -19,9 +19,6 @@
*/
package org.rhq.enterprise.server.drift;
-import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
-import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
-
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
@@ -80,6 +77,9 @@ import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
+import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
+import static org.rhq.core.domain.drift.DriftFileStatus.LOADED;
+
/**
* The SLSB method implementation needed to support the JPA (RHQ Default) Drift Server
Plugin.
*
@@ -253,7 +253,13 @@ public class JPADriftServerBean implements JPADriftServerLocal {
+ "]. Change set cannot be saved.");
return false;
}
- int version = getChangeSetVersion(resource, config);
+ // Commenting out the following line for now. We want to set the
+ // version to the value specified in the headers, but we also
+ // want to get the latest version we have in the database so
that
+ // we can make sure that the agent is in sync with the server.
+ //
+ //int version = getChangeSetVersion(resource, config);
+ int version = reader.getHeaders().getVersion();
DriftChangeSetCategory category = reader.getHeaders().getType();
driftChangeSet = new JPADriftChangeSet(resource, version,
category, config);