mirror of https://github.com/containers/podman.git
195 lines
5.7 KiB
Go
195 lines
5.7 KiB
Go
//go:build !remote
|
|
|
|
package generate
|
|
|
|
import (
|
|
"net"
|
|
|
|
"github.com/containers/common/libnetwork/types"
|
|
"github.com/containers/podman/v5/pkg/specgen"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"testing"
|
|
)
|
|
|
|
var (
|
|
portMappings = []types.PortMapping{{HostPort: 443, ContainerPort: 8080, Protocol: protoUDP}, {HostPort: 22, ContainerPort: 2222, Protocol: protoTCP}}
|
|
networks = map[string]types.PerNetworkOptions{"test": {
|
|
StaticIPs: nil,
|
|
Aliases: nil,
|
|
StaticMAC: nil,
|
|
InterfaceName: "eth2",
|
|
}}
|
|
)
|
|
|
|
func TestMapSpecCopyPodSpecToInfraContainerSpec(t *testing.T) {
|
|
infraCommand := []string{"top"}
|
|
addedHosts := []string{"otherhost"}
|
|
dnsServers := []net.IP{net.IPv4(10, 0, 0, 1), net.IPv4(8, 8, 8, 8)}
|
|
dnsOptions := []string{"dns option"}
|
|
dnsSearch := []string{"dns search"}
|
|
infraImage := "someimage"
|
|
conmonPidFile := "/var/run/conmon.pid"
|
|
podSpec := specgen.PodSpecGenerator{
|
|
PodBasicConfig: specgen.PodBasicConfig{InfraCommand: infraCommand, InfraImage: infraImage,
|
|
InfraConmonPidFile: conmonPidFile},
|
|
PodNetworkConfig: specgen.PodNetworkConfig{
|
|
PortMappings: portMappings, HostAdd: addedHosts, DNSServer: dnsServers, DNSOption: dnsOptions, DNSSearch: dnsSearch,
|
|
Networks: networks, NoManageResolvConf: true, NoManageHosts: true},
|
|
PodCgroupConfig: specgen.PodCgroupConfig{},
|
|
PodResourceConfig: specgen.PodResourceConfig{},
|
|
PodStorageConfig: specgen.PodStorageConfig{},
|
|
PodSecurityConfig: specgen.PodSecurityConfig{},
|
|
InfraContainerSpec: &specgen.SpecGenerator{},
|
|
ServiceContainerID: "",
|
|
}
|
|
|
|
mappedSpec, err := MapSpec(&podSpec)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, portMappings, mappedSpec.PortMappings)
|
|
assert.Equal(t, infraCommand, mappedSpec.Entrypoint)
|
|
assert.Equal(t, addedHosts, mappedSpec.HostAdd)
|
|
assert.Equal(t, dnsServers, mappedSpec.DNSServers)
|
|
assert.Equal(t, dnsOptions, mappedSpec.DNSOptions)
|
|
assert.Equal(t, dnsSearch, mappedSpec.DNSSearch)
|
|
require.NotNil(t, mappedSpec.UseImageResolvConf)
|
|
assert.True(t, *mappedSpec.UseImageResolvConf)
|
|
assert.Equal(t, networks, mappedSpec.Networks)
|
|
require.NotNil(t, mappedSpec.UseImageHosts)
|
|
assert.True(t, *mappedSpec.UseImageHosts)
|
|
assert.Equal(t, conmonPidFile, mappedSpec.ConmonPidFile)
|
|
assert.Equal(t, infraImage, mappedSpec.Image)
|
|
}
|
|
|
|
func createPodSpec(mode specgen.NamespaceMode) specgen.PodSpecGenerator {
|
|
return specgen.PodSpecGenerator{
|
|
InfraContainerSpec: &specgen.SpecGenerator{},
|
|
PodNetworkConfig: specgen.PodNetworkConfig{
|
|
NetNS: specgen.Namespace{NSMode: mode},
|
|
},
|
|
}
|
|
}
|
|
|
|
func createPodSpecWithNetworks(mode specgen.NamespaceMode) specgen.PodSpecGenerator {
|
|
spec := createPodSpec(mode)
|
|
spec.InfraContainerSpec.Networks = networks
|
|
return spec
|
|
}
|
|
|
|
func createPodSpecWithPortMapping(mode specgen.NamespaceMode) specgen.PodSpecGenerator {
|
|
spec := createPodSpec(mode)
|
|
spec.InfraContainerSpec.PortMappings = portMappings
|
|
return spec
|
|
}
|
|
|
|
func createPodSpecWithNetNsPath(path string) specgen.PodSpecGenerator {
|
|
spec := createPodSpec(specgen.Path)
|
|
spec.NetNS.Value = path
|
|
return spec
|
|
}
|
|
|
|
func TestMapSpecNetworkOptions(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
podSpec specgen.PodSpecGenerator
|
|
expectedNSMode specgen.NamespaceMode
|
|
expectedNSValue string
|
|
expectedNetworkOptions map[string][]string
|
|
mustError bool
|
|
}{
|
|
{
|
|
name: "Default",
|
|
podSpec: createPodSpec(specgen.Default),
|
|
expectedNSMode: "",
|
|
},
|
|
{
|
|
name: "Bridge",
|
|
podSpec: createPodSpec(specgen.Bridge),
|
|
expectedNSMode: specgen.Bridge,
|
|
},
|
|
{
|
|
name: "Private",
|
|
podSpec: createPodSpec(specgen.Private),
|
|
expectedNSMode: specgen.Private,
|
|
}, {
|
|
name: "Host",
|
|
podSpec: createPodSpec(specgen.Host),
|
|
expectedNSMode: specgen.Host,
|
|
},
|
|
{
|
|
name: "Host but with port mappings",
|
|
podSpec: createPodSpecWithPortMapping(specgen.Host),
|
|
mustError: true,
|
|
}, {
|
|
name: "Host but with networks",
|
|
podSpec: createPodSpecWithNetworks(specgen.Host),
|
|
mustError: true,
|
|
},
|
|
{
|
|
name: "Slirp",
|
|
podSpec: createPodSpec(specgen.Slirp),
|
|
expectedNSMode: specgen.Slirp,
|
|
},
|
|
{
|
|
name: "Slirp but if infra spec NS mode is Host",
|
|
podSpec: specgen.PodSpecGenerator{
|
|
InfraContainerSpec: &specgen.SpecGenerator{
|
|
ContainerNetworkConfig: specgen.ContainerNetworkConfig{NetNS: specgen.Namespace{NSMode: host}},
|
|
},
|
|
PodNetworkConfig: specgen.PodNetworkConfig{
|
|
NetNS: specgen.Namespace{NSMode: specgen.Slirp},
|
|
},
|
|
},
|
|
expectedNSMode: specgen.Host,
|
|
},
|
|
{
|
|
name: "Path",
|
|
podSpec: createPodSpecWithNetNsPath("/var/run/netns/bla"),
|
|
expectedNSMode: specgen.Path,
|
|
expectedNSValue: "/var/run/netns/bla",
|
|
},
|
|
{
|
|
name: "NoNetwork",
|
|
podSpec: createPodSpec(specgen.NoNetwork),
|
|
expectedNSMode: specgen.NoNetwork,
|
|
},
|
|
{
|
|
name: "NoNetwork but with networks",
|
|
podSpec: createPodSpecWithNetworks(specgen.NoNetwork),
|
|
mustError: true,
|
|
},
|
|
{
|
|
name: "NoNetwork but with port mappings",
|
|
podSpec: createPodSpecWithPortMapping(specgen.NoNetwork),
|
|
mustError: true,
|
|
},
|
|
{
|
|
name: "FromContainer",
|
|
podSpec: createPodSpec(specgen.FromContainer),
|
|
mustError: true,
|
|
}, {
|
|
name: "FromPod",
|
|
podSpec: createPodSpec(specgen.FromPod),
|
|
mustError: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
mappedSpec, err := MapSpec(&tt.podSpec)
|
|
|
|
if tt.mustError {
|
|
assert.Error(t, err)
|
|
} else {
|
|
assert.NoError(t, err, "error is not nil")
|
|
assert.Equal(t, tt.expectedNSMode, mappedSpec.NetNS.NSMode)
|
|
assert.Equal(t, tt.expectedNSValue, mappedSpec.NetNS.Value)
|
|
assert.Equal(t, tt.expectedNetworkOptions, mappedSpec.NetworkOptions)
|
|
}
|
|
})
|
|
}
|
|
}
|