github.com/AbhinandanKurakure/podman/v3@v3.4.10/libpod/network/cni/config_test.go (about)

     1  // +build linux
     2  
     3  package cni_test
     4  
     5  import (
     6  	"bytes"
     7  	"io/ioutil"
     8  	"net"
     9  	"os"
    10  	"path/filepath"
    11  	"time"
    12  
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  	gomegaTypes "github.com/onsi/gomega/types"
    16  	"github.com/sirupsen/logrus"
    17  
    18  	"github.com/containers/podman/v3/libpod/network/types"
    19  	"github.com/containers/podman/v3/libpod/network/util"
    20  )
    21  
    22  var _ = Describe("Config", func() {
    23  	var (
    24  		libpodNet  types.ContainerNetwork
    25  		cniConfDir string
    26  		logBuffer  bytes.Buffer
    27  	)
    28  
    29  	BeforeEach(func() {
    30  		var err error
    31  		cniConfDir, err = ioutil.TempDir("", "podman_cni_test")
    32  		if err != nil {
    33  			Fail("Failed to create tmpdir")
    34  
    35  		}
    36  		logBuffer = bytes.Buffer{}
    37  		logrus.SetOutput(&logBuffer)
    38  	})
    39  
    40  	JustBeforeEach(func() {
    41  		var err error
    42  		libpodNet, err = getNetworkInterface(cniConfDir, false)
    43  		if err != nil {
    44  			Fail("Failed to create NewCNINetworkInterface")
    45  		}
    46  	})
    47  
    48  	AfterEach(func() {
    49  		os.RemoveAll(cniConfDir)
    50  	})
    51  
    52  	Context("basic network config tests", func() {
    53  
    54  		It("check default network config exists", func() {
    55  			networks, err := libpodNet.NetworkList()
    56  			Expect(err).To(BeNil())
    57  			Expect(networks).To(HaveLen(1))
    58  			Expect(networks[0].Name).To(Equal("podman"))
    59  			Expect(networks[0].Driver).To(Equal("bridge"))
    60  			Expect(networks[0].NetworkInterface).To(Equal("cni-podman0"))
    61  			Expect(networks[0].Created.Before(time.Now())).To(BeTrue())
    62  			Expect(networks[0].Subnets).To(HaveLen(1))
    63  			Expect(networks[0].Subnets[0].Subnet.String()).To(Equal("10.88.0.0/16"))
    64  			Expect(networks[0].Subnets[0].Gateway.String()).To(Equal("10.88.0.1"))
    65  			Expect(networks[0].Subnets[0].LeaseRange).To(BeNil())
    66  			Expect(networks[0].IPAMOptions).To(HaveKeyWithValue("driver", "host-local"))
    67  			Expect(networks[0].Options).To(BeEmpty())
    68  			Expect(networks[0].Labels).To(BeEmpty())
    69  			Expect(networks[0].DNSEnabled).To(BeFalse())
    70  			Expect(networks[0].Internal).To(BeFalse())
    71  		})
    72  
    73  		It("basic network create, inspect and remove", func() {
    74  			// Because we get the time from the file create timestamp there is small precision
    75  			// loss so lets remove 500 milliseconds to make sure this test does not flake.
    76  			now := time.Now().Add(-500 * time.Millisecond)
    77  			network := types.Network{}
    78  			network1, err := libpodNet.NetworkCreate(network)
    79  			Expect(err).To(BeNil())
    80  			Expect(network1.Name).ToNot(BeEmpty())
    81  			path := filepath.Join(cniConfDir, network1.Name+".conflist")
    82  			Expect(path).To(BeARegularFile())
    83  			Expect(network1.ID).ToNot(BeEmpty())
    84  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
    85  			Expect(network1.Driver).To(Equal("bridge"))
    86  			Expect(network1.Labels).To(BeEmpty())
    87  			Expect(network1.Options).To(BeEmpty())
    88  			Expect(network1.IPAMOptions).ToNot(BeEmpty())
    89  			Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "host-local"))
    90  			Expect(network1.Created.After(now)).To(BeTrue())
    91  			Expect(network1.Subnets).To(HaveLen(1))
    92  			Expect(network1.Subnets[0].Subnet.String()).To(Equal("10.89.0.0/24"))
    93  			Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.89.0.1"))
    94  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
    95  			Expect(network1.DNSEnabled).To(BeFalse())
    96  			Expect(network1.Internal).To(BeFalse())
    97  
    98  			// inspect by name
    99  			network2, err := libpodNet.NetworkInspect(network1.Name)
   100  			Expect(err).To(BeNil())
   101  			Expect(network2).To(Equal(network1))
   102  
   103  			// inspect by ID
   104  			network2, err = libpodNet.NetworkInspect(network1.ID)
   105  			Expect(err).To(BeNil())
   106  			Expect(network2).To(Equal(network1))
   107  
   108  			// inspect by partial ID
   109  			network2, err = libpodNet.NetworkInspect(network1.ID[:10])
   110  			Expect(err).To(BeNil())
   111  			Expect(network2).To(Equal(network1))
   112  
   113  			// create a new interface to force a config load from disk
   114  			libpodNet, err = getNetworkInterface(cniConfDir, false)
   115  			Expect(err).To(BeNil())
   116  
   117  			network2, err = libpodNet.NetworkInspect(network1.Name)
   118  			Expect(err).To(BeNil())
   119  			Expect(network2).To(Equal(network1))
   120  
   121  			err = libpodNet.NetworkRemove(network1.Name)
   122  			Expect(err).To(BeNil())
   123  			Expect(path).ToNot(BeARegularFile())
   124  
   125  			_, err = libpodNet.NetworkInspect(network1.Name)
   126  			Expect(err).To(HaveOccurred())
   127  			Expect(err.Error()).To(ContainSubstring("network not found"))
   128  		})
   129  
   130  		It("create two networks", func() {
   131  			network := types.Network{}
   132  			network1, err := libpodNet.NetworkCreate(network)
   133  			Expect(err).To(BeNil())
   134  			Expect(network1.Name).ToNot(BeEmpty())
   135  			Expect(network1.Subnets).To(HaveLen(1))
   136  
   137  			network = types.Network{}
   138  			network2, err := libpodNet.NetworkCreate(network)
   139  			Expect(err).To(BeNil())
   140  			Expect(network2.Name).ToNot(Equal(network1.Name))
   141  			Expect(network2.ID).ToNot(Equal(network1.ID))
   142  			Expect(network2.NetworkInterface).ToNot(Equal(network1.NetworkInterface))
   143  			Expect(network2.Subnets).To(HaveLen(1))
   144  			Expect(network2.Subnets[0].Subnet.Contains(network1.Subnets[0].Subnet.IP)).To(BeFalse())
   145  		})
   146  
   147  		It("create bridge config", func() {
   148  			network := types.Network{Driver: "bridge"}
   149  			network1, err := libpodNet.NetworkCreate(network)
   150  			Expect(err).To(BeNil())
   151  			Expect(network1.Name).ToNot(BeEmpty())
   152  			Expect(filepath.Join(cniConfDir, network1.Name+".conflist")).To(BeARegularFile())
   153  			Expect(network1.ID).ToNot(BeEmpty())
   154  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   155  			Expect(network1.Driver).To(Equal("bridge"))
   156  			Expect(network1.Labels).To(BeEmpty())
   157  			Expect(network1.Options).To(BeEmpty())
   158  			Expect(network1.IPAMOptions).ToNot(BeEmpty())
   159  			Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "host-local"))
   160  			Expect(network1.Subnets).To(HaveLen(1))
   161  			Expect(network1.Subnets[0].Subnet.String()).To(Equal("10.89.0.0/24"))
   162  			Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.89.0.1"))
   163  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   164  			Expect(network1.DNSEnabled).To(BeFalse())
   165  			Expect(network1.Internal).To(BeFalse())
   166  		})
   167  
   168  		It("create bridge with same name should fail", func() {
   169  			network := types.Network{
   170  				Driver:           "bridge",
   171  				NetworkInterface: "cni-podman2",
   172  			}
   173  			network1, err := libpodNet.NetworkCreate(network)
   174  			Expect(err).To(BeNil())
   175  			Expect(network1.Name).ToNot(BeEmpty())
   176  			Expect(network1.ID).ToNot(BeEmpty())
   177  			Expect(network1.NetworkInterface).To(Equal("cni-podman2"))
   178  			Expect(network1.Driver).To(Equal("bridge"))
   179  
   180  			_, err = libpodNet.NetworkCreate(network)
   181  			Expect(err).To(HaveOccurred())
   182  			Expect(err.Error()).To(ContainSubstring("bridge name cni-podman2 already in use"))
   183  		})
   184  
   185  		It("create macvlan config", func() {
   186  			network := types.Network{Driver: "macvlan"}
   187  			network1, err := libpodNet.NetworkCreate(network)
   188  			Expect(err).To(BeNil())
   189  			Expect(network1.Name).ToNot(BeEmpty())
   190  			Expect(filepath.Join(cniConfDir, network1.Name+".conflist")).To(BeARegularFile())
   191  			Expect(network1.ID).ToNot(BeEmpty())
   192  			Expect(network1.Driver).To(Equal("macvlan"))
   193  			Expect(network1.Labels).To(BeEmpty())
   194  			Expect(network1.Options).To(BeEmpty())
   195  			Expect(network1.IPAMOptions).ToNot(BeEmpty())
   196  			Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "dhcp"))
   197  			Expect(network1.Subnets).To(HaveLen(0))
   198  			Expect(network1.DNSEnabled).To(BeFalse())
   199  			Expect(network1.Internal).To(BeFalse())
   200  		})
   201  
   202  		It("create macvlan config with device", func() {
   203  			network := types.Network{
   204  				Driver:           "macvlan",
   205  				NetworkInterface: "lo",
   206  			}
   207  			network1, err := libpodNet.NetworkCreate(network)
   208  			Expect(err).To(BeNil())
   209  			Expect(network1.Name).ToNot(BeEmpty())
   210  			path := filepath.Join(cniConfDir, network1.Name+".conflist")
   211  			Expect(path).To(BeARegularFile())
   212  			Expect(network1.ID).ToNot(BeEmpty())
   213  			Expect(network1.Driver).To(Equal("macvlan"))
   214  			Expect(network1.Labels).To(BeEmpty())
   215  			Expect(network1.Options).To(BeEmpty())
   216  			Expect(network1.Subnets).To(HaveLen(0))
   217  			Expect(network1.DNSEnabled).To(BeFalse())
   218  			Expect(network1.Internal).To(BeFalse())
   219  			Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "dhcp"))
   220  			grepInFile(path, `"type": "macvlan"`)
   221  			grepInFile(path, `"master": "lo"`)
   222  			grepInFile(path, `"type": "dhcp"`)
   223  		})
   224  
   225  		It("create macvlan config with subnet", func() {
   226  			subnet := "10.1.0.0/24"
   227  			n, _ := types.ParseCIDR(subnet)
   228  			network := types.Network{
   229  				Driver: "macvlan",
   230  				Subnets: []types.Subnet{
   231  					{Subnet: n},
   232  				},
   233  			}
   234  			network1, err := libpodNet.NetworkCreate(network)
   235  			Expect(err).To(BeNil())
   236  			Expect(network1.Name).ToNot(BeEmpty())
   237  			path := filepath.Join(cniConfDir, network1.Name+".conflist")
   238  			Expect(path).To(BeARegularFile())
   239  			Expect(network1.ID).ToNot(BeEmpty())
   240  			Expect(network1.Driver).To(Equal("macvlan"))
   241  			Expect(network1.Labels).To(BeEmpty())
   242  			Expect(network1.Options).To(BeEmpty())
   243  			Expect(network1.Subnets).To(HaveLen(1))
   244  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet))
   245  			Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.1.0.1"))
   246  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   247  			Expect(network1.DNSEnabled).To(BeFalse())
   248  			Expect(network1.Internal).To(BeFalse())
   249  			Expect(network1.IPAMOptions).To(HaveKeyWithValue("driver", "host-local"))
   250  			grepInFile(path, `"type": "host-local"`)
   251  		})
   252  
   253  		It("create macvlan config with invalid device", func() {
   254  			network := types.Network{
   255  				Driver:           "macvlan",
   256  				NetworkInterface: "idonotexists",
   257  			}
   258  			_, err := libpodNet.NetworkCreate(network)
   259  			Expect(err).To(HaveOccurred())
   260  			Expect(err.Error()).To(ContainSubstring("parent interface idonotexists does not exists"))
   261  		})
   262  
   263  		It("create macvlan config with internal should fail", func() {
   264  			network := types.Network{
   265  				Driver:   "macvlan",
   266  				Internal: true,
   267  			}
   268  			_, err := libpodNet.NetworkCreate(network)
   269  			Expect(err).To(HaveOccurred())
   270  			Expect(err.Error()).To(ContainSubstring("internal is not supported with macvlan"))
   271  		})
   272  
   273  		It("create bridge with subnet", func() {
   274  			subnet := "10.0.0.0/24"
   275  			n, _ := types.ParseCIDR(subnet)
   276  
   277  			network := types.Network{
   278  				Driver: "bridge",
   279  				Subnets: []types.Subnet{
   280  					{Subnet: n},
   281  				},
   282  			}
   283  			network1, err := libpodNet.NetworkCreate(network)
   284  			Expect(err).To(BeNil())
   285  			Expect(network1.Name).ToNot(BeEmpty())
   286  			Expect(network1.ID).ToNot(BeEmpty())
   287  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   288  			Expect(network1.Driver).To(Equal("bridge"))
   289  			Expect(network1.Subnets).To(HaveLen(1))
   290  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet))
   291  			Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.0.0.1"))
   292  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   293  		})
   294  
   295  		It("create bridge with ipv6 subnet", func() {
   296  			subnet := "fdcc::/64"
   297  			n, _ := types.ParseCIDR(subnet)
   298  
   299  			network := types.Network{
   300  				Driver: "bridge",
   301  				Subnets: []types.Subnet{
   302  					{Subnet: n},
   303  				},
   304  			}
   305  			network1, err := libpodNet.NetworkCreate(network)
   306  			Expect(err).To(BeNil())
   307  			Expect(network1.Name).ToNot(BeEmpty())
   308  			Expect(network1.ID).ToNot(BeEmpty())
   309  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   310  			Expect(network1.Driver).To(Equal("bridge"))
   311  			Expect(network1.IPv6Enabled).To(BeTrue())
   312  			Expect(network1.Subnets).To(HaveLen(1))
   313  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet))
   314  			Expect(network1.Subnets[0].Gateway.String()).To(Equal("fdcc::1"))
   315  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   316  		})
   317  
   318  		It("create bridge with ipv6 enabled", func() {
   319  			network := types.Network{
   320  				Driver:      "bridge",
   321  				IPv6Enabled: true,
   322  			}
   323  			network1, err := libpodNet.NetworkCreate(network)
   324  			Expect(err).To(BeNil())
   325  			Expect(network1.Name).ToNot(BeEmpty())
   326  			Expect(network1.ID).ToNot(BeEmpty())
   327  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   328  			Expect(network1.Driver).To(Equal("bridge"))
   329  			Expect(network1.Subnets).To(HaveLen(2))
   330  			Expect(network1.Subnets[0].Subnet.String()).To(ContainSubstring(".0/24"))
   331  			Expect(network1.Subnets[0].Gateway).ToNot(BeNil())
   332  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   333  			Expect(network1.Subnets[1].Subnet.String()).To(ContainSubstring("::/64"))
   334  			Expect(network1.Subnets[1].Gateway).ToNot(BeNil())
   335  			Expect(network1.Subnets[1].LeaseRange).To(BeNil())
   336  		})
   337  
   338  		It("create bridge with ipv6 enabled and ipv4 subnet", func() {
   339  			subnet := "10.100.0.0/24"
   340  			n, _ := types.ParseCIDR(subnet)
   341  
   342  			network := types.Network{
   343  				Driver: "bridge",
   344  				Subnets: []types.Subnet{
   345  					{Subnet: n},
   346  				},
   347  				IPv6Enabled: true,
   348  			}
   349  			network1, err := libpodNet.NetworkCreate(network)
   350  			Expect(err).To(BeNil())
   351  			Expect(network1.Name).ToNot(BeEmpty())
   352  			Expect(network1.ID).ToNot(BeEmpty())
   353  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   354  			Expect(network1.Driver).To(Equal("bridge"))
   355  			Expect(network1.Subnets).To(HaveLen(2))
   356  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet))
   357  			Expect(network1.Subnets[0].Gateway).ToNot(BeNil())
   358  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   359  			Expect(network1.Subnets[1].Subnet.String()).To(ContainSubstring("::/64"))
   360  			Expect(network1.Subnets[1].Gateway).ToNot(BeNil())
   361  			Expect(network1.Subnets[1].LeaseRange).To(BeNil())
   362  		})
   363  
   364  		It("create bridge with ipv6 enabled and ipv6 subnet", func() {
   365  			subnet := "fd66::/64"
   366  			n, _ := types.ParseCIDR(subnet)
   367  
   368  			network := types.Network{
   369  				Driver: "bridge",
   370  				Subnets: []types.Subnet{
   371  					{Subnet: n},
   372  				},
   373  				IPv6Enabled: true,
   374  			}
   375  			network1, err := libpodNet.NetworkCreate(network)
   376  			Expect(err).To(BeNil())
   377  			Expect(network1.Name).ToNot(BeEmpty())
   378  			Expect(network1.ID).ToNot(BeEmpty())
   379  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   380  			Expect(network1.Driver).To(Equal("bridge"))
   381  			Expect(network1.Subnets).To(HaveLen(2))
   382  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet))
   383  			Expect(network1.Subnets[0].Gateway).ToNot(BeNil())
   384  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   385  			Expect(network1.Subnets[1].Subnet.String()).To(ContainSubstring(".0/24"))
   386  			Expect(network1.Subnets[1].Gateway).ToNot(BeNil())
   387  			Expect(network1.Subnets[1].LeaseRange).To(BeNil())
   388  		})
   389  
   390  		It("create bridge with ipv6 enabled and ipv4+ipv6 subnet", func() {
   391  			subnet1 := "10.100.0.0/24"
   392  			n1, _ := types.ParseCIDR(subnet1)
   393  			subnet2 := "fd66::/64"
   394  			n2, _ := types.ParseCIDR(subnet2)
   395  
   396  			network := types.Network{
   397  				Driver: "bridge",
   398  				Subnets: []types.Subnet{
   399  					{Subnet: n1}, {Subnet: n2},
   400  				},
   401  				IPv6Enabled: true,
   402  			}
   403  			network1, err := libpodNet.NetworkCreate(network)
   404  			Expect(err).To(BeNil())
   405  			Expect(network1.Name).ToNot(BeEmpty())
   406  			Expect(network1.ID).ToNot(BeEmpty())
   407  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   408  			Expect(network1.Driver).To(Equal("bridge"))
   409  			Expect(network1.Subnets).To(HaveLen(2))
   410  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet1))
   411  			Expect(network1.Subnets[0].Gateway).ToNot(BeNil())
   412  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   413  			Expect(network1.Subnets[1].Subnet.String()).To(Equal(subnet2))
   414  			Expect(network1.Subnets[1].Gateway).ToNot(BeNil())
   415  			Expect(network1.Subnets[1].LeaseRange).To(BeNil())
   416  		})
   417  
   418  		It("create bridge with ipv6 enabled and two ipv4 subnets", func() {
   419  			subnet1 := "10.100.0.0/24"
   420  			n1, _ := types.ParseCIDR(subnet1)
   421  			subnet2 := "10.200.0.0/24"
   422  			n2, _ := types.ParseCIDR(subnet2)
   423  
   424  			network := types.Network{
   425  				Driver: "bridge",
   426  				Subnets: []types.Subnet{
   427  					{Subnet: n1}, {Subnet: n2},
   428  				},
   429  				IPv6Enabled: true,
   430  			}
   431  			network1, err := libpodNet.NetworkCreate(network)
   432  			Expect(err).To(BeNil())
   433  			Expect(network1.Name).ToNot(BeEmpty())
   434  			Expect(network1.ID).ToNot(BeEmpty())
   435  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   436  			Expect(network1.Driver).To(Equal("bridge"))
   437  			Expect(network1.Subnets).To(HaveLen(3))
   438  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet1))
   439  			Expect(network1.Subnets[0].Gateway).ToNot(BeNil())
   440  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   441  			Expect(network1.Subnets[1].Subnet.String()).To(Equal(subnet2))
   442  			Expect(network1.Subnets[1].Gateway).ToNot(BeNil())
   443  			Expect(network1.Subnets[1].LeaseRange).To(BeNil())
   444  			Expect(network1.Subnets[2].Subnet.String()).To(ContainSubstring("::/64"))
   445  			Expect(network1.Subnets[2].Gateway).ToNot(BeNil())
   446  			Expect(network1.Subnets[2].LeaseRange).To(BeNil())
   447  		})
   448  
   449  		It("create bridge with subnet and gateway", func() {
   450  			subnet := "10.0.0.5/24"
   451  			n, _ := types.ParseCIDR(subnet)
   452  			gateway := "10.0.0.50"
   453  			g := net.ParseIP(gateway)
   454  			network := types.Network{
   455  				Driver: "bridge",
   456  				Subnets: []types.Subnet{
   457  					{Subnet: n, Gateway: g},
   458  				},
   459  			}
   460  			network1, err := libpodNet.NetworkCreate(network)
   461  			Expect(err).To(BeNil())
   462  			Expect(network1.Name).ToNot(BeEmpty())
   463  			Expect(network1.ID).ToNot(BeEmpty())
   464  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   465  			Expect(network1.Driver).To(Equal("bridge"))
   466  			Expect(network1.Subnets).To(HaveLen(1))
   467  			Expect(network1.Subnets[0].Subnet.String()).To(Equal("10.0.0.0/24"))
   468  			Expect(network1.Subnets[0].Gateway.String()).To(Equal(gateway))
   469  			Expect(network1.Subnets[0].LeaseRange).To(BeNil())
   470  		})
   471  
   472  		It("create bridge with subnet and gateway not in the same subnet", func() {
   473  			subnet := "10.0.0.0/24"
   474  			n, _ := types.ParseCIDR(subnet)
   475  			gateway := "10.10.0.50"
   476  			g := net.ParseIP(gateway)
   477  			network := types.Network{
   478  				Driver: "bridge",
   479  				Subnets: []types.Subnet{
   480  					{Subnet: n, Gateway: g},
   481  				},
   482  			}
   483  			_, err := libpodNet.NetworkCreate(network)
   484  			Expect(err).To(HaveOccurred())
   485  			Expect(err.Error()).To(ContainSubstring("not in subnet"))
   486  		})
   487  
   488  		It("create bridge with subnet and lease range", func() {
   489  			subnet := "10.0.0.0/24"
   490  			n, _ := types.ParseCIDR(subnet)
   491  			startIP := "10.0.0.10"
   492  			network := types.Network{
   493  				Driver: "bridge",
   494  				Subnets: []types.Subnet{
   495  					{Subnet: n, LeaseRange: &types.LeaseRange{
   496  						StartIP: net.ParseIP(startIP),
   497  					}},
   498  				},
   499  			}
   500  			network1, err := libpodNet.NetworkCreate(network)
   501  			Expect(err).To(BeNil())
   502  			Expect(network1.Name).ToNot(BeEmpty())
   503  			Expect(network1.ID).ToNot(BeEmpty())
   504  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   505  			Expect(network1.Driver).To(Equal("bridge"))
   506  			Expect(network1.Subnets).To(HaveLen(1))
   507  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet))
   508  			Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.0.0.1"))
   509  			Expect(network1.Subnets[0].LeaseRange.StartIP.String()).To(Equal(startIP))
   510  
   511  			endIP := "10.0.0.10"
   512  			network = types.Network{
   513  				Driver: "bridge",
   514  				Subnets: []types.Subnet{
   515  					{Subnet: n, LeaseRange: &types.LeaseRange{
   516  						EndIP: net.ParseIP(endIP),
   517  					}},
   518  				},
   519  			}
   520  			network1, err = libpodNet.NetworkCreate(network)
   521  			Expect(err).To(BeNil())
   522  			Expect(network1.Name).ToNot(BeEmpty())
   523  			Expect(filepath.Join(cniConfDir, network1.Name+".conflist")).To(BeARegularFile())
   524  			Expect(network1.ID).ToNot(BeEmpty())
   525  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   526  			Expect(network1.Driver).To(Equal("bridge"))
   527  			Expect(network1.Subnets).To(HaveLen(1))
   528  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet))
   529  			Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.0.0.1"))
   530  			Expect(network1.Subnets[0].LeaseRange.EndIP.String()).To(Equal(endIP))
   531  
   532  			network = types.Network{
   533  				Driver: "bridge",
   534  				Subnets: []types.Subnet{
   535  					{Subnet: n, LeaseRange: &types.LeaseRange{
   536  						StartIP: net.ParseIP(startIP),
   537  						EndIP:   net.ParseIP(endIP),
   538  					}},
   539  				},
   540  			}
   541  			network1, err = libpodNet.NetworkCreate(network)
   542  			Expect(err).To(BeNil())
   543  			Expect(network1.Name).ToNot(BeEmpty())
   544  			Expect(network1.ID).ToNot(BeEmpty())
   545  			Expect(network1.NetworkInterface).ToNot(BeEmpty())
   546  			Expect(network1.Driver).To(Equal("bridge"))
   547  			Expect(network1.Subnets).To(HaveLen(1))
   548  			Expect(network1.Subnets[0].Subnet.String()).To(Equal(subnet))
   549  			Expect(network1.Subnets[0].Gateway.String()).To(Equal("10.0.0.1"))
   550  			Expect(network1.Subnets[0].LeaseRange.StartIP.String()).To(Equal(startIP))
   551  			Expect(network1.Subnets[0].LeaseRange.EndIP.String()).To(Equal(endIP))
   552  		})
   553  
   554  		It("create bridge with subnet and invalid lease range", func() {
   555  			subnet := "10.0.0.0/24"
   556  			n, _ := types.ParseCIDR(subnet)
   557  			startIP := "10.0.1.2"
   558  			network := types.Network{
   559  				Driver: "bridge",
   560  				Subnets: []types.Subnet{
   561  					{Subnet: n, LeaseRange: &types.LeaseRange{
   562  						StartIP: net.ParseIP(startIP),
   563  					}},
   564  				},
   565  			}
   566  			_, err := libpodNet.NetworkCreate(network)
   567  			Expect(err).To(HaveOccurred())
   568  			Expect(err.Error()).To(ContainSubstring("not in subnet"))
   569  
   570  			endIP := "10.1.1.1"
   571  			network = types.Network{
   572  				Driver: "bridge",
   573  				Subnets: []types.Subnet{
   574  					{Subnet: n, LeaseRange: &types.LeaseRange{
   575  						EndIP: net.ParseIP(endIP),
   576  					}},
   577  				},
   578  			}
   579  			_, err = libpodNet.NetworkCreate(network)
   580  			Expect(err).To(HaveOccurred())
   581  			Expect(err.Error()).To(ContainSubstring("not in subnet"))
   582  		})
   583  
   584  		It("create bridge with broken subnet", func() {
   585  			network := types.Network{
   586  				Driver: "bridge",
   587  				Subnets: []types.Subnet{
   588  					{Subnet: types.IPNet{}},
   589  				},
   590  			}
   591  			_, err := libpodNet.NetworkCreate(network)
   592  			Expect(err).To(HaveOccurred())
   593  			Expect(err.Error()).To(ContainSubstring("subnet invalid"))
   594  		})
   595  
   596  		It("create network with name", func() {
   597  			name := "myname"
   598  			network := types.Network{
   599  				Name: name,
   600  			}
   601  			network1, err := libpodNet.NetworkCreate(network)
   602  			Expect(err).To(BeNil())
   603  			Expect(network1.Name).To(Equal(name))
   604  			Expect(network1.NetworkInterface).ToNot(Equal(name))
   605  			Expect(network1.Driver).To(Equal("bridge"))
   606  		})
   607  
   608  		It("create network with invalid name", func() {
   609  			name := "myname@some"
   610  			network := types.Network{
   611  				Name: name,
   612  			}
   613  			_, err := libpodNet.NetworkCreate(network)
   614  			Expect(err).To(HaveOccurred())
   615  		})
   616  
   617  		It("create network with name", func() {
   618  			name := "myname"
   619  			network := types.Network{
   620  				Name: name,
   621  			}
   622  			network1, err := libpodNet.NetworkCreate(network)
   623  			Expect(err).To(BeNil())
   624  			Expect(network1.Name).To(Equal(name))
   625  			Expect(network1.NetworkInterface).ToNot(Equal(name))
   626  			Expect(network1.Driver).To(Equal("bridge"))
   627  		})
   628  
   629  		It("create network with invalid name", func() {
   630  			name := "myname@some"
   631  			network := types.Network{
   632  				Name: name,
   633  			}
   634  			_, err := libpodNet.NetworkCreate(network)
   635  			Expect(err).To(HaveOccurred())
   636  		})
   637  
   638  		It("create network with interface name", func() {
   639  			name := "myname"
   640  			network := types.Network{
   641  				NetworkInterface: name,
   642  			}
   643  			network1, err := libpodNet.NetworkCreate(network)
   644  			Expect(err).To(BeNil())
   645  			Expect(network1.Name).ToNot(Equal(name))
   646  			Expect(network1.NetworkInterface).To(Equal(name))
   647  			Expect(network1.Driver).To(Equal("bridge"))
   648  		})
   649  
   650  		It("create network with invalid interface name", func() {
   651  			name := "myname@some"
   652  			network := types.Network{
   653  				NetworkInterface: name,
   654  			}
   655  			_, err := libpodNet.NetworkCreate(network)
   656  			Expect(err).To(HaveOccurred())
   657  		})
   658  
   659  		It("create network with ID should fail", func() {
   660  			id := "17f29b073143d8cd97b5bbe492bdeffec1c5fee55cc1fe2112c8b9335f8b6121"
   661  			network := types.Network{
   662  				ID: id,
   663  			}
   664  			_, err := libpodNet.NetworkCreate(network)
   665  			Expect(err).To(HaveOccurred())
   666  			Expect(err.Error()).To(ContainSubstring("ID can not be set for network create"))
   667  		})
   668  
   669  		It("create bridge with dns", func() {
   670  			network := types.Network{
   671  				Driver:     "bridge",
   672  				DNSEnabled: true,
   673  			}
   674  			network1, err := libpodNet.NetworkCreate(network)
   675  			Expect(err).To(BeNil())
   676  			Expect(network1.Driver).To(Equal("bridge"))
   677  			Expect(network1.DNSEnabled).To(BeTrue())
   678  			path := filepath.Join(cniConfDir, network1.Name+".conflist")
   679  			Expect(path).To(BeARegularFile())
   680  			grepInFile(path, `"type": "dnsname"`)
   681  		})
   682  
   683  		It("create bridge with internal", func() {
   684  			network := types.Network{
   685  				Driver:   "bridge",
   686  				Internal: true,
   687  			}
   688  			network1, err := libpodNet.NetworkCreate(network)
   689  			Expect(err).To(BeNil())
   690  			Expect(network1.Driver).To(Equal("bridge"))
   691  			Expect(network1.Subnets).To(HaveLen(1))
   692  			Expect(network1.Subnets[0].Subnet.String()).ToNot(BeEmpty())
   693  			Expect(network1.Subnets[0].Gateway).To(BeNil())
   694  			Expect(network1.Internal).To(BeTrue())
   695  		})
   696  
   697  		It("create network with labels", func() {
   698  			network := types.Network{
   699  				Labels: map[string]string{
   700  					"key": "value",
   701  				},
   702  			}
   703  			network1, err := libpodNet.NetworkCreate(network)
   704  			Expect(err).To(BeNil())
   705  			Expect(network1.Driver).To(Equal("bridge"))
   706  			Expect(network1.Labels).ToNot(BeNil())
   707  			Expect(network1.Labels).To(ContainElement("value"))
   708  		})
   709  
   710  		It("create network with mtu option", func() {
   711  			network := types.Network{
   712  				Options: map[string]string{
   713  					"mtu": "1500",
   714  				},
   715  			}
   716  			network1, err := libpodNet.NetworkCreate(network)
   717  			Expect(err).To(BeNil())
   718  			Expect(network1.Driver).To(Equal("bridge"))
   719  			Expect(network1.Options).ToNot(BeNil())
   720  			path := filepath.Join(cniConfDir, network1.Name+".conflist")
   721  			Expect(path).To(BeARegularFile())
   722  			grepInFile(path, `"mtu": 1500,`)
   723  			Expect(network1.Options).To(HaveKeyWithValue("mtu", "1500"))
   724  		})
   725  
   726  		It("create network with invalid mtu option", func() {
   727  			network := types.Network{
   728  				Options: map[string]string{
   729  					"mtu": "abc",
   730  				},
   731  			}
   732  			_, err := libpodNet.NetworkCreate(network)
   733  			Expect(err).To(HaveOccurred())
   734  			Expect(err.Error()).To(ContainSubstring(`parsing "abc": invalid syntax`))
   735  
   736  			network = types.Network{
   737  				Options: map[string]string{
   738  					"mtu": "-1",
   739  				},
   740  			}
   741  			_, err = libpodNet.NetworkCreate(network)
   742  			Expect(err).To(HaveOccurred())
   743  			Expect(err.Error()).To(ContainSubstring(`mtu -1 is less than zero`))
   744  		})
   745  
   746  		It("create macvlan network with mtu option", func() {
   747  			network := types.Network{
   748  				Driver: "macvlan",
   749  				Options: map[string]string{
   750  					"mtu": "1500",
   751  				},
   752  			}
   753  			network1, err := libpodNet.NetworkCreate(network)
   754  			Expect(err).To(BeNil())
   755  			Expect(network1.Driver).To(Equal("macvlan"))
   756  			Expect(network1.Options).ToNot(BeNil())
   757  			path := filepath.Join(cniConfDir, network1.Name+".conflist")
   758  			Expect(path).To(BeARegularFile())
   759  			grepInFile(path, `"mtu": 1500`)
   760  			Expect(network1.Options).To(HaveKeyWithValue("mtu", "1500"))
   761  		})
   762  
   763  		It("create network with vlan option", func() {
   764  			network := types.Network{
   765  				Options: map[string]string{
   766  					"vlan": "5",
   767  				},
   768  			}
   769  			network1, err := libpodNet.NetworkCreate(network)
   770  			Expect(err).To(BeNil())
   771  			Expect(network1.Driver).To(Equal("bridge"))
   772  			Expect(network1.Options).ToNot(BeNil())
   773  			path := filepath.Join(cniConfDir, network1.Name+".conflist")
   774  			Expect(path).To(BeARegularFile())
   775  			grepInFile(path, `"vlan": 5,`)
   776  			Expect(network1.Options).To(HaveKeyWithValue("vlan", "5"))
   777  		})
   778  
   779  		It("create network with invalid vlan option", func() {
   780  			network := types.Network{
   781  				Options: map[string]string{
   782  					"vlan": "abc",
   783  				},
   784  			}
   785  			_, err := libpodNet.NetworkCreate(network)
   786  			Expect(err).To(HaveOccurred())
   787  			Expect(err.Error()).To(ContainSubstring(`parsing "abc": invalid syntax`))
   788  
   789  			network = types.Network{
   790  				Options: map[string]string{
   791  					"vlan": "-1",
   792  				},
   793  			}
   794  			_, err = libpodNet.NetworkCreate(network)
   795  			Expect(err).To(HaveOccurred())
   796  			Expect(err.Error()).To(ContainSubstring(`vlan ID -1 must be between 0 and 4094`))
   797  		})
   798  
   799  		It("network create unsupported option", func() {
   800  			network := types.Network{Options: map[string]string{
   801  				"someopt": "",
   802  			}}
   803  			_, err := libpodNet.NetworkCreate(network)
   804  			Expect(err).To(HaveOccurred())
   805  			Expect(err.Error()).To(ContainSubstring("unsupported network option someopt"))
   806  		})
   807  
   808  		It("network create unsupported driver", func() {
   809  			network := types.Network{
   810  				Driver: "someDriver",
   811  			}
   812  			_, err := libpodNet.NetworkCreate(network)
   813  			Expect(err).To(HaveOccurred())
   814  			Expect(err.Error()).To(ContainSubstring("unsupported driver someDriver"))
   815  		})
   816  
   817  		It("network create internal and dns", func() {
   818  			network := types.Network{
   819  				Driver:     "bridge",
   820  				Internal:   true,
   821  				DNSEnabled: true,
   822  			}
   823  			network1, err := libpodNet.NetworkCreate(network)
   824  			Expect(err).To(BeNil())
   825  			Expect(network1.Driver).To(Equal("bridge"))
   826  			Expect(network1.Subnets).To(HaveLen(1))
   827  			Expect(network1.Subnets[0].Subnet.String()).ToNot(BeEmpty())
   828  			Expect(network1.Subnets[0].Gateway).To(BeNil())
   829  			Expect(network1.Internal).To(BeTrue())
   830  			// internal and dns does not work, dns should be disabled
   831  			Expect(network1.DNSEnabled).To(BeFalse())
   832  			logString := logBuffer.String()
   833  			Expect(logString).To(ContainSubstring("dnsname and internal networks are incompatible"))
   834  		})
   835  
   836  		It("create config with podman machine plugin", func() {
   837  			libpodNet, err := getNetworkInterface(cniConfDir, true)
   838  			Expect(err).To(BeNil())
   839  
   840  			network := types.Network{}
   841  			network1, err := libpodNet.NetworkCreate(network)
   842  			Expect(err).To(BeNil())
   843  			Expect(network1.Driver).To(Equal("bridge"))
   844  			path := filepath.Join(cniConfDir, network1.Name+".conflist")
   845  			Expect(path).To(BeARegularFile())
   846  			grepInFile(path, `"type": "podman-machine",`)
   847  		})
   848  
   849  		It("network inspect partial ID", func() {
   850  			network := types.Network{Name: "net4"}
   851  			network1, err := libpodNet.NetworkCreate(network)
   852  			Expect(err).To(BeNil())
   853  			Expect(network1.ID).To(Equal("b44b7426c006839e7fe6f15d1faf64db58079d5233cba09b43be2257c1652cf5"))
   854  			network = types.Network{Name: "net5"}
   855  			network1, err = libpodNet.NetworkCreate(network)
   856  			Expect(err).To(BeNil())
   857  			Expect(network1.ID).To(Equal("b67e86fb039828ad686aa13667975b9e51f192eb617044faf06cded9d31602af"))
   858  
   859  			// Note ID is the sha256 from the name
   860  			// both net4 and net5 have an ID starting with b...
   861  			_, err = libpodNet.NetworkInspect("b")
   862  			Expect(err).To(HaveOccurred())
   863  			Expect(err.Error()).To(ContainSubstring("more than one result for network ID"))
   864  		})
   865  
   866  		It("network create two with same name", func() {
   867  			network := types.Network{Name: "net"}
   868  			network1, err := libpodNet.NetworkCreate(network)
   869  			Expect(err).To(BeNil())
   870  			Expect(network1.Name).To(Equal("net"))
   871  			network = types.Network{Name: "net"}
   872  			_, err = libpodNet.NetworkCreate(network)
   873  			Expect(err).To(HaveOccurred())
   874  			Expect(err.Error()).To(ContainSubstring("network name net already used"))
   875  		})
   876  
   877  		It("remove default network config should fail", func() {
   878  			err := libpodNet.NetworkRemove("podman")
   879  			Expect(err).To(HaveOccurred())
   880  			Expect(err.Error()).To(Equal("default network podman cannot be removed"))
   881  
   882  			network, err := libpodNet.NetworkInspect("podman")
   883  			Expect(err).To(BeNil())
   884  			err = libpodNet.NetworkRemove(network.ID)
   885  			Expect(err).To(HaveOccurred())
   886  			Expect(err.Error()).To(Equal("default network podman cannot be removed"))
   887  		})
   888  
   889  	})
   890  
   891  	Context("network load valid existing ones", func() {
   892  
   893  		BeforeEach(func() {
   894  			dir := "testfiles/valid"
   895  			files, err := ioutil.ReadDir(dir)
   896  			if err != nil {
   897  				Fail("Failed to read test directory")
   898  			}
   899  			for _, file := range files {
   900  				filename := file.Name()
   901  				data, err := ioutil.ReadFile(filepath.Join(dir, filename))
   902  				if err != nil {
   903  					Fail("Failed to copy test files")
   904  				}
   905  				err = ioutil.WriteFile(filepath.Join(cniConfDir, filename), data, 0700)
   906  				if err != nil {
   907  					Fail("Failed to copy test files")
   908  				}
   909  			}
   910  		})
   911  
   912  		It("load networks from disk", func() {
   913  			nets, err := libpodNet.NetworkList()
   914  			Expect(err).To(BeNil())
   915  			Expect(nets).To(HaveLen(9))
   916  			// test the we do not show logrus warnings/errors
   917  			logString := logBuffer.String()
   918  			Expect(logString).To(BeEmpty())
   919  		})
   920  
   921  		It("change network struct fields should not affect network struct in the backend", func() {
   922  			nets, err := libpodNet.NetworkList()
   923  			Expect(err).To(BeNil())
   924  			Expect(nets).To(HaveLen(9))
   925  
   926  			nets[0].Name = "myname"
   927  			nets, err = libpodNet.NetworkList()
   928  			Expect(err).To(BeNil())
   929  			Expect(nets).To(HaveLen(9))
   930  			Expect(nets).ToNot(ContainElement(HaveNetworkName("myname")))
   931  
   932  			network, err := libpodNet.NetworkInspect("bridge")
   933  			Expect(err).To(BeNil())
   934  			network.NetworkInterface = "abc"
   935  
   936  			network, err = libpodNet.NetworkInspect("bridge")
   937  			Expect(err).To(BeNil())
   938  			Expect(network.NetworkInterface).ToNot(Equal("abc"))
   939  		})
   940  
   941  		It("bridge network", func() {
   942  			network, err := libpodNet.NetworkInspect("bridge")
   943  			Expect(err).To(BeNil())
   944  			Expect(network.Name).To(Equal("bridge"))
   945  			Expect(network.ID).To(HaveLen(64))
   946  			Expect(network.NetworkInterface).To(Equal("cni-podman9"))
   947  			Expect(network.Driver).To(Equal("bridge"))
   948  			Expect(network.Subnets).To(HaveLen(1))
   949  			Expect(network.Subnets[0].Subnet.String()).To(Equal("10.89.8.0/24"))
   950  			Expect(network.Subnets[0].Gateway.String()).To(Equal("10.89.8.1"))
   951  			Expect(network.Subnets[0].LeaseRange).ToNot(BeNil())
   952  			Expect(network.Subnets[0].LeaseRange.StartIP.String()).To(Equal("10.89.8.20"))
   953  			Expect(network.Subnets[0].LeaseRange.EndIP.String()).To(Equal("10.89.8.50"))
   954  			Expect(network.Internal).To(BeFalse())
   955  		})
   956  
   957  		It("macvlan network", func() {
   958  			network, err := libpodNet.NetworkInspect("macvlan")
   959  			Expect(err).To(BeNil())
   960  			Expect(network.Name).To(Equal("macvlan"))
   961  			Expect(network.ID).To(HaveLen(64))
   962  			Expect(network.NetworkInterface).To(Equal("lo"))
   963  			Expect(network.Driver).To(Equal("macvlan"))
   964  			Expect(network.Subnets).To(HaveLen(0))
   965  			// DHCP
   966  		})
   967  
   968  		It("internal network", func() {
   969  			network, err := libpodNet.NetworkInspect("internal")
   970  			Expect(err).To(BeNil())
   971  			Expect(network.Name).To(Equal("internal"))
   972  			Expect(network.ID).To(HaveLen(64))
   973  			Expect(network.NetworkInterface).To(Equal("cni-podman8"))
   974  			Expect(network.Driver).To(Equal("bridge"))
   975  			Expect(network.Subnets).To(HaveLen(1))
   976  			Expect(network.Subnets[0].Subnet.String()).To(Equal("10.89.7.0/24"))
   977  			Expect(network.Subnets[0].Gateway).To(BeNil())
   978  			Expect(network.Internal).To(BeTrue())
   979  		})
   980  
   981  		It("bridge network with mtu", func() {
   982  			network, err := libpodNet.NetworkInspect("mtu")
   983  			Expect(err).To(BeNil())
   984  			Expect(network.Name).To(Equal("mtu"))
   985  			Expect(network.ID).To(HaveLen(64))
   986  			Expect(network.NetworkInterface).To(Equal("cni-podman13"))
   987  			Expect(network.Driver).To(Equal("bridge"))
   988  			Expect(network.Subnets).To(HaveLen(1))
   989  			Expect(network.Subnets[0].Subnet.String()).To(Equal("10.89.11.0/24"))
   990  			Expect(network.Subnets[0].Gateway.String()).To(Equal("10.89.11.1"))
   991  			Expect(network.Internal).To(BeFalse())
   992  			Expect(network.Options).To(HaveLen(1))
   993  			Expect(network.Options).To(HaveKeyWithValue("mtu", "1500"))
   994  		})
   995  
   996  		It("macvlan network with mtu", func() {
   997  			network, err := libpodNet.NetworkInspect("macvlan_mtu")
   998  			Expect(err).To(BeNil())
   999  			Expect(network.Name).To(Equal("macvlan_mtu"))
  1000  			Expect(network.ID).To(HaveLen(64))
  1001  			Expect(network.NetworkInterface).To(Equal("lo"))
  1002  			Expect(network.Driver).To(Equal("macvlan"))
  1003  			Expect(network.Subnets).To(HaveLen(0))
  1004  			Expect(network.Internal).To(BeFalse())
  1005  			Expect(network.Options).To(HaveLen(1))
  1006  			Expect(network.Options).To(HaveKeyWithValue("mtu", "1300"))
  1007  			Expect(network.IPAMOptions).To(HaveLen(1))
  1008  			Expect(network.IPAMOptions).To(HaveKeyWithValue("driver", "dhcp"))
  1009  		})
  1010  
  1011  		It("bridge network with vlan", func() {
  1012  			network, err := libpodNet.NetworkInspect("vlan")
  1013  			Expect(err).To(BeNil())
  1014  			Expect(network.Name).To(Equal("vlan"))
  1015  			Expect(network.ID).To(HaveLen(64))
  1016  			Expect(network.NetworkInterface).To(Equal("cni-podman14"))
  1017  			Expect(network.Driver).To(Equal("bridge"))
  1018  			Expect(network.Subnets).To(HaveLen(1))
  1019  			Expect(network.Options).To(HaveLen(1))
  1020  			Expect(network.Options).To(HaveKeyWithValue("vlan", "5"))
  1021  		})
  1022  
  1023  		It("bridge network with labels", func() {
  1024  			network, err := libpodNet.NetworkInspect("label")
  1025  			Expect(err).To(BeNil())
  1026  			Expect(network.Name).To(Equal("label"))
  1027  			Expect(network.ID).To(HaveLen(64))
  1028  			Expect(network.NetworkInterface).To(Equal("cni-podman15"))
  1029  			Expect(network.Driver).To(Equal("bridge"))
  1030  			Expect(network.Subnets).To(HaveLen(1))
  1031  			Expect(network.Labels).To(HaveLen(1))
  1032  			Expect(network.Labels).To(HaveKeyWithValue("mykey", "value"))
  1033  		})
  1034  
  1035  		It("dual stack network", func() {
  1036  			network, err := libpodNet.NetworkInspect("dualstack")
  1037  			Expect(err).To(BeNil())
  1038  			Expect(network.Name).To(Equal("dualstack"))
  1039  			Expect(network.ID).To(HaveLen(64))
  1040  			Expect(network.NetworkInterface).To(Equal("cni-podman21"))
  1041  			Expect(network.Driver).To(Equal("bridge"))
  1042  			Expect(network.Subnets).To(HaveLen(2))
  1043  
  1044  			sub1, _ := types.ParseCIDR("fd10:88:a::/64")
  1045  			sub2, _ := types.ParseCIDR("10.89.19.0/24")
  1046  			Expect(network.Subnets).To(ContainElements(
  1047  				types.Subnet{Subnet: sub1, Gateway: net.ParseIP("fd10:88:a::1")},
  1048  				types.Subnet{Subnet: sub2, Gateway: net.ParseIP("10.89.19.10").To4()},
  1049  			))
  1050  		})
  1051  
  1052  		It("network list with filters (name)", func() {
  1053  			filters := map[string][]string{
  1054  				"name": {"internal", "bridge"},
  1055  			}
  1056  			filterFuncs, err := util.GenerateNetworkFilters(filters)
  1057  			Expect(err).To(BeNil())
  1058  
  1059  			networks, err := libpodNet.NetworkList(filterFuncs...)
  1060  			Expect(err).To(BeNil())
  1061  			Expect(networks).To(HaveLen(2))
  1062  			Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge")))
  1063  		})
  1064  
  1065  		It("network list with filters (partial name)", func() {
  1066  			filters := map[string][]string{
  1067  				"name": {"inte", "bri"},
  1068  			}
  1069  			filterFuncs, err := util.GenerateNetworkFilters(filters)
  1070  			Expect(err).To(BeNil())
  1071  
  1072  			networks, err := libpodNet.NetworkList(filterFuncs...)
  1073  			Expect(err).To(BeNil())
  1074  			Expect(networks).To(HaveLen(2))
  1075  			Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge")))
  1076  		})
  1077  
  1078  		It("network list with filters (id)", func() {
  1079  			filters := map[string][]string{
  1080  				"id": {"3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f", "17f29b073143d8cd97b5bbe492bdeffec1c5fee55cc1fe2112c8b9335f8b6121"},
  1081  			}
  1082  			filterFuncs, err := util.GenerateNetworkFilters(filters)
  1083  			Expect(err).To(BeNil())
  1084  
  1085  			networks, err := libpodNet.NetworkList(filterFuncs...)
  1086  			Expect(err).To(BeNil())
  1087  			Expect(networks).To(HaveLen(2))
  1088  			Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge")))
  1089  		})
  1090  
  1091  		It("network list with filters (id)", func() {
  1092  			filters := map[string][]string{
  1093  				"id": {"3bed2cb3a3acf7b6a8ef408420cc682d5520e26976d354254f528c965612054f", "17f29b073143d8cd97b5bbe492bdeffec1c5fee55cc1fe2112c8b9335f8b6121"},
  1094  			}
  1095  			filterFuncs, err := util.GenerateNetworkFilters(filters)
  1096  			Expect(err).To(BeNil())
  1097  
  1098  			networks, err := libpodNet.NetworkList(filterFuncs...)
  1099  			Expect(err).To(BeNil())
  1100  			Expect(networks).To(HaveLen(2))
  1101  			Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge")))
  1102  		})
  1103  
  1104  		It("network list with filters (partial id)", func() {
  1105  			filters := map[string][]string{
  1106  				"id": {"3bed2cb3a3acf7b6a8ef408420", "17f29b073143d8cd97b5bbe492bde"},
  1107  			}
  1108  			filterFuncs, err := util.GenerateNetworkFilters(filters)
  1109  			Expect(err).To(BeNil())
  1110  
  1111  			networks, err := libpodNet.NetworkList(filterFuncs...)
  1112  			Expect(err).To(BeNil())
  1113  			Expect(networks).To(HaveLen(2))
  1114  			Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge")))
  1115  		})
  1116  
  1117  		It("network list with filters (driver)", func() {
  1118  			filters := map[string][]string{
  1119  				"driver": {"bridge", "macvlan"},
  1120  			}
  1121  			filterFuncs, err := util.GenerateNetworkFilters(filters)
  1122  			Expect(err).To(BeNil())
  1123  
  1124  			networks, err := libpodNet.NetworkList(filterFuncs...)
  1125  			Expect(err).To(BeNil())
  1126  			Expect(networks).To(HaveLen(9))
  1127  			Expect(networks).To(ConsistOf(HaveNetworkName("internal"), HaveNetworkName("bridge"),
  1128  				HaveNetworkName("mtu"), HaveNetworkName("vlan"), HaveNetworkName("podman"),
  1129  				HaveNetworkName("label"), HaveNetworkName("macvlan"), HaveNetworkName("macvlan_mtu"), HaveNetworkName("dualstack")))
  1130  		})
  1131  
  1132  		It("network list with filters (label)", func() {
  1133  			filters := map[string][]string{
  1134  				"label": {"mykey"},
  1135  			}
  1136  			filterFuncs, err := util.GenerateNetworkFilters(filters)
  1137  			Expect(err).To(BeNil())
  1138  
  1139  			networks, err := libpodNet.NetworkList(filterFuncs...)
  1140  			Expect(err).To(BeNil())
  1141  			Expect(networks).To(HaveLen(1))
  1142  			Expect(networks).To(ConsistOf(HaveNetworkName("label")))
  1143  
  1144  			filters = map[string][]string{
  1145  				"label": {"mykey=value"},
  1146  			}
  1147  			filterFuncs, err = util.GenerateNetworkFilters(filters)
  1148  			Expect(err).To(BeNil())
  1149  
  1150  			networks, err = libpodNet.NetworkList(filterFuncs...)
  1151  			Expect(err).To(BeNil())
  1152  			Expect(networks).To(HaveLen(1))
  1153  			Expect(networks).To(ConsistOf(HaveNetworkName("label")))
  1154  		})
  1155  
  1156  		It("network list with filters", func() {
  1157  			filters := map[string][]string{
  1158  				"driver": {"bridge"},
  1159  				"label":  {"mykey"},
  1160  			}
  1161  			filterFuncs, err := util.GenerateNetworkFilters(filters)
  1162  			Expect(err).To(BeNil())
  1163  			Expect(filterFuncs).To(HaveLen(2))
  1164  
  1165  			networks, err := libpodNet.NetworkList(filterFuncs...)
  1166  			Expect(err).To(BeNil())
  1167  			Expect(networks).To(HaveLen(1))
  1168  			Expect(networks).To(ConsistOf(HaveNetworkName("label")))
  1169  
  1170  			filters = map[string][]string{
  1171  				"driver": {"macvlan"},
  1172  				"label":  {"mykey"},
  1173  			}
  1174  			filterFuncs, err = util.GenerateNetworkFilters(filters)
  1175  			Expect(err).To(BeNil())
  1176  
  1177  			networks, err = libpodNet.NetworkList(filterFuncs...)
  1178  			Expect(err).To(BeNil())
  1179  			Expect(networks).To(HaveLen(0))
  1180  		})
  1181  
  1182  		It("crate bridge network with used interface name", func() {
  1183  			network := types.Network{
  1184  				NetworkInterface: "cni-podman9",
  1185  			}
  1186  			_, err := libpodNet.NetworkCreate(network)
  1187  			Expect(err).To(HaveOccurred())
  1188  			Expect(err.Error()).To(ContainSubstring("bridge name cni-podman9 already in use"))
  1189  		})
  1190  	})
  1191  
  1192  	Context("network load invalid existing ones", func() {
  1193  
  1194  		BeforeEach(func() {
  1195  			dir := "testfiles/invalid"
  1196  			files, err := ioutil.ReadDir(dir)
  1197  			if err != nil {
  1198  				Fail("Failed to read test directory")
  1199  			}
  1200  			for _, file := range files {
  1201  				filename := file.Name()
  1202  				data, err := ioutil.ReadFile(filepath.Join(dir, filename))
  1203  				if err != nil {
  1204  					Fail("Failed to copy test files")
  1205  				}
  1206  				err = ioutil.WriteFile(filepath.Join(cniConfDir, filename), data, 0700)
  1207  				if err != nil {
  1208  					Fail("Failed to copy test files")
  1209  				}
  1210  			}
  1211  		})
  1212  
  1213  		It("load invalid networks from disk", func() {
  1214  			nets, err := libpodNet.NetworkList()
  1215  			Expect(err).To(BeNil())
  1216  			Expect(nets).To(HaveLen(2))
  1217  			logString := logBuffer.String()
  1218  			Expect(logString).To(ContainSubstring("noname.conflist: error parsing configuration list: no name"))
  1219  			Expect(logString).To(ContainSubstring("noplugin.conflist: error parsing configuration list: no plugins in list"))
  1220  			Expect(logString).To(ContainSubstring("invalidname.conflist has invalid name, skipping: names must match"))
  1221  			Expect(logString).To(ContainSubstring("has the same network name as"))
  1222  			Expect(logString).To(ContainSubstring("broken.conflist: error parsing configuration list"))
  1223  			Expect(logString).To(ContainSubstring("invalid_gateway.conflist could not be converted to a libpod config, skipping: failed to parse gateway ip 10.89.8"))
  1224  		})
  1225  
  1226  	})
  1227  
  1228  })
  1229  
  1230  func grepInFile(path string, match string) {
  1231  	data, err := ioutil.ReadFile(path)
  1232  	ExpectWithOffset(1, err).To(BeNil())
  1233  	ExpectWithOffset(1, string(data)).To(ContainSubstring(match))
  1234  }
  1235  
  1236  // HaveNetworkName is a custom GomegaMatcher to match a network name
  1237  func HaveNetworkName(name string) gomegaTypes.GomegaMatcher {
  1238  	return WithTransform(func(e types.Network) string {
  1239  		return e.Name
  1240  	}, Equal(name))
  1241  }