/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package hudson.plugins.disk_usage; import hudson.Extension; import hudson.model.Action; import hudson.model.AperiodicWork; import hudson.model.RootAction; import hudson.plugins.disk_usage.unused.DiskUsageNotUsedDataCalculationThread; import hudson.util.Graph; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import javax.servlet.ServletException; import jenkins.model.Jenkins; import org.jfree.data.category.DefaultCategoryDataset; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; /** * * @author Lucie Votypkova */ @Extension public class DiskUsageJenkinsAction extends DiskUsageItemGroupAction implements RootAction { public DiskUsageJenkinsAction(){ super(Jenkins.getInstance().getPlugin(DiskUsagePlugin.class).getDiskUsageItemGrouForJenkinsRootAction()); } public static DiskUsageJenkinsAction getInstance(){ List<Action> actions = Jenkins.getInstance().getActions(); for(Action a : actions){ if(a instanceof DiskUsageJenkinsAction){ return (DiskUsageJenkinsAction) a; } } //no action //should not happen but if - add action DiskUsageJenkinsAction action = new DiskUsageJenkinsAction(); Jenkins.getInstance().getActions().add(action); return action; } @Override public String getIconFileName() { return "/plugin/disk-usage/icons/diskusage48.png"; } @Override public String getDisplayName() { return Messages.DisplayName(); } @Override public String getUrlName() { return "disk-usage"; } public boolean isGraphAvailable(){ return true; } public Graph getOverallGraph(){ File jobsDir = new File(Jenkins.getInstance().getRootDir(), "jobs"); long maxValue = getAllDiskUsage(true); if(getConfiguration().getShowFreeSpaceForJobDirectory()){ maxValue = jobsDir.getTotalSpace(); } long maxValueWorkspace = Math.max(getAllCustomOrNonSlaveWorkspaces(true), getAllDiskUsageWorkspace(true)); List<DiskUsageOvearallGraphGenerator.DiskUsageRecord> record = DiskUsageProjectActionFactory.DESCRIPTOR.getHistory(); //First iteration just to get scale of the y-axis for (DiskUsageOvearallGraphGenerator.DiskUsageRecord usage : record){ if(getConfiguration().getShowFreeSpaceForJobDirectory()){ maxValue = Math.max(maxValue,usage.getAllSpace()); } maxValue = Math.max(maxValue, usage.getJobsDiskUsage()); maxValueWorkspace = Math.max(maxValueWorkspace, usage.getSlaveWorkspacesUsage()); maxValueWorkspace = Math.max(maxValueWorkspace, usage.getNonSlaveWorkspacesUsage()); } int floor = (int) DiskUsageUtil.getScale(maxValue); int floorWorkspace = (int) DiskUsageUtil.getScale(maxValueWorkspace); String unit = DiskUsageUtil.getUnitString(floor); String unitWorkspace = DiskUsageUtil.getUnitString(floorWorkspace); double base = Math.pow(1024, floor); double baseWorkspace = Math.pow(1024, floorWorkspace); DefaultCategoryDataset dataset = new DefaultCategoryDataset(); DefaultCategoryDataset datasetW = new DefaultCategoryDataset(); for (DiskUsageOvearallGraphGenerator.DiskUsageRecord usage : record) { Date label = usage.getDate(); if(getConfiguration().getShowFreeSpaceForJobDirectory()){ dataset.addValue(((Long) usage.getAllSpace()) / base, "space for jobs directory", label); } dataset.addValue(((Long) usage.getJobsDiskUsage()) / base, "all jobs", label); dataset.addValue(((Long) usage.getBuildsDiskUsage()) / base, "all builds", label); datasetW.addValue(((Long) usage.getSlaveWorkspacesUsage()) / baseWorkspace, "slave workspaces", label); datasetW.addValue(((Long) usage.getNonSlaveWorkspacesUsage()) / baseWorkspace, "non slave workspaces", label); } //add current state if(getConfiguration().getShowFreeSpaceForJobDirectory()){ dataset.addValue(((Long) jobsDir.getTotalSpace()) / base, "space for jobs directory", "current"); } dataset.addValue(((Long) getAllDiskUsage(true)) / base, "all jobs", "current"); dataset.addValue(((Long) getBuildsDiskUsage(null, null, true).get("all")) / base, "all builds", "current"); datasetW.addValue(((Long) getAllDiskUsageWorkspace(true)) / baseWorkspace, "slave workspaces", "current"); datasetW.addValue(((Long) getAllCustomOrNonSlaveWorkspaces(true)) / baseWorkspace, "non slave workspaces", "current"); return new DiskUsageGraph(dataset, unit, datasetW, unitWorkspace); } public DiskUsageProjectActionFactory.DescriptorImpl getConfiguration(){ return DiskUsageProjectActionFactory.DESCRIPTOR; } public BuildDiskUsageCalculationThread getBuildsDiskUsageThread(){ return AperiodicWork.all().get(BuildDiskUsageCalculationThread.class); } public JobWithoutBuildsDiskUsageCalculation getJobsDiskUsageThread(){ return AperiodicWork.all().get(JobWithoutBuildsDiskUsageCalculation.class); } public WorkspaceDiskUsageCalculationThread getWorkspaceDiskUsageThread(){ return AperiodicWork.all().get(WorkspaceDiskUsageCalculationThread.class); } public DiskUsageNotUsedDataCalculationThread getNotUsedDataDiskUsageThread(){ return AperiodicWork.all().get(DiskUsageNotUsedDataCalculationThread.class); } public String getCountIntervalForBuilds(){ long nextExecution = getBuildsDiskUsageThread().scheduledLastInstanceExecutionTime() - System.currentTimeMillis(); if(nextExecution<=0) //not scheduled nextExecution = getBuildsDiskUsageThread().getRecurrencePeriod(); return DiskUsageUtil.formatTimeInMilisec(nextExecution); } public String getCountIntervalForJobs(){ long nextExecution = getJobsDiskUsageThread().scheduledLastInstanceExecutionTime() - System.currentTimeMillis(); if(nextExecution<=0) //not scheduled nextExecution = getJobsDiskUsageThread().getRecurrencePeriod(); return DiskUsageUtil.formatTimeInMilisec(nextExecution); } public String getCountIntervalForWorkspaces(){ long nextExecution = getWorkspaceDiskUsageThread().scheduledLastInstanceExecutionTime() - System.currentTimeMillis(); if(nextExecution<=0) //not scheduled nextExecution = getWorkspaceDiskUsageThread().getRecurrencePeriod(); return DiskUsageUtil.formatTimeInMilisec(nextExecution); } public String getCountIntervalForNotUsedData(){ long nextExecution = getNotUsedDataDiskUsageThread().scheduledLastInstanceExecutionTime() - System.currentTimeMillis(); if(nextExecution<=0) //not scheduled nextExecution = getNotUsedDataDiskUsageThread().getRecurrencePeriod(); return DiskUsageUtil.formatTimeInMilisec(nextExecution); } public void doRecordBuildDiskUsage(StaplerRequest req, StaplerResponse res) throws ServletException, IOException, Exception { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); if(getConfiguration().isCalculationBuildsEnabled() && !getBuildsDiskUsageThread().isExecuting()) getBuildsDiskUsageThread().doAperiodicRun(); res.forwardToPreviousPage(req); } public void doRecordJobsDiskUsage(StaplerRequest req, StaplerResponse res) throws ServletException, IOException, Exception { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); if(getConfiguration().isCalculationJobsEnabled() && !getJobsDiskUsageThread().isExecuting()) getJobsDiskUsageThread().doAperiodicRun(); res.forwardToPreviousPage(req); } public void doRecordWorkspaceDiskUsage(StaplerRequest req, StaplerResponse res) throws ServletException, IOException, Exception { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); if(getConfiguration().isCalculationWorkspaceEnabled() && !getWorkspaceDiskUsageThread().isExecuting()) getWorkspaceDiskUsageThread().doAperiodicRun(); res.forwardToPreviousPage(req); } public void doRecordNotUsedDataDiskUsage(StaplerRequest req, StaplerResponse res) throws ServletException, IOException, Exception { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); if(getConfiguration().isCalculationNotUsedDataEnabled() && !getNotUsedDataDiskUsageThread().isExecuting()) getNotUsedDataDiskUsageThread().doAperiodicRun(); res.forwardToPreviousPage(req); } }