diff --git a/pkg/drivers/kic/oci/network_create.go b/pkg/drivers/kic/oci/network_create.go index 3f145e2e84e1..1dee5b2053cb 100644 --- a/pkg/drivers/kic/oci/network_create.go +++ b/pkg/drivers/kic/oci/network_create.go @@ -171,13 +171,18 @@ type networkInspect struct { ContainerIPs []string } +var dockerInsepctGetter = func(name string) (*RunResult, error) { + cmd := exec.Command(Docker, "network", "inspect", name, "--format", `{"Name": "{{.Name}}","Driver": "{{.Driver}}","Subnet": "{{range .IPAM.Config}}{{.Subnet}}{{end}}","Gateway": "{{range .IPAM.Config}}{{.Gateway}}{{end}}","MTU": {{if (index .Options "com.docker.network.driver.mtu")}}{{(index .Options "com.docker.network.driver.mtu")}}{{else}}0{{end}},{{$first := true}} "ContainerIPs": [{{range $k,$v := .Containers }}{{if $first}}{{$first = false}}{{else}}, {{end}}"{{$v.IPv4Address}}"{{end}}]}`) + rr, err := runCmd(cmd) + return rr, err +} + // if exists returns subnet, gateway and mtu func dockerNetworkInspect(name string) (netInfo, error) { var vals networkInspect var info = netInfo{name: name} - cmd := exec.Command(Docker, "network", "inspect", name, "--format", `{"Name": "{{.Name}}","Driver": "{{.Driver}}","Subnet": "{{range .IPAM.Config}}{{.Subnet}}{{end}}","Gateway": "{{range .IPAM.Config}}{{.Gateway}}{{end}}","MTU": {{(index .Options "com.docker.network.driver.mtu")}},{{$first := true}} "ContainerIPs": [{{range $k,$v := .Containers }}{{if $first}}{{$first = false}}{{else}}, {{end}}"{{$v.IPv4Address}}"{{end}}]}`) - rr, err := runCmd(cmd) + rr, err := dockerInsepctGetter(name) if err != nil { logDockerNetworkInspect(Docker, name) if strings.Contains(rr.Output(), "No such network") { diff --git a/pkg/drivers/kic/oci/network_create_test.go b/pkg/drivers/kic/oci/network_create_test.go new file mode 100644 index 000000000000..a060d9947956 --- /dev/null +++ b/pkg/drivers/kic/oci/network_create_test.go @@ -0,0 +1,84 @@ +/* +Copyright 2019 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package oci + +import ( + "bytes" + "net" + "testing" +) + +var dockerResponse string +var dockerInspectGetterMock = func(name string) (*RunResult, error) { + var responseInBytes bytes.Buffer + responseInBytes.WriteString(dockerResponse) + response := &RunResult{Stdout: responseInBytes} + + return response, nil +} + +func TestDockerInspect(t *testing.T) { + var tests = []struct { + name string + dockerInspectResponse string + gateway string + subnetIP string + mtu int + }{ + { + name: "withMTU", + dockerInspectResponse: `{"Name": "m2","Driver": "bridge","Subnet": "172.19.0.0/16","Gateway": "172.19.0.1","MTU": 9216, "ContainerIPs": []}`, + gateway: "172.19.0.1", + subnetIP: "172.19.0.0", + mtu: 9216, + }, + { + name: "withoutMTU", + dockerInspectResponse: `{"Name": "m2","Driver": "bridge","Subnet": "172.19.0.0/16","Gateway": "172.19.0.1","MTU": 0, "ContainerIPs": []}`, + gateway: "172.19.0.1", + subnetIP: "172.19.0.0", + mtu: 0, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + dockerInspectResponseWithMtu := tc.dockerInspectResponse + + // setting up mock funcs + dockerResponse = dockerInspectResponseWithMtu + dockerInsepctGetter = dockerInspectGetterMock + + netInfo, err := dockerNetworkInspect("m2") + + if err != nil { + t.Errorf("Expected not to have error but got %v", err) + } + + if netInfo.mtu != tc.mtu { + t.Errorf("Expected not to have MTU as %v but got %v", tc.mtu, netInfo.mtu) + } + + if !netInfo.gateway.Equal(net.ParseIP(tc.gateway)) { + t.Errorf("Expected not to have gateway as %v but got %v", tc.gateway, netInfo.gateway) + } + + if !netInfo.subnet.IP.Equal(net.ParseIP(tc.subnetIP)) { + t.Errorf("Expected not to have subnet as %v but got %v", tc.subnetIP, netInfo.gateway) + } + }) + } +}