github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/bindings/test/networks_test.go (about) 1 package bindings_test 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "time" 8 9 "github.com/containers/common/libnetwork/types" 10 "github.com/hanks177/podman/v4/pkg/bindings" 11 "github.com/hanks177/podman/v4/pkg/bindings/containers" 12 "github.com/hanks177/podman/v4/pkg/bindings/network" 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 "github.com/onsi/gomega/gexec" 16 ) 17 18 var _ = Describe("Podman networks", func() { 19 var ( 20 bt *bindingTest 21 s *gexec.Session 22 connText context.Context 23 err error 24 ) 25 26 BeforeEach(func() { 27 28 bt = newBindingTest() 29 bt.RestoreImagesFromCache() 30 s = bt.startAPIService() 31 time.Sleep(1 * time.Second) 32 connText, err = bindings.NewConnection(context.Background(), bt.sock) 33 Expect(err).To(BeNil()) 34 _, err = network.Prune(connText, &network.PruneOptions{}) 35 Expect(err).To(BeNil()) 36 }) 37 38 AfterEach(func() { 39 s.Kill() 40 bt.cleanup() 41 }) 42 43 It("podman prune unused networks with filters", func() { 44 name := "foobar" 45 net := types.Network{ 46 Name: name, 47 } 48 _, err = network.Create(connText, &net) 49 Expect(err).To(BeNil()) 50 51 // Invalid filters should return error 52 filtersIncorrect := map[string][]string{ 53 "status": {"dummy"}, 54 } 55 _, err = network.Prune(connText, new(network.PruneOptions).WithFilters(filtersIncorrect)) 56 Expect(err).ToNot(BeNil()) 57 58 // List filter params should not work with prune. 59 filtersIncorrect = map[string][]string{ 60 "name": {name}, 61 } 62 _, err = network.Prune(connText, new(network.PruneOptions).WithFilters(filtersIncorrect)) 63 Expect(err).ToNot(BeNil()) 64 65 // Mismatched label, correct filter params => no network should be pruned. 66 filtersIncorrect = map[string][]string{ 67 "label": {"xyz"}, 68 } 69 pruneResponse, err := network.Prune(connText, new(network.PruneOptions).WithFilters(filtersIncorrect)) 70 Expect(err).To(BeNil()) 71 Expect(len(pruneResponse)).To(Equal(0)) 72 73 // Mismatched until, correct filter params => no network should be pruned. 74 filters := map[string][]string{ 75 "until": {"50"}, // January 1, 1970 76 } 77 pruneResponse, err = network.Prune(connText, new(network.PruneOptions).WithFilters(filters)) 78 Expect(err).To(BeNil()) 79 Expect(len(pruneResponse)).To(Equal(0)) 80 81 // Valid filter params => network should be pruned now. 82 filters = map[string][]string{ 83 "until": {"5000000000"}, // June 11, 2128 84 } 85 pruneResponse, err = network.Prune(connText, new(network.PruneOptions).WithFilters(filters)) 86 Expect(err).To(BeNil()) 87 Expect(len(pruneResponse)).To(Equal(1)) 88 }) 89 90 It("create network", func() { 91 // create a network with blank config should work 92 _, err = network.Create(connText, nil) 93 Expect(err).To(BeNil()) 94 95 name := "foobar" 96 net := types.Network{ 97 Name: name, 98 } 99 100 report, err := network.Create(connText, &net) 101 Expect(err).To(BeNil()) 102 Expect(report.Name).To(Equal(name)) 103 104 // create network with same name should 500 105 _, err = network.Create(connText, &net) 106 Expect(err).ToNot(BeNil()) 107 code, _ := bindings.CheckResponseCode(err) 108 Expect(code).To(BeNumerically("==", http.StatusConflict)) 109 }) 110 111 It("inspect network", func() { 112 name := "foobar" 113 net := types.Network{ 114 Name: name, 115 } 116 _, err = network.Create(connText, &net) 117 Expect(err).To(BeNil()) 118 data, err := network.Inspect(connText, name, nil) 119 Expect(err).To(BeNil()) 120 Expect(data.Name).To(Equal(name)) 121 }) 122 123 It("list networks", func() { 124 // create a bunch of named networks and make verify with list 125 netNames := []string{"homer", "bart", "lisa", "maggie", "marge"} 126 for i := 0; i < 5; i++ { 127 net := types.Network{ 128 Name: netNames[i], 129 } 130 _, err = network.Create(connText, &net) 131 Expect(err).To(BeNil()) 132 } 133 list, err := network.List(connText, nil) 134 Expect(err).To(BeNil()) 135 Expect(len(list)).To(BeNumerically(">=", 5)) 136 for _, n := range list { 137 if n.Name != "podman" { 138 Expect(StringInSlice(n.Name, netNames)).To(BeTrue()) 139 } 140 } 141 142 // list with bad filter should be 500 143 filters := make(map[string][]string) 144 filters["foobar"] = []string{"1234"} 145 options := new(network.ListOptions).WithFilters(filters) 146 _, err = network.List(connText, options) 147 Expect(err).ToNot(BeNil()) 148 code, _ := bindings.CheckResponseCode(err) 149 Expect(code).To(BeNumerically("==", http.StatusInternalServerError)) 150 151 // filter list with success 152 filters = make(map[string][]string) 153 filters["name"] = []string{"homer"} 154 options = new(network.ListOptions).WithFilters(filters) 155 list, err = network.List(connText, options) 156 Expect(err).To(BeNil()) 157 Expect(len(list)).To(BeNumerically("==", 1)) 158 Expect(list[0].Name).To(Equal("homer")) 159 }) 160 161 It("remove network", func() { 162 // removing a noName network should result in 404 163 _, err := network.Remove(connText, "noName", nil) 164 code, err := bindings.CheckResponseCode(err) 165 Expect(err).To(BeNil()) 166 Expect(code).To(BeNumerically("==", http.StatusNotFound)) 167 168 // Removing an unused network should work 169 name := "unused" 170 net := types.Network{ 171 Name: name, 172 } 173 _, err = network.Create(connText, &net) 174 Expect(err).To(BeNil()) 175 report, err := network.Remove(connText, name, nil) 176 Expect(err).To(BeNil()) 177 Expect(report[0].Name).To(Equal(name)) 178 179 // Removing a network that is being used without force should be 500 180 name = "used" 181 net = types.Network{ 182 Name: name, 183 } 184 _, err = network.Create(connText, &net) 185 Expect(err).To(BeNil()) 186 187 // Start container and wait 188 container := "ntest" 189 session := bt.runPodman([]string{"run", "-dt", fmt.Sprintf("--network=%s", name), "--name", container, alpine.name, "top"}) 190 session.Wait(45) 191 Expect(session.ExitCode()).To(BeZero()) 192 193 _, err = network.Remove(connText, name, nil) 194 code, err = bindings.CheckResponseCode(err) 195 Expect(err).To(BeNil()) 196 Expect(code).To(BeNumerically("==", http.StatusInternalServerError)) 197 198 // Removing with a network in use with force should work with a stopped container 199 err = containers.Stop(connText, container, new(containers.StopOptions).WithTimeout(0)) 200 Expect(err).To(BeNil()) 201 options := new(network.RemoveOptions).WithForce(true) 202 report, err = network.Remove(connText, name, options) 203 Expect(err).To(BeNil()) 204 Expect(report[0].Name).To(Equal(name)) 205 }) 206 })