modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
| 53 ++++++++++
modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
| 14 ++
modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java
| 22 +++-
modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
| 11 ++
4 files changed, 98 insertions(+), 2 deletions(-)
New commits:
commit 7739090a34afd0d618bbdf13794eb1ecc3c13846
Author: John Sanda <jsanda(a)redhat.com>
Date: Sat Sep 17 10:55:32 2011 -0400
Updating MongoDB drift plugin to store file contents.
Now when a change set is reported by the agent, the mongodb plugin
checks the database to see if the content is already there. If it isn't,
it sends a request to the agent for the content. When the agent sends
the content, the plugin saves the bits to the database using GridFS.
diff --git
a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
index b37299a..ceeacfd 100644
---
a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
+++
b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/MongoDBDriftServer.java
@@ -24,6 +24,8 @@ import java.io.File;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.ZipEntry;
@@ -40,6 +42,7 @@ import org.rhq.common.drift.ChangeSetReader;
import org.rhq.common.drift.ChangeSetReaderImpl;
import org.rhq.common.drift.FileEntry;
import org.rhq.common.drift.Headers;
+import org.rhq.core.clientapi.agent.drift.DriftAgentService;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.DriftChangeSetCriteria;
import org.rhq.core.domain.criteria.DriftCriteria;
@@ -58,6 +61,7 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.util.ZipUtil;
import org.rhq.core.util.file.FileUtil;
+import org.rhq.enterprise.server.agentclient.AgentClient;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginContext;
import org.rhq.enterprise.server.plugin.pc.drift.DriftChangeSetSummary;
@@ -68,6 +72,7 @@ import
org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBChangeSet
import org.rhq.enterprise.server.plugins.drift.mongodb.entities.MongoDBFile;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import static org.rhq.enterprise.server.util.LookupUtil.getAgentManager;
import static org.rhq.enterprise.server.util.LookupUtil.getResourceManager;
public class MongoDBDriftServer implements DriftServerPluginFacet, ServerPluginComponent
{
@@ -117,6 +122,8 @@ public class MongoDBDriftServer implements DriftServerPluginFacet,
ServerPluginC
ChangeSetReader reader = new ChangeSetReaderImpl(new BufferedReader(new
InputStreamReader(stream)));
Headers headers = reader.getHeaders();
+ List<DriftFileDTO> missingContent = new
LinkedList<DriftFileDTO>();
+
MongoDBChangeSet changeSet = new MongoDBChangeSet();
changeSet.setCategory(headers.getType());
changeSet.setResourceId(resourceId);
@@ -134,6 +141,29 @@ public class MongoDBDriftServer implements DriftServerPluginFacet,
ServerPluginC
MongoDBChangeSetEntry entry = new MongoDBChangeSetEntry();
entry.setCategory(fileEntry.getType());
entry.setPath(path);
+
+ switch (fileEntry.getType()) {
+ case FILE_ADDED:
+ entry.setNewFileHash(fileEntry.getNewSHA());
+ if (fileDAO.findOne(fileEntry.getNewSHA()) == null) {
+ missingContent.add(newDriftFile(fileEntry.getNewSHA()));
+ }
+ break;
+ case FILE_CHANGED:
+ entry.setOldFileHash(fileEntry.getOldSHA());
+ entry.setNewFileHash(fileEntry.getNewSHA());
+ if (fileDAO.findOne(fileEntry.getNewSHA()) == null) {
+ missingContent.add(newDriftFile(fileEntry.getNewSHA()));
+ }
+ if (fileDAO.findOne(fileEntry.getOldSHA()) == null) {
+ missingContent.add(newDriftFile(fileEntry.getNewSHA()));
+ }
+ break;
+ default: // FILE_REMOVED
+ if (fileDAO.findOne(fileEntry.getOldSHA()) == null) {
+ missingContent.add(newDriftFile(fileEntry.getOldSHA()));
+ }
+ }
changeSet.add(entry);
// we are taking advantage of the fact that we know the summary is
only used by the server
@@ -146,6 +176,13 @@ public class MongoDBDriftServer implements DriftServerPluginFacet,
ServerPluginC
}
ds.save(changeSet);
+
+ if (!missingContent.isEmpty()) {
+ AgentClient agent = getAgentManager().getAgentClient(subject,
resourceId);
+ DriftAgentService driftService = agent.getDriftAgentService();
+ driftService.requestDriftFiles(resourceId, headers, missingContent);
+ }
+
return true;
}
});
@@ -153,8 +190,24 @@ public class MongoDBDriftServer implements DriftServerPluginFacet,
ServerPluginC
return summary;
}
+ private DriftFileDTO newDriftFile(String hash) {
+ DriftFileDTO file = new DriftFileDTO();
+ file.setHashId(hash);
+ return file;
+ }
+
@Override
public void saveChangeSetFiles(final Subject subject, final File changeSetFilesZip)
throws Exception {
+ String zipFileName = changeSetFilesZip.getName();
+ File tmpDir = new File(System.getProperty("java.io.tmpdir"));
+ File dir = new File(tmpDir, zipFileName.substring(0,
zipFileName.indexOf(".")));
+ dir.mkdir();
+
+ ZipUtil.unzipFile(changeSetFilesZip, dir);
+ for (File file : dir.listFiles()) {
+ fileDAO.save(file);
+ file.delete();
+ }
}
diff --git
a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
index 445c3bb..869b6b3 100644
---
a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
+++
b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/dao/FileDAO.java
@@ -19,10 +19,16 @@
package org.rhq.enterprise.server.plugins.drift.mongodb.dao;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
+import com.mongodb.gridfs.GridFSInputFile;
public class FileDAO {
@@ -35,8 +41,14 @@ public class FileDAO {
gridFS = new GridFS(this.db);
}
- GridFSDBFile findOne(String hash) {
+ public GridFSDBFile findOne(String hash) {
return gridFS.findOne(new BasicDBObject("_id", hash));
}
+ public void save(File file) throws IOException {
+ GridFSInputFile inputFile = gridFS.createFile(new BufferedInputStream(new
FileInputStream(file)));
+ inputFile.put("_id", file.getName());
+ inputFile.save();
+ }
+
}
diff --git
a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java
b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java
index 737d2c1..e236266 100644
---
a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java
+++
b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBChangeSetEntry.java
@@ -46,6 +46,10 @@ public class MongoDBChangeSetEntry implements
Drift<MongoDBChangeSet, MongoDBFil
private MongoDBFile newFile;
+ private String oldFileHash;
+
+ private String newFileHash;
+
public MongoDBChangeSetEntry() {
}
@@ -141,7 +145,23 @@ public class MongoDBChangeSetEntry implements
Drift<MongoDBChangeSet, MongoDBFil
this.path = path;
}
- @Override
+ public String getOldFileHash() {
+ return oldFileHash;
+ }
+
+ public void setOldFileHash(String oldFileHash) {
+ this.oldFileHash = oldFileHash;
+ }
+
+ public String getNewFileHash() {
+ return newFileHash;
+ }
+
+ public void setNewFileHash(String newFileHash) {
+ this.newFileHash = newFileHash;
+ }
+
+ @Override
public MongoDBFile getOldDriftFile() {
return oldFile;
}
diff --git
a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
index abdf836..a3ecfbc 100644
---
a/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
+++
b/modules/enterprise/server/plugins/drift-mongodb/src/main/java/org/rhq/enterprise/server/plugins/drift/mongodb/entities/MongoDBFile.java
@@ -7,6 +7,10 @@ import com.google.code.morphia.annotations.Embedded;
import org.rhq.core.domain.drift.DriftFile;
import org.rhq.core.domain.drift.DriftFileStatus;
+/**
+ * Note that this class might go away. I am not certain that it is needed. Files are
+ * stored in fs.files collection when using the GridFS API as we are.
+ */
@Embedded
public class MongoDBFile implements Serializable, DriftFile {
@@ -20,6 +24,13 @@ public class MongoDBFile implements Serializable, DriftFile {
private DriftFileStatus status;
+ public MongoDBFile() {
+ }
+
+ public MongoDBFile(String hash) {
+ this.hash = hash;
+ }
+
@Override
public String getHashId() {
return hash;