Files
Alexander CuevaandgVisor bot 1a8cde909e Add the profile command to runsc, with subcommands cpu and heap.
This change registers the profile command under the debug command group in the
runsc CLI.

This will be followed up with other profiling sub-command implementations.

PiperOrigin-RevId: 974750514
2026-09-01 15:51:43 -07:00

119 lines
3.5 KiB
Go

// Copyright 2025 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package maincli is the main entrypoint for runsc.
package maincli
import (
"github.com/google/subcommands"
"gvisor.dev/gvisor/runsc/cli"
"gvisor.dev/gvisor/runsc/cmd"
"gvisor.dev/gvisor/runsc/cmd/alias"
"gvisor.dev/gvisor/runsc/cmd/nvproxy"
"gvisor.dev/gvisor/runsc/cmd/profile"
"gvisor.dev/gvisor/runsc/cmd/sentry/sentrycmd"
"gvisor.dev/gvisor/runsc/cmd/trace"
"gvisor.dev/gvisor/runsc/cmd/util"
// TODO(gvisor.dev/issue/13718): Temporary.
// Remove this import once sidecar binaries are replaced by on-disk binaries.
_ "gvisor.dev/gvisor/runsc/gvisorbinaries/embed"
)
const (
userGroup = ""
helperGroup = "helpers"
debugGroup = "debug"
metricGroup = "metrics"
internalGroup = "internal use only"
)
// Main is the main entrypoint.
func Main() {
alias.HandleAlias()
cmds, helpCmds := commands()
cli.Run(nil, cmds, helpCmds)
}
func commands() (map[util.SubCommand]string, []subcommands.Command) {
cmds := map[util.SubCommand]string{
// Register OCI user-facing runsc commands.
new(cmd.Checkpoint): userGroup,
new(cmd.Create): userGroup,
new(cmd.Delete): userGroup,
new(cmd.Events): userGroup,
new(cmd.Exec): userGroup,
new(cmd.Kill): userGroup,
new(cmd.List): userGroup,
new(cmd.PS): userGroup,
new(cmd.Pause): userGroup,
new(cmd.Restore): userGroup,
new(cmd.Resume): userGroup,
new(cmd.Run): userGroup,
new(cmd.Spec): userGroup,
new(cmd.Start): userGroup,
new(cmd.State): userGroup,
new(cmd.Update): userGroup,
new(cmd.Wait): userGroup,
// Non-OCI user-facing runsc commands.
new(cmd.Do): userGroup,
new(cmd.FSCheckpoint): userGroup,
new(cmd.PortForward): userGroup,
new(cmd.Read): userGroup,
new(cmd.SandboxExec): userGroup,
new(cmd.Tar): userGroup,
// Helpers.
new(cmd.Install): helperGroup,
new(cmd.Mitigate): helperGroup,
new(cmd.Uninstall): helperGroup,
new(nvproxy.Nvproxy): helperGroup,
new(trace.Trace): helperGroup,
new(cmd.CPUFeatures): helperGroup,
new(cmd.Features): helperGroup,
new(cmd.Debug): debugGroup,
new(profile.Profile): debugGroup,
new(cmd.Statefile): debugGroup,
new(cmd.Symbolize): debugGroup,
new(cmd.Usage): debugGroup,
new(cmd.ReadControl): debugGroup,
new(cmd.WriteControl): debugGroup,
new(cmd.MetricMetadata): metricGroup,
new(cmd.MetricExport): metricGroup,
new(cmd.MetricServer): metricGroup,
// Internal commands.
new(sentrycmd.Boot): internalGroup,
new(cmd.Gofer): internalGroup,
new(sentrycmd.Umount): internalGroup,
}
// Merge alias commands.
for k, v := range alias.Commands() {
cmds[k] = v
}
helpCmds := []subcommands.Command{
// For historical reasons, these subcommands are invoked as `runsc help
// platforms` and `runsc help syscalls`.
new(cmd.Platforms),
new(cmd.Syscalls),
}
return cmds, helpCmds
}