modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 92 +++++++---
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java | 22 +-
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java | 5
3 files changed, 86 insertions(+), 33 deletions(-)
New commits:
commit 83879d5bacf2534b152623211529d76a205ab4d0
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Apr 29 15:49:03 2010 -0400
get tests to run - this doesn't pass yet - need the API to return full data on the bundle version taht was created
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 0889a80..df0e04f 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -285,14 +285,14 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
File tmpDir = FileUtil.createTempDirectory("createBundleFromDistro", ".dir", null);
try {
- String bundleFile1 = "subdir1/bundle-file-1.txt";
- String bundleFile2 = "subdir2/bundle-file-2.txt";
- String bundleFile3 = "bundle-file-3.txt";
+ String bundleFile1 = TEST_PREFIX + "_subdir1/bundle-file-1.txt";
+ String bundleFile2 = TEST_PREFIX + "_subdir2/bundle-file-2.txt";
+ String bundleFile3 = TEST_PREFIX + "_bundle-file-3.txt";
writeFile(new File(tmpDir, bundleFile1), "first bundle file found inside bundle distro");
writeFile(new File(tmpDir, bundleFile2), "second bundle file found inside bundle distro");
writeFile(new File(tmpDir, bundleFile3), "third bundle file found inside bundle distro");
- String bundleName = "test-bundle-name";
+ String bundleName = TEST_PREFIX + "-create-from-distro";
String bundleVersion = "1.2.3";
String bundleDescription = "test bundle desc";
DeploymentProperties bundleMetadata = new DeploymentProperties(0, bundleName, bundleVersion,
@@ -325,6 +325,10 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
// to a db lookup to make sure our bundle version is queryable
BundleVersionCriteria criteria = new BundleVersionCriteria();
criteria.addFilterId(bv1.getId());
+ criteria.fetchBundle(true);
+ criteria.fetchConfigurationDefinition(true);
+ criteria.fetchBundleFiles(true);
+ criteria.fetchTags(true);
BundleVersion bv2 = bundleManager.findBundleVersionsByCriteria(overlord, criteria).get(0);
// test that the PC's return value and our own DB lookup match the bundle version we expect to be in the DB
@@ -336,9 +340,13 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert bv.getDescription().equals(bundleDescription) : "the bundle version desc should be the same as the bundle desc";
assert bv.getVersion().equals(bundleVersion) : bv;
assert bv.getBundleFiles().size() == 3 : bv;
- assert bv.getBundleFiles().contains(bundleFile1) : bv;
- assert bv.getBundleFiles().contains(bundleFile2) : bv;
- assert bv.getBundleFiles().contains(bundleFile3) : bv;
+ ArrayList<String> bundleFileNames = new ArrayList<String>(3);
+ for (BundleFile bf : bv.getBundleFiles()) {
+ bundleFileNames.add(bf.getPackageVersion().getFileName());
+ }
+ assert bundleFileNames.contains(bundleFile1) : bv;
+ assert bundleFileNames.contains(bundleFile2) : bv;
+ assert bundleFileNames.contains(bundleFile3) : bv;
assert bv.getBundleDeployments().isEmpty() : bv;
assert bv.getConfigurationDefinition().getPropertyDefinitions().size() == 1;
assert bv.getConfigurationDefinition().get(propName) != null;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
index 42a88f9..cb3f16e 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
@@ -194,6 +194,11 @@ public class TestBundleServerPluginService extends ServerPluginService implement
public RecipeParseResults parseRecipe(String bundleTypeName, String recipe) throws Exception {
return new TestBundlePluginComponent().parseRecipe(recipe);
}
+
+ @Override
+ public BundleDistributionInfo processBundleDistributionFile(File distributionFile) throws Exception {
+ return new TestBundlePluginComponent().processBundleDistributionFile(distributionFile);
+ }
}
class TestBundlePluginComponent implements BundleServerPluginFacet {
commit 4553a351c20652643def0f545345885b6b629af7
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Apr 29 15:48:41 2010 -0400
set up proper tx boundaries. abort/delete bundle version creation on error. try to fetch data that is returned to the caller after creation using new distro
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 46ea98c..e1b0f65 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -81,6 +81,7 @@ import org.rhq.core.util.NumberUtil;
import org.rhq.core.util.stream.StreamUtil;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.agentclient.AgentClient;
+import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RequiredPermission;
@@ -111,6 +112,9 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
private EntityManager entityManager;
@EJB
+ private SubjectManagerLocal subjectManager;
+
+ @EJB
private AgentManagerLocal agentManager;
@EJB
@@ -323,6 +327,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return bundleVersion;
}
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ @TransactionAttribute(TransactionAttributeType.NEVER)
public BundleVersion createBundleVersionViaFile(Subject subject, File distributionFile) throws Exception {
BundleServerPluginManager manager = BundleManagerHelper.getPluginContainer().getBundleServerPluginManager();
@@ -332,6 +338,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return bundleVersion;
}
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ @TransactionAttribute(TransactionAttributeType.NEVER)
public BundleVersion createBundleVersionViaURL(Subject subject, URL distributionFileUrl) throws Exception {
// get the distro file into a tmp dir
@@ -352,17 +360,13 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
log.debug("Copied [" + len + "] bytes from [" + distributionFileUrl + "] into ["
+ tempDistributionFile.getPath() + "]");
- bundleVersion = bundleManager.createBundleVersionViaFile(subject, tempDistributionFile);
+ bundleVersion = createBundleVersionViaFile(subject, tempDistributionFile);
} finally {
if (null != tempDistributionFile) {
tempDistributionFile.delete();
}
- if (is != null) {
- is.close();
- }
- if (os != null) {
- os.close();
- }
+ safeClose(is);
+ safeClose(os);
}
return bundleVersion;
@@ -374,44 +378,80 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
BundleType bundleType = bundleManager.getBundleType(subject, info.getBundleTypeName());
String bundleName = info.getRecipeParseResults().getBundleMetadata().getBundleName();
String bundleDescription = info.getRecipeParseResults().getBundleMetadata().getDescription();
- String name = "TODO: bundleVersionName";
- String description = "TODO: bundleVersionDesc";
+ String name = bundleName;
+ String description = bundleDescription;
String version = info.getRecipeParseResults().getBundleMetadata().getBundleVersion();
String recipe = info.getRecipe();
// first see if the bundle exists or not; if not, create one
+ boolean createdBundle;
BundleCriteria criteria = new BundleCriteria();
criteria.setStrict(true);
criteria.addFilterBundleTypeId(bundleType.getId());
criteria.addFilterName(bundleName);
- PageList<Bundle> bundles = findBundlesByCriteria(subject, criteria);
+ PageList<Bundle> bundles = bundleManager.findBundlesByCriteria(subject, criteria);
Bundle bundle;
if (bundles.getTotalSize() == 0) {
- bundle = createBundle(subject, bundleName, bundleDescription, bundleType.getId());
+ bundle = bundleManager.createBundle(subject, bundleName, bundleDescription, bundleType.getId());
+ createdBundle = true;
} else {
bundle = bundles.get(0);
+ createdBundle = false;
}
// now create the bundle version with the bundle we either found or created
- BundleVersion bundleVersion = createBundleVersion(subject, bundle.getId(), name, description, version, recipe);
+ BundleVersion bundleVersion = bundleManager.createBundleVersion(subject, bundle.getId(), name, description,
+ version, recipe);
// now that we have the bundle version we can actually create the bundle files that were provided in
// the bundle distribution
- Map<String, File> bundleFiles = info.getBundleFiles();
- for (String fileName : bundleFiles.keySet()) {
- File file = bundleFiles.get(fileName);
- InputStream is = null;
- try {
- is = new FileInputStream(file);
- BundleFile bundleFile = bundleManager.addBundleFile(subject, bundleVersion.getId(), fileName, "1.0",
- null, is);
- log.debug("Added bundle file [" + bundleFile + "] to BundleVersion [" + bundleVersion + "]");
- } finally {
- safeClose(is);
- if (null != file) {
- file.delete();
+ try {
+ Map<String, File> bundleFiles = info.getBundleFiles();
+ for (String fileName : bundleFiles.keySet()) {
+ File file = bundleFiles.get(fileName);
+ InputStream is = null;
+ try {
+ is = new FileInputStream(file);
+ BundleFile bundleFile = bundleManager.addBundleFile(subject, bundleVersion.getId(), fileName,
+ "1.0", null, is);
+ log.debug("Added bundle file [" + bundleFile + "] to BundleVersion [" + bundleVersion + "]");
+ } finally {
+ safeClose(is);
+ if (null != file) {
+ file.delete();
+ }
}
}
+ } catch (Exception e) {
+ // we failed to add one or more bundle files to the bundle version. Since this means the distribution file
+ // did not fully get its bundle data persisted, we need to abort the entire effort. Let's delete
+ // the bundle version including the bundle definition if we were the ones that initially created it
+ // (thus this should completely wipe the database of any knowledge of what we just did previously)
+ log.error("Failed to add bundle file to new bundle version [" + bundleVersion
+ + "], will not create the new bundle", e);
+ try {
+ bundleManager.deleteBundleVersion(subjectManager.getOverlord(), bundleVersion.getId(), createdBundle);
+ } catch (Exception e1) {
+ log.error("Failed to delete the partially created bundle version: " + bundleVersion, e1);
+ }
+ throw e;
+ }
+
+ // because the distribution file can define things like bundle files and default tags, let's
+ // ask for the full bundle version data so we can return that back to the caller; thus we let
+ // the caller know exactly what the distribution file had inside of it and what we persisted to the DB
+ BundleVersionCriteria bvCriteria = new BundleVersionCriteria();
+ bvCriteria.addFilterId(bundleVersion.getId());
+ bvCriteria.fetchBundle(true);
+ bvCriteria.fetchBundleFiles(true);
+ bvCriteria.fetchConfigurationDefinition(true);
+ bvCriteria.fetchTags(true);
+ PageList<BundleVersion> bundleVersions = bundleManager.findBundleVersionsByCriteria(subject, bvCriteria);
+ if (bundleVersions != null && bundleVersions.size() == 1) {
+ bundleVersion = bundleVersions.get(0);
+ } else {
+ log.error("Failed to obtain the full bundle version, returning only what we currently know about it: "
+ + bundleVersion);
}
return bundleVersion;
@@ -933,7 +973,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
try {
os.close();
} catch (Exception e) {
- log.warn("Failed to close InputStream", e);
+ log.warn("Failed to close OutputStream", e);
}
}
}