From 2ec6c55c33663eb247e26e642f2b06f29e78bbfc Mon Sep 17 00:00:00 2001 From: Welder Luz Date: Fri, 16 Aug 2024 12:24:07 -0300 Subject: [PATCH] Allow the listing of already included patches when importing them into a custom channel --- .../db/datasource/xml/Errata_queries.xml | 43 +++++++++++++++++++ .../redhat/rhn/domain/channel/Channel.hbm.xml | 9 ++++ .../rhn/domain/channel/ChannelFactory.java | 12 ++++++ .../channel/manage/AddCustomErrataAction.java | 4 +- .../manage/AddErrataToChannelAction.java | 7 ++- .../channel/manage/AddRedHatErrataAction.java | 14 ++++-- .../strings/jsp/StringResource_en_US.xml | 3 ++ .../rhn/manager/channel/ChannelManager.java | 16 +++---- .../pages/channel/manage/adderrataredhat.jsp | 8 ++++ java/spacewalk-java.changes.welder.bsc1228856 | 1 + 10 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 java/spacewalk-java.changes.welder.bsc1228856 diff --git a/java/code/src/com/redhat/rhn/common/db/datasource/xml/Errata_queries.xml b/java/code/src/com/redhat/rhn/common/db/datasource/xml/Errata_queries.xml index f9aa31222787..91f00b511a70 100644 --- a/java/code/src/com/redhat/rhn/common/db/datasource/xml/Errata_queries.xml +++ b/java/code/src/com/redhat/rhn/common/db/datasource/xml/Errata_queries.xml @@ -576,6 +576,49 @@ SELECT DISTINCT E.id, E.advisory_name AS advisory_name, + + + SELECT DISTINCT E.id , E.advisory AS advisory, + E.update_date AS UPDATE_DATE, + E.synopsis as ADVISORY_SYNOPSIS, + E.advisory_type as ADVISORY_TYPE, + E.advisory_name AS advisory_name, + E.advisory_status + FROM rhnErrata E + INNER JOIN rhnChannelErrata CE ON E.id = CE.errata_id + LEFT JOIN + (SELECT errata_id from rhnChannelErrata where channel_id = :custom_cid) errata_exists + ON errata_exists.errata_id = E.id, + rhnSet S + WHERE CE.channel_id = S.element + AND S.label = 'channels_for_errata' + AND errata_exists.errata_id is null + AND S.user_id = :user_id + + + + + + + SELECT DISTINCT E.id, E.advisory_name AS advisory_name, + E.update_date AS UPDATE_DATE, + E.synopsis as ADVISORY_SYNOPSIS, + E.advisory_type as ADVISORY_TYPE, + E.advisory_status + FROM rhnErrata E + INNER JOIN rhnChannelErrata CE ON CE.errata_id = E.id + INNER JOIN rhnSet S on S.element = CE.channel_id + INNER JOIN rhnErrataPackage EP ON EP.errata_id = E.id + INNER JOIN rhnPackage P ON p.id = EP.package_id + INNER JOIN rhnPackage P2 ON P.name_id = P2.name_id + INNER JOIN rhnChannelPackage CP ON P2.id = CP.package_id + WHERE CP.channel_id = :custom_cid + AND S.user_id = :user_id + AND S.label = 'channels_for_errata' + AND E.id not in (select errata_id from rhnChannelErrata where channel_id = :custom_cid) + + + diff --git a/java/code/src/com/redhat/rhn/domain/channel/Channel.hbm.xml b/java/code/src/com/redhat/rhn/domain/channel/Channel.hbm.xml index 0552f6f53432..edbc82b2858d 100644 --- a/java/code/src/com/redhat/rhn/domain/channel/Channel.hbm.xml +++ b/java/code/src/com/redhat/rhn/domain/channel/Channel.hbm.xml @@ -602,6 +602,15 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + + + + + getPackageIds(Long cid) { return singleton.listObjectsByNamedQuery("Channel.getPackageIdList", Map.of("cid", cid)); } + /** + * Get cloned errata ids for a channel + * @param cid the channel id + * @return List of errata ids + */ + public static List getClonedErrataIds(Long cid) { + if (cid == null) { + return new ArrayList<>(); + } + return singleton.listObjectsByNamedQuery("Channel.getClonedErrataOriginalIdList", Map.of("cid", cid)); + } + /** * Looksup the number of Packages in a channel * @param channel the Channel who's package count you are interested in. diff --git a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddCustomErrataAction.java b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddCustomErrataAction.java index bec6ece55c54..942a0a146c6c 100644 --- a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddCustomErrataAction.java +++ b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddCustomErrataAction.java @@ -221,7 +221,7 @@ protected DataResult getData(HttpServletRequest request, set.addElement(selectedChan.getId()); RhnSetManager.store(set); return ChannelManager.findErrataFromRhnSetForTarget(currentChan, - packageAssoc, user); + packageAssoc, false, user); } else if (selChannelList != null) { RhnSet set = RhnSetDecl.CHANNELS_FOR_ERRATA.get(user); @@ -231,7 +231,7 @@ else if (selChannelList != null) { } RhnSetManager.store(set); return ChannelManager.findErrataFromRhnSetForTarget(currentChan, - packageAssoc, user); + packageAssoc, false, user); } else { return ChannelManager.findCustomErrataForTarget(currentChan, diff --git a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddErrataToChannelAction.java b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddErrataToChannelAction.java index beaeb7622123..3e34b90c701d 100644 --- a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddErrataToChannelAction.java +++ b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddErrataToChannelAction.java @@ -41,6 +41,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -82,6 +83,7 @@ public ActionForward execute(ActionMapping mapping, } List channelPacks = ChannelFactory.getPackageIds(currentChan.getId()); + List clonedErrataOriginalIds = ChannelFactory.getClonedErrataIds(currentChan.getId()); for (Long pid : packageIds) { if (!channelPacks.contains(pid)) { @@ -95,7 +97,10 @@ public ActionForward execute(ActionMapping mapping, // user).getElementValues(); //ErrataManager.publishErrataToChannelAsync(currentChan, errataIds, user); List errata = ErrataManager.errataInSet(user, - RhnSetDecl.setForChannelErrata(currentChan).get(user).getLabel()); + RhnSetDecl.setForChannelErrata(currentChan).get(user).getLabel()) + .stream() + .filter(it -> !clonedErrataOriginalIds.contains(it.getId())) + .collect(Collectors.toList()); Set eids = ErrataManager.cloneChannelErrata(errata, currentChan.getId(), user); diff --git a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddRedHatErrataAction.java b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddRedHatErrataAction.java index 636b566cf8e9..8d45ca5c2c46 100644 --- a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddRedHatErrataAction.java +++ b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/AddRedHatErrataAction.java @@ -64,6 +64,7 @@ public class AddRedHatErrataAction extends RhnListAction { private static final String CHANNEL_SUBMIT = "frontend.actions.channels.manager." + "add.viewErrata"; private static final String CHECKED = "assoc_checked"; + private static final String LIST_ALREADY_INCLUDED_PATCH = "list_already_included"; private static final String SUBMITTED = "frontend.actions.channels.manager." + "add.submit"; @@ -97,6 +98,7 @@ public ActionForward execute(ActionMapping mapping, List channelList; String selectedChannelStr; boolean checked = true; + boolean listAlreadyIncludedPatches = true; //Set initail strings @@ -130,6 +132,10 @@ public ActionForward execute(ActionMapping mapping, checked = false; } + if (requestContext.isSubmitted() && request.getParameter(LIST_ALREADY_INCLUDED_PATCH) == null) { + listAlreadyIncludedPatches = false; + } + request.setAttribute(CHECKED, checked); request.setAttribute(SELECTED_CHANNEL, selectedChannelStr); @@ -157,7 +163,8 @@ public ActionForward execute(ActionMapping mapping, RhnListSetHelper helper = new RhnListSetHelper(request); RhnSet set = getSetDecl(currentChan).get(user); - DataResult dr = getData(request, selectedChannel, currentChan, channelList, checked, user); + DataResult dr = getData(request, selectedChannel, currentChan, channelList, checked, + listAlreadyIncludedPatches, user); request.setAttribute(RequestContext.PAGE_LIST, dr); @@ -244,6 +251,7 @@ private DataResult getData(HttpServletRequest request, Channel currentChan, List selChannelList, boolean packageAssoc, + boolean listAlreadyIncludedPatches, User user) { if (selectedChan != null) { @@ -252,7 +260,7 @@ private DataResult getData(HttpServletRequest request, set.addElement(selectedChan.getId()); RhnSetManager.store(set); return ChannelManager.findErrataFromRhnSetForTarget(currentChan, - packageAssoc, user); + packageAssoc, listAlreadyIncludedPatches, user); } else if (selChannelList != null) { RhnSet set = RhnSetDecl.CHANNELS_FOR_ERRATA.get(user); @@ -262,7 +270,7 @@ else if (selChannelList != null) { } RhnSetManager.store(set); return ChannelManager.findErrataFromRhnSetForTarget(currentChan, - packageAssoc, user); + packageAssoc, listAlreadyIncludedPatches, user); } else { diff --git a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml index d5b38cf20344..d431c3596628 100644 --- a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml +++ b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml @@ -22447,6 +22447,9 @@ As a Channel Administrator, you may change the base channels your systems are su <em>(Recommended)</em> With this selected only patches that contain packages that apply to this channel are shown. Also, package architecture will match what is currently in the channel. + + With this selected, patches that are already part of the channel are shown. This is useful when a patch is part of multiple channels, has been included from one of them, and it is necessary to associate its packages from another one. + Add to SSM diff --git a/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java b/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java index 946c45ec90a7..b33ef2f7910f 100644 --- a/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java +++ b/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java @@ -2064,15 +2064,9 @@ public static DataResult findErrataForTarget( * @return List of Errata */ public static DataResult findErrataFromRhnSetForTarget( - Channel targetChannel, boolean packageAssoc, User user) { + Channel targetChannel, boolean packageAssoc, boolean listAlreadyIncluded, User user) { - String mode; - if (packageAssoc) { - mode = "in_sources_for_target_package_assoc"; - } - else { - mode = "in_sources_for_target"; - } + String mode = getModeFindErrataFromRhnSet(packageAssoc, listAlreadyIncluded); Map params = new HashMap<>(); params.put("custom_cid", targetChannel.getId()); @@ -2085,6 +2079,12 @@ public static DataResult findErrataFromRhnSetForTarget( return m.execute(params); } + private static String getModeFindErrataFromRhnSet(boolean packageAssoc, boolean listAlreadyIncluded) { + return "in_sources_for_target" + + (packageAssoc ? "_package_assoc" : "") + + (listAlreadyIncluded ? "_with_already_included" : ""); + } + /** * find available errata from custom base channels and their child channels for a * particular channel diff --git a/java/code/webapp/WEB-INF/pages/channel/manage/adderrataredhat.jsp b/java/code/webapp/WEB-INF/pages/channel/manage/adderrataredhat.jsp index e5671cd199e2..a287684785b9 100644 --- a/java/code/webapp/WEB-INF/pages/channel/manage/adderrataredhat.jsp +++ b/java/code/webapp/WEB-INF/pages/channel/manage/adderrataredhat.jsp @@ -26,6 +26,14 @@ +
+ +
+ + +
+
+ diff --git a/java/spacewalk-java.changes.welder.bsc1228856 b/java/spacewalk-java.changes.welder.bsc1228856 new file mode 100644 index 000000000000..0dedf061a285 --- /dev/null +++ b/java/spacewalk-java.changes.welder.bsc1228856 @@ -0,0 +1 @@ +- Allow the listing of already included patches when importing them into a custom channel (bsc#1228856)