Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
8463f0d
refactor: remove orchestrator container DSL and provider run
retr0h Mar 13, 2026
39be583
docs: add container runtime rename design
retr0h Mar 13, 2026
8bb84ad
docs: add container runtime rename implementation plan
retr0h Mar 13, 2026
8f63584
refactor: rename container OpenAPI spec to docker
retr0h Mar 13, 2026
7b6e18e
refactor: rename container permissions to docker
retr0h Mar 13, 2026
7aa92ee
refactor: rename container internals to docker
retr0h Mar 13, 2026
4d2c6c6
refactor: rewrite container-targeting example with Docker DSL
retr0h Mar 13, 2026
b202001
refactor: rename container integration tests to docker
retr0h Mar 13, 2026
924d917
docs: update container references to docker
retr0h Mar 13, 2026
6e1e321
refactor: rename remaining container references to docker
retr0h Mar 13, 2026
4c99de7
refactor: remove redundant Docker Service wrapper
retr0h Mar 13, 2026
7114c1b
test: achieve 100% coverage on orchestrator Docker DSL
retr0h Mar 13, 2026
5dc44c4
fix: add Changed to Docker provider result types
retr0h Mar 13, 2026
71d5b6e
docs: nest CLI docs under container/docker hierarchy
retr0h Mar 13, 2026
1eb7272
docs: rename orchestrator operation docs to docker prefix
retr0h Mar 14, 2026
885261d
fix: correct DAG ordering in orchestrator example
retr0h Mar 14, 2026
be310c9
chore: remove accidentally committed binary
retr0h Mar 14, 2026
d5c7818
fix: remove deliberately-fails from cleanup deps
retr0h Mar 14, 2026
b207369
fix: add pre-cleanup step to orchestrator example
retr0h Mar 14, 2026
257bc2f
style: fix table alignment in orchestrator operations
retr0h Mar 14, 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
4 changes: 2 additions & 2 deletions cmd/agent_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func setupAgent(
b := connectNATSBundle(ctx, log, connCfg, kvBucket, namespace, streamName)

providerFactory := agent.NewProviderFactory(log)
hostProvider, diskProvider, memProvider, loadProvider, dnsProvider, pingProvider, netinfoProvider, commandProvider, containerProvider := providerFactory.CreateProviders()
hostProvider, diskProvider, memProvider, loadProvider, dnsProvider, pingProvider, netinfoProvider, commandProvider, dockerProvider := providerFactory.CreateProviders()

// Create file provider if Object Store and file-state KV are configured
hostname, _ := job.GetAgentHostname(appConfig.Agent.Hostname)
Expand All @@ -67,7 +67,7 @@ func setupAgent(
netinfoProvider,
commandProvider,
fileProvider,
containerProvider,
dockerProvider,
b.registryKV,
b.factsKV,
)
Expand Down
6 changes: 3 additions & 3 deletions cmd/api_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ type ServerManager interface {
GetMetricsHandler(metricsHandler http.Handler, path string) []func(e *echo.Echo)
// GetAuditHandler returns audit handler for registration.
GetAuditHandler(store audit.Store) []func(e *echo.Echo)
// GetContainerHandler returns container handler for registration.
GetContainerHandler(jobClient jobclient.JobClient) []func(e *echo.Echo)
// GetDockerHandler returns Docker handler for registration.
GetDockerHandler(jobClient jobclient.JobClient) []func(e *echo.Echo)
// GetFileHandler returns file handler for registration.
GetFileHandler(objStore file.ObjectStoreManager) []func(e *echo.Echo)
// RegisterHandlers registers a list of handlers with the Echo instance.
Expand Down Expand Up @@ -482,7 +482,7 @@ func registerAPIHandlers(
handlers = append(
handlers,
sm.GetHealthHandler(checker, startTime, "0.1.0", metricsProvider)...)
handlers = append(handlers, sm.GetContainerHandler(jc)...)
handlers = append(handlers, sm.GetDockerHandler(jc)...)
handlers = append(handlers, sm.GetMetricsHandler(metricsHandler, metricsPath)...)
if auditStore != nil {
handlers = append(handlers, sm.GetAuditHandler(auditStore)...)
Expand Down
6 changes: 3 additions & 3 deletions cmd/client_container.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ package cmd

import "github.com/spf13/cobra"

// clientContainerCmd represents the clientContainer command.
// clientContainerCmd represents the container parent command.
var clientContainerCmd = &cobra.Command{
Use: "container",
Short: "Container management operations",
Long: `Manage containers on target nodes.`,
Short: "Container runtime management",
Long: `Manage containers using runtime-specific subcommands.`,
}

func init() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,17 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

// Package mocks provides mock implementations for testing.
package mocks
package cmd

//go:generate go tool github.com/golang/mock/mockgen -source=../driver.go -destination=driver.gen.go -package=mocks
import "github.com/spf13/cobra"

// clientContainerDockerCmd represents the docker subcommand under container.
var clientContainerDockerCmd = &cobra.Command{
Use: "docker",
Short: "Docker container operations",
Long: `Manage Docker containers on target nodes.`,
}

func init() {
clientContainerCmd.AddCommand(clientContainerDockerCmd)
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ import (
"github.com/retr0h/osapi/pkg/sdk/client/gen"
)

// clientContainerCreateCmd represents the clientContainerCreate command.
var clientContainerCreateCmd = &cobra.Command{
// clientContainerDockerCreateCmd represents the clientContainerDockerCreate command.
var clientContainerDockerCreateCmd = &cobra.Command{
Use: "create",
Short: "Create a new container",
Long: `Create a new container on the target node from the specified image.`,
Expand All @@ -44,7 +44,7 @@ var clientContainerCreateCmd = &cobra.Command{
volumeFlags, _ := cmd.Flags().GetStringSlice("volume")
autoStart, _ := cmd.Flags().GetBool("auto-start")

body := gen.ContainerCreateRequest{
body := gen.DockerCreateRequest{
Image: image,
AutoStart: &autoStart,
}
Expand All @@ -62,7 +62,7 @@ var clientContainerCreateCmd = &cobra.Command{
body.Volumes = &volumeFlags
}

resp, err := sdkClient.Container.Create(ctx, host, body)
resp, err := sdkClient.Docker.Create(ctx, host, body)
if err != nil {
cli.HandleError(err, logger)
return
Expand Down Expand Up @@ -98,20 +98,20 @@ var clientContainerCreateCmd = &cobra.Command{
}

func init() {
clientContainerCmd.AddCommand(clientContainerCreateCmd)
clientContainerDockerCmd.AddCommand(clientContainerDockerCreateCmd)

clientContainerCreateCmd.PersistentFlags().
clientContainerDockerCreateCmd.PersistentFlags().
String("image", "", "Container image reference (required)")
clientContainerCreateCmd.PersistentFlags().
clientContainerDockerCreateCmd.PersistentFlags().
String("name", "", "Optional name for the container")
clientContainerCreateCmd.PersistentFlags().
clientContainerDockerCreateCmd.PersistentFlags().
StringSlice("env", []string{}, "Environment variable in KEY=VALUE format (repeatable)")
clientContainerCreateCmd.PersistentFlags().
clientContainerDockerCreateCmd.PersistentFlags().
StringSlice("port", []string{}, "Port mapping in host:container format (repeatable)")
clientContainerCreateCmd.PersistentFlags().
clientContainerDockerCreateCmd.PersistentFlags().
StringSlice("volume", []string{}, "Volume mount in host:container format (repeatable)")
clientContainerCreateCmd.PersistentFlags().
clientContainerDockerCreateCmd.PersistentFlags().
Bool("auto-start", true, "Start the container immediately after creation")

_ = clientContainerCreateCmd.MarkPersistentFlagRequired("image")
_ = clientContainerDockerCreateCmd.MarkPersistentFlagRequired("image")
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ import (
"github.com/retr0h/osapi/pkg/sdk/client/gen"
)

// clientContainerExecCmd represents the clientContainerExec command.
var clientContainerExecCmd = &cobra.Command{
// clientContainerDockerExecCmd represents the clientContainerDockerExec command.
var clientContainerDockerExecCmd = &cobra.Command{
Use: "exec",
Short: "Execute a command in a container",
Long: `Execute a command inside a running container on the target node.`,
Expand All @@ -43,7 +43,7 @@ var clientContainerExecCmd = &cobra.Command{
envFlags, _ := cmd.Flags().GetStringSlice("env")
workingDir, _ := cmd.Flags().GetString("working-dir")

body := gen.ContainerExecRequest{
body := gen.DockerExecRequest{
Command: command,
}

Expand All @@ -54,7 +54,7 @@ var clientContainerExecCmd = &cobra.Command{
body.WorkingDir = &workingDir
}

resp, err := sdkClient.Container.Exec(ctx, host, id, body)
resp, err := sdkClient.Docker.Exec(ctx, host, id, body)
if err != nil {
cli.HandleError(err, logger)
return
Expand Down Expand Up @@ -89,17 +89,17 @@ var clientContainerExecCmd = &cobra.Command{
}

func init() {
clientContainerCmd.AddCommand(clientContainerExecCmd)
clientContainerDockerCmd.AddCommand(clientContainerDockerExecCmd)

clientContainerExecCmd.PersistentFlags().
clientContainerDockerExecCmd.PersistentFlags().
String("id", "", "Container ID to exec in (required)")
clientContainerExecCmd.PersistentFlags().
clientContainerDockerExecCmd.PersistentFlags().
StringSlice("command", []string{}, "Command to execute (required, comma-separated)")
clientContainerExecCmd.PersistentFlags().
clientContainerDockerExecCmd.PersistentFlags().
StringSlice("env", []string{}, "Environment variable in KEY=VALUE format (repeatable)")
clientContainerExecCmd.PersistentFlags().
clientContainerDockerExecCmd.PersistentFlags().
String("working-dir", "", "Working directory inside the container")

_ = clientContainerExecCmd.MarkPersistentFlagRequired("id")
_ = clientContainerExecCmd.MarkPersistentFlagRequired("command")
_ = clientContainerDockerExecCmd.MarkPersistentFlagRequired("id")
_ = clientContainerDockerExecCmd.MarkPersistentFlagRequired("command")
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ import (
"github.com/retr0h/osapi/internal/cli"
)

// clientContainerInspectCmd represents the clientContainerInspect command.
var clientContainerInspectCmd = &cobra.Command{
// clientContainerDockerInspectCmd represents the clientContainerDockerInspect command.
var clientContainerDockerInspectCmd = &cobra.Command{
Use: "inspect",
Short: "Inspect a container",
Long: `Retrieve detailed information about a specific container on the target node.`,
Expand All @@ -39,7 +39,7 @@ var clientContainerInspectCmd = &cobra.Command{
host, _ := cmd.Flags().GetString("target")
id, _ := cmd.Flags().GetString("id")

resp, err := sdkClient.Container.Inspect(ctx, host, id)
resp, err := sdkClient.Docker.Inspect(ctx, host, id)
if err != nil {
cli.HandleError(err, logger)
return
Expand Down Expand Up @@ -97,10 +97,10 @@ var clientContainerInspectCmd = &cobra.Command{
}

func init() {
clientContainerCmd.AddCommand(clientContainerInspectCmd)
clientContainerDockerCmd.AddCommand(clientContainerDockerInspectCmd)

clientContainerInspectCmd.PersistentFlags().
clientContainerDockerInspectCmd.PersistentFlags().
String("id", "", "Container ID to inspect (required)")

_ = clientContainerInspectCmd.MarkPersistentFlagRequired("id")
_ = clientContainerDockerInspectCmd.MarkPersistentFlagRequired("id")
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ import (
"github.com/retr0h/osapi/pkg/sdk/client/gen"
)

// clientContainerListCmd represents the clientContainerList command.
var clientContainerListCmd = &cobra.Command{
// clientContainerDockerListCmd represents the clientContainerDockerList command.
var clientContainerDockerListCmd = &cobra.Command{
Use: "list",
Short: "List containers on target node",
Long: `List containers on the target node, optionally filtered by state.`,
Expand All @@ -40,17 +40,17 @@ var clientContainerListCmd = &cobra.Command{
stateFlag, _ := cmd.Flags().GetString("state")
limit, _ := cmd.Flags().GetInt("limit")

params := &gen.GetNodeContainerParams{}
params := &gen.GetNodeContainerDockerParams{}

if stateFlag != "" {
state := gen.GetNodeContainerParamsState(stateFlag)
state := gen.GetNodeContainerDockerParamsState(stateFlag)
params.State = &state
}
if limit > 0 {
params.Limit = &limit
}

resp, err := sdkClient.Container.List(ctx, host, params)
resp, err := sdkClient.Docker.List(ctx, host, params)
if err != nil {
cli.HandleError(err, logger)
return
Expand Down Expand Up @@ -98,10 +98,10 @@ var clientContainerListCmd = &cobra.Command{
}

func init() {
clientContainerCmd.AddCommand(clientContainerListCmd)
clientContainerDockerCmd.AddCommand(clientContainerDockerListCmd)

clientContainerListCmd.PersistentFlags().
clientContainerDockerListCmd.PersistentFlags().
String("state", "running", "Filter by state: running, stopped, all")
clientContainerListCmd.PersistentFlags().
clientContainerDockerListCmd.PersistentFlags().
Int("limit", 0, "Maximum number of containers to return")
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ import (
"github.com/retr0h/osapi/pkg/sdk/client/gen"
)

// clientContainerPullCmd represents the clientContainerPull command.
var clientContainerPullCmd = &cobra.Command{
// clientContainerDockerPullCmd represents the clientContainerDockerPull command.
var clientContainerDockerPullCmd = &cobra.Command{
Use: "pull",
Short: "Pull a container image",
Long: `Pull a container image on the target node.`,
Expand All @@ -39,11 +39,11 @@ var clientContainerPullCmd = &cobra.Command{
host, _ := cmd.Flags().GetString("target")
image, _ := cmd.Flags().GetString("image")

body := gen.ContainerPullRequest{
body := gen.DockerPullRequest{
Image: image,
}

resp, err := sdkClient.Container.Pull(ctx, host, body)
resp, err := sdkClient.Docker.Pull(ctx, host, body)
if err != nil {
cli.HandleError(err, logger)
return
Expand Down Expand Up @@ -73,10 +73,10 @@ var clientContainerPullCmd = &cobra.Command{
}

func init() {
clientContainerCmd.AddCommand(clientContainerPullCmd)
clientContainerDockerCmd.AddCommand(clientContainerDockerPullCmd)

clientContainerPullCmd.PersistentFlags().
clientContainerDockerPullCmd.PersistentFlags().
String("image", "", "Image reference to pull (required)")

_ = clientContainerPullCmd.MarkPersistentFlagRequired("image")
_ = clientContainerDockerPullCmd.MarkPersistentFlagRequired("image")
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ import (
"github.com/retr0h/osapi/pkg/sdk/client/gen"
)

// clientContainerRemoveCmd represents the clientContainerRemove command.
var clientContainerRemoveCmd = &cobra.Command{
// clientContainerDockerRemoveCmd represents the clientContainerDockerRemove command.
var clientContainerDockerRemoveCmd = &cobra.Command{
Use: "remove",
Short: "Remove a container",
Long: `Remove a container from the target node.`,
Expand All @@ -40,12 +40,12 @@ var clientContainerRemoveCmd = &cobra.Command{
id, _ := cmd.Flags().GetString("id")
force, _ := cmd.Flags().GetBool("force")

params := &gen.DeleteNodeContainerByIDParams{}
params := &gen.DeleteNodeContainerDockerByIDParams{}
if force {
params.Force = &force
}

resp, err := sdkClient.Container.Remove(ctx, host, id, params)
resp, err := sdkClient.Docker.Remove(ctx, host, id, params)
if err != nil {
cli.HandleError(err, logger)
return
Expand Down Expand Up @@ -74,12 +74,12 @@ var clientContainerRemoveCmd = &cobra.Command{
}

func init() {
clientContainerCmd.AddCommand(clientContainerRemoveCmd)
clientContainerDockerCmd.AddCommand(clientContainerDockerRemoveCmd)

clientContainerRemoveCmd.PersistentFlags().
clientContainerDockerRemoveCmd.PersistentFlags().
String("id", "", "Container ID to remove (required)")
clientContainerRemoveCmd.PersistentFlags().
clientContainerDockerRemoveCmd.PersistentFlags().
Bool("force", false, "Force removal of a running container")

_ = clientContainerRemoveCmd.MarkPersistentFlagRequired("id")
_ = clientContainerDockerRemoveCmd.MarkPersistentFlagRequired("id")
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ import (
"github.com/retr0h/osapi/internal/cli"
)

// clientContainerStartCmd represents the clientContainerStart command.
var clientContainerStartCmd = &cobra.Command{
// clientContainerDockerStartCmd represents the clientContainerDockerStart command.
var clientContainerDockerStartCmd = &cobra.Command{
Use: "start",
Short: "Start a stopped container",
Long: `Start a stopped container on the target node.`,
Expand All @@ -38,7 +38,7 @@ var clientContainerStartCmd = &cobra.Command{
host, _ := cmd.Flags().GetString("target")
id, _ := cmd.Flags().GetString("id")

resp, err := sdkClient.Container.Start(ctx, host, id)
resp, err := sdkClient.Docker.Start(ctx, host, id)
if err != nil {
cli.HandleError(err, logger)
return
Expand Down Expand Up @@ -67,10 +67,10 @@ var clientContainerStartCmd = &cobra.Command{
}

func init() {
clientContainerCmd.AddCommand(clientContainerStartCmd)
clientContainerDockerCmd.AddCommand(clientContainerDockerStartCmd)

clientContainerStartCmd.PersistentFlags().
clientContainerDockerStartCmd.PersistentFlags().
String("id", "", "Container ID to start (required)")

_ = clientContainerStartCmd.MarkPersistentFlagRequired("id")
_ = clientContainerDockerStartCmd.MarkPersistentFlagRequired("id")
}
Loading
Loading