diff --git a/client/executor/exec_linux_test.go b/client/executor/exec_linux_test.go index a2a9339f4..f3147e58b 100644 --- a/client/executor/exec_linux_test.go +++ b/client/executor/exec_linux_test.go @@ -18,7 +18,7 @@ var ( Networks: []*structs.NetworkResource{ &structs.NetworkResource{ MBits: 50, - DynamicPorts: 1, + DynamicPorts: []string{"http"}, }, }, } diff --git a/jobspec/parse_test.go b/jobspec/parse_test.go index 6f4589344..f485183b5 100644 --- a/jobspec/parse_test.go +++ b/jobspec/parse_test.go @@ -92,7 +92,7 @@ func TestParse(t *testing.T) { &structs.NetworkResource{ MBits: 100, ReservedPorts: []int{1, 2, 3}, - DynamicPorts: 3, + DynamicPorts: []string{"http", "https", "admin"}, }, }, }, diff --git a/jobspec/test-fixtures/basic.hcl b/jobspec/test-fixtures/basic.hcl index e81f1e9bf..f57162938 100644 --- a/jobspec/test-fixtures/basic.hcl +++ b/jobspec/test-fixtures/basic.hcl @@ -43,7 +43,7 @@ job "binstore-storagelocker" { network { mbits = "100" reserved_ports = [1,2,3] - dynamic_ports = 3 + dynamic_ports = ["http", "https", "admin"] } } } diff --git a/jobspec/test-fixtures/multi-network.hcl b/jobspec/test-fixtures/multi-network.hcl index f6fe09544..967b5c0b2 100644 --- a/jobspec/test-fixtures/multi-network.hcl +++ b/jobspec/test-fixtures/multi-network.hcl @@ -11,13 +11,13 @@ job "binstore-storagelocker" { network { mbits = "100" reserved_ports = [1,2,3] - dynamic_ports = 3 + dynamic_ports = ["http", "https", "admin"] } network { mbits = "128" reserved_ports = [1,2,3] - dynamic_ports = 3 + dynamic_ports = ["http", "https", "admin"] } } } diff --git a/nomad/mock/mock.go b/nomad/mock/mock.go index d402f8ac3..445988884 100644 --- a/nomad/mock/mock.go +++ b/nomad/mock/mock.go @@ -86,7 +86,7 @@ func Job() *structs.Job { Networks: []*structs.NetworkResource{ &structs.NetworkResource{ MBits: 50, - DynamicPorts: 1, + DynamicPorts: []string{"http"}, }, }, }, @@ -135,7 +135,7 @@ func Alloc() *structs.Allocation { IP: "192.168.0.100", ReservedPorts: []int{12345}, MBits: 100, - DynamicPorts: 1, + DynamicPorts: []string{"http"}, }, }, }, @@ -149,7 +149,7 @@ func Alloc() *structs.Allocation { IP: "192.168.0.100", ReservedPorts: []int{5000}, MBits: 50, - DynamicPorts: 1, + DynamicPorts: []string{"http"}, }, }, }, diff --git a/nomad/structs/network.go b/nomad/structs/network.go index 4efc4524e..f19a87ded 100644 --- a/nomad/structs/network.go +++ b/nomad/structs/network.go @@ -164,7 +164,7 @@ func (idx *NetworkIndex) AssignNetwork(ask *NetworkResource) (out *NetworkResour } // Check if we need to generate any ports - for i := 0; i < ask.DynamicPorts; i++ { + for i := 0; i < len(ask.DynamicPorts); i++ { attempts := 0 PICK: attempts++ diff --git a/nomad/structs/network_test.go b/nomad/structs/network_test.go index 1db783d65..ed84c3532 100644 --- a/nomad/structs/network_test.go +++ b/nomad/structs/network_test.go @@ -287,7 +287,7 @@ func TestNetworkIndex_AssignNetwork(t *testing.T) { // Ask for dynamic ports ask = &NetworkResource{ - DynamicPorts: 3, + DynamicPorts: []string{"http", "https", "admin"}, } offer, err = idx.AssignNetwork(ask) if err != nil { @@ -306,7 +306,7 @@ func TestNetworkIndex_AssignNetwork(t *testing.T) { // Ask for reserved + dynamic ports ask = &NetworkResource{ ReservedPorts: []int{12345}, - DynamicPorts: 3, + DynamicPorts: []string{"http", "https", "admin"}, } offer, err = idx.AssignNetwork(ask) if err != nil { diff --git a/nomad/structs/structs.go b/nomad/structs/structs.go index 5df59950a..7601a0cdb 100644 --- a/nomad/structs/structs.go +++ b/nomad/structs/structs.go @@ -612,12 +612,12 @@ func (r *Resources) GoString() string { // NetworkResource is used to represesent available network // resources type NetworkResource struct { - Device string // Name of the device - CIDR string // CIDR block of addresses - IP string // IP address - MBits int // Throughput - ReservedPorts []int `mapstructure:"reserved_ports"` // Reserved ports - DynamicPorts int `mapstructure:"dynamic_ports"` // Dynamically assigned ports + Device string // Name of the device + CIDR string // CIDR block of addresses + IP string // IP address + MBits int // Throughput + ReservedPorts []int `mapstructure:"reserved_ports"` // Reserved ports + DynamicPorts []string `mapstructure:"dynamic_ports"` // Dynamically assigned ports } // Copy returns a deep copy of the network resource @@ -638,7 +638,7 @@ func (n *NetworkResource) Add(delta *NetworkResource) { n.ReservedPorts = append(n.ReservedPorts, delta.ReservedPorts...) } n.MBits += delta.MBits - n.DynamicPorts += delta.DynamicPorts + n.DynamicPorts = append(n.DynamicPorts, delta.DynamicPorts...) } func (n *NetworkResource) GoString() string { diff --git a/nomad/structs/structs_test.go b/nomad/structs/structs_test.go index 4067da590..a85661efe 100644 --- a/nomad/structs/structs_test.go +++ b/nomad/structs/structs_test.go @@ -230,7 +230,7 @@ func TestResource_Add_Network(t *testing.T) { Networks: []*NetworkResource{ &NetworkResource{ MBits: 50, - DynamicPorts: 2, + DynamicPorts: []string{"http", "https"}, }, }, } @@ -238,7 +238,7 @@ func TestResource_Add_Network(t *testing.T) { Networks: []*NetworkResource{ &NetworkResource{ MBits: 25, - DynamicPorts: 1, + DynamicPorts: []string{"admin"}, }, }, } @@ -256,7 +256,7 @@ func TestResource_Add_Network(t *testing.T) { Networks: []*NetworkResource{ &NetworkResource{ MBits: 75, - DynamicPorts: 3, + DynamicPorts: []string{"http", "https", "admin"}, }, }, } diff --git a/scheduler/util_test.go b/scheduler/util_test.go index 45c387e29..a9d894d8c 100644 --- a/scheduler/util_test.go +++ b/scheduler/util_test.go @@ -261,7 +261,7 @@ func TestTasksUpdated(t *testing.T) { } j6 := mock.Job() - j6.TaskGroups[0].Tasks[0].Resources.Networks[0].DynamicPorts = 3 + j6.TaskGroups[0].Tasks[0].Resources.Networks[0].DynamicPorts = []string{"http", "https", "admin"} if !tasksUpdated(j1.TaskGroups[0], j6.TaskGroups[0]) { t.Fatalf("bad") } diff --git a/website/source/docs/jobspec/index.html.md b/website/source/docs/jobspec/index.html.md index 337c98e63..4460b7c52 100644 --- a/website/source/docs/jobspec/index.html.md +++ b/website/source/docs/jobspec/index.html.md @@ -48,7 +48,10 @@ job "my-service" { memory = 128 network { mbits = 100 - dynamic_ports = 1 + dynamic_ports = [ + "http", + "https", + ] } } } @@ -182,9 +185,11 @@ The `resources` object supports the following keys: The `network` object supports teh following keys: -* `dynamic_ports` - The number of dynamic ports. These are - ports that are assigned at task scheduling type, and require - the task to be able to bind dynamically. Defaults to 0. +* `dynamic_ports` - List of strings (`^[a-z0-9_]+$`), called labels. Each label + will be associated with a dynamic port when the task starts. Port allocation + will be passed to the task as an environment variable like `NOMAD_PORT_{{ .Label }}` + (upper-cased). Some Drivers may infer additional semantics from the label. See + [Docker](/docs/drivers/docker.html) for an example. * `mbits` - The number of MBits in bandwidth required.