github.com/containers/podman/v4@v4.9.4/pkg/specgen/generate/pod_create_test.go (about) 1 //go:build !remote 2 // +build !remote 3 4 package generate 5 6 import ( 7 "net" 8 9 "github.com/containers/common/libnetwork/types" 10 "github.com/containers/podman/v4/pkg/specgen" 11 "github.com/stretchr/testify/assert" 12 13 "testing" 14 ) 15 16 var ( 17 portMappings = []types.PortMapping{{HostPort: 443, ContainerPort: 8080, Protocol: protoUDP}, {HostPort: 22, ContainerPort: 2222, Protocol: protoTCP}} 18 networks = map[string]types.PerNetworkOptions{"test": { 19 StaticIPs: nil, 20 Aliases: nil, 21 StaticMAC: nil, 22 InterfaceName: "eth2", 23 }} 24 ) 25 26 func TestMapSpecCopyPodSpecToInfraContainerSpec(t *testing.T) { 27 infraCommand := []string{"top"} 28 addedHosts := []string{"otherhost"} 29 dnsServers := []net.IP{net.IPv4(10, 0, 0, 1), net.IPv4(8, 8, 8, 8)} 30 dnsOptions := []string{"dns option"} 31 dnsSearch := []string{"dns search"} 32 infraImage := "someimage" 33 conmonPidFile := "/var/run/conmon.pid" 34 podSpec := specgen.PodSpecGenerator{ 35 PodBasicConfig: specgen.PodBasicConfig{InfraCommand: infraCommand, InfraImage: infraImage, 36 InfraConmonPidFile: conmonPidFile}, 37 PodNetworkConfig: specgen.PodNetworkConfig{ 38 PortMappings: portMappings, HostAdd: addedHosts, DNSServer: dnsServers, DNSOption: dnsOptions, DNSSearch: dnsSearch, 39 Networks: networks, NoManageResolvConf: true, NoManageHosts: true}, 40 PodCgroupConfig: specgen.PodCgroupConfig{}, 41 PodResourceConfig: specgen.PodResourceConfig{}, 42 PodStorageConfig: specgen.PodStorageConfig{}, 43 PodSecurityConfig: specgen.PodSecurityConfig{}, 44 InfraContainerSpec: &specgen.SpecGenerator{}, 45 ServiceContainerID: "", 46 } 47 48 mappedSpec, err := MapSpec(&podSpec) 49 50 assert.NoError(t, err) 51 52 assert.Equal(t, portMappings, mappedSpec.PortMappings) 53 assert.Equal(t, infraCommand, mappedSpec.Entrypoint) 54 assert.Equal(t, addedHosts, mappedSpec.HostAdd) 55 assert.Equal(t, dnsServers, mappedSpec.DNSServers) 56 assert.Equal(t, dnsOptions, mappedSpec.DNSOptions) 57 assert.Equal(t, dnsSearch, mappedSpec.DNSSearch) 58 assert.True(t, mappedSpec.UseImageResolvConf) 59 assert.Equal(t, networks, mappedSpec.Networks) 60 assert.True(t, mappedSpec.UseImageHosts) 61 assert.Equal(t, conmonPidFile, mappedSpec.ConmonPidFile) 62 assert.Equal(t, infraImage, mappedSpec.Image) 63 } 64 65 func createPodSpec(mode specgen.NamespaceMode) specgen.PodSpecGenerator { 66 return specgen.PodSpecGenerator{ 67 InfraContainerSpec: &specgen.SpecGenerator{}, 68 PodNetworkConfig: specgen.PodNetworkConfig{ 69 NetNS: specgen.Namespace{NSMode: mode}, 70 }, 71 } 72 } 73 74 func createPodSpecWithNetworks(mode specgen.NamespaceMode) specgen.PodSpecGenerator { 75 spec := createPodSpec(mode) 76 spec.InfraContainerSpec.Networks = networks 77 return spec 78 } 79 80 func createPodSpecWithPortMapping(mode specgen.NamespaceMode) specgen.PodSpecGenerator { 81 spec := createPodSpec(mode) 82 spec.InfraContainerSpec.PortMappings = portMappings 83 return spec 84 } 85 86 func createPodSpecWithNetNsPath(path string) specgen.PodSpecGenerator { 87 spec := createPodSpec(specgen.Path) 88 spec.NetNS.Value = path 89 return spec 90 } 91 92 func TestMapSpecNetworkOptions(t *testing.T) { 93 tests := []struct { 94 name string 95 podSpec specgen.PodSpecGenerator 96 expectedNSMode specgen.NamespaceMode 97 expectedNSValue string 98 expectedNetworkOptions map[string][]string 99 mustError bool 100 }{ 101 { 102 name: "Default", 103 podSpec: createPodSpec(specgen.Default), 104 expectedNSMode: "", 105 }, 106 { 107 name: "Bridge", 108 podSpec: createPodSpec(specgen.Bridge), 109 expectedNSMode: specgen.Bridge, 110 }, 111 { 112 name: "Private", 113 podSpec: createPodSpec(specgen.Private), 114 expectedNSMode: specgen.Private, 115 }, { 116 name: "Host", 117 podSpec: createPodSpec(specgen.Host), 118 expectedNSMode: specgen.Host, 119 }, 120 { 121 name: "Host but with port mappings", 122 podSpec: createPodSpecWithPortMapping(specgen.Host), 123 mustError: true, 124 }, { 125 name: "Host but with networks", 126 podSpec: createPodSpecWithNetworks(specgen.Host), 127 mustError: true, 128 }, 129 { 130 name: "Slirp", 131 podSpec: createPodSpec(specgen.Slirp), 132 expectedNSMode: specgen.Slirp, 133 }, 134 { 135 name: "Slirp but if infra spec NS mode is Host", 136 podSpec: specgen.PodSpecGenerator{ 137 InfraContainerSpec: &specgen.SpecGenerator{ 138 ContainerNetworkConfig: specgen.ContainerNetworkConfig{NetNS: specgen.Namespace{NSMode: host}}, 139 }, 140 PodNetworkConfig: specgen.PodNetworkConfig{ 141 NetNS: specgen.Namespace{NSMode: specgen.Slirp}, 142 }, 143 }, 144 expectedNSMode: specgen.Host, 145 }, 146 { 147 name: "Path", 148 podSpec: createPodSpecWithNetNsPath("/var/run/netns/bla"), 149 expectedNSMode: specgen.Path, 150 expectedNSValue: "/var/run/netns/bla", 151 }, 152 { 153 name: "NoNetwork", 154 podSpec: createPodSpec(specgen.NoNetwork), 155 expectedNSMode: specgen.NoNetwork, 156 }, 157 { 158 name: "NoNetwork but with networks", 159 podSpec: createPodSpecWithNetworks(specgen.NoNetwork), 160 mustError: true, 161 }, 162 { 163 name: "NoNetwork but with port mappings", 164 podSpec: createPodSpecWithPortMapping(specgen.NoNetwork), 165 mustError: true, 166 }, 167 { 168 name: "FromContainer", 169 podSpec: createPodSpec(specgen.FromContainer), 170 mustError: true, 171 }, { 172 name: "FromPod", 173 podSpec: createPodSpec(specgen.FromPod), 174 mustError: true, 175 }, 176 } 177 178 for _, tt := range tests { 179 t.Run(tt.name, func(t *testing.T) { 180 mappedSpec, err := MapSpec(&tt.podSpec) 181 182 if tt.mustError { 183 assert.Error(t, err) 184 } else { 185 assert.NoError(t, err, "error is not nil") 186 assert.Equal(t, tt.expectedNSMode, mappedSpec.NetNS.NSMode) 187 assert.Equal(t, tt.expectedNSValue, mappedSpec.NetNS.Value) 188 assert.Equal(t, tt.expectedNetworkOptions, mappedSpec.NetworkOptions) 189 } 190 }) 191 } 192 }