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  })