Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
261c3cb
[JENKINS-76317]: Extending the maintenance window functionality to su…
prathamalwayscomeslast Dec 20, 2025
56c87f6
Changes to keep it backwards compatible
prathamalwayscomeslast Dec 20, 2025
3434c2e
- Split the `MaintenanceWindow` form for cloud and agents.
prathamalwayscomeslast Dec 24, 2025
e9e1b13
- Fixed UI bugs
prathamalwayscomeslast Dec 25, 2025
6164606
`MaintenanceLink` now works correctly with clouds.
prathamalwayscomeslast Dec 25, 2025
2dc5106
- `RecurringMaintenanceWindow`s now work for clouds
prathamalwayscomeslast Dec 28, 2025
6e78eba
Added some cloud provisioning listener tests
prathamalwayscomeslast Dec 31, 2025
5e7eba7
Handled all possible edge cases for CloudProvisioningListenerTest
prathamalwayscomeslast Jan 1, 2026
8c46205
Added some new tests:
prathamalwayscomeslast Jan 4, 2026
7ee0628
Refactored `MaintenanceLinkTest` for Cloud and fixed some other tests
prathamalwayscomeslast Jan 5, 2026
7284c08
Improved some tests
prathamalwayscomeslast Jan 6, 2026
7b8097f
More tests improved.
prathamalwayscomeslast Jan 10, 2026
ebe3b0d
Solved most test case issues. Solved all checkstyle violations. Added…
prathamalwayscomeslast Jan 13, 2026
83d5b3f
Removed debugging helper statements
prathamalwayscomeslast Jan 13, 2026
9bda3d0
- Improved tooltip and badge in `MaintenanceLink`
prathamalwayscomeslast Jan 24, 2026
d1f5237
Maintenance Window clean up for cloud when a node is being provisioned.
prathamalwayscomeslast Jan 24, 2026
1b8ba9d
- `MaintenanceLinkTest` issues are resolved, completely.
prathamalwayscomeslast Jan 31, 2026
f666851
- `MaintenanceLinkTest` issues are resolved, completely.
prathamalwayscomeslast Feb 26, 2026
71870b1
New helper class: PermissionManager - clean handling of permissions o…
prathamalwayscomeslast Feb 27, 2026
b6e1ace
Integrated the new PermissionManager API to the existing structure
prathamalwayscomeslast Feb 28, 2026
8f40231
Merge branch 'centralized-permissions' into cloud-maintenance
prathamalwayscomeslast Feb 28, 2026
c29ef42
Fix compile error
prathamalwayscomeslast Feb 28, 2026
bf30b66
Revert "- `MaintenanceLinkTest` issues are resolved, completely. - Ne…
prathamalwayscomeslast Mar 1, 2026
ebba161
Reverting cloud UUIDs
prathamalwayscomeslast Mar 1, 2026
568a80c
fix: resolved test failures
prathamalwayscomeslast Mar 1, 2026
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 @@ -12,17 +12,17 @@

/** Inject the action link to agents. */
@Extension
public class MaintenanceActionFactory extends TransientActionFactory<SlaveComputer> {
public class AgentMaintenanceActionFactory extends TransientActionFactory<SlaveComputer> {

@Override
@NonNull
public Collection<? extends Action> createFor(@NonNull SlaveComputer target) {
List<Action> result = new ArrayList<>();
if (!(target instanceof AbstractCloudComputer)
&& target.getActions().stream().noneMatch(x -> x instanceof MaintenanceAction)) {
MaintenanceAction action = new MaintenanceAction(target);
MaintenanceTarget mt = new MaintenanceTarget(MaintenanceTarget.TargetType.AGENT, target.getName());
MaintenanceAction action = new MaintenanceAction(mt);
result.add(action);
target.addAction(new MaintenanceAction(target));
}
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,9 @@ public boolean isManualLaunchAllowed(final SlaveComputer c) {
@Override
@GuardedBy("hudson.model.Queue.lock")
public synchronized long check(final SlaveComputer c) {
MaintenanceWindow maintenance = MaintenanceHelper.getInstance().getMaintenance(c.getName());
MaintenanceHelper.getInstance().checkRecurring(c.getName());
MaintenanceTarget target = new MaintenanceTarget(MaintenanceTarget.TargetType.AGENT, c.getName());
MaintenanceWindow maintenance = MaintenanceHelper.getInstance().getMaintenance(target.toKey());
MaintenanceHelper.getInstance().checkRecurring(target.toKey());
LOGGER.log(Level.FINER, "Checking for Maintenance Window for agent {0}. online = {1}, idle = {2}",
new Object[] { c.getName(), c.isOnline(), c.isIdle() });
if (maintenance != null) {
Expand All @@ -74,13 +75,10 @@ public synchronized long check(final SlaveComputer c) {
if (maintenance.isKeepUpWhenActive()) {
if (!maintenance.isMaxWaitTimeFinished()) {
if (c.isIdle()) {
Queue.withLock(new Runnable() {
@Override
public void run() {
LOGGER.log(Level.INFO, "Disconnecting agent {0} as it was idle when maintenance window started.",
new Object[] { c.getName() });
c.disconnect(maintenance.getOfflineCause(c.getName()));
}
Queue.withLock(() -> {
LOGGER.log(Level.INFO, "Disconnecting agent {0} as it was idle when maintenance window started.",
new Object[] { c.getName() });
c.disconnect(maintenance.getOfflineCause(c.getName()));
});
}
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.sap.prd.jenkins.plugins.agent_maintenance;

import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import hudson.model.Action;
import hudson.slaves.Cloud;
import jenkins.model.Jenkins;
import jenkins.model.TransientActionFactory;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

@Extension
public class CloudMaintenanceActionFactory extends TransientActionFactory<Cloud> {

@NonNull
@Override
public Collection<? extends Action> createFor(@NonNull Cloud target) {
if (!Jenkins.get().hasPermission(Jenkins.ADMINISTER)) {
return Collections.emptyList();
}
MaintenanceTarget mt = new MaintenanceTarget(MaintenanceTarget.TargetType.CLOUD, target.name);
MaintenanceAction action = new MaintenanceAction(mt);
// target.addAction(action);

return Collections.singletonList(action);
}

@Override
public Class<Cloud> type() {
return Cloud.class;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.sap.prd.jenkins.plugins.agent_maintenance;

import hudson.Extension;
import hudson.model.queue.CauseOfBlockage;
import hudson.slaves.Cloud;
import hudson.slaves.CloudProvisioningListener;

import java.util.logging.Level;
import java.util.logging.Logger;

@Extension
public class CloudMaintenanceProvisioningListener extends CloudProvisioningListener {
private static final Logger LOGGER = Logger.getLogger(CloudMaintenanceProvisioningListener.class.getName());

@Override
public CauseOfBlockage canProvision(Cloud cloud, Cloud.CloudState state, int numExecutors) {
try {
MaintenanceTarget target = new MaintenanceTarget(MaintenanceTarget.TargetType.CLOUD, cloud.name);
LOGGER.log(Level.FINER, "Checking for Maintenance Window for cloud {0}", cloud.name);
if (MaintenanceHelper.getInstance()
.hasActiveMaintenanceWindows(target.toKey())) {

return new CauseOfBlockage() {
@Override
public String getShortDescription() {
return "Cloud is in maintenance: " + cloud.name;
}
};
}
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Failed to check maintenance for cloud " +
cloud.name, e);
}
return null; // Allow provisioning when no active maintenance window
}
}
Loading
Loading