Skip to content

Commit 313f36b

Browse files
committed
Add a no-op GRPC responder service to the podman system service
Add a bare minimum GRPC service to the podman system service socket. Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
1 parent dccb067 commit 313f36b

File tree

16 files changed

+611
-52
lines changed

16 files changed

+611
-52
lines changed

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,11 @@ all: binaries docs
239239

240240
.PHONY: binaries
241241
ifeq ($(GOOS),freebsd)
242-
binaries: podman podman-remote ## (FreeBSD) Build podman and podman-remote binaries
242+
binaries: podman podman-remote podman-testing ## (FreeBSD) Build podman, podman-remote, and podman-testing binaries
243243
else ifneq (, $(findstring $(GOOS),darwin windows))
244244
binaries: podman-remote ## (macOS/Windows) Build podman-remote (client) only binaries
245245
else
246-
binaries: podman podman-remote podman-testing podmansh rootlessport quadlet ## (Linux) Build podman, podman-remote and rootlessport binaries quadlet
246+
binaries: podman podman-remote podman-testing podmansh rootlessport quadlet ## (Linux) Build podman, podman-remote, podmansh, rootlessport, and quadlet binaries
247247
endif
248248

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

480480
.PHONY: podman-testing
481-
podman-testing: bin/podman-testing
481+
podman-testing: $(SRCBINDIR)/podman-testing
482482

483483
###
484484
### Secondary binary-build targets

cmd/podman-testing/call.go

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"errors"
7+
"fmt"
8+
"io"
9+
"net"
10+
"strings"
11+
12+
"github.com/containers/podman/v6/pkg/api/grpcpb"
13+
"github.com/containers/podman/v6/pkg/bindings"
14+
"github.com/containers/podman/v6/pkg/domain/entities"
15+
"github.com/spf13/cobra"
16+
"go.podman.io/common/pkg/completion"
17+
"google.golang.org/grpc"
18+
"google.golang.org/grpc/credentials/insecure"
19+
reflectionv1 "google.golang.org/grpc/reflection/grpc_reflection_v1"
20+
)
21+
22+
var (
23+
noopDescription = `Call the no-op GRPC endpoint.`
24+
noopCmd = &cobra.Command{
25+
Use: "noop [arg]",
26+
Args: cobra.MaximumNArgs(1),
27+
Short: "Call the no-op GRPC endpoint",
28+
Long: noopDescription,
29+
RunE: noop,
30+
ValidArgsFunction: completion.AutocompleteNone,
31+
Example: `podman-testing noop`,
32+
}
33+
lsDescription = `List GRPC endpoints.`
34+
lsCmd = &cobra.Command{
35+
Use: "ls [arg]",
36+
Args: cobra.MaximumNArgs(1),
37+
Short: "Call an RPC endpoint",
38+
Long: lsDescription,
39+
RunE: ls,
40+
ValidArgsFunction: completion.AutocompleteNone,
41+
Example: `podman-testing ls`,
42+
}
43+
)
44+
45+
func init() {
46+
mainCmd.AddCommand(noopCmd)
47+
mainCmd.AddCommand(lsCmd)
48+
}
49+
50+
func ls(_ *cobra.Command, args []string) error {
51+
if podmanConfig.EngineMode != entities.TunnelMode {
52+
return errors.New("only available in remote mode")
53+
}
54+
ctx, grpcClient, err := getGrpcClient()
55+
if err != nil {
56+
return fmt.Errorf("setting up grpc client for podman service: %w", err)
57+
}
58+
if err != nil {
59+
return fmt.Errorf("setting up grpc client for podman service: %w", err)
60+
}
61+
reflectionClient := reflectionv1.NewServerReflectionClient(grpcClient)
62+
if reflectionClient == nil {
63+
return fmt.Errorf("setting up client for reflection grpc service: %w", err)
64+
}
65+
info, err := reflectionClient.ServerReflectionInfo(ctx)
66+
if err != nil {
67+
return fmt.Errorf("reflection grpc service: %w", err)
68+
}
69+
ls := ""
70+
if len(args) > 1 {
71+
ls = args[1]
72+
}
73+
err = info.Send(&reflectionv1.ServerReflectionRequest{
74+
MessageRequest: &reflectionv1.ServerReflectionRequest_ListServices{
75+
ListServices: ls,
76+
},
77+
})
78+
if err != nil {
79+
return fmt.Errorf("reflection grpc service: %w", err)
80+
}
81+
err = info.CloseSend()
82+
if err != nil {
83+
return fmt.Errorf("reflection grpc service: %w", err)
84+
}
85+
var response reflectionv1.ServerReflectionResponse
86+
err = info.RecvMsg(&response)
87+
for err == nil {
88+
var out []byte
89+
out, err = json.Marshal(response.GetListServicesResponse())
90+
if err != nil {
91+
return fmt.Errorf("encoding response from grpc service: %w", err)
92+
}
93+
fmt.Println(string(out))
94+
response.Reset()
95+
err = info.RecvMsg(&response)
96+
}
97+
if !errors.Is(err, io.EOF) {
98+
return fmt.Errorf("unexpected grpc protocol error: %w", err)
99+
}
100+
return nil
101+
}
102+
103+
func noop(_ *cobra.Command, args []string) error {
104+
var out []byte
105+
switch podmanConfig.EngineMode {
106+
case entities.TunnelMode:
107+
ctx, grpcClient, err := getGrpcClient()
108+
if err != nil {
109+
return fmt.Errorf("setting up grpc client for podman service: %w", err)
110+
}
111+
noopClient := grpcpb.NewNoopClient(grpcClient)
112+
if noopClient == nil {
113+
return fmt.Errorf("setting up client for noop grpc service: %w", err)
114+
}
115+
var request grpcpb.NoopRequest
116+
if encoded := strings.Join(args, ""); len(encoded) > 0 {
117+
if err := json.Unmarshal([]byte(encoded), &request); err != nil {
118+
return fmt.Errorf("parsing client request contents for noop grpc service: %w", err)
119+
}
120+
}
121+
response, err := noopClient.Noop(ctx, &request)
122+
if err != nil {
123+
return fmt.Errorf("noop grpc service: %w", err)
124+
}
125+
out, err = json.Marshal(response)
126+
if err != nil {
127+
return fmt.Errorf("encoding response from grpc service: %w", err)
128+
}
129+
default:
130+
return errors.New("only available in remote mode")
131+
}
132+
fmt.Println(string(out))
133+
return nil
134+
}
135+
136+
func getGrpcClient() (context.Context, *grpc.ClientConn, error) {
137+
ctx, err := bindings.NewConnection(mainContext, podmanConfig.URI)
138+
if err != nil {
139+
return nil, nil, fmt.Errorf("connecting to podman service: %w", err)
140+
}
141+
client, err := bindings.GetClient(ctx)
142+
if err != nil {
143+
return nil, nil, fmt.Errorf("obtaining client handle for podman service: %w", err)
144+
}
145+
onlyPodmanSystemServiceDialer := grpc.WithContextDialer(func(ctx context.Context, _ string) (net.Conn, error) { return client.GetDialer(ctx) })
146+
withoutEncryption := grpc.WithTransportCredentials(insecure.NewCredentials())
147+
grpcClient, err := grpc.NewClient(podmanConfig.URI, onlyPodmanSystemServiceDialer, withoutEncryption)
148+
if err != nil {
149+
return nil, nil, fmt.Errorf("setting up grpc client for podman service: %w", err)
150+
}
151+
return ctx, grpcClient, err
152+
}

cmd/podman-testing/create.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//go:build !remote
1+
//go:build (linux || freebsd) && !remote
22

33
package main
44

@@ -20,7 +20,7 @@ var (
2020
Long: createStorageLayerDescription,
2121
RunE: createStorageLayer,
2222
ValidArgsFunction: completion.AutocompleteNone,
23-
Example: `podman testing create-storage-layer`,
23+
Example: `podman-testing create-storage-layer`,
2424
}
2525

2626
createStorageLayerOpts entities.CreateStorageLayerOptions
@@ -33,7 +33,7 @@ var (
3333
Long: createLayerDescription,
3434
RunE: createLayer,
3535
ValidArgsFunction: completion.AutocompleteNone,
36-
Example: `podman testing create-layer`,
36+
Example: `podman-testing create-layer`,
3737
}
3838

3939
createLayerOpts entities.CreateLayerOptions
@@ -46,7 +46,7 @@ var (
4646
Long: createImageDescription,
4747
RunE: createImage,
4848
ValidArgsFunction: completion.AutocompleteNone,
49-
Example: `podman testing create-image`,
49+
Example: `podman-testing create-image`,
5050
}
5151

5252
createImageOpts entities.CreateImageOptions
@@ -59,7 +59,7 @@ var (
5959
Long: createContainerDescription,
6060
RunE: createContainer,
6161
ValidArgsFunction: completion.AutocompleteNone,
62-
Example: `podman testing create-container`,
62+
Example: `podman-testing create-container`,
6363
}
6464

6565
createContainerOpts entities.CreateContainerOptions

cmd/podman-testing/data.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//go:build !remote
1+
//go:build (linux || freebsd) && !remote
22

33
package main
44

@@ -21,7 +21,7 @@ var (
2121
Long: createLayerDataDescription,
2222
RunE: createLayerData,
2323
ValidArgsFunction: completion.AutocompleteNone,
24-
Example: `podman testing create-layer-data`,
24+
Example: `podman-testing create-layer-data`,
2525
}
2626

2727
createLayerDataOpts entities.CreateLayerDataOptions
@@ -37,7 +37,7 @@ var (
3737
Long: createImageDataDescription,
3838
RunE: createImageData,
3939
ValidArgsFunction: completion.AutocompleteNone,
40-
Example: `podman testing create-image-data`,
40+
Example: `podman-testing create-image-data`,
4141
}
4242

4343
createImageDataOpts entities.CreateImageDataOptions
@@ -53,7 +53,7 @@ var (
5353
Long: createContainerDataDescription,
5454
RunE: createContainerData,
5555
ValidArgsFunction: completion.AutocompleteNone,
56-
Example: `podman testing create-container-data`,
56+
Example: `podman-testing create-container-data`,
5757
}
5858

5959
createContainerDataOpts entities.CreateContainerDataOptions
@@ -69,7 +69,7 @@ var (
6969
Long: modifyLayerDataDescription,
7070
RunE: modifyLayerData,
7171
ValidArgsFunction: completion.AutocompleteNone,
72-
Example: `podman testing modify-layer-data`,
72+
Example: `podman-testing modify-layer-data`,
7373
}
7474

7575
modifyLayerDataOpts entities.ModifyLayerDataOptions
@@ -84,7 +84,7 @@ var (
8484
Long: modifyImageDataDescription,
8585
RunE: modifyImageData,
8686
ValidArgsFunction: completion.AutocompleteNone,
87-
Example: `podman testing modify-image-data`,
87+
Example: `podman-testing modify-image-data`,
8888
}
8989

9090
modifyImageDataOpts entities.ModifyImageDataOptions
@@ -99,7 +99,7 @@ var (
9999
Long: modifyContainerDataDescription,
100100
RunE: modifyContainerData,
101101
ValidArgsFunction: completion.AutocompleteNone,
102-
Example: `podman testing modify-container-data`,
102+
Example: `podman-testing modify-container-data`,
103103
}
104104

105105
modifyContainerDataOpts entities.ModifyContainerDataOptions
@@ -114,7 +114,7 @@ var (
114114
Long: removeLayerDataDescription,
115115
RunE: removeLayerData,
116116
ValidArgsFunction: completion.AutocompleteNone,
117-
Example: `podman testing remove-layer-data`,
117+
Example: `podman-testing remove-layer-data`,
118118
}
119119

120120
removeLayerDataOpts entities.RemoveLayerDataOptions
@@ -127,7 +127,7 @@ var (
127127
Long: removeImageDataDescription,
128128
RunE: removeImageData,
129129
ValidArgsFunction: completion.AutocompleteNone,
130-
Example: `podman testing remove-image-data`,
130+
Example: `podman-testing remove-image-data`,
131131
}
132132

133133
removeImageDataOpts entities.RemoveImageDataOptions
@@ -140,7 +140,7 @@ var (
140140
Long: removeContainerDataDescription,
141141
RunE: removeContainerData,
142142
ValidArgsFunction: completion.AutocompleteNone,
143-
Example: `podman testing remove-container-data`,
143+
Example: `podman-testing remove-container-data`,
144144
}
145145

146146
removeContainerDataOpts entities.RemoveContainerDataOptions

cmd/podman-testing/layer.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//go:build !remote
1+
//go:build (linux || freebsd) && !remote
22

33
package main
44

@@ -21,7 +21,7 @@ var (
2121
Long: populateLayerDescription,
2222
RunE: populateLayer,
2323
ValidArgsFunction: completion.AutocompleteNone,
24-
Example: `podman testing populate-layer`,
24+
Example: `podman-testing populate-layer`,
2525
}
2626

2727
populateLayerOpts entities.PopulateLayerOptions
@@ -35,7 +35,7 @@ var (
3535
Long: modifyLayerDescription,
3636
RunE: modifyLayer,
3737
ValidArgsFunction: completion.AutocompleteNone,
38-
Example: `podman testing modify-layer`,
38+
Example: `podman-testing modify-layer`,
3939
}
4040

4141
modifyLayerOpts entities.ModifyLayerOptions

cmd/podman-testing/main.go

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
//go:build !remote
2-
31
package main
42

53
import (
@@ -11,13 +9,10 @@ import (
119
"syscall"
1210

1311
_ "github.com/containers/podman/v6/cmd/podman/completion"
14-
ientities "github.com/containers/podman/v6/internal/domain/entities"
15-
"github.com/containers/podman/v6/internal/domain/infra"
1612
"github.com/containers/podman/v6/pkg/domain/entities"
1713
"github.com/sirupsen/logrus"
1814
"github.com/spf13/cobra"
1915
"go.podman.io/common/pkg/config"
20-
"go.podman.io/storage"
2116
"go.podman.io/storage/pkg/reexec"
2217
"go.podman.io/storage/pkg/unshare"
2318
)
@@ -38,11 +33,9 @@ var (
3833
SilenceUsage: true,
3934
SilenceErrors: true,
4035
}
41-
mainContext = context.Background()
42-
podmanConfig entities.PodmanConfig
43-
globalStorageOptions storage.StoreOptions
44-
globalLogLevel string
45-
testingEngine ientities.TestingEngine
36+
mainContext = context.Background()
37+
podmanConfig entities.PodmanConfig
38+
globalLogLevel string
4639
)
4740

4841
func init() {
@@ -80,18 +73,9 @@ func before() error {
8073
}
8174
podmanConfig.ContainersConf = containersConf
8275

83-
podmanConfig.StorageDriver = globalStorageOptions.GraphDriverName
84-
podmanConfig.GraphRoot = globalStorageOptions.GraphRoot
85-
podmanConfig.Runroot = globalStorageOptions.RunRoot
86-
podmanConfig.ImageStore = globalStorageOptions.ImageStore
87-
podmanConfig.StorageOpts = globalStorageOptions.GraphDriverOptions
88-
podmanConfig.TransientStore = globalStorageOptions.TransientStore
89-
90-
te, err := infra.NewTestingEngine(&podmanConfig)
91-
if err != nil {
92-
return fmt.Errorf("initializing libpod: %w", err)
76+
if err := testingEngineBefore(&podmanConfig); err != nil {
77+
return fmt.Errorf("setting up testing engine: %w", err)
9378
}
94-
testingEngine = te
9579
return nil
9680
}
9781

0 commit comments

Comments
 (0)