modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftClient.java | 17 + modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java | 11 - modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java | 74 ++++++ modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java | 44 ++-- modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftClientTestStub.java | 15 + modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java | 1 modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftFilesSenderTest.java | 110 ++++++++++ 7 files changed, 249 insertions(+), 23 deletions(-)
New commits: commit 9d6b41dc094a53ee93d6ecf9aa9a568da313029d Author: John Sanda jsanda@redhat.com Date: Tue Jun 28 17:17:49 2011 -0400
Adding support for sending change set content to server
Initial commit for DriftFilesSenderTest and DriftClient. DriftClient is an interface that is passed into DriftDetector and DriftFilesSender to better facilitate testing.
This is a rough, first cut at this functionality that has not yet gone through end-to-end testing. DriftFilesSender iterates through the change set meta data file for each DriftFile until it finds a matching hash. When a match is found, it stages the file so that it can be sent to the server.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftClient.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftClient.java new file mode 100644 index 0000000..114c365 --- /dev/null +++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftClient.java @@ -0,0 +1,17 @@ +package org.rhq.core.pc.drift; + +import java.io.File; + +import org.rhq.core.domain.drift.DriftConfiguration; + +/** + * This is a client interface to the server that drift-related tasks call to interact with + * the server. + */ +public interface DriftClient { + + void sendChangeSetToServer(int resourceId, DriftConfiguration driftConfiguration); + + void sendChangeSetContentToServer(int resourceId, String driftConfigurationName, File contentDir); + +} 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 f1f0fdb..6c31e7f 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 @@ -6,7 +6,6 @@ import java.util.Collection; import java.util.Stack;
import org.apache.commons.io.DirectoryWalker; -import org.apache.commons.io.FilenameUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
@@ -14,11 +13,9 @@ import org.rhq.common.drift.ChangeSetWriter; import org.rhq.common.drift.DirectoryEntry; import org.rhq.common.drift.FileEntry; import org.rhq.common.drift.Headers; -import org.rhq.core.domain.drift.DriftChangeSetCategory; import org.rhq.core.domain.drift.DriftConfiguration; import org.rhq.core.util.MessageDigestGenerator;
-import static java.io.File.separator; import static java.util.Collections.EMPTY_LIST; import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
@@ -31,7 +28,7 @@ public class DriftDetector implements Runnable {
private MessageDigestGenerator digestGenerator = new MessageDigestGenerator(MessageDigestGenerator.SHA_256);
- private DriftManager driftMgr; + private DriftClient driftClient;
public void setScheduleQueue(ScheduleQueue queue) { scheduleQueue = queue; @@ -41,8 +38,8 @@ public class DriftDetector implements Runnable { changeSetMgr = changeSetManager; }
- public void setDriftManager(DriftManager driftManager) { - driftMgr = driftManager; + public void setDriftClient(DriftClient driftClient) { + this.driftClient = driftClient; }
@Override @@ -70,7 +67,7 @@ public class DriftDetector implements Runnable {
schedule.updateShedule(); scheduleQueue.enqueue(schedule); - driftMgr.sendChangeSetToServer(schedule.getResourceId(), driftConfig); + driftClient.sendChangeSetToServer(schedule.getResourceId(), driftConfig); }
private String relativePath(File basedir, File file) { diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java index a6ec604..e7cf34c 100644 --- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java +++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftFilesSender.java @@ -1,16 +1,88 @@ package org.rhq.core.pc.drift;
+import java.io.File; +import java.io.IOException; import java.util.List;
+import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.rhq.common.drift.ChangeSetReader; +import org.rhq.common.drift.DirectoryEntry; +import org.rhq.common.drift.FileEntry; +import org.rhq.common.drift.Headers; import org.rhq.core.domain.drift.DriftFile; +import org.rhq.core.util.file.FileUtil; + +import static org.rhq.core.util.file.FileUtil.copyFile;
public class DriftFilesSender implements Runnable {
- public DriftFilesSender(int resourceId, String driftConfigurationName, List<DriftFile> driftFiles) { + private Log log = LogFactory.getLog(DriftFilesSender.class); + + private int resourceId; + + private Headers headers; + + private List<DriftFile> driftFiles;
+ private ChangeSetManager changeSetMgr; + + private DriftClient driftClient; + + public void setResourceId(int resourceId) { + this.resourceId = resourceId; + } + + public void setHeaders(Headers headers) { + this.headers = headers; + } + + public void setDriftFiles(List<DriftFile> driftFiles) { + this.driftFiles = driftFiles; + } + + public void setDriftClient(DriftClient driftClient) { + this.driftClient = driftClient; + } + + public void setChangeSetManager(ChangeSetManager changeSetManager) { + changeSetMgr = changeSetManager; }
@Override public void run() { + try { + File changeSet = changeSetMgr.findChangeSet(resourceId, headers.getDriftConfigurationName()); + File contentDir = new File(changeSet.getParentFile(), "content"); + contentDir.mkdir(); + + for (DriftFile driftFile : driftFiles) { + File file = find(driftFile); + if (file == null) { + log.warn("Unable to find file for " + driftFile); + } else { + copyFile(file, new File(contentDir, driftFile.getHashId())); + } + } + driftClient.sendChangeSetContentToServer(resourceId, headers.getDriftConfigurationName(), contentDir); + } catch (IOException e) { + log.error("Failed to send drift files.", e); + } + } + + private File find(DriftFile driftFile) throws IOException { + ChangeSetReader reader = changeSetMgr.getChangeSetReader(resourceId, headers.getDriftConfigurationName()); + DirectoryEntry dirEntry = reader.readDirectoryEntry(); + + while (dirEntry != null) { + for (FileEntry fileEntry : dirEntry) { + if (fileEntry.getNewSHA().equals(driftFile.getHashId())) { + File dir = new File(headers.getBasedir(), dirEntry.getDirectory()); + return new File(dir, fileEntry.getFile()); + } + } + } + return null; } } diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java index 2560147..1d6ec1a 100644 --- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java +++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftManager.java @@ -22,7 +22,7 @@ import org.rhq.core.pc.ContainerService; import org.rhq.core.pc.PluginContainerConfiguration; import org.rhq.core.pc.agent.AgentService;
-public class DriftManager extends AgentService implements DriftAgentService, ContainerService { +public class DriftManager extends AgentService implements DriftAgentService, DriftClient, ContainerService {
private final Log log = LogFactory.getLog(DriftManager.class);
@@ -54,7 +54,7 @@ public class DriftManager extends AgentService implements DriftAgentService, Con DriftDetector driftDetector = new DriftDetector(); driftDetector.setScheduleQueue(schedulesQueue); driftDetector.setChangeSetManager(changeSetMgr); - driftDetector.setDriftManager(this); + driftDetector.setDriftClient(this);
driftThreadPool = new ScheduledThreadPoolExecutor(5); driftThreadPool.scheduleAtFixedRate(new DriftDetector(), 30, 1800, TimeUnit.SECONDS); @@ -71,6 +71,7 @@ public class DriftManager extends AgentService implements DriftAgentService, Con changeSetMgr = null; }
+ @Override public void sendChangeSetToServer(int resourceId, DriftConfiguration driftConfiguration) { try { File changeSetFile = changeSetMgr.findChangeSet(resourceId, driftConfiguration.getName()); @@ -98,6 +99,21 @@ public class DriftManager extends AgentService implements DriftAgentService, Con }
@Override + public void sendChangeSetContentToServer(int resourceId, String driftConfigurationName, File contentDir) { + try { + File zipFile = new File(pluginContainerConfiguration.getTemporaryDirectory(), "content.zip"); + zipFileOrDirectory(contentDir, zipFile); + + DriftServerService driftServer = pluginContainerConfiguration.getServerServices().getDriftServerService(); + driftServer.sendFilesZip(resourceId, zipFile.length(), remoteInputStream(new BufferedInputStream( + new FileInputStream(zipFile)))); + } catch (IOException e) { + log.error("An error occurred while trying to send content for changeset[resourceId: " + resourceId + + ", driftConfiguration: " + driftConfigurationName + "]", e); + } + } + + @Override public void detectDrift(int resourceId, DriftConfiguration driftConfiguration) { ScheduleQueue queue = new ScheduleQueue() { DriftDetectionSchedule schedule; @@ -125,7 +141,7 @@ public class DriftManager extends AgentService implements DriftAgentService, Con DriftDetector driftDetector = new DriftDetector(); driftDetector.setChangeSetManager(changeSetMgr); driftDetector.setScheduleQueue(queue); - driftDetector.setDriftManager(this); + driftDetector.setDriftClient(this);
driftThreadPool.execute(driftDetector); } @@ -135,29 +151,27 @@ public class DriftManager extends AgentService implements DriftAgentService, Con schedulesQueue.enqueue(new DriftDetectionSchedule(resourceId, driftConfiguration)); }
- public void sendSnapshotReport(int resourceId, SnapshotHandle handle) throws Exception { - DriftServerService driftServer = pluginContainerConfiguration.getServerServices().getDriftServerService(); - - driftServer.sendChangesetZip(resourceId, handle.getMetadataFile().length(), - remoteInputStream(new BufferedInputStream(new FileInputStream(handle.getMetadataFile())))); - } - @Override public boolean requestDriftFiles(int resourceId, Headers headers, List<DriftFile> driftFiles) { - return false; + DriftFilesSender sender = new DriftFilesSender(); + sender.setResourceId(resourceId); + sender.setDriftClient(this); + sender.setDriftFiles(driftFiles); + sender.setHeaders(headers); + sender.setChangeSetManager(changeSetMgr); + + driftThreadPool.execute(sender); + + return true; }
@Override public void unscheduleDriftDetection(int resourceId, DriftConfiguration driftConfiguration) { - // TODO Auto-generated method stub - }
@Override public void updateDriftDetection(int resourceId, DriftConfiguration driftConfiguration) { - // TODO Auto-generated method stub - }
} diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftClientTestStub.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftClientTestStub.java new file mode 100644 index 0000000..d6e5d45 --- /dev/null +++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftClientTestStub.java @@ -0,0 +1,15 @@ +package org.rhq.core.pc.drift; + +import java.io.File; + +import org.rhq.core.domain.drift.DriftConfiguration; + +class DriftClientTestStub implements DriftClient { + @Override + public void sendChangeSetToServer(int resourceId, DriftConfiguration driftConfiguration) { + } + + @Override + public void sendChangeSetContentToServer(int resourceId, String driftConfigurationName, File contentDir) { + } +} 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 8ec7938..0a10de3 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 @@ -73,6 +73,7 @@ public class DriftDetectorTest extends JMockTest { scheduleQueue.enqueue(schedule);
DriftDetector detector = new DriftDetector(); + detector.setDriftClient(new DriftClientTestStub()); detector.setChangeSetManager(changeSetMgr); detector.setScheduleQueue(scheduleQueue);
diff --git a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftFilesSenderTest.java b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftFilesSenderTest.java new file mode 100644 index 0000000..eb333f5 --- /dev/null +++ b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftFilesSenderTest.java @@ -0,0 +1,110 @@ +package org.rhq.core.pc.drift; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.util.Arrays; +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import org.unitils.thirdparty.org.apache.commons.io.FileUtils; + +import org.rhq.common.drift.Headers; +import org.rhq.core.domain.drift.DriftChangeSetCategory; +import org.rhq.core.domain.drift.DriftFile; + +import static java.util.Arrays.asList; +import static org.apache.commons.io.FileUtils.deleteDirectory; +import static org.apache.commons.io.FileUtils.touch; +import static org.apache.commons.io.IOUtils.writeLines; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +public class DriftFilesSenderTest { + + File changeSetsDir; + + File resourcesDir; + + ChangeSetManager changeSetMgr; + + String driftConfigName = "test"; + + File server1Dir; + + @BeforeClass + public void init() throws Exception { + File basedir = new File("target", getClass().getSimpleName()); + deleteDirectory(basedir); + basedir.mkdir(); + + changeSetsDir = new File(basedir, "changesets"); + changeSetsDir.mkdir(); + + resourcesDir = new File(basedir, "resources"); + resourcesDir.mkdir(); + } + + @BeforeMethod + public void setUp() { + changeSetMgr = new ChangeSetManagerImpl(changeSetsDir); + } + + @Test + public void sendFiles() throws Exception { + String driftConfigName = "test"; + + File server1Dir = new File(resourcesDir, "server-1"); + server1Dir.mkdir(); + + File confDir = new File(server1Dir, "conf"); + confDir.mkdir(); + + touch(new File(confDir, "server.conf")); + + int resourceId = 1; + + File changeSetDir = new File(new File(changeSetsDir, Integer.toString(resourceId)), driftConfigName); + changeSetDir.mkdirs(); + + List<String> changeSet = asList( + driftConfigName, + server1Dir.getAbsolutePath(), + COVERAGE.code(), + "conf 1", + "2e345df 0 server.conf A", + "" + ); + BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(changeSetDir, + "changeset.txt"))); + writeLines(changeSet, "\n", stream); + stream.close(); + + Headers headers = new Headers(driftConfigName, server1Dir.getAbsolutePath(), COVERAGE); + List<DriftFile> driftFiles = asList(new DriftFile("2e345df")); + + DriftFilesSender sender = new DriftFilesSender(); + sender.setDriftClient(new DriftClientTestStub()); + sender.setChangeSetManager(changeSetMgr); + sender.setResourceId(resourceId); + sender.setDriftFiles(driftFiles); + sender.setHeaders(headers); + sender.run(); + + File contentDir = new File(changeSetDir, "content"); + contentDir.mkdir(); + + File content = new File(contentDir, "2e345df"); + + assertEquals(contentDir.list().length, 1, "Expected to find one file in " + + contentDir.getAbsolutePath()); + assertTrue(content.exists(), "Expected to find file named " + content.getName() + " in content directory. " + + "SHA-256 hashes should be used as file names"); + } + +}
rhq-commits@lists.fedorahosted.org