Support port range for docker-compose v2 (#1345)

* allow port range specification in v1v2

* improve tests for loadPorts

* add port range to fixtures of docker-compose v2

* update fixtures to follow up on #1341
This commit is contained in:
namusyaka
2020-11-04 22:16:33 +08:00
committed by GitHub
parent 119f0b8f70
commit 8b06045c70
7 changed files with 539 additions and 147 deletions
+87 -41
View File
@@ -17,20 +17,21 @@ limitations under the License.
package compose
import (
"fmt"
"os"
"reflect"
"strings"
"testing"
"github.com/kubernetes/kompose/pkg/kobject"
api "k8s.io/api/core/v1"
"time"
"github.com/docker/cli/cli/compose/types"
"github.com/docker/libcompose/config"
"github.com/docker/libcompose/project"
"github.com/docker/libcompose/yaml"
"github.com/google/go-cmp/cmp"
"github.com/kubernetes/kompose/pkg/kobject"
"github.com/pkg/errors"
api "k8s.io/api/core/v1"
)
func durationPtr(value time.Duration) *time.Duration {
@@ -147,50 +148,95 @@ func TestHandleServiceType(t *testing.T) {
// Test loading of ports
func TestLoadPorts(t *testing.T) {
port1 := []string{"127.0.0.1:80:80/tcp"}
result1 := kobject.Ports{
HostIP: "127.0.0.1",
HostPort: 80,
ContainerPort: 80,
Protocol: api.ProtocolTCP,
}
port2 := []string{"80:80/tcp"}
result2 := kobject.Ports{
HostPort: 80,
ContainerPort: 80,
Protocol: api.ProtocolTCP,
}
port3 := []string{"80:80"}
result3 := kobject.Ports{
HostPort: 80,
ContainerPort: 80,
Protocol: api.ProtocolTCP,
}
port4 := []string{"80"}
result4 := kobject.Ports{
HostPort: 0,
ContainerPort: 80,
Protocol: api.ProtocolTCP,
}
tests := []struct {
ports []string
result kobject.Ports
expose []string
want []kobject.Ports
}{
{port1, result1},
{port2, result2},
{port3, result3},
{port4, result4},
{
ports: []string{"127.0.0.1:80:80/tcp"},
want: []kobject.Ports{
{HostIP: "127.0.0.1", HostPort: 80, ContainerPort: 80, Protocol: api.ProtocolTCP},
},
},
{
ports: []string{"80:80/tcp"},
want: []kobject.Ports{
{HostPort: 80, ContainerPort: 80, Protocol: api.ProtocolTCP},
},
},
{
ports: []string{"80:80"},
want: []kobject.Ports{
{HostPort: 80, ContainerPort: 80, Protocol: api.ProtocolTCP},
},
},
{
ports: []string{"80"},
want: []kobject.Ports{
{ContainerPort: 80, Protocol: api.ProtocolTCP},
},
},
{
ports: []string{"3000-3005"},
want: []kobject.Ports{
{ContainerPort: 3000, Protocol: api.ProtocolTCP},
{ContainerPort: 3001, Protocol: api.ProtocolTCP},
{ContainerPort: 3002, Protocol: api.ProtocolTCP},
{ContainerPort: 3003, Protocol: api.ProtocolTCP},
{ContainerPort: 3004, Protocol: api.ProtocolTCP},
{ContainerPort: 3005, Protocol: api.ProtocolTCP},
},
},
{
ports: []string{"3000-3005:5000-5005"},
want: []kobject.Ports{
{HostPort: 3000, ContainerPort: 5000, Protocol: api.ProtocolTCP},
{HostPort: 3001, ContainerPort: 5001, Protocol: api.ProtocolTCP},
{HostPort: 3002, ContainerPort: 5002, Protocol: api.ProtocolTCP},
{HostPort: 3003, ContainerPort: 5003, Protocol: api.ProtocolTCP},
{HostPort: 3004, ContainerPort: 5004, Protocol: api.ProtocolTCP},
{HostPort: 3005, ContainerPort: 5005, Protocol: api.ProtocolTCP},
},
},
{
ports: []string{"127.0.0.1:3000-3005:5000-5005"},
want: []kobject.Ports{
{HostIP: "127.0.0.1", HostPort: 3000, ContainerPort: 5000, Protocol: api.ProtocolTCP},
{HostIP: "127.0.0.1", HostPort: 3001, ContainerPort: 5001, Protocol: api.ProtocolTCP},
{HostIP: "127.0.0.1", HostPort: 3002, ContainerPort: 5002, Protocol: api.ProtocolTCP},
{HostIP: "127.0.0.1", HostPort: 3003, ContainerPort: 5003, Protocol: api.ProtocolTCP},
{HostIP: "127.0.0.1", HostPort: 3004, ContainerPort: 5004, Protocol: api.ProtocolTCP},
{HostIP: "127.0.0.1", HostPort: 3005, ContainerPort: 5005, Protocol: api.ProtocolTCP},
},
},
{
ports: []string{"80", "3000"},
want: []kobject.Ports{
{HostPort: 0, ContainerPort: 80, Protocol: api.ProtocolTCP},
{HostPort: 0, ContainerPort: 3000, Protocol: api.ProtocolTCP},
},
},
{
ports: []string{"80", "3000"},
expose: []string{"80"},
want: []kobject.Ports{
{HostPort: 0, ContainerPort: 80, Protocol: api.ProtocolTCP},
{HostPort: 0, ContainerPort: 3000, Protocol: api.ProtocolTCP},
},
},
}
for _, tt := range tests {
result, err := loadPorts(tt.ports, nil)
if err != nil {
t.Errorf("Unexpected error with loading ports %v", err)
}
if result[0] != tt.result {
t.Errorf("Expected %q, got %q", tt.result, result[0])
}
t.Run(fmt.Sprintf("port=%q,expose=%q", tt.ports, tt.expose), func(t *testing.T) {
got, err := loadPorts(tt.ports, nil)
if err != nil {
t.Fatalf("Unexpected error with loading ports %v", err)
}
if diff := cmp.Diff(tt.want, got); diff != "" {
t.Errorf("loadPorts() mismatch (-want +got):\n%s", diff)
}
})
}
}