On Jun 16, 2011, at 9:07 AM, Freek Dijkstra wrote:

Freek Dijkstra wrote:
During today's call we agreed to have another conference call in two
weeks time.

The next NML call is scheduled on June 16th at
UTC 15:00 = 8:00 PDT = EDT 11:00 = 17:00 CEST.

Call: +1-734-615-7474 (Please use if you do not pay for Long Distance)
or +1-866-411-0013 (toll free US/Canada Only)
Enter access code: 0186145

Jeroen and I today have been looking at the NML RNC schema that Roman
Ɓapacz wrote some time ago.

Some initial comments:

--- nmlbase20110421.rnc 2011-06-16 11:02:32.000000000 -0400
+++ nmlbase20110616.rnc 2011-06-16 10:56:20.000000000 -0400
@@ -40,17 +42,19 @@
 
 Relation =
   element relation {
-    attribute type { xsd:string }
-    & IdReference*
-    & anyElement*
+    attribute type { xsd:anyURI }
+    & ( BaseNode | BaseLink | BasePort | BaseService | NMLGroup | Container )
   }
 
+# problem: hasPort, hasport, has_port are not equal. Risk is less with URI's.
+# risk of proliferation of types. E.g. Port -hostname-> Node instead of Node -hasport-> Port
+

I think this is going to be a problem no matter what. If it's a URI, folks can still define junk relationships. I'm not opposed to it, per se; though, I'd like to see some specifics of what kinds of URIs you're thinking of.

 Lifetime =
   element lifetime {
     StartTime
     & (EndTime | Duration)?
   }
-
+### May a lifetime be segmented? (thus multiple sets of begin/endtime?)

It's probably just an optimization so i'd rather keep things simple, if possible. I think, in general, the same element may appear with different lifetime elements. For example, at time X, a virtual port's capacity is increased (the ports id is Y). Now we have the same element, Y, with a different set of properties (pre-X and post-X). If we change Y, we'll need to update everything pointing at Y with the new id. If we keep Y the same, when users lookup the element, they'll find two with different lifetimes, and it's up to them to figure out the correct one for their situation. I think the latter makes the most sense (if nothing else, it avoids nasty update loops when elements A and B have pointers at each other, and one gets updated. if A gets updated, it becomes A', so B gets updated, and now points at A', but it needs to be changed to B', so A' needs updated to point to B', and becomes A'', etc).

  # #################################################################
 # This sequence allows any element, attribute, or text (regardless 
@@ -78,14 +82,13 @@
 ## ########################
 
 StartTime = 
-  anyElement*
+  element start { xsd:dateTime }
    
 EndTime = 
-  anyElement*
+  element end { xsd:dateTime }
 
 Duration =
-  anyElement*
-
+  element duration { xsd:duration }

The ISO duration looks truly ugly IMO, but I'm fine with swapping these to use more standardized formats.

 ## ########################
 ## Generic location
@@ -106,17 +109,17 @@
   & element shelf { xsd:string }?
   & element latitude { xsd:float }?
   & element longitude { xsd:float }?
-
+### NAME?

I'd not mind being able to name locations.

 ## ########################
 ## Generic link
 ## ########################
 
-BaseLink = element link { BaseLinkContent }
+BaseLink = element link { BaseLinkContent | NetworkObjectRef }
 BaseLinkContent =
   NetworkObject
   & element type { xsd:string }?
-  & element capacity { xsd:string }?
+  & element capacity { xsd:float }?
   & anyElement*

I like specifying capacity as a float instead of an arbitrary string.

 ## ########################
 ## Generic service
 ## ########################
 
-BaseService = element service { BaseServiceContent }
-BaseServiceContent =
-  NetworkObject
-  & anyElement*
+BaseService = 
+  AdaptationService
+  | SwitchingService
+
+AdaptationService = anyElement
+SwitchingService = anyElement

I'm not sure about limiting the services to AdaptationService and SwitchingService in the initial RNC file. At minimum, adding an 'AnyService' that is also anyElement would be good.

 +## ########################
+## Containers
+## ########################
+
+## A container is a list of items. A list may be unordered (a Bag) or ordered (a Sequence)
+
+Container = 
+  Bag
+  | Sequence
+
+Bag = 
+  element bag { UnorderedItem* }
+
+UnorderedItem = 
+  element * { NetworkObject | NetworkObjectRef }
+
+Sequence = 
+  element list { attribute first { xsd:anyURI } OrderedItem* }
+
+UnorderedItem = 
+  element * { 
+    attribute next { xsd:anyURI }
+    | attribute last { xsd:empty }
+    anyThing 
+  }
+

I'll need to think about this some more. I'm curious about the UnorderedItem. They've got "next" and "last" elements which implies an ordering of some kind.

Cheers,
Aaron

Summer 2011 ESCC/Internet2 Joint Techs
Hosted by the University of Alaska-Fairbanks
http://events.internet2.edu/2011/jt-uaf