java/code/src/com/redhat/rhn/common/db/datasource/xml/Package_queries.xml
| 22 ++++
java/code/src/com/redhat/rhn/domain/rhnpackage/PackageFactory.java
| 17 +++
java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
| 18 +---
java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
| 45 +---------
java/code/src/com/redhat/rhn/manager/rhnpackage/PackageManager.java
| 43 +++++++++
java/code/src/com/redhat/rhn/manager/system/IncompatibleArchException.java
| 12 ++
java/spacewalk-java.spec
| 8 +
rel-eng/packages/spacewalk-java
| 2
8 files changed, 113 insertions(+), 54 deletions(-)
New commits:
commit c5c43546cfc802f7700b407747a9d5ecf2189bbb
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Mar 10 17:16:31 2011 +0100
Automatic commit of package [spacewalk-java] release [1.4.16-1].
diff --git a/java/spacewalk-java.spec b/java/spacewalk-java.spec
index 9867ccd..7b94943 100644
--- a/java/spacewalk-java.spec
+++ b/java/spacewalk-java.spec
@@ -17,7 +17,7 @@ Name: spacewalk-java
Summary: Spacewalk Java site packages
Group: Applications/Internet
License: GPLv2
-Version: 1.4.15
+Version: 1.4.16
Release: 1%{?dist}
URL:
https://fedorahosted.org/spacewalk
Source0:
https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
@@ -537,6 +537,12 @@ fi
%{jardir}/postgresql-jdbc.jar
%changelog
+* Thu Mar 10 2011 Tomas Lestach <tlestach(a)redhat.com> 1.4.16-1
+- 644880 - speed up channel.software.addPackages API (tlestach(a)redhat.com)
+- Subquery in FROM must have an alias in PostgreSQL. (jpazdziora(a)redhat.com)
+- reprovisioning should not fail completely if python modules are missing
+ (michael.mraka(a)redhat.com)
+
* Mon Mar 07 2011 Jan Pazdziora 1.4.15-1
- 682258 - fix unit test (mzazrivec(a)redhat.com)
- 682258 - removed unused imports (mzazrivec(a)redhat.com)
diff --git a/rel-eng/packages/spacewalk-java b/rel-eng/packages/spacewalk-java
index 0e47f64..a7823e7 100644
--- a/rel-eng/packages/spacewalk-java
+++ b/rel-eng/packages/spacewalk-java
@@ -1 +1 @@
-1.4.15-1 java/
+1.4.16-1 java/
commit 1c9e62430720a088fbda5e433d3d57897ba182f6
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Mar 10 14:16:54 2011 +0100
644880 - speed up channel.software.addPackages API
diff --git a/java/code/src/com/redhat/rhn/common/db/datasource/xml/Package_queries.xml
b/java/code/src/com/redhat/rhn/common/db/datasource/xml/Package_queries.xml
index 53bbd39..c935503 100644
--- a/java/code/src/com/redhat/rhn/common/db/datasource/xml/Package_queries.xml
+++ b/java/code/src/com/redhat/rhn/common/db/datasource/xml/Package_queries.xml
@@ -1940,7 +1940,25 @@ select distinct p.evr_id as id
</query>
</mode>
-
-
+<mode name="channel_arch_and_org_access">
+ <query params="channel_id, org_id">
+SELECT p.id, comp.package_arch_id, p.org_id org_package, octv.package_id org_access,
sctv.package_id shared_access
+FROM rhnPackage p
+ LEFT JOIN
+ (SELECT a.package_arch_id
+ FROM rhnChannel c
+ LEFT JOIN rhnChannelPackageArchCompat a ON a.channel_arch_id = c.channel_arch_id
+ WHERE c.id = :channel_id) comp ON p.package_arch_id = comp.package_arch_id
+ LEFT JOIN
+ (SELECT DISTINCT CP.package_id
+ FROM rhnOrgChannelTreeView CT inner join rhnChannelPackage CP on CT.id =
CP.channel_id
+ WHERE CT.org_id = :org_id) octv on octv.package_id = p.id
+ LEFT JOIN
+ (SELECT DISTINCT CP.package_id
+ FROM rhnSharedChannelTreeView CT inner join rhnChannelPackage CP on CT.id =
CP.channel_id
+ WHERE CT.org_id = :org_id) sctv on sctv.package_id = p.id
+WHERE p.id IN (%s)
+ </query>
+</mode>
</datasource_modes>
diff --git a/java/code/src/com/redhat/rhn/domain/rhnpackage/PackageFactory.java
b/java/code/src/com/redhat/rhn/domain/rhnpackage/PackageFactory.java
index 5a08231..dcf229b 100644
--- a/java/code/src/com/redhat/rhn/domain/rhnpackage/PackageFactory.java
+++ b/java/code/src/com/redhat/rhn/domain/rhnpackage/PackageFactory.java
@@ -506,4 +506,21 @@ public class PackageFactory extends HibernateFactory {
return prov;
}
+ /**
+ * Returns information, whether each package in the list is channel compatible
+ * and whether the org has accesds to
+ * @param orgId organization id
+ * @param channelId channel id
+ * @param packageIds list of package ids
+ * @return dataresult(id, package_arch_id, org_package, org_access, shared_access)
+ */
+ public static DataResult getPackagesChannelArchCompatAndOrgAccess(
+ Long orgId, Long channelId, List<Long> packageIds) {
+ Map params = new HashMap();
+ params.put("org_id", orgId);
+ params.put("channel_id", channelId);
+ SelectMode m = ModeFactory.getMode("Package_queries",
+ "channel_arch_and_org_access");
+ return m.execute(params, packageIds);
+ }
}
diff --git
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
index e7a6003..7f0a7d1 100644
---
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
+++
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/channel/software/ChannelSoftwareHandler.java
@@ -1114,15 +1114,15 @@ public class ChannelSoftwareHandler extends BaseHandler {
User loggedInUser = getLoggedInUser(sessionKey);
Channel channel = lookupChannelByLabel(loggedInUser.getOrg(), channelLabel);
- //Make sure the user is a channel admin for the given channel.
- if (!UserManager.verifyChannelAdmin(loggedInUser, channel)) {
- throw new PermissionCheckFailureException();
- }
-
// Try to add the list of packages to the channel. Catch any exceptions and
// convert to FaultExceptions
try {
- ChannelEditor.getInstance().addPackages(loggedInUser, channel, packageIds);
+ // we need long values to pass
+ List<Long> longPackageIds = new ArrayList();
+ for (Iterator it = packageIds.iterator(); it.hasNext();) {
+ longPackageIds.add(new Long((Integer) it.next()));
+ }
+ ChannelEditor.getInstance().addPackages(loggedInUser, channel,
longPackageIds);
}
catch (PermissionException e) {
throw new PermissionCheckFailureException();
@@ -1132,12 +1132,6 @@ public class ChannelSoftwareHandler extends BaseHandler {
//doesn't exist.
throw new NoSuchPackageException(le);
}
- /*
- catch (IncompatibleArchException iae) {
- throw new FaultException(1202, "incompatiblePackageArch",
- "package architecture is incompatible with channel", iae);
- }
- */
//refresh channel with newest packages
ChannelManager.refreshWithNewestPackages(channel, "api");
diff --git a/java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
b/java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
index b3fa116..c84a98c 100644
--- a/java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
+++ b/java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java
@@ -20,16 +20,12 @@ import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.common.security.PermissionException;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.channel.ChannelFactory;
-import com.redhat.rhn.domain.rhnpackage.Package;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.manager.rhnpackage.PackageManager;
-import com.redhat.rhn.manager.system.IncompatibleArchException;
import com.redhat.rhn.manager.user.UserManager;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -97,45 +93,18 @@ public class ChannelEditor {
}
List<Long> existingPids = ChannelFactory.getPackageIds(channel.getId());
- List list = new ArrayList();
-
- //Loop through packageIds
- for (Iterator itr = packageIds.iterator(); itr.hasNext();) {
- Long pid = convertObjectToLong(itr.next());
- // make sure user has access to the package
- if (!UserManager.verifyPackageAccess(user.getOrg(), pid)) {
- StringBuffer msg = new StringBuffer("User: ");
- msg.append(user.getLogin());
- msg.append(" does not have access to package: ");
- msg.append(pid);
-
- //Throw an exception with a nice error message so the user
- //knows what went wrong.
- LocalizationService ls = LocalizationService.getInstance();
- PermissionException pex = new PermissionException(msg.toString());
-
pex.setLocalizedTitle(ls.getMessage("permission.jsp.title.package"));
-
pex.setLocalizedSummary(ls.getMessage("permission.jsp.summary.package"));
- throw pex;
- }
- // check package compatibility with the channel when adding
- if (add) {
- Package pkg = PackageManager.lookupByIdAndUser(pid, user);
- if (!channel.getChannelArch().isCompatible(pkg.getPackageArch())) {
- throw new IncompatibleArchException(pkg.getPackageArch(),
- channel.getChannelArch());
- }
- }
- // add packages to action list
- if (!add || !existingPids.contains(pid)) {
- list.add(pid);
- }
+ if (add) {
+ packageIds.removeAll(existingPids);
}
+ PackageManager.verifyPackagesChannelArchCompatAndOrgAccess(user,
+ channel, (List<Long>) packageIds, add);
+
if (add) {
- ChannelManager.addPackages(channel, list, user);
+ ChannelManager.addPackages(channel, (List<Long>) packageIds, user);
}
else {
- ChannelManager.removePackages(channel, list, user);
+ ChannelManager.removePackages(channel, (List<Long>) packageIds, user);
}
// Mark the affected channel to have it smetadata evaluated, where necessary
diff --git a/java/code/src/com/redhat/rhn/manager/rhnpackage/PackageManager.java
b/java/code/src/com/redhat/rhn/manager/rhnpackage/PackageManager.java
index 096e94f..5bc0e60 100644
--- a/java/code/src/com/redhat/rhn/manager/rhnpackage/PackageManager.java
+++ b/java/code/src/com/redhat/rhn/manager/rhnpackage/PackageManager.java
@@ -21,6 +21,7 @@ import com.redhat.rhn.common.db.datasource.ModeFactory;
import com.redhat.rhn.common.db.datasource.SelectMode;
import com.redhat.rhn.common.db.datasource.WriteMode;
import com.redhat.rhn.common.hibernate.HibernateFactory;
+import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.common.security.PermissionException;
import com.redhat.rhn.common.util.CompressionUtil;
import com.redhat.rhn.common.util.RpmVersionComparator;
@@ -50,6 +51,7 @@ import com.redhat.rhn.manager.errata.cache.ErrataCacheManager;
import com.redhat.rhn.manager.rhnset.RhnSetDecl;
import com.redhat.rhn.manager.rhnset.RhnSetManager;
import com.redhat.rhn.manager.satellite.SystemCommandExecutor;
+import com.redhat.rhn.manager.system.IncompatibleArchException;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
@@ -1363,4 +1365,45 @@ public class PackageManager extends BaseManager {
return ce.getLastCommandOutput();
}
+ /**
+ * Throw exception, if any of the packages aren't accessible by user or
+ * aren't compatible with provided channel arch
+ * @param user user
+ * @param channel channel
+ * @param packageIds package ids
+ * @param checkArchCompat optionally arch compatibility doesn't have to be
checked
+ * (f.e. when removing packages, only orgt access is important)
+ */
+ public static void verifyPackagesChannelArchCompatAndOrgAccess(
+ User user, Channel channel, List<Long> packageIds, boolean
checkArchCompat) {
+ DataResult dr = PackageFactory.getPackagesChannelArchCompatAndOrgAccess(
+ user.getOrg().getId(), channel.getId(), packageIds);
+ List<Long> archNonCompat = new ArrayList<Long>();
+ List<Long> orgNoAccess = new ArrayList<Long>();
+ for (Iterator i = dr.iterator(); i.hasNext();) {
+ Map m = (Map) i.next();
+ if (m.get("package_arch_id") == null) {
+ archNonCompat.add((Long)m.get("id"));
+ }
+ if (m.get("org_package") == null &&
+ m.get("org_access") == null &&
+ m.get("shared_access") == null) {
+ archNonCompat.add((Long)m.get("id"));
+ }
+ }
+ if (!orgNoAccess.isEmpty()) {
+ StringBuffer msg = new StringBuffer("User: ");
+ msg.append(user.getLogin());
+ msg.append(" does not have access to packages: ");
+ msg.append(orgNoAccess);
+ LocalizationService ls = LocalizationService.getInstance();
+ PermissionException pex = new PermissionException(msg.toString());
+
pex.setLocalizedTitle(ls.getMessage("permission.jsp.title.package"));
+
pex.setLocalizedSummary(ls.getMessage("permission.jsp.summary.package"));
+ throw pex;
+ }
+ if (checkArchCompat && !archNonCompat.isEmpty()) {
+ throw new IncompatibleArchException(channel.getChannelArch(),
archNonCompat);
+ }
+ }
}
diff --git a/java/code/src/com/redhat/rhn/manager/system/IncompatibleArchException.java
b/java/code/src/com/redhat/rhn/manager/system/IncompatibleArchException.java
index afdfa72..2146be6 100644
--- a/java/code/src/com/redhat/rhn/manager/system/IncompatibleArchException.java
+++ b/java/code/src/com/redhat/rhn/manager/system/IncompatibleArchException.java
@@ -19,6 +19,8 @@ import com.redhat.rhn.domain.channel.ChannelArch;
import com.redhat.rhn.domain.rhnpackage.PackageArch;
import com.redhat.rhn.domain.server.ServerArch;
+import java.util.List;
+
/**
* IncompatibleArchException
* @version $Rev$
@@ -55,4 +57,14 @@ public class IncompatibleArchException extends RhnRuntimeException {
this("The package architecture (" + pa.getName() + ") is
incompatible " +
"with the channel architecture (" + ca.getName() +
")");
}
+
+ /**
+ * Ctor
+ * @param ca ChannelArch which is incompatible with PackageArch.
+ * @param packageIds package ids incompatible with ChannelArch.
+ */
+ public IncompatibleArchException(ChannelArch ca, List<Long> packageIds) {
+ this("Following package ids: " + packageIds + " are incompatible
" +
+ "with channel architecture (" + ca.getName() + ")");
+ }
}