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  }