diff options
-rw-r--r-- | cmd/podman/common/create_opts.go | 5 | ||||
-rw-r--r-- | pkg/bindings/images/build.go | 7 | ||||
-rw-r--r-- | pkg/bindings/images/build_test.go | 17 | ||||
-rw-r--r-- | pkg/channel/writer.go | 20 | ||||
-rw-r--r-- | test/compose/ipam_set_ip/docker-compose.yml | 17 | ||||
-rw-r--r-- | test/compose/ipam_set_ip/tests.sh | 4 |
6 files changed, 58 insertions, 12 deletions
diff --git a/cmd/podman/common/create_opts.go b/cmd/podman/common/create_opts.go index ca36d751e..77ac781a5 100644 --- a/cmd/podman/common/create_opts.go +++ b/cmd/podman/common/create_opts.go @@ -302,6 +302,11 @@ func ContainerCreateToContainerCLIOpts(cc handlers.CreateContainerConfig, cgroup staticIP := net.ParseIP(ep.IPAddress) netInfo.StaticIP = &staticIP } + // if IPAMConfig.IPv4Address is provided + if ep.IPAMConfig != nil && ep.IPAMConfig.IPv4Address != "" { + staticIP := net.ParseIP(ep.IPAMConfig.IPv4Address) + netInfo.StaticIP = &staticIP + } // If MAC address is provided if len(ep.MacAddress) > 0 { staticMac, err := net.ParseMAC(ep.MacAddress) diff --git a/pkg/bindings/images/build.go b/pkg/bindings/images/build.go index c0e5706a5..6acfcc1c8 100644 --- a/pkg/bindings/images/build.go +++ b/pkg/bindings/images/build.go @@ -28,6 +28,10 @@ import ( "github.com/sirupsen/logrus" ) +var ( + iidRegex = regexp.MustCompile(`^[0-9a-f]{12}`) +) + // Build creates an image using a containerfile reference func Build(ctx context.Context, containerFiles []string, options entities.BuildOptions) (*entities.BuildReport, error) { params := url.Values{} @@ -337,7 +341,6 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO } dec := json.NewDecoder(body) - re := regexp.MustCompile(`[0-9a-f]{12}`) var id string var mErr error @@ -366,7 +369,7 @@ func Build(ctx context.Context, containerFiles []string, options entities.BuildO switch { case s.Stream != "": stdout.Write([]byte(s.Stream)) - if re.Match([]byte(s.Stream)) { + if iidRegex.Match([]byte(s.Stream)) { id = strings.TrimSuffix(s.Stream, "\n") } case s.Error != "": diff --git a/pkg/bindings/images/build_test.go b/pkg/bindings/images/build_test.go new file mode 100644 index 000000000..e4035d5f8 --- /dev/null +++ b/pkg/bindings/images/build_test.go @@ -0,0 +1,17 @@ +package images + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBuildMatchIID(t *testing.T) { + assert.True(t, iidRegex.MatchString("a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4")) + assert.True(t, iidRegex.MatchString("3da3a8f95d42")) + assert.False(t, iidRegex.MatchString("3da3")) +} + +func TestBuildNotMatchStatusMessage(t *testing.T) { + assert.False(t, iidRegex.MatchString("Copying config a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4")) +} diff --git a/pkg/channel/writer.go b/pkg/channel/writer.go index 28c9d7de5..ecb68e906 100644 --- a/pkg/channel/writer.go +++ b/pkg/channel/writer.go @@ -1,7 +1,6 @@ package channel import ( - "fmt" "io" "sync" @@ -34,20 +33,17 @@ func (w *writeCloser) Chan() <-chan []byte { // Write method for WriteCloser func (w *writeCloser) Write(b []byte) (bLen int, err error) { - // https://github.com/containers/podman/issues/7896 - // when podman-remote pull image, if it was killed, the server will panic: send on closed channel - // so handle it - defer func() { - if rErr := recover(); rErr != nil { - err = fmt.Errorf("%s", rErr) - } - }() - if w == nil || w.ch == nil { + if w == nil { return 0, errors.New("use channel.NewWriter() to initialize a WriteCloser") } w.mux.Lock() defer w.mux.Unlock() + + if w.ch == nil { + return 0, errors.New("the channel is closed for Write") + } + buf := make([]byte, len(b)) copy(buf, b) w.ch <- buf @@ -57,6 +53,10 @@ func (w *writeCloser) Write(b []byte) (bLen int, err error) { // Close method for WriteCloser func (w *writeCloser) Close() error { + w.mux.Lock() + defer w.mux.Unlock() + close(w.ch) + w.ch = nil return nil } diff --git a/test/compose/ipam_set_ip/docker-compose.yml b/test/compose/ipam_set_ip/docker-compose.yml new file mode 100644 index 000000000..d220c02c0 --- /dev/null +++ b/test/compose/ipam_set_ip/docker-compose.yml @@ -0,0 +1,17 @@ +version: "3.2" +services: + test: + image: alpine + networks: + net1: + ipv4_address: 10.123.0.253 + tty: true + command: ["top"] + +networks: + net1: + driver: bridge + ipam: + driver: default + config: + - subnet: 10.123.0.0/24 diff --git a/test/compose/ipam_set_ip/tests.sh b/test/compose/ipam_set_ip/tests.sh new file mode 100644 index 000000000..ecaf3167e --- /dev/null +++ b/test/compose/ipam_set_ip/tests.sh @@ -0,0 +1,4 @@ +# -*- bash -*- + +podman container inspect ipam_set_ip_test_1 --format '{{ .NetworkSettings.Networks.ipam_set_ip_net1.IPAddress }}' +like "$output" "10.123.0.253" "$testname : ip address is set" |