+-----+ | | --+ sw6 +-- / | | \ PID1 +-----+ / +-----+ \ +-----+ PID2 eh1__| |_ / \ ____| |__eh2 192.0.2.2 | sw1 | \ +--|--+ +--|--+ / | sw2 | 192.0.2.3 +-----+ \ | | | |/ +-----+ \_| sw5 +---------+ sw7 | PID3 +-----+ / | | | |\ +-----+ PID4 eh3__| |__/ +-----+ +-----+ \____| |__eh4 192.0.2.4 | sw3 | | sw4 | 192.0.2.5 +-----+ +-----+ bw(eh1--sw1) = bw(sw1--sw5) = 150 Mbps bw(eh2--sw2) = bw(eh3--sw3) = bw(eh4--sw4) = 100 Mbps bw(sw1--sw5) = bw(sw3--sw5) = bw(sw2--sw7) = bw(sw4--sw7) = 100 Mbps bw(sw5--sw6) = bw(sw5--sw7) = bw(sw6--sw7) = 100 Mbps
+----------------------+ {eh1} | | {eh2} PID1 | | PID2 +------+ +------+ | | | | {eh3} | | {eh4} PID3 | | PID4 +------+ +------+ | | +----------------------+
max(x + y).
x <= 100 Mbps y <= 100 Mbps.
x <= 100 Mbps y <= 100 Mbps x + y <= 150 Mbps
x <= 100 Mbps y <= 100 Mbps x + y <= 100 Mbps
Data schema Queries | | \ / +-------------+ +-----------------+ | ALTO Client | <===============> | Job Optimizer | +-------------+ +-----------------+ PV | ^ PV | Request | | Response | | | On-demand resource | (Potential | | (Network allocation, demand | Data | | Resource vectors, etc. | Transfers) | | Constraints) (Non-ALTO interfaces)| v | v +-------------+ +-----------------+ | ALTO Server | <===============> | Network Manager | +-------------+ +-----------------+ / | \ | | | WAN DC1 DC2
Ongoing transfers New transfer requests \----\ | | | v v +-------------+ +---------------+ | ALTO Client | <===========> | Data Transfer | +-------------+ | Scheduler | ^ | ^ | PV Request +---------------+ | | | \--------------\ | | \--------------\ | | v PV Response | v +-------------+ +-------------+ | ALTO Server | | ALTO Server | +-------------+ +-------------+ || || +---------+ +---------+ | Network | | Network | | Manager | | Manager | +---------+ +---------+ . . . _~_ __ . . . . ( )( ) .___ ~v~v~ /--( )------------( ) ( )-----/ ( ) ( ) ~w~w~ ~^~^~^~ ~v~v~ Site 1 Non-blocking Core Site 2
Site 1: [c] . ........................................> [d] +---+ 10 Gbps +---+ 10 Gbps +----+ 50 Gbps | A |---------| B |---------| GW |--------- Core +---+ +---+ +----+ ................... . . . v [a] [b] Site 2: [d] <........................................ [c] +---+ 5 Gbps +---+ 10 Gbps +----+ 20 Gbps | X |--------| Y |---------| GW |--------- Core +---+ +---+ +----+ .................... . . . v [e] [f]
a: { b: [ane1] }, c: { d: [ane1, ane2, ane3] } ane1: bw = 10 Gbps (link: A->B) ane2: bw = 10 Gbps (link: B->GW) ane3: bw = 50 Gbps (link: GW->Core)
c: { d: [anei, aneii, aneiii] } e: { f: [aneiv] } anei: bw = 5 Gbps (link Y->X) aneii: bw = 10 Gbps (link GW->Y) aneiii: bw = 20 Gbps (link Core->GW) aneiv: bw = 10 Gbps (link Y->GW)
+-------------+ +----------------------+ | ALTO Client | <==========> | Application Provider | +-------------+ +----------------------+ PV | ^ PV | Request | | Response | Resource allocation, | | | service establishment, (End hosts | | (Edge nodes | etc. and cloud | | and metrics) | servers) | | | v | v +-------------+ +---------------------+ | ALTO Server | <=========> | Cloud-Edge Provider | +-------------+ +---------------------+ ____________________________________/\___________ / \ | (((o | | /_\ _~_ __ __ a (/\_/\) ( ) ( )~( )_ \ /------( )---------( )----\\---( ) _|_ / (______) (___) ( ) |_| -/ Site-radio Access CO (__________) /---\ Edge Node 1 | Cloud DC On premise | /---------/ (((o / | / Site-radio /_\ / Edge Node 2(/\_/\)-----/ /(_____)\ ___ / \ --- b--|_| -/ \--|_|--c /---\ /---\ On premise On premise
a: { b: [ane1, ane2, ane3, ane4, ane5], c: [ane1, ane2, ane3, ane4, ane6], DC: [ane1, ane2, ane3] } b: { c: [ane5, ane4, ane6], DC: [ane5, ane4, ane3] } ane1: latency = 5 ms cpu = 2 memory = 8 GB storage = 10 TB (On premise, a) ane2: latency = 20 ms cpu = 4 memory = 8 GB storage = 10 TB (Site-radio Edge Node 1) ane3: latency = 100 ms cpu = 8 memory = 128 GB storage = 100 TB (Access CO) ane4: latency = 20 ms cpu = 4 memory = 8 GB storage = 10 TB (Site-radio Edge Node 2) ane5: latency = 5 ms cpu = 2 memory = 8 GB storage = 10 TB (On premise, b) ane6: latency = 5 ms cpu = 2 memory = 8 GB storage = 10 TB (On premise, c)
f1 | ^ f1 | | -----------------> +----------+ +---+ +---+ | Firewall | | A |-----| B | +----------+ +---+ +---+ | | -----------------> v | f2 f2
ALTO client ALTO server |-------------- Request ---------------->| |<------------- Response ----------------|
ALTO client ALTO server |------------- PV Request -------------->| |<----- PV Response (Cost Map Part) -----| |<--- PV Response (Property Map Part) ---|
application/alto-propmap+json
20 Mbps 20 Mbps 10 Mbps +---+ +---+ +---+ /----| B |---| D |----| E |---- H2 +---+/ +---+ +---+ +---+ H1 ----| A | 15 Mbps| +---+\ +---+ \----| C | 15 Mbps +---+
object { [EntityPropertyName ane-property-names<0..*>;] } PVReqFilteredCostMap : ReqFilteredCostMap;
POST /costmap/pv HTTP/1.1 Host: alto.example.com Accept: multipart/related;type=application/alto-costmap+json, application/alto-error+json Content-Length: 212 Content-Type: application/alto-costmapfilter+json { "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" }, "pids": { "srcs": [ "PID1" ], "dsts": [ "PID2" ] }, "ane-property-names": [ "max-reservable-bandwidth" ] }
object { [EntityPropertyName ane-property-names<0..*>;] } PVFilteredCostMapCapabilities : FilteredCostMapCapabilities;
resource-id '.' part-resource-id
HTTP/1.1 200 OK Content-Length: 911 Content-Type: multipart/related; boundary=example-1; type=application/alto-costmap+json --example-1 Content-ID: <costmap@alto.example.com> Content-Type: application/alto-costmap+json { "meta": { "vtag": { "resource-id": "filtered-cost-map-pv.costmap", "tag": "fb20b76204814e9db37a51151faaaef2" }, "dependent-vtags": [ { "resource-id": "my-default-networkmap", "tag": "75ed013b3cb58f896e839582504f6228" } ], "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" } }, "cost-map": { "PID1": { "PID2": [ "ANE1" ] } } } --example-1 Content-ID: <propmap@alto.example.com> Content-Type: application/alto-propmap+json { "meta": { "dependent-vtags": [ { "resource-id": "filtered-cost-map-pv.costmap", "tag": "fb20b76204814e9db37a51151faaaef2" } ] }, "property-map": { ".ane:ANE1": { "max-reservable-bandwidth": 100000000 } } } --example-1
object { [EntityPropertyName ane-property-names<0..*>;] } PVReqEndpointCostMap : ReqEndpointCostMap;
POST /ecs/pv HTTP/1.1 Host: alto.example.com Accept: multipart/related;type=application/alto-endpointcost+json, application/alto-error+json Content-Length: 238 Content-Type: application/alto-endpointcostparams+json { "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" }, "endpoints": { "srcs": [ "ipv4:192.0.2.2" ], "dsts": [ "ipv4:192.0.2.18" ] }, "ane-property-names": [ "max-reservable-bandwidth" ] }
resource-id '.' part-resource-id
HTTP/1.1 200 OK Content-Length: 899 Content-Type: multipart/related; boundary=example-1; type=application/alto-endpointcost+json --example-1 Content-ID: <ecs@alto.example.com> Content-Type: application/alto-endpointcost+json { "meta": { "vtag": { "resource-id": "ecs-pv.ecs", "tag": "ec137bb78118468c853d5b622ac003f1" }, "dependent-vtags": [ { "resource-id": "my-default-networkmap", "tag": "677fe5f4066848d282ece213a84f9429" } ], "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" } }, "cost-map": { "ipv4:192.0.2.2": { "ipv4:192.0.2.18": [ "ANE1" ] } } } --example-1 Content-ID: <propmap@alto.example.com> Content-Type: application/alto-propmap+json { "meta": { "dependent-vtags": [ { "resource-id": "ecs-pv.ecs", "tag": "ec137bb78118468c853d5b622ac003f1" } ] }, "property-map": { ".ane:ANE1": { "max-reservable-bandwidth": 100000000 } } } --example-1
----- L1 / PID1 +----------+ 10 Gbps +----------+ PID3 192.0.2.0/28+-+ +------+ +---------+ +--+192.0.2.32/28 | | MEC1 | | | | 2001:db8::3:0/16 | +------+ | +-----+ | PID2 | | | +----------+ 192.0.2.16/28+-+ | | NET3 | | | 15 Gbps | | | \ +----------+ | -------- L2 NET1 | +----------+ | +------+ | PID4 | | MEC2 | +--+192.0.2.48/28 | +------+ | 2001:db8::4:0/16 +----------+ NET2
{ "meta": { "cost-types": { "path-vector": { "cost-mode": "array", "cost-metric": "ane-path" }, "num-rc": { "cost-mode": "numerical", "cost-metric": "routingcost" } } }, "resources": { "my-default-networkmap": { "uri": "https://alto.example.com/networkmap", "media-type": "application/alto-networkmap+json" }, "filtered-cost-map-pv": { "uri": "https://alto.example.com/costmap/pv", "media-type": "multipart/related; type=application/alto-costmap+json", "accepts": "application/alto-costmapfilter+json", "capabilities": { "cost-type-names": [ "path-vector" ], "ane-property-names": [ "max-reservable-bandwidth" ] }, "uses": [ "my-default-networkmap" ] }, "ane-props": { "uri": "https://alto.example.com/ane-props", "media-type": "application/alto-propmap+json", "accepts": "application/alto-propmapparams+json", "capabilities": { "mappings": { ".ane": [ "cpu" ] } } }, "endpoint-cost-pv": { "uri": "https://alto.exmaple.com/endpointcost/pv", "media-type": "multipart/related; type=application/alto-endpointcost+json", "accepts": "application/alto-endpointcostparams+json", "capabilities": { "cost-type-names": [ "path-vector" ], "ane-property-names": [ "max-reservable-bandwidth", "persistent-entity-id" ] }, "uses": [ "ane-props" ] }, "update-pv": { "uri": "https://alto.example.com/updates/pv", "media-type": "text/event-stream", "uses": [ "endpoint-cost-pv" ], "accepts": "application/alto-updatestreamparams+json", "capabilities": { "support-stream-control": true } }, "multicost-pv": { "uri": "https://alto.exmaple.com/endpointcost/mcpv", "media-type": "multipart/related; type=application/alto-endpointcost+json", "accepts": "application/alto-endpointcostparams+json", "capabilities": { "cost-type-names": [ "path-vector", "num-rc" ], "max-cost-types": 2, "testable-cost-type-names": [ "num-rc" ], "ane-property-names": [ "max-reservable-bandwidth", "persistent-entity-id" ] }, "uses": [ "ane-props" ] } } }
POST /costmap/pv HTTP/1.1 Host: alto.example.com Accept: multipart/related;type=application/alto-costmap+json, application/alto-error+json Content-Length: 163 Content-Type: application/alto-costmapfilter+json { "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" }, "pids": { "srcs": [ "PID1" ], "dsts": [ "PID3", "PID4" ] } }
HTTP/1.1 200 OK Content-Length: 952 Content-Type: multipart/related; boundary=example-1; type=application/alto-costmap+json --example-1 Content-ID: <costmap@alto.example.com> Content-Type: application/alto-costmap+json { "meta": { "vtag": { "resource-id": "filtered-cost-map-pv.costmap", "tag": "d827f484cb66ce6df6b5077cb8562b0a" }, "dependent-vtags": [ { "resource-id": "my-default-networkmap", "tag": "c04bc5da49534274a6daeee8ea1dec62" } ], "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" } }, "cost-map": { "PID1": { "PID3": [ "L1" ], "PID4": [ "L1", "L2" ] } } } --example-1 Content-ID: <propmap@alto.example.com> Content-Type: application/alto-propmap+json { "meta": { "dependent-vtags": [ { "resource-id": "filtered-cost-map-pv.costmap", "tag": "d827f484cb66ce6df6b5077cb8562b0a" } ] }, "property-map": { ".ane:L1": {}, ".ane:L2": {} } } --example-1
POST /endpointcost/pv HTTP/1.1 Host: alto.example.com Accept: multipart/related; type=application/alto-endpointcost+json, application/alto-error+json Content-Length: 383 Content-Type: application/alto-endpointcostparams+json { "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" }, "endpoints": { "srcs": [ "ipv4:192.0.2.34", "ipv6:2001:db8::3:1" ], "dsts": [ "ipv4:192.0.2.2", "ipv4:192.0.2.50", "ipv6:2001:db8::4:1" ] }, "ane-property-names": [ "max-reservable-bandwidth", "persistent-entity-id" ] }
HTTP/1.1 200 OK Content-Length: 1508 Content-Type: multipart/related; boundary=example-2; type=application/alto-endpointcost+json --example-2 Content-ID: <ecs@alto.example.com> Content-Type: application/alto-endpointcost+json { "meta": { "vtags": { "resource-id": "endpoint-cost-pv.ecs", "tag": "bb6bb72eafe8f9bdc4f335c7ed3b10822a391cef" }, "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" } }, "endpoint-cost-map": { "ipv4:192.0.2.34": { "ipv4:192.0.2.2": [ "NET3", "L1", "NET1" ], "ipv4:192.0.2.50": [ "NET3", "L2", "NET2" ] }, "ipv6:2001:db8::3:1": { "ipv6:2001:db8::4:1": [ "NET3", "L2", "NET2" ] } } } --example-2 Content-ID: <propmap@alto.example.com> Content-Type: application/alto-propmap+json { "meta": { "dependent-vtags": [ { "resource-id": "endpoint-cost-pv.ecs", "tag": "bb6bb72eafe8f9bdc4f335c7ed3b10822a391cef" }, { "resource-id": "ane-props", "tag": "bf3c8c1819d2421c9a95a9d02af557a3" } ] }, "property-map": { ".ane:NET1": { "max-reservable-bandwidth": 50000000000, "persistent-entity-id": "ane-props.ane:MEC1" }, ".ane:NET2": { "max-reservable-bandwidth": 50000000000, "persistent-entity-id": "ane-props.ane:MEC2" }, ".ane:NET3": { "max-reservable-bandwidth": 50000000000 }, ".ane:L1": { "max-reservable-bandwidth": 10000000000 }, ".ane:L2": { "max-reservable-bandwidth": 15000000000 } } } --example-2
HTTP/1.1 200 OK Content-Length: 1333 Content-Type: multipart/related; boundary=example-2; type=application/alto-endpointcost+json --example-2 Content-ID: <ecs@alto.example.com> Content-Type: application/alto-endpointcost+json { "meta": { "vtags": { "resource-id": "endpoint-cost-pv.ecs", "tag": "bb975862fbe3422abf4dae386b132c1d" }, "cost-type": { "cost-mode": "array", "cost-metric": "ane-path" } }, "endpoint-cost-map": { "ipv4:192.0.2.34": { "ipv4:192.0.2.2": [ "NET3", "AGGR1" ], "ipv4:192.0.2.50": [ "NET3", "AGGR2" ] }, "ipv6:2001:db8::3:1": { "ipv6:2001:db8::4:1": [ "NET3", "AGGR2" ] } } } --example-2 Content-ID: <propmap@alto.example.com> Content-Type: application/alto-propmap+json { "meta": { "dependent-vtags": [ { "resource-id": "endpoint-cost-pv.ecs", "tag": "bb975862fbe3422abf4dae386b132c1d" }, { "resource-id": "ane-props", "tag": "bf3c8c1819d2421c9a95a9d02af557a3" } ] }, "property-map": { ".ane:AGGR1": { "max-reservable-bandwidth": 10000000000, "persistent-entity-id": "ane-props.ane:MEC1" }, ".ane:AGGR2": { "max-reservable-bandwidth": 15000000000, "persistent-entity-id": "ane-props.ane:MEC2" }, ".ane:NET3": { "max-reservable-bandwidth": 50000000000 } } } --example-2
POST /updates/pv HTTP/1.1 Host: alto.example.com Accept: text/event-stream Content-Type: application/alto-updatestreamparams+json Content-Length: 120 { "add": { "ecspvsub1": { "resource-id": "endpoint-cost-pv", "input": <ecs-input> } } }
HTTP/1.1 200 OK Connection: keep-alive Content-Type: text/event-stream event: application/alto-updatestreamcontrol+json data: {"control-uri": "https://alto.example.com/updates/streams/123"} event: multipart/related;boundary=example-3; type=application/alto-endpointcost+json,ecspvsub1 data: --example-3 data: Content-ID: <ecsmap@alto.example.com> data: Content-Type: application/alto-endpointcost+json data: data: <endpoint-cost-map-entry> data: --example-3 data: Content-ID: <propmap@alto.example.com> data: Content-Type: application/alto-propmap+json data: data: <property-map-entry> data: --example-3--
event: application/merge-patch+json, ecspvsub1.ecsmap@alto.example.com data: <Merge patch for endpoint-cost-map-update> event: application/merge-patch+json, ecspvsub1.propmap@alto.example.com data: <Merge patch for property-map-update>
POST /endpointcost/mcpv HTTP/1.1 Host: alto.example.com Accept: multipart/related; type=application/alto-endpointcost+json, application/alto-error+json Content-Length: 454 Content-Type: application/alto-endpointcostparams+json { "multi-cost-types": [ { "cost-mode": "array", "cost-metric": "ane-path" }, { "cost-mode": "numerical", "cost-metric": "routingcost" } ], "endpoints": { "srcs": [ "ipv4:192.0.2.34", "ipv6:2001:db8::3:1" ], "dsts": [ "ipv4:192.0.2.2", "ipv4:192.0.2.50", "ipv6:2001:db8::4:1" ] }, "ane-property-names": [ "max-reservable-bandwidth", "persistent-entity-id" ] }
HTTP/1.1 200 OK Content-Length: 1419 Content-Type: multipart/related; boundary=example-4; type=application/alto-endpointcost+json --example-4 Content-ID: <ecs@alto.example.com> Content-Type: application/alto-endpointcost+json { "meta": { "vtags": { "resource-id": "endpoint-cost-pv.ecs", "tag": "84a4f9c14f9341f0983e3e5f43a371c8" }, "multi-cost-types": [ { "cost-mode": "array", "cost-metric": "ane-path" }, { "cost-mode": "numerical", "cost-metric": "routingcost" } ] }, "endpoint-cost-map": { "ipv4:192.0.2.34": { "ipv4:192.0.2.2": [[ "NET3", "AGGR1" ], 3], "ipv4:192.0.2.50": [[ "NET3", "AGGR2" ], 2] }, "ipv6:2001:db8::3:1": { "ipv6:2001:db8::4:1": [[ "NET3", "AGGR2" ], 2] } } } --example-4 Content-ID: <propmap@alto.example.com> Content-Type: application/alto-propmap+json { "meta": { "dependent-vtags": [ { "resource-id": "endpoint-cost-pv.ecs", "tag": "84a4f9c14f9341f0983e3e5f43a371c8" }, { "resource-id": "ane-props", "tag": "be157afa031443a187b60bb80a86b233" } ] }, "property-map": { ".ane:AGGR1": { "max-reservable-bandwidth": 10000000000, "persistent-entity-id": "ane-props.ane:MEC1" }, ".ane:AGGR2": { "max-reservable-bandwidth": 15000000000, "persistent-entity-id": "ane-props.ane:MEC2" }, ".ane:NET3": { "max-reservable-bandwidth": 50000000000 } } } --example-4
Identifier | Intended Semantics | Reference |
---|---|---|
ane-path | See Section 6.5.1 | RFC 9275 |
Identifier | Description | Intended Semantics | Reference |
---|---|---|---|
array | Indicates that the cost value is a JSON array | See Section 6.5.2 | RFC 9275 |
Identifier | Entity Identifier Encoding | Hierarchy and Inheritance | Media Type of Defining Resource | Mapping to ALTO Address Type |
---|---|---|---|---|
ane | See Section 6.2.2 | None | application/alto-propmap+json | false |
Identifier | Intended Semantics | Media Type of Defining Resource |
---|---|---|
max-reservable-bandwidth | See Section 6.4.1 | application/alto-propmap+json |
persistent-entity-id | See Section 6.4.2 | application/alto-propmap+json |