Bumping versions by 0.0.1 for next dev cycle
[ttp.git] / ttp-model / src / main / yang / ttp.yang
1 /*
2  * Copyright (c) 2014 Brocade Communications Systems others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 module onf-ttp {
10   /* Notes:
11    *  => Comments that start with "SPEC:" are feedback for the ONF
12    *  => Comments that start with "REFINE:" are notes for where we could enhance things
13    *  => Comments that start with "TODO:" are places where we *need* to do work
14    *
15    * High-level TODOs:
16    *  => add "mandatory true;" where things are required
17    *     - note that this might involve variants of universal TTP properties when some are required
18    *  => how to handle the "all", "one_or_more", "zero_or_more", "exactly_one", and "zero_or_one"
19    *     meta-member keywords?
20    *     - We currently support "all", "one_or_more" and "zero_or_more" directly under
21    *       "flow_mod_types" because that is all that was illustrated.
22    *     - We currently support "exactly_one" and "zero_or_one" directly under "match_set" and
23    *       "instruction_set" because that was all that was illustrated.
24    *     - We currently support "exactly_one" and "zero_or_one" for action lists, i.e., actions in
25    *       instructions_set, action_set in bucket_type, and actions in packet_out
26    *     - In all the above cases, I believe we accept JSON which would not be a valid TTP and
27    *       might need to add extra validation. This is true elsewhere as well.
28    *
29    *     - "all" is only used in one example under "flow_mod_types" in the middle of page 43
30    *     - "one_or_more" is never illustrated with an example
31    *     - "zero_or_more" sometimes points to an object and sometimes to an array. It seems like it
32    *                      should always do one or the other. Only used under "flow_mod_types" in the
33    *                      example.
34    *     - "exactly_one" examples for "instruction_set" and "match_set"
35    *     - "zero_or_one" is only used in "instruction_set" and only to point to a single object;
36    *                     never to an array. It seems like it should always point to an array, even
37    *                     if it is an array with a single element.
38    *
39    *     - SPEC: It's really unclear how these work. For example, "instruction_set" usually points
40    *             to a list, but at the bottom of page 26 it points to an object with a single
41    *             "exactly_one" list. While at the top of page 27, it points to a list which contains
42    *             an object with a single "zero_or_more" list.
43    *     - SPEC: It's not clear what "optional support" vs. "optional use" meta-member keywords are.
44    *
45    * High-level SPECs:
46    *  => where are (and aren't) universal ttp properties valid?
47    *     - everywhere but lists? this seems the most likely.
48    */
49
50   namespace "urn:onf:ttp";
51   prefix ttp;
52
53   // Not using these because the TTP spec makes it difficult to reuse prior modeling efforts. Maybe
54   // we can use it in the future.
55   //import openflow-extensible-match {prefix oxm;}
56   //import openflow-instruction {prefix ofi;}
57   //import openflow-types {prefix oft;}
58
59   revision 2014-07-11 {
60     description "ONF TTP schema 2014/07/11";
61   }
62
63   grouping name-property {
64     description "denotes something that has a name, which is a string";
65
66     leaf name {
67       type string;
68     }
69   }
70
71   grouping opt-tag-property {
72     description "denotes strings that represent optional functionality in the TTP";
73
74     leaf opt_tag {
75       type string;
76     }
77   }
78
79   grouping doc-property {
80     description "denotes something that has documentation as a list of strings";
81
82     leaf-list doc {
83       type string;
84     }
85   }
86
87   grouping universal-TTP-properties {
88     //SPEC: exactly what can have have these?
89     description "these properties are applicable to all objects in TTPs";
90
91     uses name-property;
92     uses opt-tag-property;
93     uses doc-property;
94   }
95
96
97   grouping type-property {
98     description "denotes something that has a type identified with a string";
99
100     leaf type {
101       type string;
102     }
103   }
104
105   grouping NDM_metadata-properties {
106     description "metadata about an NDM (or TTP)";
107
108     leaf authority {
109        type string;
110     }
111
112     leaf OF_protocol_version {
113        type string;
114     }
115
116     leaf version {
117        type string;
118     }
119
120     uses type-property;
121     uses universal-TTP-properties;
122   }
123
124   grouping action-properties {
125     uses universal-TTP-properties;
126     leaf action {
127       type string;
128       // REFINE: enum ofp_action_type string after "OFPAT_"
129     }
130     leaf port {
131       type string; // REFINE: port number or variable name or reserved port name (enum ofp_port_no
132                    //         string after "OFPP_")
133     }
134     leaf group_id {
135       type string; // TODO: or number?
136     }
137     leaf queue_id {
138       type string; // TODO: or number?
139     }
140     leaf ttl {
141       description "MPLS or IP TTL";
142       type string;
143     }
144     leaf ethertype {
145       type string; // TODO: or number?
146     }
147     leaf field {
148       type string; // REFINE: enum oxm_ofb_match_fields string after "OFPXMT_OFB_"
149     }
150     leaf value {
151       type string; // REFINE: value for the field being set, e.g., bitmap of the appropriate size,
152                    //         or variable name
153     }
154   }
155
156   grouping action-all-properties{
157     uses action-properties;
158     list all {
159       uses action-properties;
160     }
161     list one_or_more {
162       uses action-properties;
163     }
164   }
165
166   // possible bug in yangtools? using this works, but pasting it's content where it's used fails
167   grouping action-zero-exactly-one-properties {
168     uses action-properties;
169     list exactly_one {
170       uses action-all-properties;
171     }
172     list zero_or_one {
173       uses action-all-properties;
174     }
175
176     //TODO: are these two allowed here?
177     list zero_or_more {
178       uses action-all-properties;
179     }
180     list one_or_more {
181       uses action-all-properties;
182     }
183   }
184
185   grouping match_set-properties {
186
187     // SPEC: mentions that pre-requisites are assumed even if not listed
188     // SPEC: this implies requirement that explicit pre-reqs that mismatch are illegal
189
190     uses universal-TTP-properties;
191     leaf field {
192       type string; //REFINE: enum oxm_ofb_match_fields string after "OFPXMT_OFB_"
193       // type identityref {
194       //   base oxm:match-field;
195       // }
196     }
197     leaf match_type { // was "wc_type" in older (pre-spec) TTP
198       type enumeration {
199         enum exact; // exact match, as if all mask bits = 1 (also default)
200         enum mask;  // arbitrary mask field allowed for this field
201                     // SPEC: is it clear what happens if no mask present? All 1's?
202         enum prefix; // mask must be contiguous ones from MSB of field (like subnet mask)
203         enum all_or_exact; // field may be omitted, but exact match if present
204       }
205     }
206     leaf mask { // has 1's where must match. Presence and value must agree with match_type
207       type string; // a string representing numbers (dec, hex, etc)
208     }
209     leaf value {
210       type string; // either a variable name or fixed value for the field
211       // REFINE: add pattern to say it's either a string or variable?
212       // SPEC: would be nice if this was easier to specify in a schema
213     }
214     leaf const_mask { // mask for specifying value bits that cannot be varied
215       type string;
216       // SPEC: would be good to have an example! [There is one on the middle of page 24]
217     }
218     leaf const_value { // value used to specify the value of unvarying bits
219       type string;
220
221       // SPEC: seems like const_mask and const_value must come together?
222       // SPEC: const_mask and const_value invalid with "exact" or "all_or_exact"?
223       // SPEC: const_mask and const_value valid with mask...but prefix? Clarify
224     }
225   }
226
227   grouping instruction_set-properties {
228     uses universal-TTP-properties;
229     leaf instruction {
230     type string; //REFINE: enum ofp_instruction_type string after "OFPIT_"
231
232     // Perhaps come back to this approach?
233     // type identityref {
234     //   base oft:instruction-base;
235     // }
236     }
237     leaf table {
238       type string; //REFINE: should be the name of a table defined here
239     }
240     leaf metadata {
241       type uint64; //SPEC: is this an integer in JSON or a string storing a 64-bit value?
242     }
243     leaf metadata_mask {
244       type uint64; //SPEC: is this an integer in JSON or a string storing a 64-bit value?
245     }
246     list actions {
247       uses action-zero-exactly-one-properties;
248     }
249     leaf meter_name {
250       type string;
251       // SPEC: this belongs in "instruction_set" not in "actions"
252     }
253   }
254
255   grouping flow_mod-properties {
256     uses universal-TTP-properties;
257     leaf priority {
258       description
259         "Must have exactly one of priority or priority_rank. Integer greater than zero, or an
260          integer range of the form \"n..m\" where n and m are integers with 0 < n < m.";
261       type string; //REFINE: add pattern for integer or integer range
262
263       // TODO: all flow_mod_type entries must select the same one of priority and priority_rank
264       // SPEC: how to schema the constraints on priority?
265     }
266     leaf priority_rank {
267       description
268         "Must have exactly one of priority or priority_rank. An integer greater than zero
269          indicating relative priority of flow_mod_types.";
270       type string; // strings that represent numbers
271
272       // SPEC: priority ranks must be unique within flow table?
273       // SPEC: priority-rank is incompatible with built-in-flow-mods
274       // SPEC: That is, cannot be used in the same flow table (see below)
275     }
276     list match_set {
277       // NOTE: in the ODL version, this *must* be a list (in the spec it can also be a singleton)
278       uses match_set-properties;
279       list exactly_one {
280         uses match_set-properties;
281       }
282       list zero_or_one {
283         uses match_set-properties;
284       }
285     }
286     list instruction_set {
287       // NOTE: in the ODL version, this *must* be a list (in the spec it can also be a singleton)
288       description "A list of the instructions possible. Can also optionally include lists of
289                    other instructions in the \"exactly_one\" and \"zero_or_one\" lists.";
290       uses instruction_set-properties;
291       list exactly_one {
292         uses instruction_set-properties;
293       }
294       list zero_or_one {
295         uses instruction_set-properties;
296       }
297       // TODO: I think the intention is to be ale to specify multiple entries for exactly_one
298       //       as well as zero_or_one, but this gives one list. We could do a list of lists, but
299       //       the inner lists wouldn't be anonymous.
300       // SPEC: The spec says this is an array, but there are examples where it is not, e.g., the
301       //       bottom of page 26.
302     }
303   }
304
305   grouping table-type-pattern-properties {
306     container NDM_metadata {
307       uses NDM_metadata-properties;
308     }
309
310     list identifiers {
311       uses universal-TTP-properties;
312       leaf var {
313         type string;
314       }
315       leaf range {
316         //REFINE: we can add a regex patter to restrict this
317         //REFINE: also make sure range in YANG doesn't do this
318         type string;
319       }
320
321       leaf id {
322         type string;
323       }
324       leaf type {
325         type enumeration {
326           enum field;
327           enum inst;
328           enum action;
329           enum error;
330         }
331       }
332       leaf exp_id {
333         type string; //TODO: is this a string?
334                      //SPEC: not state what this is.
335       }
336       leaf exp_code {
337         type string; //TODO: is this a string?
338                      //SPEC: not state what this is.
339       }
340
341       //SPEC: should be clearer about Variables vs. Identifiers
342     }
343
344     list features {
345       uses universal-TTP-properties;
346       leaf feature {
347         type string;
348         //REFINE: can we restrict this more than just a string?
349       }
350     }
351
352     list table_map { // intentionally not using the "univ TTP props"
353       key name;
354       leaf name {
355         type string;
356         mandatory true;
357       }
358       leaf number {
359         type uint8;
360         mandatory true;
361       }
362       //SPEC: you can't do what is there in YANG, maybe put name in the tables in flow_tables?
363     }
364
365     container meter_table {
366       uses universal-TTP-properties;
367       list meter_types {
368         uses universal-TTP-properties;
369         list bands {
370           uses universal-TTP-properties;
371           leaf type {
372             type enumeration {
373               enum DROP;
374               enum DSCP_REMARK;
375             }
376           }
377           leaf rate {
378             type string;
379             //REFINE: use a regex patter?
380             //SPEC: make min and max as ints?
381           }
382           leaf burst {
383             type string;
384             //REFINE: use a regex patter?
385             //SPEC: make min and max as ints?
386           }
387         }
388       }
389       list built_in_meters {
390         uses universal-TTP-properties;
391         leaf meter_id {
392           type uint32; //borrowed from OF spec
393         }
394         leaf type {
395           type string;
396           //REFINE: should be enum ofp_meter_band_type string after "OFPMBT_"
397         }
398         list bands {
399           leaf rate {
400             type uint32;
401             //REFINE: right int?
402           }
403           leaf burst {
404             type uint32;
405             //REFINE: right int?
406           }
407         }
408       }
409     }
410
411     list flow_tables {
412       uses universal-TTP-properties;
413       list flow_mod_types {
414         uses flow_mod-properties;
415         list all {
416           uses flow_mod-properties;
417         }
418         list one_or_more {
419           uses flow_mod-properties;
420         }
421         list zero_or_more {
422           uses flow_mod-properties;
423         }
424       }
425       list built_in_flow_mods {
426          uses flow_mod-properties;
427
428          // SPEC: says "usually are flow_mods that ..."  Usually? Always?
429
430          // built-ins are flow_mods, not just templates like flow_mod_types
431          // so the allowed fields are similar
432          // can we leverage similarity, or do we need to repeat the fields?
433          // as flow-mod-types get more complex, leverage is important
434
435          // SPEC: Only "priority" allowed for built-ins? (rank doesn't work?) (rank doesn't work
436          //       because implies "specified later")
437          // SPEC: if built-in and flow-mod-types are defined for same table...
438          //       and if "priority" is required for built-in, then...
439          //       then flow-mod-types in same table must be "priority" (not rank)
440
441          // SPEC: For built-in flow mods, these are not templates (constraints), but actual flow
442          //       mods. For flow mod, match type is expressed, not described as such, "match_type"
443          //       seems pointless?  Or maybe "prefix"? const_value and const_mask meaningless
444       }
445       list table_subsets {
446         uses universal-TTP-properties; //REFINE: "name" is a required field, used as alias
447         leaf-list subset {
448            type string;
449            //REFINE: should be "MISS", a flow_mod_type name or a "built_in_flow_mod" name
450         }
451       }
452     }
453
454     list group_entry_types {
455       uses universal-TTP-properties;
456       leaf group_type {
457         type string; // REFINE: enum ofp_group_type string after "OFPGT_"
458       }
459       list bucket_types {
460         uses universal-TTP-properties;
461         list action_set {
462           uses action-zero-exactly-one-properties;
463         }
464       }
465     }
466
467     list packet_out {
468       uses universal-TTP-properties;
469       list actions {
470         uses action-zero-exactly-one-properties;
471       }
472       //SPEC: no examples in the spec and text is ambiguous
473     }
474
475     list parameters {
476       uses universal-TTP-properties;
477       uses type-property;
478       leaf default {
479         type union {
480           type uint32;
481           type string;
482           //TODO: is this sufficient?
483           //SPEC: this seems ambiguous in the spec
484         }
485       }
486     }
487
488     list flow_paths {
489       uses universal-TTP-properties;
490       leaf-list path {
491         description "a list of strings each of which must be the name of a
492                      table from the table_map or the name of a table in square
493                      brackets.";
494         type string;
495         //SPEC: rework, can't have this in YANG
496         // We wanted: "flow_paths": ["path": ["table1", ["table2"] ] ]
497         // We did: "flow_paths": ["path": ["table1", "[table2]" ] ]
498       }
499       leaf-list no-path {
500         description "a list of strings each of which must be the name of a
501                      table from the table_map or the name of a table in square
502                      brackets.";
503         type string;
504       }
505       //REFINE: this is really either path or no-path. can we do better in modeling?
506       //SPEC: could be clearer about whether you can mix path and no-path and if so, what happens.
507     }
508
509     container security {
510       uses universal-TTP-properties;
511     }
512   }
513
514   container opendaylight-ttps {
515     container table-type-patterns {
516       list table-type-pattern {
517         uses table-type-pattern-properties;
518       }
519     }
520     description "The global TTP registry for OpenDaylight";
521   }
522 }