Mercurial > hg > release > thermostat-1.0
changeset 419:7a02efec5e28
Add a cli command to trigger a heap dump
Reviewed-by: rkennke
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-June/001983.html
author | Omair Majid <omajid@redhat.com> |
---|---|
date | Thu, 21 Jun 2012 18:14:39 -0400 |
parents | edda32dd535e |
children | 8d7ef9bd02ea |
files | client/heapdumper/src/main/java/com/redhat/thermostat/client/heap/DumpHeapCommand.java client/heapdumper/src/main/resources/META-INF/services/com.redhat.thermostat.common.cli.Command client/heapdumper/src/test/java/com/redhat/thermostat/client/heap/DumpHeapCommandTest.java common/core/src/main/java/com/redhat/thermostat/common/cli/HostVMArguments.java |
diffstat | 4 files changed, 203 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/heapdumper/src/main/java/com/redhat/thermostat/client/heap/DumpHeapCommand.java Thu Jun 21 18:14:39 2012 -0400 @@ -0,0 +1,102 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.client.heap; + +import java.util.Collection; + +import com.redhat.thermostat.common.cli.ArgumentSpec; +import com.redhat.thermostat.common.cli.Command; +import com.redhat.thermostat.common.cli.CommandContext; +import com.redhat.thermostat.common.cli.CommandException; +import com.redhat.thermostat.common.cli.HostVMArguments; + +public class DumpHeapCommand implements Command { + + private static final String NAME = "dump-heap"; + private static final String DESCRIPTION = "trigger a heap dump on the VM"; + private static final String USAGE = DESCRIPTION; + + private final HeapDumperCommand implementation; + + public DumpHeapCommand() { + this(new HeapDumperCommand()); + } + + DumpHeapCommand(HeapDumperCommand impl) { + this.implementation = impl; + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getDescription() { + return DESCRIPTION; + } + + @Override + public String getUsage() { + return USAGE; + } + + @Override + public Collection<ArgumentSpec> getAcceptedArguments() { + return HostVMArguments.getArgumentSpecs(); + } + + @Override + public boolean isStorageRequired() { + return true; + } + + + @Override + public void run(CommandContext ctx) throws CommandException { + HostVMArguments args = new HostVMArguments(ctx.getArguments()); + + HeapDump hd = implementation.execute(args.getVM()); + ctx.getConsole().getOutput().print("Done\n"); + } + + @Override + public void disable() { + /* NO-OP */ + } + +}
--- a/client/heapdumper/src/main/resources/META-INF/services/com.redhat.thermostat.common.cli.Command Thu Jun 21 23:53:37 2012 +0200 +++ b/client/heapdumper/src/main/resources/META-INF/services/com.redhat.thermostat.common.cli.Command Thu Jun 21 18:14:39 2012 -0400 @@ -1,1 +1,2 @@ -com.redhat.thermostat.client.heap.ListHeapDumpsCommand \ No newline at end of file +com.redhat.thermostat.client.heap.ListHeapDumpsCommand +com.redhat.thermostat.client.heap.DumpHeapCommand
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/heapdumper/src/test/java/com/redhat/thermostat/client/heap/DumpHeapCommandTest.java Thu Jun 21 18:14:39 2012 -0400 @@ -0,0 +1,98 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.client.heap; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.isA; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import org.junit.Test; + +import com.redhat.thermostat.common.cli.Command; +import com.redhat.thermostat.common.cli.CommandException; +import com.redhat.thermostat.common.cli.SimpleArguments; +import com.redhat.thermostat.common.dao.VmRef; +import com.redhat.thermostat.test.TestCommandContextFactory; + +public class DumpHeapCommandTest { + + @Test + public void testBasics() { + Command command = new DumpHeapCommand(); + assertEquals("dump-heap", command.getName()); + assertNotNull(command.getDescription()); + assertNotNull(command.getUsage()); + } + + @Test + public void verifyAcuallyCallsWorker() throws CommandException { + HeapDumperCommand impl = mock(HeapDumperCommand.class); + DumpHeapCommand command = new DumpHeapCommand(impl); + + TestCommandContextFactory factory = new TestCommandContextFactory(); + + SimpleArguments args = new SimpleArguments(); + args.addArgument("hostId", "foo"); + args.addArgument("vmId", "0"); + + command.run(factory.createContext(args)); + + verify(impl).execute(isA(VmRef.class)); + assertEquals("Done\n", factory.getOutput()); + } + + @Test + public void verifyNeedsHostAndVmId() throws CommandException { + HeapDumperCommand impl = mock(HeapDumperCommand.class); + DumpHeapCommand command = new DumpHeapCommand(impl); + + TestCommandContextFactory factory = new TestCommandContextFactory(); + + SimpleArguments args = new SimpleArguments(); + + try { + command.run(factory.createContext(args)); + assertTrue("should not reach here", false); + } catch (CommandException ce) { + assertEquals("a hostId is required", ce.getMessage()); + } + } + +}
--- a/common/core/src/main/java/com/redhat/thermostat/common/cli/HostVMArguments.java Thu Jun 21 23:53:37 2012 +0200 +++ b/common/core/src/main/java/com/redhat/thermostat/common/cli/HostVMArguments.java Thu Jun 21 18:14:39 2012 -0400 @@ -58,7 +58,7 @@ String hostId = args.getArgument(HOST_ID_ARGUMENT); String vmId = args.getArgument(VM_ID_ARGUMENT); if (hostRequired && hostId == null) { - throw new CommandException("a " + HOST_ID_ARGUMENT + "is required"); + throw new CommandException("a " + HOST_ID_ARGUMENT + " is required"); } else if (hostId == null) { host = null; } else {