Jasdip,

This is very impressive work, Jasdip. I've been trying to follow this
conversation, and this doc is very helpful.

I note that in the analysis there are references to "put the new
extension value in the help" (or something). What does this mean?
First, /help is a query unto itself. Second, putting additional
information in a "notice" without proper guidance of what to actually
do may be kicking the ambiguity-can down the road. Is it part of the
title for the notice? Is there a textual description, and if so how
does that work with I18N issues? Does it go into a relative link
structure?

The aspect analysis section is interesting as it helps us to evaluate
the trade-offs. In my opinion, interoperability is paramount otherwise
we'll just be repeating this conversation again in a year. I view
on-the-wire efficiency as the least-compelling objective for this
protocol. And cost to clients should be given higher consideration
than cost to servers given there are many more clients than servers.

I believe this puts me in camp A even if it means we sacrifice some of
the on-the-wire aesthetic.

-andy

On Mon, Jun 6, 2022 at 10:05 PM Jasdip Singh <jasd...@arin.net> wrote:
>
> Hi.
>
>
>
> Please find below the revised analysis of the current approach (A) and the 2 
> newly proposed approaches (B and C) for RDAP extensions [1]. Hopefully, the 
> considered change scenarios are now granular enough ( @Mario :) ).
>
>
>
> My high-level observations:
>
> Approach C is much better than Approach B.
> That said, would still go with Approach A since it consistently prevents 
> naming collisions for all change scenarios and affords sufficient transition 
> time for clients to “upgrade” to the next iteration of an extension. The 
> latter -- graceful upgrade -- could be quite important to most, if not all, 
> customers of the RDAP service at an RIR or a DNR, to the point of being an 
> operational requirement. The former – consistently preventing naming 
> collisions – helps keep the model simple, albeit at the expense of 
> occasionally sending more data in responses.
> Approach C is closer to Approach A than to Approach B but requires a careful 
> scenario-by-scenario analysis to determine the need for a new prefix(es), and 
> that could be problematic at times. I think it’d come down to (sunk) cost 
> versus benefit when choosing between sticking with Approach A or moving to 
> Approach C.
>
>
>
> Please feel free to rectify this analysis. :) Hopefully, the discussion could 
> converge for the considered change scenarios.
>
>
>
> Thanks,
>
> Jasdip
>
>
>
> [1] 
> https://docs.google.com/document/d/1e3QD8z01KpYRd5LwdLBWjHHDoFVAVEL8u7Y52zsDdx0/edit?usp=sharing
>
>
>
> ---
>
>
>
> RDAP Extensions Analysis v2
>
>
>
> Approaches
>
> Change Scenario Analysis
>
> Aspect Analysis
>
> Approaches
>
>
>
> Approach A: Tight coupling between extension identifier and rdapConformance
>
>
>
> Extension identifier = <opaque identifier>
>
>   No version semantics
>
>   Registered in the IANA RDAP Extensions registry
>
>   A new spec provided for each new iteration of the extension
>
> rdapConformance = <extension identifier>
>
>
>
> Extension identifier used to prefix data member names, and in URIs (path 
> segment, segment parameter, and/or query parameters)
>
>
>
> Note: The phrase “new iteration” here simply connotes a new opaque identifier 
> for an extension when it evolves.
>
>
>
> Approach B: Lack of tight coupling between extension identifier and 
> rdapConformance
>
>
>
> Extension identifier = <prefix>
>
>   Registered in the IANA RDAP Extensions registry
>
> rdapConformance = <prefix>[<version (suffix)>]   [ ] means optional
>
>   Needs version (suffix) semantics
>
>   Registered in the IANA RDAP Extensions registry (or perhaps another 
> registry for rdapConformance)
>
>   A new spec provided for each new version of rdapConformance
>
>
>
> Extension identifier used to prefix data member names, and in URIs (path 
> segment, segment parameter, and/or query parameters)
>
>
>
> Approach C: Decouple extension identifier from prefix(es) used for naming
>
>
>
> Extension identifier = <opaque identifier>
>
>   Registered in the IANA RDAP Extensions registry
>
>   A new spec provided for each new iteration of the extension; lists 
> prefix(es) used for naming
>
>     Version semantics not needed for listed prefix(es)
>
> rdapConformance = <extension identifier>
>
>
>
> Listed prefix(es) used to prefix data member names, and in URIs (path 
> segment, segment parameter, and/or query parameters)
>
> Change Scenario Analysis
>
> Legend:
>
> ei - extension identifier
>
> rc - rdapConformance value
>
> p - prefix
>
> u - URI
>
> q - query parameter
>
> s - segment
>
> sp - segment parameter
>
> d - data member
>
>
>
> #
>
> Change Scenario
>
> Approach A - Tight coupling between extension identifier and rdapConformance
>
> Approach B - Lack of tight coupling between extension identifier and 
> rdapConformance
>
> Approach C - Decouple extension identifier from prefix(es) used for naming
>
> 1
>
> Add a URI path (no parameters yet)
>
> ei = ext0 (registered)
>
> rc = ext0
>
> p = ext0 (new)
>
>
>
> u0 = …/ext0/…
>
> ei = ext (registered)
>
> rc = ext0 (registered)
>
> p = ext (new)
>
>
>
> u0 = …/ext/…
>
> ei = ext0 (registered)
>
> rc = ext0
>
> p = p0 (new)
>
>
>
> u0 = …/p0/…
>
> 2
>
> Add a path segment (s1)
>
> ei = ext1 (registered)
>
> rc = ext1
>
> p = ext1 (new)
>
>
>
> u1 = …/ext1/s1/…
>
>
>
> Old URI u0 continues to exist during transition
>
> ei = ext
>
> rc = ext1 (registered)
>
> p = ext
>
>
>
> u1 = …/ext/s1/…
>
>
>
> Clients still on rc ext0 when calling u0 break
>
> ei = ext1 (registered)
>
> rc = ext1
>
> p = p1 (new)
>
>
>
> u1 = …/p1/s1/…
>
>
>
> Old URI u0 continues to exist during transition
>
> 3
>
> Add a segment parameter (sp2)
>
> ei = ext2 (registered)
>
> rc = ext2
>
> p = ext2 (new)
>
>
>
> u2 = …/ext2/s1;sp2=.../…
>
> ei = ext
>
> rc = ext2 (registered)
>
> p = ext
>
>
>
> u2 = …/ext/s1;sp2=.../…
>
> ei = ext2 (registered)
>
> rc = ext2
>
> p = p1
>
>
>
> u2 = …/p1/s1;sp2=.../…
>
> 4
>
> Rename a segment parameter (sp2 -> sp3)
>
> ei = ext3 (registered)
>
> rc = ext3
>
> p = ext3 (new)
>
>
>
> u3 = …/ext3/s1;sp3=.../…
>
>
>
> Old URI u2 continues to exist during transition
>
> ei = ext
>
> rc = ext3 (registered)
>
> p = ext
>
>
>
> u3 = …/ext/s1;sp3=.../…
>
>
>
> Clients still on rc ext2 when calling u2 break
>
> ei = ext3 (registered)
>
> rc = ext3
>
> p = p3 (new)
>
>
>
> u3 = …/p3/s1;sp3=.../…
>
>
>
> Old URI u2 continues to exist during transition
>
> 5
>
> Remove a path segment (s1)
>
> ei = ext4 (registered)
>
> rc = ext4
>
> p = ext4 (new)
>
>
>
> u4 = …/ext4/…
>
>
>
> Old URI u3 continues to exist during transition
>
> ei = ext
>
> rc = ext4 (registered)
>
> p = ext
>
>
>
> u4 = …/ext/…
>
>
>
> Clients still on rc ext3 when calling u3 break
>
> ei = ext4 (registered)
>
> rc = ext4
>
> p = p4 (new)
>
>
>
> u4 = …/p4/…
>
>
>
> Old URI u3 continues to exist during transition
>
> 6
>
> Add a required query parameter (q5)
>
> ei = ext5 (registered)
>
> rc = ext5
>
> p = ext5 (new)
>
>
>
> u5 = …/ext5/…?q5=...
>
>
>
> Old URI u4 continues to exist during transition
>
> ei = ext
>
> rc = ext5 (registered)
>
> p = ext
>
>
>
> u5 = …/ext/…?q5=...
>
>
>
> Clients still on rc ext4 when calling u4 break
>
> ei = ext5 (registered)
>
> rc = ext5
>
> p = p5 (new)
>
>
>
> u5 = …/p5/…?q5=...
>
>
>
> Old URI u4 continues to exist during transition
>
> 7
>
> Add an optional query parameter (q6)
>
> ei = ext6 (registered)
>
> rc = ext6
>
> p = ext6 (new)
>
>
>
> u6 = …/ext6/…?q5=...&q6=...
>
>
>
> Old URI u5 continues to exist during transition
>
> ei = ext
>
> rc = ext6 (registered)
>
> p = ext
>
>
>
> u6 = …/ext/…?q5=...&q6=...
>
>
>
> Clients still on rc ext5 when calling u5 do not break
>
> ei = ext6 (registered)
>
> rc = ext6
>
> p = p5
>
>
>
> u6 = …/p5/…?q5=...&q6=...
>
>
>
> Clients still on rc ext5 when calling u5 do not break
>
> 8
>
> Rename a required query parameter (q5 -> q7)
>
> ei = ext7 (registered)
>
> rc = ext7
>
> p = ext7 (new)
>
>
>
> u7 = …/ext7/…?q7=...&q6=...
>
>
>
> Old URI u6 continues to exist during transition
>
> ei = ext
>
> rc = ext7 (registered)
>
> p = ext
>
>
>
> u7 = …/ext/…?q7=...&q6=...
>
>
>
> Clients still on rc ext6 when calling u6 break
>
> ei = ext7 (registered)
>
> rc = ext7
>
> p = p7 (new)
>
>
>
> u7 = …/p7/…?q7=...&q6=...
>
>
>
> Old URI u6 continues to exist during transition
>
> 9
>
> Rename an optional query parameter (q6 -> q8)
>
> ei = ext8 (registered)
>
> rc = ext8
>
> p = ext8 (new)
>
>
>
> u8 = …/ext8/…?q7=...&q8=...
>
>
>
> Old URI u7 continues to exist during transition
>
> ei = ext
>
> rc = ext8 (registered)
>
> p = ext
>
>
>
> u8 = …/ext/…?q7=...&q8=...
>
>
>
> Clients still on rc ext7 when calling u7 break
>
> ei = ext8 (registered)
>
> rc = ext8
>
> p = p8 (new)
>
>
>
> u8 = …/p8/…?q7=...&q8=...
>
>
>
> Old URI u7 continues to exist during transition
>
> 10
>
> Add a new data member (object class, array, number, string, and/or literal) 
> (d object) for a new response
>
> ei = ext9 (registered)
>
> rc = ext9
>
> p = ext9 (new)
>
>
>
> u9 = …/ext9/…?q7=...&q8=...
>
>
>
> Old URI u8 continues to exist during transition
>
>
>
> u9_d = …/ext9_d/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext9”
>
>   ],
>
>   “ext9_d” : {
>
>     “d0” : “a”
>
>   }
>
> }
>
> ei = ext
>
> rc = ext9 (registered)
>
> p = ext
>
>
>
> u8 = …/ext/…?q7=...&q8=...
>
>
>
> u9_d = …/ext_d/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext9”
>
>   ],
>
>   “ext_d” : {
>
>     “d0” : “a”
>
>   }
>
> }
>
> ei = ext9 (registered)
>
> rc = ext9
>
> p = p8
>
>
>
> u8 = …/p8/…?q7=...&q8=...
>
>
>
> u9_d = …/p8_d/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext9”
>
>   ],
>
>   “p8_d” : {
>
>     “d0” : “a”
>
>   }
>
> }
>
> 11
>
> Add a required data member (d1) to an existing response
>
> ei = ext10 (registered)
>
> rc = ext10
>
> p = ext10 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext10”
>
>   ],
>
>   …,
>
>   “ext10_d1” : 8
>
> }
>
> ei = ext
>
> rc = ext10 (registered)
>
> p = ext
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext10”
>
>   ],
>
>   …,
>
>   “ext_d1” : 8
>
> }
>
> ei = ext10 (registered)
>
> rc = ext10
>
> p = p10 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext10”
>
>   ],
>
>   …,
>
>   “p10_d1” : 8
>
> }
>
> 12
>
> Add an optional data member (d2) to an existing response
>
> ei = ext11 (registered)
>
> rc = ext11
>
> p = ext11 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext10”,
>
>     “ext11”
>
>   ],
>
>   …,
>
>   “ext10_d1” : 8,
>
>   “ext11_d1” : 8,
>
>   “ext11_d2” : “abc”
>
> }
>
>
>
> Clients still on rc ext10 when calling u10 do not break, at the expense of 
> sending duplicate data for ext10
>
> ei = ext
>
> rc = ext11 (registered)
>
> p = ext
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext11”
>
>   ],
>
>   …,
>
>   “ext_d1” : 8,
>
>   “ext_d2” : “abc”
>
> }
>
>
>
> Clients still on rc ext10 when calling u10 do not break
>
> ei = ext11 (registered)
>
> rc = ext11
>
> p = p10
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext11”
>
>   ],
>
>   …,
>
>   “p10_d1” : 8,
>
>   “p10_d2” : “abc”
>
> }
>
>
>
> Clients still on rc ext10 when calling u10 do not break
>
> 13
>
> Rename a required data member (d1 -> d3)
>
> ei = ext12 (registered)
>
> rc = ext12
>
> p = ext12 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext11”,
>
>     “ext12”
>
>   ],
>
>   …,
>
>   “ext11_d1” : 8,
>
>   “ext11_d2” : “abc”,
>
>   “ext12_d3” : 8,
>
>   “ext12_d2” : “abc”
>
> }
>
>
>
> Clients still on rc ext11 when calling u10 do not break, at the expense of 
> sending duplicate data for ext11
>
> ei = ext
>
> rc = ext12 (registered)
>
> p = ext
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext12”
>
>   ],
>
>   …,
>
>   “ext_d3” : 8,
>
>   “ext_d2” : “abc”
>
> }
>
>
>
> Clients still on rc ext11 when calling u10 break
>
> ei = ext12 (registered)
>
> rc = ext12
>
> p = p12 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext11”,
>
>     “ext12”
>
>   ],
>
>   …,
>
>   “p10_d1” : 8,
>
>   “p10_d2” : “abc”,
>
>   “p12_d3” : 8,
>
>   “p12_d2” : “abc”
>
> }
>
>
>
> Clients still on rc ext11 when calling u10 do not break, at the expense of 
> sending duplicate data for ext11
>
> 14
>
> Modify a required data member’s type (d3 number -> string)
>
> ei = ext13 (registered)
>
> rc = ext13
>
> p = ext13 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext12”,
>
>     “ext13”
>
>   ],
>
>   …,
>
>   “ext12_d3” : 8,
>
>   “ext12_d2” : “abc”,
>
>   “ext13_d3” : “def”,
>
>   “ext13_d2” : “abc”
>
> }
>
>
>
> Clients still on rc ext12 when calling u10 do not break, at the expense of 
> sending duplicate data for ext12
>
> ei = ext
>
> rc = ext13 (registered)
>
> p = ext
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext13”
>
>   ],
>
>   …,
>
>   “ext_d3” : “def”,
>
>   “ext_d2” : “abc”
>
> }
>
>
>
> Clients still on rc ext12 when calling u10 break
>
> ei = ext13 (registered)
>
> rc = ext13
>
> p = p13 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext12”,
>
>     “ext13”
>
>   ],
>
>   …,
>
>   “p12_d3” : 8,
>
>   “p12_d2” : “abc”,
>
>   “p13_d3” : “def”,
>
>   “p13_d2” : “abc”
>
> }
>
>
>
> Clients still on rc ext12 when calling u10 do not break, at the expense of 
> sending duplicate data for ext12
>
> 15
>
> Rename an optional data member (d2 -> d4)
>
> ei = ext14 (registered)
>
> rc = ext14
>
> p = ext14 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext13”,
>
>     “ext14”
>
>   ],
>
>   …,
>
>   “ext13_d3” : “def”,
>
>   “ext13_d2” : “abc”,
>
>   “ext14_d3” : “def”,
>
>   “ext14_d4” : “abc”
>
> }
>
>
>
> Clients still on rc ext13 when calling u10 do not break, at the expense of 
> sending duplicate data for ext13
>
> ei = ext
>
> rc = ext14 (registered)
>
> p = ext
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext14”
>
>   ],
>
>   …,
>
>   “ext_d3” : “def”,
>
>   “ext_d4” : “abc”
>
> }
>
>
>
> Clients still on rc ext13 when calling u10 break if they were processing the 
> optional data member
>
> ei = ext14 (registered)
>
> rc = ext14
>
> p = p14 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext13”,
>
>     “ext14”
>
>   ],
>
>   …,
>
>   “p13_d3” : “def”,
>
>   “p13_d2” : “abc”,
>
>   “p14_d3” : “def”,
>
>   “p14_d4” : “abc”
>
> }
>
>
>
> Clients still on rc ext13 when calling u10 do not break, at the expense of 
> sending duplicate data for ext13
>
> 16
>
> Modify an optional data member’s type (d4 string -> number)
>
> ei = ext15 (registered)
>
> rc = ext15
>
> p = ext15 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext14”,
>
>     “ext15”
>
>   ],
>
>   …,
>
>   “ext14_d3” : “def”,
>
>   “ext14_d4” : “abc”,
>
>   “ext15_d3” : “def”,
>
>   “ext15_d4” : 16
>
> }
>
>
>
> Clients still on rc ext14 when calling u10 do not break, at the expense of 
> sending duplicate data for ext14
>
> ei = ext
>
> rc = ext15 (registered)
>
> p = ext
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext15”
>
>   ],
>
>   …,
>
>   “ext_d3” : “def”,
>
>   “ext_d4” : 16
>
> }
>
>
>
> Clients still on rc ext14 when calling u10 break if they were processing the 
> optional data member
>
> ei = ext15 (registered)
>
> rc = ext15
>
> p = p15 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext14”,
>
>     “ext15”
>
>   ],
>
>   …,
>
>   “p14_d3” : “def”,
>
>   “p14_d4” : “abc”,
>
>   “p15_d3” : “def”,
>
>   “p15_d4” : 16
>
> }
>
>
>
> Clients still on rc ext14 when calling u10 do not break, at the expense of 
> sending duplicate data for ext14
>
> 17
>
> Remove a required data member (d3)
>
> ei = ext16 (registered)
>
> rc = ext16
>
> p = ext16 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext15”,
>
>     “ext16”
>
>   ],
>
>   …,
>
>   “ext15_d3” : “def”,
>
>   “ext15_d4” : 16,
>
>   “ext16_d4” : 16,
>
> }
>
>
>
> Clients still on rc ext15 when calling u10 do not break, at the expense of 
> sending duplicate data for ext15
>
> ei = ext
>
> rc = ext16 (registered)
>
> p = ext
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext16”
>
>   ],
>
>   …,
>
>   “ext_d4” : 16
>
> }
>
>
>
> Clients still on rc ext15 when calling u10 break
>
> ei = ext16 (registered)
>
> rc = ext16
>
> p = p16 (new)
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext15”,
>
>     “ext16”
>
>   ],
>
>   …,
>
>   “p15_d3” : “def”,
>
>   “p15_d4” : 16,
>
>   “p16_d4” : 16,
>
> }
>
>
>
> Clients still on rc ext15 when calling u10 do not break, at the expense of 
> sending duplicate data for ext15
>
> 18
>
> Remove an optional data member (d4)
>
> ei = ext17 (registered)
>
> rc = ext17
>
> p = ext16
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext16”,
>
>     “ext17”
>
>   ],
>
>   …,
>
>   “ext16_d4” : 16
>
> }
>
>
>
> Clients still on rc ext16 when calling u10 do not break, at the expense of 
> sending data for ext16
>
>
>
> Note: This would be the case when phasing out jcard
>
> ei = ext
>
> rc = ext17 (registered)
>
> p = ext
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext17”
>
>   ],
>
>   …
>
> }
>
>
>
> Clients still on rc ext16 when calling u10 break if they were processing the 
> optional data member
>
> ei = ext17 (registered)
>
> rc = ext17
>
> p = p16
>
>
>
> u10 = …/…
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext16”,
>
>     “ext17”
>
>   ],
>
>   …,
>
>   “p16_d4” : 16
>
> }
>
>
>
> Clients still on rc ext16 when calling u10 do not break, at the expense of 
> sending data for ext16
>
> 19
>
> Remove a required query parameter (q7)
>
> ei = ext18 (registered)
>
> rc = ext18
>
> p = ext18 (new)
>
>
>
> u18 = …/ext18/…?q8=...
>
>
>
> Old URI u9 continues to exist during transition
>
> ei = ext
>
> rc = ext18 (registered)
>
> p = ext
>
>
>
> u18 = …/ext/…?q8=...
>
>
>
> Clients still on rc ext9 when calling u8 break
>
> ei = ext18 (registered)
>
> rc = ext18
>
> p = p18 (new)
>
>
>
> u18 = …/p18/…?q8=...
>
>
>
> Old URI u8 continues to exist during transition
>
> 20
>
> Remove an optional query parameter (q8)
>
> ei = ext19 (registered)
>
> rc = ext19
>
> p = ext19 (new)
>
>
>
> u19 = …/ext19/…
>
>
>
> Old URI u18 continues to exist during transition
>
> ei = ext
>
> rc = ext19 (registered)
>
> p = ext
>
>
>
> u19 = …/ext/…
>
>
>
> Clients still on rc ext18 when calling u18 break
>
> ei = ext19 (registered)
>
> rc = ext19
>
> p = p19 (new)
>
>
>
> u19 = …/p19/…
>
>
>
> Old URI u18 continues to exist during transition
>
> 21
>
> Remove a URI path (u19)
>
> ei = ext20 (registered)
>
> rc = ext20
>
> p = ext19
>
>
>
> u19 = …/ext19/…
>
>
>
> Old URI u19 continues to exist during transition, and not beyond
>
> ei = ext
>
> rc = ext20 (registered)
>
> p = ext
>
>
>
> u19 = …/ext/…
>
>
>
> Old URI u19 continues to exist during transition, and not beyond
>
> ei = ext20 (registered)
>
> rc = ext20
>
> p = p19
>
>
>
> u19 = …/p19/…
>
>
>
> Old URI u19 continues to exist during transition, and not beyond
>
> 22
>
> Add a query parameter (q9) to an existing, non-extension URI
>
> ei = ext21 (registered)
>
> rc = ext21
>
> p = ext21 (new)
>
>
>
> u21 = …?ext21_q9=...
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext21”
>
>   ],
>
>   …
>
> }
>
> ei = ext
>
> rc = ext21 (registered)
>
> p = ext
>
>
>
> u21 = …?ext_q9=...
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext21”
>
>   ],
>
>   …
>
> }
>
> ei = ext21 (registered)
>
> rc = ext21
>
> p = p21 (new)
>
>
>
> u21 = …?p21_q9=...
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext21”
>
>   ],
>
>   …
>
> }
>
> 23
>
> Remove a query parameter (q9) from an existing, non-extension URI, as well as 
> add a query parameter (q10) to it
>
> ei = ext22 (registered)
>
> rc = ext22
>
> p = ext22 (new)
>
>
>
> u22 = …?ext21_q9=...&ext22_q10=...
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext21”,
>
>     “ext22”
>
>   ],
>
>   …
>
> }
>
>
>
> Clients still on rc ext21 when calling u22 do not break
>
> ei = ext
>
> rc = ext22 (registered)
>
> p = ext
>
>
>
> u22 = …?ext_q10=...
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext22”
>
>   ],
>
>   …
>
> }
>
>
>
> Clients still on rc ext21 when calling u22 break
>
> ei = ext22 (registered)
>
> rc = ext22
>
> p = p22 (new)
>
>
>
> u22 = …?p21_q9=...&p22_q10=...
>
>
>
> {
>
>   “rdapConformance” : [
>
>     …,
>
>     “ext21”,
>
>     “ext22”
>
>   ],
>
>   …
>
> }
>
>
>
> Clients still on rc ext21 when calling u22 do not break
>
>
>
> Aspect Analysis
>
>
>
> #
>
> Aspect
>
> Approach A - Tight coupling between extension identifier and rdapConformance
>
> Approach B - Lack of tight coupling between extension identifier and 
> rdapConformance
>
> Approach C - Decouple extension identifier from prefix(es) used for naming
>
> 1
>
> Providing a new spec to IANA for a new iteration of an extension
>
> Registry stays as-is
>
>
>
> Few non-compliant registrations need to be remedied
>
> Registry needs to evolve for:
>
>
>
>   Versioned rdapConformance
>
>
>
>   Tying spec to versioned rdapConformance
>
> Registry stays as-is
>
>
>
> Prefix(es) listed in the spec
>
> 2
>
> Risk of breaking changes for RDAP clients
>
> Minimal since it would always be a controlled upgrade to the next iteration 
> of an extension with sufficient transition time
>
> Most risky out of all the approaches since there is no controlled way to 
> upgrade for quite a few change scenarios
>
> Risk is minimal, like for approach A
>
>
>
> However, requires carefully identifying the need for a new prefix on 
> scenario-by-scenario basis; otherwise inadvertent mistakes possible
>
> 3
>
> Cost of reprogramming clients for the next iteration of an extension
>
> There is cost but not as high as it seems — replacing extension identifier in 
> multiple places, and accounting for primarily query parameter and data member 
> changes
>
>
>
> Longer grace period for clients to reprogram if the server supports multiple 
> iterations of an extension during transition
>
> Reprogramming could become exigent for clients if the server switches to the 
> new iteration without supporting the previous iteration
>
> Cost slightly lower than that for Approach A — replacing prefixes for a 
> majority (but not all) of scenarios
>
> 4
>
> Cost of reprogramming servers for the next iteration of an extension
>
> Highest cost — to simultaneously support multiple iterations during 
> transition period, replicating code from the previous iteration and replacing 
> extension identifier in multiple places, and accounting for primarily query 
> parameter and data member changes
>
>
>
> Eventually retiring code for the previous iteration
>
> Lowest cost since only the latest iteration is supported
>
> Cost is lower than for that for Approach A but not too low — for a majority 
> (but not all) of scenarios, to simultaneously support multiple iterations 
> during transition period, replicating code from the previous iteration and 
> replacing prefixes in multiple places, and accounting for primarily query 
> parameter and data member changes
>
>
>
> Eventually retiring code for the previous iteration
>
> 5
>
> Server-side signaling of the next iteration of an extension
>
> Add the new value of the rdapConformance in the help response and related 
> responses
>
>
>
> Make new URIs available
>
> Add the new value of the rdapConformance in the help response and related 
> responses
>
>
>
> No change in URIs for the new value of the rdapConformance
>
> Add the new value of the rdapConformance in the help response and related 
> responses
>
>
>
> To a lower extent than Approach A, make new URIs available
>
> 6
>
> Collisions risk
>
> Zero since the new extension identifier is explicitly marked in data members 
> and URIs
>
> High since the new iteration of an extension is not marked in data members 
> and URIs, and is only discoverable through the rdapConformance value in a 
> response
>
> Zero since the new prefix is explicitly marked in data members and URIs, just 
> like the new extension identifier in Approach A
>
>
>
>
>
> _______________________________________________
> regext mailing list
> regext@ietf.org
> https://www.ietf.org/mailman/listinfo/regext

_______________________________________________
regext mailing list
regext@ietf.org
https://www.ietf.org/mailman/listinfo/regext

Reply via email to