}
@Override
@TransactionAttribute(NOT_SUPPORTED)
public void pinSnapshot(Subject subject, int driftDefId, int snapshotVersion) {
DriftDefinition driftDef = driftManager.getDriftDefinition(subject, driftDefId);
authorizeOrFail(subject, driftDef.getResource().getId(), "Can not update drifts");
if (driftDef.getTemplate() != null && driftDef.getTemplate().isPinned()) {
throw new IllegalArgumentException(("Cannot repin a definition that has been created from a pinned "
+ "template."));
}
driftDef.setPinned(true);
driftManager.updateDriftDefinition(subject, driftDef);
driftDef.getResource().setAgentSynchronizationNeeded();
DriftSnapshotRequest snapshotRequest = new DriftSnapshotRequest(driftDefId, snapshotVersion);
DriftSnapshot snapshot = getSnapshot(subject, snapshotRequest);
DriftChangeSetDTO changeSet = new DriftChangeSetDTO();
changeSet.setCategory(COVERAGE);
changeSet.setVersion(0);
changeSet.setDriftDefinitionId(driftDefId);
changeSet.setDriftHandlingMode(DriftHandlingMode.normal);
changeSet.setResourceId(driftDef.getResource().getId());
DriftServerPluginFacet driftServerPlugin = getServerPlugin();
try {
driftServerPlugin.purgeByDriftDefinitionName(subject, driftDef.getResource().getId(), driftDef.getName());
persistSnapshot(subject, snapshot, changeSet);
} catch (Exception e) {
throw new RuntimeException("Failed to pin snapshot", e);
}
try {
AgentClient agent = agentManager.getAgentClient(subjectManager.getOverlord(), driftDef.getResource()
.getId());
DriftAgentService driftService = agent.getDriftAgentService();
driftService.pinSnapshot(driftDef.getResource().getId(), driftDef.getName(), snapshot);
} catch (Exception e) {
log.warn("Unable to notify agent that DriftDefinition[driftDefinitionId: " + driftDefId
+ ", driftDefinitionName: " + driftDef.getName() + "] has been pinned. The agent may be down.", e);
}
}