Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -239,11 +239,11 @@ all: binaries docs

.PHONY: binaries
ifeq ($(GOOS),freebsd)
binaries: podman podman-remote ## (FreeBSD) Build podman and podman-remote binaries
binaries: podman podman-remote podman-testing ## (FreeBSD) Build podman, podman-remote, and podman-testing binaries
else ifneq (, $(findstring $(GOOS),darwin windows))
binaries: podman-remote ## (macOS/Windows) Build podman-remote (client) only binaries
else
binaries: podman podman-remote podman-testing podmansh rootlessport quadlet ## (Linux) Build podman, podman-remote and rootlessport binaries quadlet
binaries: podman podman-remote podman-testing podmansh rootlessport quadlet ## (Linux) Build podman, podman-remote, podmansh, rootlessport, and quadlet binaries
endif

# Extract text following double-# for targets, as their description for
Expand Down Expand Up @@ -478,7 +478,7 @@ $(SRCBINDIR)/podman-testing: $(SOURCES) go.mod go.sum
-o $@ ./cmd/podman-testing

.PHONY: podman-testing
podman-testing: bin/podman-testing
podman-testing: $(SRCBINDIR)/podman-testing

###
### Secondary binary-build targets
Expand Down
152 changes: 152 additions & 0 deletions cmd/podman-testing/call.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
package main

import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"net"
"strings"

"github.com/containers/podman/v6/pkg/api/grpcpb"
"github.com/containers/podman/v6/pkg/bindings"
"github.com/containers/podman/v6/pkg/domain/entities"
"github.com/spf13/cobra"
"go.podman.io/common/pkg/completion"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
reflectionv1 "google.golang.org/grpc/reflection/grpc_reflection_v1"
)

var (
noopDescription = `Call the no-op GRPC endpoint.`
noopCmd = &cobra.Command{
Use: "noop [arg]",
Args: cobra.MaximumNArgs(1),
Short: "Call the no-op GRPC endpoint",
Long: noopDescription,
RunE: noop,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman-testing noop`,
}
lsDescription = `List GRPC endpoints.`
lsCmd = &cobra.Command{
Use: "ls [arg]",
Args: cobra.MaximumNArgs(1),
Short: "Call an RPC endpoint",
Long: lsDescription,
RunE: ls,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman-testing ls`,
}
)

func init() {
mainCmd.AddCommand(noopCmd)
mainCmd.AddCommand(lsCmd)
}

func ls(_ *cobra.Command, args []string) error {
if podmanConfig.EngineMode != entities.TunnelMode {
return errors.New("only available in remote mode")
}
ctx, grpcClient, err := getGrpcClient()
if err != nil {
return fmt.Errorf("setting up grpc client for podman service: %w", err)
}
if err != nil {
return fmt.Errorf("setting up grpc client for podman service: %w", err)
}
reflectionClient := reflectionv1.NewServerReflectionClient(grpcClient)
if reflectionClient == nil {
return fmt.Errorf("setting up client for reflection grpc service: %w", err)
}
info, err := reflectionClient.ServerReflectionInfo(ctx)
if err != nil {
return fmt.Errorf("reflection grpc service: %w", err)
}
ls := ""
if len(args) > 1 {
ls = args[1]
}
err = info.Send(&reflectionv1.ServerReflectionRequest{
MessageRequest: &reflectionv1.ServerReflectionRequest_ListServices{
ListServices: ls,
},
})
if err != nil {
return fmt.Errorf("reflection grpc service: %w", err)
}
err = info.CloseSend()
if err != nil {
return fmt.Errorf("reflection grpc service: %w", err)
}
var response reflectionv1.ServerReflectionResponse
err = info.RecvMsg(&response)
for err == nil {
var out []byte
out, err = json.Marshal(response.GetListServicesResponse())
if err != nil {
return fmt.Errorf("encoding response from grpc service: %w", err)
}
fmt.Println(string(out))
response.Reset()
err = info.RecvMsg(&response)
}
if !errors.Is(err, io.EOF) {
return fmt.Errorf("unexpected grpc protocol error: %w", err)
}
return nil
}

func noop(_ *cobra.Command, args []string) error {
var out []byte
switch podmanConfig.EngineMode {
case entities.TunnelMode:
ctx, grpcClient, err := getGrpcClient()
if err != nil {
return fmt.Errorf("setting up grpc client for podman service: %w", err)
}
noopClient := grpcpb.NewNoopClient(grpcClient)
if noopClient == nil {
return fmt.Errorf("setting up client for noop grpc service: %w", err)
}
var request grpcpb.NoopRequest
if encoded := strings.Join(args, ""); len(encoded) > 0 {
if err := json.Unmarshal([]byte(encoded), &request); err != nil {
return fmt.Errorf("parsing client request contents for noop grpc service: %w", err)
}
}
response, err := noopClient.Noop(ctx, &request)
if err != nil {
return fmt.Errorf("noop grpc service: %w", err)
}
out, err = json.Marshal(response)
if err != nil {
return fmt.Errorf("encoding response from grpc service: %w", err)
}
default:
return errors.New("only available in remote mode")
}
fmt.Println(string(out))
return nil
}

func getGrpcClient() (context.Context, *grpc.ClientConn, error) {
ctx, err := bindings.NewConnection(mainContext, podmanConfig.URI)
if err != nil {
return nil, nil, fmt.Errorf("connecting to podman service: %w", err)
}
client, err := bindings.GetClient(ctx)
if err != nil {
return nil, nil, fmt.Errorf("obtaining client handle for podman service: %w", err)
}
onlyPodmanSystemServiceDialer := grpc.WithContextDialer(func(ctx context.Context, _ string) (net.Conn, error) { return client.GetDialer(ctx) })
withoutEncryption := grpc.WithTransportCredentials(insecure.NewCredentials())
grpcClient, err := grpc.NewClient(podmanConfig.URI, onlyPodmanSystemServiceDialer, withoutEncryption)
if err != nil {
return nil, nil, fmt.Errorf("setting up grpc client for podman service: %w", err)
}
return ctx, grpcClient, err
}
10 changes: 5 additions & 5 deletions cmd/podman-testing/create.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//go:build !remote
//go:build (linux || freebsd) && !remote

package main

Expand All @@ -20,7 +20,7 @@ var (
Long: createStorageLayerDescription,
RunE: createStorageLayer,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing create-storage-layer`,
Example: `podman-testing create-storage-layer`,
}

createStorageLayerOpts entities.CreateStorageLayerOptions
Expand All @@ -33,7 +33,7 @@ var (
Long: createLayerDescription,
RunE: createLayer,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing create-layer`,
Example: `podman-testing create-layer`,
}

createLayerOpts entities.CreateLayerOptions
Expand All @@ -46,7 +46,7 @@ var (
Long: createImageDescription,
RunE: createImage,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing create-image`,
Example: `podman-testing create-image`,
}

createImageOpts entities.CreateImageOptions
Expand All @@ -59,7 +59,7 @@ var (
Long: createContainerDescription,
RunE: createContainer,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing create-container`,
Example: `podman-testing create-container`,
}

createContainerOpts entities.CreateContainerOptions
Expand Down
20 changes: 10 additions & 10 deletions cmd/podman-testing/data.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//go:build !remote
//go:build (linux || freebsd) && !remote

package main

Expand All @@ -21,7 +21,7 @@ var (
Long: createLayerDataDescription,
RunE: createLayerData,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing create-layer-data`,
Example: `podman-testing create-layer-data`,
}

createLayerDataOpts entities.CreateLayerDataOptions
Expand All @@ -37,7 +37,7 @@ var (
Long: createImageDataDescription,
RunE: createImageData,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing create-image-data`,
Example: `podman-testing create-image-data`,
}

createImageDataOpts entities.CreateImageDataOptions
Expand All @@ -53,7 +53,7 @@ var (
Long: createContainerDataDescription,
RunE: createContainerData,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing create-container-data`,
Example: `podman-testing create-container-data`,
}

createContainerDataOpts entities.CreateContainerDataOptions
Expand All @@ -69,7 +69,7 @@ var (
Long: modifyLayerDataDescription,
RunE: modifyLayerData,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing modify-layer-data`,
Example: `podman-testing modify-layer-data`,
}

modifyLayerDataOpts entities.ModifyLayerDataOptions
Expand All @@ -84,7 +84,7 @@ var (
Long: modifyImageDataDescription,
RunE: modifyImageData,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing modify-image-data`,
Example: `podman-testing modify-image-data`,
}

modifyImageDataOpts entities.ModifyImageDataOptions
Expand All @@ -99,7 +99,7 @@ var (
Long: modifyContainerDataDescription,
RunE: modifyContainerData,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing modify-container-data`,
Example: `podman-testing modify-container-data`,
}

modifyContainerDataOpts entities.ModifyContainerDataOptions
Expand All @@ -114,7 +114,7 @@ var (
Long: removeLayerDataDescription,
RunE: removeLayerData,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing remove-layer-data`,
Example: `podman-testing remove-layer-data`,
}

removeLayerDataOpts entities.RemoveLayerDataOptions
Expand All @@ -127,7 +127,7 @@ var (
Long: removeImageDataDescription,
RunE: removeImageData,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing remove-image-data`,
Example: `podman-testing remove-image-data`,
}

removeImageDataOpts entities.RemoveImageDataOptions
Expand All @@ -140,7 +140,7 @@ var (
Long: removeContainerDataDescription,
RunE: removeContainerData,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing remove-container-data`,
Example: `podman-testing remove-container-data`,
}

removeContainerDataOpts entities.RemoveContainerDataOptions
Expand Down
6 changes: 3 additions & 3 deletions cmd/podman-testing/layer.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//go:build !remote
//go:build (linux || freebsd) && !remote

package main

Expand All @@ -21,7 +21,7 @@ var (
Long: populateLayerDescription,
RunE: populateLayer,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing populate-layer`,
Example: `podman-testing populate-layer`,
}

populateLayerOpts entities.PopulateLayerOptions
Expand All @@ -35,7 +35,7 @@ var (
Long: modifyLayerDescription,
RunE: modifyLayer,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman testing modify-layer`,
Example: `podman-testing modify-layer`,
}

modifyLayerOpts entities.ModifyLayerOptions
Expand Down
26 changes: 5 additions & 21 deletions cmd/podman-testing/main.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
//go:build !remote

package main

import (
Expand All @@ -11,13 +9,10 @@ import (
"syscall"

_ "github.com/containers/podman/v6/cmd/podman/completion"
ientities "github.com/containers/podman/v6/internal/domain/entities"
"github.com/containers/podman/v6/internal/domain/infra"
"github.com/containers/podman/v6/pkg/domain/entities"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"go.podman.io/common/pkg/config"
"go.podman.io/storage"
"go.podman.io/storage/pkg/reexec"
"go.podman.io/storage/pkg/unshare"
)
Expand All @@ -38,11 +33,9 @@ var (
SilenceUsage: true,
SilenceErrors: true,
}
mainContext = context.Background()
podmanConfig entities.PodmanConfig
globalStorageOptions storage.StoreOptions
globalLogLevel string
testingEngine ientities.TestingEngine
mainContext = context.Background()
podmanConfig entities.PodmanConfig
globalLogLevel string
)

func init() {
Expand Down Expand Up @@ -80,18 +73,9 @@ func before() error {
}
podmanConfig.ContainersConf = containersConf

podmanConfig.StorageDriver = globalStorageOptions.GraphDriverName
podmanConfig.GraphRoot = globalStorageOptions.GraphRoot
podmanConfig.Runroot = globalStorageOptions.RunRoot
podmanConfig.ImageStore = globalStorageOptions.ImageStore
podmanConfig.StorageOpts = globalStorageOptions.GraphDriverOptions
podmanConfig.TransientStore = globalStorageOptions.TransientStore

te, err := infra.NewTestingEngine(&podmanConfig)
if err != nil {
return fmt.Errorf("initializing libpod: %w", err)
if err := testingEngineBefore(&podmanConfig); err != nil {
return fmt.Errorf("setting up testing engine: %w", err)
}
testingEngine = te
return nil
}

Expand Down
Loading