github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/test/e2e/network_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strings"
     7  	"time"
     8  
     9  	"github.com/containers/podman/v2/pkg/rootless"
    10  	. "github.com/containers/podman/v2/test/utils"
    11  	"github.com/containers/storage/pkg/stringid"
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  )
    15  
    16  var _ = Describe("Podman network", func() {
    17  	var (
    18  		tempdir    string
    19  		err        error
    20  		podmanTest *PodmanTestIntegration
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		SkipIfRootless("rootless CNI is tech preview in RHEL 8.3.1")
    25  
    26  		tempdir, err = CreateTempDirInTempDir()
    27  		if err != nil {
    28  			os.Exit(1)
    29  		}
    30  		podmanTest = PodmanTestCreate(tempdir)
    31  		podmanTest.Setup()
    32  	})
    33  
    34  	AfterEach(func() {
    35  		podmanTest.Cleanup()
    36  		f := CurrentGinkgoTestDescription()
    37  		processTestResult(f)
    38  
    39  	})
    40  
    41  	It("podman network list", func() {
    42  		name, path := generateNetworkConfig(podmanTest)
    43  		defer removeConf(path)
    44  
    45  		session := podmanTest.Podman([]string{"network", "ls"})
    46  		session.WaitWithDefaultTimeout()
    47  		Expect(session.ExitCode()).To(Equal(0))
    48  		Expect(session.LineInOutputContains(name)).To(BeTrue())
    49  	})
    50  
    51  	It("podman network list -q", func() {
    52  		name, path := generateNetworkConfig(podmanTest)
    53  		defer removeConf(path)
    54  
    55  		session := podmanTest.Podman([]string{"network", "ls", "--quiet"})
    56  		session.WaitWithDefaultTimeout()
    57  		Expect(session.ExitCode()).To(Equal(0))
    58  		Expect(session.LineInOutputContains(name)).To(BeTrue())
    59  	})
    60  
    61  	It("podman network list --filter success", func() {
    62  		name, path := generateNetworkConfig(podmanTest)
    63  		defer removeConf(path)
    64  
    65  		session := podmanTest.Podman([]string{"network", "ls", "--filter", "plugin=bridge"})
    66  		session.WaitWithDefaultTimeout()
    67  		Expect(session.ExitCode()).To(Equal(0))
    68  		Expect(session.LineInOutputContains(name)).To(BeTrue())
    69  	})
    70  
    71  	It("podman network list --filter failure", func() {
    72  		name, path := generateNetworkConfig(podmanTest)
    73  		defer removeConf(path)
    74  
    75  		session := podmanTest.Podman([]string{"network", "ls", "--filter", "plugin=test"})
    76  		session.WaitWithDefaultTimeout()
    77  		Expect(session.ExitCode()).To(Equal(0))
    78  		Expect(session.LineInOutputContains(name)).To(BeFalse())
    79  	})
    80  
    81  	rm_func := func(rm string) {
    82  		It(fmt.Sprintf("podman network %s no args", rm), func() {
    83  			session := podmanTest.Podman([]string{"network", rm})
    84  			session.WaitWithDefaultTimeout()
    85  			Expect(session.ExitCode()).ToNot(BeZero())
    86  
    87  		})
    88  
    89  		It(fmt.Sprintf("podman network %s", rm), func() {
    90  			name, path := generateNetworkConfig(podmanTest)
    91  			defer removeConf(path)
    92  
    93  			session := podmanTest.Podman([]string{"network", "ls", "--quiet"})
    94  			session.WaitWithDefaultTimeout()
    95  			Expect(session.ExitCode()).To(Equal(0))
    96  			Expect(session.LineInOutputContains(name)).To(BeTrue())
    97  
    98  			rm := podmanTest.Podman([]string{"network", rm, name})
    99  			rm.WaitWithDefaultTimeout()
   100  			Expect(rm.ExitCode()).To(BeZero())
   101  
   102  			results := podmanTest.Podman([]string{"network", "ls", "--quiet"})
   103  			results.WaitWithDefaultTimeout()
   104  			Expect(results.ExitCode()).To(Equal(0))
   105  			Expect(results.LineInOutputContains(name)).To(BeFalse())
   106  		})
   107  	}
   108  
   109  	rm_func("rm")
   110  	rm_func("remove")
   111  
   112  	It("podman network inspect no args", func() {
   113  		session := podmanTest.Podman([]string{"network", "inspect"})
   114  		session.WaitWithDefaultTimeout()
   115  		Expect(session.ExitCode()).ToNot(BeZero())
   116  	})
   117  
   118  	It("podman network inspect", func() {
   119  		name, path := generateNetworkConfig(podmanTest)
   120  		defer removeConf(path)
   121  
   122  		expectedNetworks := []string{name}
   123  		if !rootless.IsRootless() {
   124  			// rootful image contains "podman/cni/87-podman-bridge.conflist" for "podman" network
   125  			expectedNetworks = append(expectedNetworks, "podman")
   126  		}
   127  		session := podmanTest.Podman(append([]string{"network", "inspect"}, expectedNetworks...))
   128  		session.WaitWithDefaultTimeout()
   129  		Expect(session.ExitCode()).To(Equal(0))
   130  		Expect(session.IsJSONOutputValid()).To(BeTrue())
   131  	})
   132  
   133  	It("podman network inspect", func() {
   134  		name, path := generateNetworkConfig(podmanTest)
   135  		defer removeConf(path)
   136  
   137  		session := podmanTest.Podman([]string{"network", "inspect", name, "--format", "{{.cniVersion}}"})
   138  		session.WaitWithDefaultTimeout()
   139  		Expect(session.ExitCode()).To(Equal(0))
   140  		Expect(session.LineInOutputContains("0.3.0")).To(BeTrue())
   141  	})
   142  
   143  	It("podman inspect container single CNI network", func() {
   144  		netName := "testNetSingleCNI"
   145  		network := podmanTest.Podman([]string{"network", "create", "--subnet", "10.50.50.0/24", netName})
   146  		network.WaitWithDefaultTimeout()
   147  		Expect(network.ExitCode()).To(BeZero())
   148  		defer podmanTest.removeCNINetwork(netName)
   149  
   150  		ctrName := "testCtr"
   151  		container := podmanTest.Podman([]string{"run", "-dt", "--network", netName, "--name", ctrName, ALPINE, "top"})
   152  		container.WaitWithDefaultTimeout()
   153  		Expect(container.ExitCode()).To(BeZero())
   154  
   155  		inspect := podmanTest.Podman([]string{"inspect", ctrName})
   156  		inspect.WaitWithDefaultTimeout()
   157  		Expect(inspect.ExitCode()).To(BeZero())
   158  		conData := inspect.InspectContainerToJSON()
   159  		Expect(len(conData)).To(Equal(1))
   160  		Expect(len(conData[0].NetworkSettings.Networks)).To(Equal(1))
   161  		net, ok := conData[0].NetworkSettings.Networks[netName]
   162  		Expect(ok).To(BeTrue())
   163  		Expect(net.NetworkID).To(Equal(netName))
   164  		Expect(net.IPPrefixLen).To(Equal(24))
   165  		Expect(strings.HasPrefix(net.IPAddress, "10.50.50.")).To(BeTrue())
   166  
   167  		// Necessary to ensure the CNI network is removed cleanly
   168  		rmAll := podmanTest.Podman([]string{"rm", "-f", ctrName})
   169  		rmAll.WaitWithDefaultTimeout()
   170  		Expect(rmAll.ExitCode()).To(BeZero())
   171  	})
   172  
   173  	It("podman inspect container two CNI networks (container not running)", func() {
   174  		netName1 := "testNetThreeCNI1"
   175  		network1 := podmanTest.Podman([]string{"network", "create", netName1})
   176  		network1.WaitWithDefaultTimeout()
   177  		Expect(network1.ExitCode()).To(BeZero())
   178  		defer podmanTest.removeCNINetwork(netName1)
   179  
   180  		netName2 := "testNetThreeCNI2"
   181  		network2 := podmanTest.Podman([]string{"network", "create", netName2})
   182  		network2.WaitWithDefaultTimeout()
   183  		Expect(network2.ExitCode()).To(BeZero())
   184  		defer podmanTest.removeCNINetwork(netName2)
   185  
   186  		ctrName := "testCtr"
   187  		container := podmanTest.Podman([]string{"create", "--network", fmt.Sprintf("%s,%s", netName1, netName2), "--name", ctrName, ALPINE, "top"})
   188  		container.WaitWithDefaultTimeout()
   189  		Expect(container.ExitCode()).To(BeZero())
   190  
   191  		inspect := podmanTest.Podman([]string{"inspect", ctrName})
   192  		inspect.WaitWithDefaultTimeout()
   193  		Expect(inspect.ExitCode()).To(BeZero())
   194  		conData := inspect.InspectContainerToJSON()
   195  		Expect(len(conData)).To(Equal(1))
   196  		Expect(len(conData[0].NetworkSettings.Networks)).To(Equal(2))
   197  		net1, ok := conData[0].NetworkSettings.Networks[netName1]
   198  		Expect(ok).To(BeTrue())
   199  		Expect(net1.NetworkID).To(Equal(netName1))
   200  		net2, ok := conData[0].NetworkSettings.Networks[netName2]
   201  		Expect(ok).To(BeTrue())
   202  		Expect(net2.NetworkID).To(Equal(netName2))
   203  
   204  		// Necessary to ensure the CNI network is removed cleanly
   205  		rmAll := podmanTest.Podman([]string{"rm", "-f", ctrName})
   206  		rmAll.WaitWithDefaultTimeout()
   207  		Expect(rmAll.ExitCode()).To(BeZero())
   208  	})
   209  
   210  	It("podman inspect container two CNI networks", func() {
   211  		netName1 := "testNetTwoCNI1"
   212  		network1 := podmanTest.Podman([]string{"network", "create", "--subnet", "10.50.51.0/25", netName1})
   213  		network1.WaitWithDefaultTimeout()
   214  		Expect(network1.ExitCode()).To(BeZero())
   215  		defer podmanTest.removeCNINetwork(netName1)
   216  
   217  		netName2 := "testNetTwoCNI2"
   218  		network2 := podmanTest.Podman([]string{"network", "create", "--subnet", "10.50.51.128/26", netName2})
   219  		network2.WaitWithDefaultTimeout()
   220  		Expect(network2.ExitCode()).To(BeZero())
   221  		defer podmanTest.removeCNINetwork(netName2)
   222  
   223  		ctrName := "testCtr"
   224  		container := podmanTest.Podman([]string{"run", "-dt", "--network", fmt.Sprintf("%s,%s", netName1, netName2), "--name", ctrName, ALPINE, "top"})
   225  		container.WaitWithDefaultTimeout()
   226  		Expect(container.ExitCode()).To(BeZero())
   227  
   228  		inspect := podmanTest.Podman([]string{"inspect", ctrName})
   229  		inspect.WaitWithDefaultTimeout()
   230  		Expect(inspect.ExitCode()).To(BeZero())
   231  		conData := inspect.InspectContainerToJSON()
   232  		Expect(len(conData)).To(Equal(1))
   233  		Expect(len(conData[0].NetworkSettings.Networks)).To(Equal(2))
   234  		net1, ok := conData[0].NetworkSettings.Networks[netName1]
   235  		Expect(ok).To(BeTrue())
   236  		Expect(net1.NetworkID).To(Equal(netName1))
   237  		Expect(net1.IPPrefixLen).To(Equal(25))
   238  		Expect(strings.HasPrefix(net1.IPAddress, "10.50.51.")).To(BeTrue())
   239  		net2, ok := conData[0].NetworkSettings.Networks[netName2]
   240  		Expect(ok).To(BeTrue())
   241  		Expect(net2.NetworkID).To(Equal(netName2))
   242  		Expect(net2.IPPrefixLen).To(Equal(26))
   243  		Expect(strings.HasPrefix(net2.IPAddress, "10.50.51.")).To(BeTrue())
   244  
   245  		// Necessary to ensure the CNI network is removed cleanly
   246  		rmAll := podmanTest.Podman([]string{"rm", "-f", ctrName})
   247  		rmAll.WaitWithDefaultTimeout()
   248  		Expect(rmAll.ExitCode()).To(BeZero())
   249  	})
   250  
   251  	It("podman network remove bogus", func() {
   252  		session := podmanTest.Podman([]string{"network", "rm", "bogus"})
   253  		session.WaitWithDefaultTimeout()
   254  		Expect(session.ExitCode()).To(Equal(1))
   255  	})
   256  
   257  	It("podman network remove --force with pod", func() {
   258  		netName := "testnet"
   259  		session := podmanTest.Podman([]string{"network", "create", netName})
   260  		session.WaitWithDefaultTimeout()
   261  		Expect(session.ExitCode()).To(BeZero())
   262  		defer podmanTest.removeCNINetwork(netName)
   263  
   264  		session = podmanTest.Podman([]string{"pod", "create", "--network", netName})
   265  		session.WaitWithDefaultTimeout()
   266  		Expect(session.ExitCode()).To(BeZero())
   267  		podID := session.OutputToString()
   268  
   269  		session = podmanTest.Podman([]string{"create", "--pod", podID, ALPINE})
   270  		session.WaitWithDefaultTimeout()
   271  		Expect(session.ExitCode()).To(BeZero())
   272  
   273  		session = podmanTest.Podman([]string{"network", "rm", netName})
   274  		session.WaitWithDefaultTimeout()
   275  		Expect(session.ExitCode()).To(Equal(2))
   276  
   277  		session = podmanTest.Podman([]string{"network", "rm", "--force", netName})
   278  		session.WaitWithDefaultTimeout()
   279  		Expect(session.ExitCode()).To(BeZero())
   280  
   281  		// check if pod is deleted
   282  		session = podmanTest.Podman([]string{"pod", "exists", podID})
   283  		session.WaitWithDefaultTimeout()
   284  		Expect(session.ExitCode()).To(Equal(1))
   285  
   286  		// check if net is deleted
   287  		session = podmanTest.Podman([]string{"network", "ls"})
   288  		session.WaitWithDefaultTimeout()
   289  		Expect(session.ExitCode()).To(BeZero())
   290  		Expect(session.OutputToString()).To(Not(ContainSubstring(netName)))
   291  	})
   292  
   293  	It("podman network remove with two networks", func() {
   294  		netName1 := "net1"
   295  		session := podmanTest.Podman([]string{"network", "create", netName1})
   296  		session.WaitWithDefaultTimeout()
   297  		Expect(session.ExitCode()).To(BeZero())
   298  		defer podmanTest.removeCNINetwork(netName1)
   299  
   300  		netName2 := "net2"
   301  		session = podmanTest.Podman([]string{"network", "create", netName2})
   302  		session.WaitWithDefaultTimeout()
   303  		Expect(session.ExitCode()).To(BeZero())
   304  		defer podmanTest.removeCNINetwork(netName2)
   305  
   306  		session = podmanTest.Podman([]string{"network", "rm", netName1, netName2})
   307  		session.WaitWithDefaultTimeout()
   308  		Expect(session.ExitCode()).To(BeZero())
   309  		lines := session.OutputToStringArray()
   310  		Expect(lines[0]).To(Equal(netName1))
   311  		Expect(lines[1]).To(Equal(netName2))
   312  	})
   313  	It("podman network with multiple aliases", func() {
   314  		Skip("Until DNSName is updated on our CI images")
   315  		var worked bool
   316  		netName := "aliasTest" + stringid.GenerateNonCryptoID()
   317  		session := podmanTest.Podman([]string{"network", "create", netName})
   318  		session.WaitWithDefaultTimeout()
   319  		Expect(session.ExitCode()).To(BeZero())
   320  		defer podmanTest.removeCNINetwork(netName)
   321  
   322  		top := podmanTest.Podman([]string{"run", "-dt", "--name=web", "--network=" + netName, "--network-alias=web1", "--network-alias=web2", nginx})
   323  		top.WaitWithDefaultTimeout()
   324  		Expect(top.ExitCode()).To(BeZero())
   325  		interval := time.Duration(250 * time.Millisecond)
   326  		// Wait for the nginx service to be running
   327  		for i := 0; i < 6; i++ {
   328  			// Test curl against the container's name
   329  			c1 := podmanTest.Podman([]string{"run", "--network=" + netName, nginx, "curl", "web"})
   330  			c1.WaitWithDefaultTimeout()
   331  			worked = Expect(c1.ExitCode()).To(BeZero())
   332  			if worked {
   333  				break
   334  			}
   335  			time.Sleep(interval)
   336  			interval *= 2
   337  		}
   338  		Expect(worked).To(BeTrue())
   339  
   340  		// Nginx is now running so no need to do a loop
   341  		// Test against the first alias
   342  		c2 := podmanTest.Podman([]string{"run", "--network=" + netName, nginx, "curl", "web1"})
   343  		c2.WaitWithDefaultTimeout()
   344  		Expect(c2.ExitCode()).To(BeZero())
   345  
   346  		// Test against the second alias
   347  		c3 := podmanTest.Podman([]string{"run", "--network=" + netName, nginx, "curl", "web2"})
   348  		c3.WaitWithDefaultTimeout()
   349  		Expect(c3.ExitCode()).To(BeZero())
   350  	})
   351  
   352  	It("bad network name in disconnect should result in error", func() {
   353  		SkipIfRootless("network connect and disconnect are only rootfull")
   354  		dis := podmanTest.Podman([]string{"network", "disconnect", "foobar", "test"})
   355  		dis.WaitWithDefaultTimeout()
   356  		Expect(dis.ExitCode()).ToNot(BeZero())
   357  
   358  	})
   359  
   360  	It("bad container name in network disconnect should result in error", func() {
   361  		SkipIfRootless("network connect and disconnect are only rootfull")
   362  		netName := "aliasTest" + stringid.GenerateNonCryptoID()
   363  		session := podmanTest.Podman([]string{"network", "create", netName})
   364  		session.WaitWithDefaultTimeout()
   365  		Expect(session.ExitCode()).To(BeZero())
   366  		defer podmanTest.removeCNINetwork(netName)
   367  
   368  		dis := podmanTest.Podman([]string{"network", "disconnect", netName, "foobar"})
   369  		dis.WaitWithDefaultTimeout()
   370  		Expect(dis.ExitCode()).ToNot(BeZero())
   371  
   372  	})
   373  
   374  	It("podman network disconnect with invalid container state should result in error", func() {
   375  		SkipIfRootless("network connect and disconnect are only rootfull")
   376  		netName := "aliasTest" + stringid.GenerateNonCryptoID()
   377  		session := podmanTest.Podman([]string{"network", "create", netName})
   378  		session.WaitWithDefaultTimeout()
   379  		Expect(session.ExitCode()).To(BeZero())
   380  		defer podmanTest.removeCNINetwork(netName)
   381  
   382  		ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"})
   383  		ctr.WaitWithDefaultTimeout()
   384  		Expect(ctr.ExitCode()).To(BeZero())
   385  
   386  		dis := podmanTest.Podman([]string{"network", "disconnect", netName, "test"})
   387  		dis.WaitWithDefaultTimeout()
   388  		Expect(dis.ExitCode()).ToNot(BeZero())
   389  	})
   390  
   391  	It("podman network disconnect", func() {
   392  		SkipIfRootless("network connect and disconnect are only rootfull")
   393  		netName := "aliasTest" + stringid.GenerateNonCryptoID()
   394  		session := podmanTest.Podman([]string{"network", "create", netName})
   395  		session.WaitWithDefaultTimeout()
   396  		Expect(session.ExitCode()).To(BeZero())
   397  		defer podmanTest.removeCNINetwork(netName)
   398  
   399  		ctr := podmanTest.Podman([]string{"run", "-dt", "--name", "test", "--network", netName, ALPINE, "top"})
   400  		ctr.WaitWithDefaultTimeout()
   401  		Expect(ctr.ExitCode()).To(BeZero())
   402  
   403  		exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
   404  		exec.WaitWithDefaultTimeout()
   405  		Expect(exec.ExitCode()).To(BeZero())
   406  
   407  		dis := podmanTest.Podman([]string{"network", "disconnect", netName, "test"})
   408  		dis.WaitWithDefaultTimeout()
   409  		Expect(dis.ExitCode()).To(BeZero())
   410  
   411  		exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
   412  		exec.WaitWithDefaultTimeout()
   413  		Expect(exec.ExitCode()).ToNot(BeZero())
   414  	})
   415  
   416  	It("bad network name in connect should result in error", func() {
   417  		SkipIfRootless("network connect and disconnect are only rootfull")
   418  		dis := podmanTest.Podman([]string{"network", "connect", "foobar", "test"})
   419  		dis.WaitWithDefaultTimeout()
   420  		Expect(dis.ExitCode()).ToNot(BeZero())
   421  
   422  	})
   423  
   424  	It("bad container name in network connect should result in error", func() {
   425  		SkipIfRootless("network connect and disconnect are only rootfull")
   426  		netName := "aliasTest" + stringid.GenerateNonCryptoID()
   427  		session := podmanTest.Podman([]string{"network", "create", netName})
   428  		session.WaitWithDefaultTimeout()
   429  		Expect(session.ExitCode()).To(BeZero())
   430  		defer podmanTest.removeCNINetwork(netName)
   431  
   432  		dis := podmanTest.Podman([]string{"network", "connect", netName, "foobar"})
   433  		dis.WaitWithDefaultTimeout()
   434  		Expect(dis.ExitCode()).ToNot(BeZero())
   435  
   436  	})
   437  
   438  	It("podman connect on a container that already is connected to the network should error", func() {
   439  		SkipIfRootless("network connect and disconnect are only rootfull")
   440  		netName := "aliasTest" + stringid.GenerateNonCryptoID()
   441  		session := podmanTest.Podman([]string{"network", "create", netName})
   442  		session.WaitWithDefaultTimeout()
   443  		Expect(session.ExitCode()).To(BeZero())
   444  		defer podmanTest.removeCNINetwork(netName)
   445  
   446  		ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"})
   447  		ctr.WaitWithDefaultTimeout()
   448  		Expect(ctr.ExitCode()).To(BeZero())
   449  
   450  		con := podmanTest.Podman([]string{"network", "connect", netName, "test"})
   451  		con.WaitWithDefaultTimeout()
   452  		Expect(con.ExitCode()).ToNot(BeZero())
   453  	})
   454  
   455  	It("podman network connect with invalid container state should result in error", func() {
   456  		SkipIfRootless("network connect and disconnect are only rootfull")
   457  		netName := "aliasTest" + stringid.GenerateNonCryptoID()
   458  		session := podmanTest.Podman([]string{"network", "create", netName})
   459  		session.WaitWithDefaultTimeout()
   460  		Expect(session.ExitCode()).To(BeZero())
   461  		defer podmanTest.removeCNINetwork(netName)
   462  
   463  		ctr := podmanTest.Podman([]string{"create", "--name", "test", "--network", netName, ALPINE, "top"})
   464  		ctr.WaitWithDefaultTimeout()
   465  		Expect(ctr.ExitCode()).To(BeZero())
   466  
   467  		dis := podmanTest.Podman([]string{"network", "connect", netName, "test"})
   468  		dis.WaitWithDefaultTimeout()
   469  		Expect(dis.ExitCode()).ToNot(BeZero())
   470  	})
   471  
   472  	It("podman network connect", func() {
   473  		SkipIfRemote("This requires a pending PR to be merged before it will work")
   474  		SkipIfRootless("network connect and disconnect are only rootfull")
   475  		netName := "aliasTest" + stringid.GenerateNonCryptoID()
   476  		session := podmanTest.Podman([]string{"network", "create", netName})
   477  		session.WaitWithDefaultTimeout()
   478  		Expect(session.ExitCode()).To(BeZero())
   479  		defer podmanTest.removeCNINetwork(netName)
   480  
   481  		ctr := podmanTest.Podman([]string{"run", "-dt", "--name", "test", "--network", netName, ALPINE, "top"})
   482  		ctr.WaitWithDefaultTimeout()
   483  		Expect(ctr.ExitCode()).To(BeZero())
   484  
   485  		exec := podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth0"})
   486  		exec.WaitWithDefaultTimeout()
   487  		Expect(exec.ExitCode()).To(BeZero())
   488  
   489  		// Create a second network
   490  		newNetName := "aliasTest" + stringid.GenerateNonCryptoID()
   491  		session = podmanTest.Podman([]string{"network", "create", newNetName})
   492  		session.WaitWithDefaultTimeout()
   493  		Expect(session.ExitCode()).To(BeZero())
   494  		defer podmanTest.removeCNINetwork(newNetName)
   495  
   496  		connect := podmanTest.Podman([]string{"network", "connect", newNetName, "test"})
   497  		connect.WaitWithDefaultTimeout()
   498  		Expect(connect.ExitCode()).To(BeZero())
   499  
   500  		exec = podmanTest.Podman([]string{"exec", "-it", "test", "ip", "addr", "show", "eth1"})
   501  		exec.WaitWithDefaultTimeout()
   502  		Expect(exec.ExitCode()).To(BeZero())
   503  	})
   504  
   505  	It("podman network create/remove macvlan", func() {
   506  		net := "macvlan" + stringid.GenerateNonCryptoID()
   507  		nc := podmanTest.Podman([]string{"network", "create", "--macvlan", "lo", net})
   508  		nc.WaitWithDefaultTimeout()
   509  		Expect(nc.ExitCode()).To(Equal(0))
   510  
   511  		nc = podmanTest.Podman([]string{"network", "rm", net})
   512  		nc.WaitWithDefaultTimeout()
   513  		Expect(nc.ExitCode()).To(Equal(0))
   514  	})
   515  })