Skip to content

Issv3 proxy registration data for SCC on the Hub #10325

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@
import com.suse.manager.model.hub.IssPeripheralChannels;
import com.suse.manager.model.maintenance.MaintenanceCalendar;
import com.suse.manager.model.maintenance.MaintenanceSchedule;
import com.suse.scc.proxy.SCCProxyRecord;

import java.util.List;

Expand Down Expand Up @@ -312,6 +313,7 @@ private AnnotationRegistry() {
SAPWorkload.class,
SCCCredentials.class,
SCCOrderItem.class,
SCCProxyRecord.class,
SCCRegCacheItem.class,
SCCRepositoryAuth.class,
SCCRepositoryBasicAuth.class,
Expand Down
30 changes: 12 additions & 18 deletions java/code/src/com/redhat/rhn/domain/scc/SCCCachingFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@

import com.suse.scc.model.SCCRepositoryJson;
import com.suse.scc.model.SCCSubscriptionJson;
import com.suse.scc.model.SCCUpdateSystemItem;
import com.suse.scc.model.SCCVirtualizationHostJson;
import com.suse.utils.Opt;

Expand All @@ -38,12 +39,10 @@
import org.hibernate.type.StandardBasicTypes;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -591,27 +590,22 @@ public static List<SCCRegCacheItem> listRegItemsByCredentials(Credentials cred)

/**
* Return list of data for last seen SCC update call
* @param cred SCC Org Crednetials
* @return a list of maps with the keys scc_login, scc_passwd, checkin
* @param cred SCC Org Credentials
* @return a list {@link SCCUpdateSystemItem}
*/
@SuppressWarnings("unchecked")
public static List<Map<String, Object>> listUpdateLastSeenCandidates(SCCCredentials cred) {
List<Map<String, Object>> result = new ArrayList<>();
public static List<SCCUpdateSystemItem> listUpdateLastSeenItems(SCCCredentials cred) {
List<Object[]> rows = getSession().createNativeQuery("""
SELECT reg.scc_login, reg.scc_passwd, si.checkin FROM suseSCCRegCache reg
JOIN rhnServer s ON reg.server_id = s.id JOIN rhnServerInfo si ON s.id = si.server_id
WHERE reg.scc_regerror_timestamp IS NULL AND reg.creds_id = :cred AND reg.scc_id IS NOT NULL
""")
SELECT reg.scc_login, reg.scc_passwd, si.checkin FROM suseSCCRegCache reg
JOIN rhnServer s ON reg.server_id = s.id JOIN rhnServerInfo si ON s.id = si.server_id
WHERE reg.scc_regerror_timestamp IS NULL AND reg.creds_id = :cred AND reg.scc_id IS NOT NULL
""")
.setParameter("cred", cred.getId(), StandardBasicTypes.LONG)
.list();
for (Object[] row : rows) {
Map<String, Object> entry = new HashMap<>();
entry.put("scc_login", row[0].toString());
entry.put("scc_passwd", row[1].toString());
entry.put("checkin", row[2]);
result.add(entry);
}
return result;

return rows.stream()
.map(r -> new SCCUpdateSystemItem(r[0].toString(), r[1].toString(), (Date) r[2]))
.toList();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,18 @@
import com.redhat.rhn.domain.credentials.CredentialsFactory;
import com.redhat.rhn.domain.credentials.SCCCredentials;
import com.redhat.rhn.domain.scc.SCCCachingFactory;
import com.redhat.rhn.domain.scc.SCCRegCacheItem;
import com.redhat.rhn.frontend.xmlrpc.sync.content.SCCContentSyncSource;
import com.redhat.rhn.manager.content.ContentSyncException;
import com.redhat.rhn.manager.content.ContentSyncManager;

import com.suse.cloud.CloudPaygManager;
import com.suse.scc.SCCSystemRegistrationManager;
import com.suse.scc.client.SCCClient;
import com.suse.scc.client.SCCConfig;
import com.suse.scc.client.SCCConfigBuilder;
import com.suse.scc.client.SCCWebClient;
import com.suse.scc.SCCTaskManager;
import com.suse.scc.model.SCCSubscriptionJson;

import org.apache.commons.collections.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
Expand Down Expand Up @@ -205,23 +198,12 @@ public void deleteMirrorCredentials(Long id, HttpServletRequest request)
}

// Check for systems registered under this credentials and start delete requests
List<SCCRegCacheItem> itemList = SCCCachingFactory.listRegItemsByCredentials(dbCreds);
log.debug("{} RegCacheItems found to force delete", itemList.size());
try {
URI url = new URI(Config.get().getString(ConfigDefaults.SCC_URL));
String uuid = ContentSyncManager.getUUID();
SCCConfig sccConfig = new SCCConfigBuilder()
.setUrl(url)
.setUsername("")
.setPassword("")
.setUuid(uuid)
.createSCCConfig();
SCCClient sccClient = new SCCWebClient(sccConfig);
SCCSystemRegistrationManager sccRegManager = new SCCSystemRegistrationManager(sccClient);
sccRegManager.deregister(itemList, true);
}
catch (URISyntaxException e) {
log.error("Invalid SCC URL configured.", e);
SCCTaskManager sccTaskManager = new SCCTaskManager();
sccTaskManager.cleanupSccWhenDeletingPrimaryCredentials(dbCreds);

//deregister all proxy items if primary credentials
if (credentials.isPrimary()) {
sccTaskManager.cleanupSccProxyWhenDeletingPrimaryCredentials();
}

// Clear Repository Authentications
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,40 +13,26 @@
import com.redhat.rhn.GlobalInstanceHolder;
import com.redhat.rhn.common.conf.Config;
import com.redhat.rhn.common.conf.ConfigDefaults;
import com.redhat.rhn.domain.credentials.CredentialsFactory;
import com.redhat.rhn.domain.credentials.SCCCredentials;
import com.redhat.rhn.domain.notification.NotificationMessage;
import com.redhat.rhn.domain.notification.UserNotificationFactory;
import com.redhat.rhn.domain.notification.types.NotificationType;
import com.redhat.rhn.domain.notification.types.SCCOptOutWarning;
import com.redhat.rhn.domain.role.RoleFactory;
import com.redhat.rhn.domain.scc.SCCCachingFactory;
import com.redhat.rhn.domain.scc.SCCRegCacheItem;
import com.redhat.rhn.manager.content.ContentSyncManager;

import com.suse.scc.SCCSystemRegistrationManager;
import com.suse.scc.client.SCCClient;
import com.suse.scc.client.SCCConfig;
import com.suse.scc.client.SCCConfigBuilder;
import com.suse.scc.client.SCCWebClient;
import com.suse.scc.model.SCCVirtualizationHostJson;
import com.suse.scc.SCCTaskManager;

import org.apache.commons.lang3.time.DateUtils;
import org.quartz.JobExecutionContext;

import java.net.URI;
import java.net.URISyntaxException;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;


public class ForwardRegistrationTask extends RhnJavaJob {

// initialize first run between 30 minutes and 3 hours from now
private static LocalDateTime nextLastSeenUpdateRun = LocalDateTime.now().plusMinutes(
protected static LocalDateTime nextLastSeenUpdateRun = LocalDateTime.now().plusMinutes(
ThreadLocalRandom.current().nextInt(30, 3 * 60));

@Override
Expand Down Expand Up @@ -78,69 +64,20 @@ public void execute(JobExecutionContext arg0) {
}
if (Config.get().getString(ContentSyncManager.RESOURCE_PATH) == null) {

List<SCCCredentials> credentials = CredentialsFactory.listSCCCredentials();
Optional<SCCCredentials> optPrimCred = credentials.stream()
.filter(c -> c.isPrimary())
.findFirst();
if (optPrimCred.isEmpty()) {
// We cannot update SCC without credentials
// Standard Uyuni case
log.debug("No SCC Credentials - skipping forwarding registration");
return;
}
int waitTime = ThreadLocalRandom.current().nextInt(0, 15 * 60);
if (log.isDebugEnabled()) {
// no waiting when debug is on
waitTime = 1;
SCCTaskManager sccTaskManager = new SCCTaskManager();
boolean updateLastSeenUpdateRun =
sccTaskManager.executeSCCTasksWithinRandomMinutes(15, nextLastSeenUpdateRun);
if (updateLastSeenUpdateRun) {
updateLastSeenUpdateRun();
}
try {
Thread.sleep(waitTime * 1000);
}
catch (InterruptedException e) {
log.debug("Sleep interrupted", e);
}
optPrimCred.ifPresent(primaryCredentials -> executeSCCTasks(primaryCredentials));
}
}

/*
* Do SCC related tasks like insert, update and delete system in SCC
*/
private void executeSCCTasks(SCCCredentials primaryCredentials) {
try {
URI url = new URI(Config.get().getString(ConfigDefaults.SCC_URL));
String uuid = ContentSyncManager.getUUID();
SCCCachingFactory.initNewSystemsToForward();
SCCConfig sccConfig = new SCCConfigBuilder()
.setUrl(url)
.setUsername("")
.setPassword("")
.setUuid(uuid)
.createSCCConfig();
SCCClient sccClient = new SCCWebClient(sccConfig);

SCCSystemRegistrationManager sccRegManager = new SCCSystemRegistrationManager(sccClient);
List<SCCRegCacheItem> forwardRegistration = SCCCachingFactory.findSystemsToForwardRegistration();
log.debug("{} RegCacheItems found to forward", forwardRegistration.size());

List<SCCRegCacheItem> deregister = SCCCachingFactory.listDeregisterItems();
log.debug("{} RegCacheItems found to delete", deregister.size());

List<SCCVirtualizationHostJson> virtHosts = SCCCachingFactory.listVirtualizationHosts();
log.debug("{} VirtHosts found to send", virtHosts.size());

sccRegManager.deregister(deregister, false);
sccRegManager.register(forwardRegistration, primaryCredentials);
sccRegManager.virtualInfo(virtHosts, primaryCredentials);
if (LocalDateTime.now().isAfter(nextLastSeenUpdateRun)) {
sccRegManager.updateLastSeen(primaryCredentials);
// next run in 22 - 26 hours
nextLastSeenUpdateRun = nextLastSeenUpdateRun.plusMinutes(
ThreadLocalRandom.current().nextInt(22 * 60, 26 * 60));
}
}
catch (URISyntaxException e) {
log.error(e.getMessage(), e);
private void updateLastSeenUpdateRun() {
// next run in 22 - 26 hours
synchronized (this) {
nextLastSeenUpdateRun = nextLastSeenUpdateRun.plusMinutes(
ThreadLocalRandom.current().nextInt(22 * 60, 26 * 60));
}
}
}
Loading