9
"github.com/containers/common/libnetwork/types"
10
"github.com/containers/podman/v5/pkg/bindings"
11
"github.com/containers/podman/v5/pkg/bindings/containers"
12
"github.com/containers/podman/v5/pkg/bindings/network"
13
. "github.com/onsi/ginkgo/v2"
14
. "github.com/onsi/gomega"
15
"github.com/onsi/gomega/gexec"
16
"golang.org/x/exp/slices"
19
var _ = Describe("Podman networks", func() {
23
connText context.Context
30
bt.RestoreImagesFromCache()
31
s = bt.startAPIService()
32
time.Sleep(1 * time.Second)
33
connText, err = bindings.NewConnection(context.Background(), bt.sock)
34
Expect(err).ToNot(HaveOccurred())
35
_, err = network.Prune(connText, &network.PruneOptions{})
36
Expect(err).ToNot(HaveOccurred())
44
It("podman prune unused networks with filters", func() {
49
_, err = network.Create(connText, &net)
50
Expect(err).ToNot(HaveOccurred())
52
// Invalid filters should return error
53
filtersIncorrect := map[string][]string{
56
_, err = network.Prune(connText, new(network.PruneOptions).WithFilters(filtersIncorrect))
57
Expect(err).To(HaveOccurred())
59
// List filter params should not work with prune.
60
filtersIncorrect = map[string][]string{
63
_, err = network.Prune(connText, new(network.PruneOptions).WithFilters(filtersIncorrect))
64
Expect(err).To(HaveOccurred())
66
// Mismatched label, correct filter params => no network should be pruned.
67
filtersIncorrect = map[string][]string{
70
pruneResponse, err := network.Prune(connText, new(network.PruneOptions).WithFilters(filtersIncorrect))
71
Expect(err).ToNot(HaveOccurred())
72
Expect(pruneResponse).To(BeEmpty())
74
// Mismatched until, correct filter params => no network should be pruned.
75
filters := map[string][]string{
76
"until": {"50"}, // January 1, 1970
78
pruneResponse, err = network.Prune(connText, new(network.PruneOptions).WithFilters(filters))
79
Expect(err).ToNot(HaveOccurred())
80
Expect(pruneResponse).To(BeEmpty())
82
// Valid filter params => network should be pruned now.
83
filters = map[string][]string{
84
"until": {"5000000000"}, // June 11, 2128
86
pruneResponse, err = network.Prune(connText, new(network.PruneOptions).WithFilters(filters))
87
Expect(err).ToNot(HaveOccurred())
88
Expect(pruneResponse).To(HaveLen(1))
91
It("create network", func() {
92
// create a network with blank config should work
93
_, err = network.Create(connText, nil)
94
Expect(err).ToNot(HaveOccurred())
101
report, err := network.Create(connText, &net)
102
Expect(err).ToNot(HaveOccurred())
103
Expect(report.Name).To(Equal(name))
105
// create network with same name should 409
106
_, err = network.Create(connText, &net)
107
Expect(err).To(HaveOccurred())
108
code, _ := bindings.CheckResponseCode(err)
109
Expect(code).To(BeNumerically("==", http.StatusConflict))
111
// create network with same name and ignore false should 409
112
options := new(network.ExtraCreateOptions).WithIgnoreIfExists(false)
113
_, err = network.CreateWithOptions(connText, &net, options)
114
Expect(err).To(HaveOccurred())
115
code, _ = bindings.CheckResponseCode(err)
116
Expect(code).To(BeNumerically("==", http.StatusConflict))
118
// create network with same name and ignore true succeed
119
options = new(network.ExtraCreateOptions).WithIgnoreIfExists(true)
120
report, err = network.CreateWithOptions(connText, &net, options)
121
Expect(err).ToNot(HaveOccurred())
122
Expect(report.Name).To(Equal(name))
125
It("inspect network", func() {
127
net := types.Network{
130
_, err = network.Create(connText, &net)
131
Expect(err).ToNot(HaveOccurred())
132
data, err := network.Inspect(connText, name, nil)
133
Expect(err).ToNot(HaveOccurred())
134
Expect(data.Name).To(Equal(name))
137
It("list networks", func() {
138
// create a bunch of named networks and make verify with list
139
netNames := []string{"homer", "bart", "lisa", "maggie", "marge"}
140
for i := 0; i < 5; i++ {
141
net := types.Network{
144
_, err = network.Create(connText, &net)
145
Expect(err).ToNot(HaveOccurred())
147
list, err := network.List(connText, nil)
148
Expect(err).ToNot(HaveOccurred())
149
Expect(len(list)).To(BeNumerically(">=", 5))
150
for _, n := range list {
151
if n.Name != "podman" {
152
Expect(slices.Contains(netNames, n.Name)).To(BeTrue())
156
// list with bad filter should be 500
157
filters := make(map[string][]string)
158
filters["foobar"] = []string{"1234"}
159
options := new(network.ListOptions).WithFilters(filters)
160
_, err = network.List(connText, options)
161
Expect(err).To(HaveOccurred())
162
code, _ := bindings.CheckResponseCode(err)
163
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
165
// filter list with success
166
filters = make(map[string][]string)
167
filters["name"] = []string{"homer"}
168
options = new(network.ListOptions).WithFilters(filters)
169
list, err = network.List(connText, options)
170
Expect(err).ToNot(HaveOccurred())
171
Expect(list).To(HaveLen(1))
172
Expect(list[0].Name).To(Equal("homer"))
175
It("remove network", func() {
176
// removing a noName network should result in 404
177
_, err := network.Remove(connText, "noName", nil)
178
code, err := bindings.CheckResponseCode(err)
179
Expect(err).ToNot(HaveOccurred())
180
Expect(code).To(BeNumerically("==", http.StatusNotFound))
182
// Removing an unused network should work
184
net := types.Network{
187
_, err = network.Create(connText, &net)
188
Expect(err).ToNot(HaveOccurred())
189
report, err := network.Remove(connText, name, nil)
190
Expect(err).ToNot(HaveOccurred())
191
Expect(report[0].Name).To(Equal(name))
193
// Removing a network that is being used without force should be 500
198
_, err = network.Create(connText, &net)
199
Expect(err).ToNot(HaveOccurred())
201
// Start container and wait
203
session := bt.runPodman([]string{"run", "-dt", fmt.Sprintf("--network=%s", name), "--name", container, alpine.name, "top"})
205
Expect(session.ExitCode()).To(BeZero())
207
_, err = network.Remove(connText, name, nil)
208
code, err = bindings.CheckResponseCode(err)
209
Expect(err).ToNot(HaveOccurred())
210
Expect(code).To(BeNumerically("==", http.StatusInternalServerError))
212
// Removing with a network in use with force should work with a stopped container
213
err = containers.Stop(connText, container, new(containers.StopOptions).WithTimeout(0))
214
Expect(err).ToNot(HaveOccurred())
215
options := new(network.RemoveOptions).WithForce(true)
216
report, err = network.Remove(connText, name, options)
217
Expect(err).ToNot(HaveOccurred())
218
Expect(report[0].Name).To(Equal(name))