draft-ietf-lmap-yang-05.txt   draft-ietf-lmap-yang-06.txt 
Network Working Group J. Schoenwaelder Network Working Group J. Schoenwaelder
Internet-Draft V. Bajpai Internet-Draft V. Bajpai
Intended status: Standards Track Jacobs University Bremen Intended status: Standards Track Jacobs University Bremen
Expires: January 9, 2017 July 8, 2016 Expires: May 4, 2017 October 31, 2016
A YANG Data Model for LMAP Measurement Agents A YANG Data Model for LMAP Measurement Agents
draft-ietf-lmap-yang-05.txt draft-ietf-lmap-yang-06.txt
Abstract Abstract
This document defines a data model for Large-Scale Measurement This document defines a data model for Large-Scale Measurement
Platforms (LMAP). The data model is defined using the YANG data Platforms (LMAP). The data model is defined using the YANG data
modeling language. modeling language.
Status of This Memo Status of This Memo
This Internet-Draft is submitted in full conformance with the This Internet-Draft is submitted in full conformance with the
skipping to change at page 1, line 32 skipping to change at page 1, line 32
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at http://datatracker.ietf.org/drafts/current/. Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on January 9, 2017. This Internet-Draft will expire on May 4, 2017.
Copyright Notice Copyright Notice
Copyright (c) 2016 IETF Trust and the persons identified as the Copyright (c) 2016 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of (http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 11 skipping to change at page 2, line 11
include Simplified BSD License text as described in Section 4.e of include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License. described in the Simplified BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 2 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3 1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3
2. Data Model Overview . . . . . . . . . . . . . . . . . . . . . 3 2. Data Model Overview . . . . . . . . . . . . . . . . . . . . . 3
3. Relationship to the Information Model . . . . . . . . . . . . 7 3. Relationship to the Information Model . . . . . . . . . . . . 8
4. YANG Modules . . . . . . . . . . . . . . . . . . . . . . . . 8 4. YANG Modules . . . . . . . . . . . . . . . . . . . . . . . . 9
5. Security Considerations . . . . . . . . . . . . . . . . . . . 42 4.1. LMAP Common YANG Module . . . . . . . . . . . . . . . . . 10
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 44 4.2. LMAP Control YANG Module . . . . . . . . . . . . . . . . 18
7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 45 4.3. LMAP Report YANG Module . . . . . . . . . . . . . . . . . 40
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 46 5. Security Considerations . . . . . . . . . . . . . . . . . . . 45
8.1. Normative References . . . . . . . . . . . . . . . . . . 46 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47
8.2. Informative References . . . . . . . . . . . . . . . . . 46 7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 48
Appendix A. Open Issues . . . . . . . . . . . . . . . . . . . . 47 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 48
A.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 8.1. Normative References . . . . . . . . . . . . . . . . . . 48
A.2. Examples . . . . . . . . . . . . . . . . . . . . . . . . 47 8.2. Informative References . . . . . . . . . . . . . . . . . 49
Appendix B. Non-editorial Changes since -04 . . . . . . . . . . 47 Appendix A. Example IPPM Extension Module for UDP Latency
Appendix C. Non-editorial Changes since -03 . . . . . . . . . . 48 Metrics . . . . . . . . . . . . . . . . . . . . . . 50
Appendix D. Non-editorial Changes since -02 . . . . . . . . . . 48 Appendix B. Example Configuration . . . . . . . . . . . . . . . 52
Appendix E. Non-editorial Changes since -01 . . . . . . . . . . 48 Appendix C. Example State . . . . . . . . . . . . . . . . . . . 55
Appendix F. Non-editorial Changes since -00 . . . . . . . . . . 49 Appendix D. Example Report . . . . . . . . . . . . . . . . . . . 58
Appendix G. Example IPPM Module for UDP Latency Metrics . . . . 50 Appendix E. Open Issues . . . . . . . . . . . . . . . . . . . . 60
Appendix H. Example Configuration (XML) . . . . . . . . . . . . 51 E.1. Martin's Review Comments . . . . . . . . . . . . . . . . 60
Appendix I. Example Configuration (JSON) . . . . . . . . . . . . 58 Appendix F. Change History . . . . . . . . . . . . . . . . . . . 60
Appendix J. Example State (XML) . . . . . . . . . . . . . . . . 67 F.1. Non-editorial Changes since -05 . . . . . . . . . . . . . 60
Appendix K. Example State (JSON) . . . . . . . . . . . . . . . . 68 F.2. Non-editorial Changes since -04 . . . . . . . . . . . . . 61
Appendix L. Example Report (XML) . . . . . . . . . . . . . . . . 70 F.3. Non-editorial Changes since -03 . . . . . . . . . . . . . 61
Appendix M. Example Report (JSON) . . . . . . . . . . . . . . . 71 F.4. Non-editorial Changes since -02 . . . . . . . . . . . . . 62
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 73 F.5. Non-editorial Changes since -01 . . . . . . . . . . . . . 62
F.6. Non-editorial Changes since -00 . . . . . . . . . . . . . 63
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 63
1. Introduction 1. Introduction
This document defines a data model for Large-Scale Measurement This document defines a data model for Large-Scale Measurement
Platforms (LMAP) [RFC7594]. The data model is defined using the YANG Platforms (LMAP) [RFC7594]. The data model is defined using the YANG
[RFC6020] data modeling language. It aims to be consistent with the [RFC6020] data modeling language. It aims to be consistent with the
LMAP Information Model [I-D.ietf-lmap-information-model]. LMAP Information Model [I-D.ietf-lmap-information-model].
1.1. Terminology 1.1. Terminology
skipping to change at page 3, line 28 skipping to change at page 3, line 28
means a presence container, and "*" denotes a list and leaf-list. means a presence container, and "*" denotes a list and leaf-list.
o Parentheses enclose choice and case nodes, and case nodes are also o Parentheses enclose choice and case nodes, and case nodes are also
marked with a colon (":"). marked with a colon (":").
o Ellipsis ("...") stands for contents of subtrees that are not o Ellipsis ("...") stands for contents of subtrees that are not
shown. shown.
2. Data Model Overview 2. Data Model Overview
The LMAP framework has three basic elements: Measurement Agents,
Controllers, and Collectors. Measurement Agents initiate the actual
measurements, which are called Measurement Tasks in the LMAP
terminology. The Controller instructs one or more MAs and
communicates the set of Measurement Tasks an MA should perform and
when. The Collector accepts Reports from the MAs with the Results
from their Measurement Tasks.
The YANG data model for LMAP has been split into three modules:
1. The module ietf-lmap-common.yang provides common definitions such
as LMAP specific data types.
2. The module ietf-lmap-config.yang defines the data structures
exchanged between a Controller and Measurement Agents.
3. The module ietf-lmap-report.yang defines the data structures
exchanged between Measurement Agents and Collectors.
As shown in Figure 1, a Controller, implementing ietf-lmap-
common.yang and ietf-lmap-control.yang as a client, will instruct
Measurement Agents, implementing ietf-lmap-common.yang and ietf-lmap-
control.yang as servers. A Measurement Agent, implementing ietf-
lmap-common.yang and ietf-lmap-report.yang, will send results to a
Collector, implementing ietf-lmap-common.yang and ietf-lmap-
report.yang as a server.
+------------------------+
| LMAP Controller |
| |
| Client: |
| ietf-lmap-comman.yang |
| ietf-lmap-control.yang |
+------------------------+
+------------------------+ |
| LMAP Measurement Agent | |
| | <- request |
| Server: |<---------------------'
| ietf-lmap-comman.yang | response ->
| ietf-lmap-control.yang |
| |
| | request ->
| Client: |----------------------.
| ietf-lmap-comman.yang | <- response |
| ietf-lmap-report.yang | |
+------------------------+ v
+------------------------+
| LMAP Collector |
| |
| Server: |
| ietf-lmap-comman.yang |
| ietf-lmap-report.yang |
+------------------------+
Figure 1: LMAP Controller, Measurement Agents, and Collector and the
YANG modules they implement as client or server
The tree diagram below shows the structure of the configuration data The tree diagram below shows the structure of the configuration data
model. model.
module: ietf-lmap-control module: ietf-lmap-control
+--rw lmap +--rw lmap
+--rw agent +--rw agent
| +--rw agent-id? yang:uuid | +--rw agent-id? yang:uuid
| +--rw device-id? inet:uri | +--rw device-id? inet:uri
| +--rw group-id? string | +--rw group-id? string
| +--rw measurement-point? string | +--rw measurement-point? string
skipping to change at page 5, line 20 skipping to change at page 6, line 30
| | +--rw time yang:date-and-time | | +--rw time yang:date-and-time
| +--:(immediate) | +--:(immediate)
| | +--rw immediate empty | | +--rw immediate empty
| +--:(startup) | +--:(startup)
| | +--rw startup empty | | +--rw startup empty
| +--:(controller-lost) | +--:(controller-lost)
| | +--rw controller-lost empty | | +--rw controller-lost empty
| +--:(controller-connected) | +--:(controller-connected)
| +--rw controller-connected empty | +--rw controller-connected empty
+--rw random-spread? uint32 +--rw random-spread? uint32
+--rw cycle-interval? uint32
The tree diagram below shows the structure of the state data model. The tree diagram below shows the structure of the state data model.
module: ietf-lmap-control module: ietf-lmap-control
+--ro lmap-state +--ro lmap-state
+--ro agent +--ro agent
| +--ro agent-id yang:uuid | +--ro agent-id? yang:uuid
| +--ro device-id inet:uri | +--ro device-id? inet:uri
| +--ro hardware string | +--ro hardware string
| +--ro firmware string | +--ro firmware string
| +--ro version string | +--ro version string
| +--ro tag* lmap:tag
| +--ro last-started yang:date-and-time | +--ro last-started yang:date-and-time
+--ro tasks +--ro tasks
| +--ro task* [name] | +--ro task* [name]
| +--ro name lmap:identifier | +--ro name lmap:identifier
| +--ro metric* [uri] | +--ro metric* [uri]
| | +--ro uri inet:uri | | +--ro uri inet:uri
| | +--ro role* string | | +--ro role* string
| +--ro version? string | +--ro version? string
| +--ro program? string | +--ro program? string
+--ro schedules +--ro schedules
skipping to change at page 7, line 20 skipping to change at page 8, line 20
+---x report +---x report
+---w input +---w input
+---w date yang:date-and-time +---w date yang:date-and-time
+---w agent-id? yang:uuid +---w agent-id? yang:uuid
+---w group-id? string +---w group-id? string
+---w measurement-point? string +---w measurement-point? string
+---w result* +---w result*
+---w schedule-name? lmap:identifier +---w schedule-name? lmap:identifier
+---w action-name? lmap:identifier +---w action-name? lmap:identifier
+---w task-name? lmap:identifier +---w task-name? lmap:identifier
+---w parameters
| +---w (extension)?
+---w option* [id] +---w option* [id]
| +---w id lmap:identifier | +---w id lmap:identifier
| +---w name? string | +---w name? string
| +---w value? string | +---w value? string
+---w tag* lmap:tag +---w tag* lmap:tag
+---w event? yang:date-and-time
+---w start yang:date-and-time +---w start yang:date-and-time
+---w end? yang:date-and-time +---w end? yang:date-and-time
+---w cycle-number? lmap:cycle-number
+---w status lmap:status-code +---w status lmap:status-code
+---w conflict* +---w conflict*
| +---w schedule-name? lmap:identifier | +---w schedule-name? lmap:identifier
| +---w action-name? lmap:identifier | +---w action-name? lmap:identifier
| +---w task-name? lmap:identifier | +---w task-name? lmap:identifier
+---w table* +---w table*
+---w metric* [uri] +---w metric* [uri]
| +---w uri inet:uri | +---w uri inet:uri
| +---w role* string | +---w role* string
+---w column* string +---w column* string
skipping to change at page 8, line 45 skipping to change at page 10, line 4
o Channels: Channels are not modeled since the NETCONF and RESTCONF o Channels: Channels are not modeled since the NETCONF and RESTCONF
server configuration data model [I-D.ietf-netconf-server-model] server configuration data model [I-D.ietf-netconf-server-model]
already provides a mechanism to configure NETCONF and RESTCONF already provides a mechanism to configure NETCONF and RESTCONF
server channels. server channels.
o Task Configurations: This is modeled in the /lmap/tasks subtree. o Task Configurations: This is modeled in the /lmap/tasks subtree.
o Event Information: This is modeled in the /lmap/events subtree. o Event Information: This is modeled in the /lmap/events subtree.
4. YANG Modules 4. YANG Modules
4.1. LMAP Common YANG Module
The modules import definitions from [RFC6536], [RFC6991] and This module imports definitions from [RFC6536].
[RFC7223] and they reference [RFC7398].
<CODE BEGINS> file "ietf-lmap-common@2016-07-07.yang" <CODE BEGINS> file "ietf-lmap-common@2016-10-10.yang"
module ietf-lmap-common { module ietf-lmap-common {
namespace "urn:ietf:params:xml:ns:yang:ietf-lmap-common"; namespace "urn:ietf:params:xml:ns:yang:ietf-lmap-common";
prefix "lmap"; prefix "lmap";
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
organization organization
"IETF Large-Scale Measurement Platforms Working Group"; "IETF Large-Scale Measurement Platforms Working Group";
skipping to change at page 9, line 30 skipping to change at page 10, line 37
Editor: Vaibhav Bajpai Editor: Vaibhav Bajpai
<v.bajpai@jacobs-university.de>"; <v.bajpai@jacobs-university.de>";
description description
"This module provides common definitions used by the data "This module provides common definitions used by the data
models written for Large-Scale Measurement Platforms (LMAP). models written for Large-Scale Measurement Platforms (LMAP).
This module defines typedefs and groupings but no schema This module defines typedefs and groupings but no schema
tree elements."; tree elements.";
revision "2016-07-07" { revision "2016-10-10" {
description description
"Initial version"; "Initial version";
reference reference
"RFC XXX: A YANG Data Model for LMAP Measurement Agents"; "RFC XXX: A YANG Data Model for LMAP Measurement Agents";
} }
/* /*
* Typedefs * Typedefs
*/ */
typedef identifier { typedef identifier {
type string { type string {
length "1..max"; length "1..max";
} }
skipping to change at page 10, line 15 skipping to change at page 11, line 21
} }
description description
"A tag consists of at least one character."; "A tag consists of at least one character.";
} }
typedef glob-pattern { typedef glob-pattern {
type string { type string {
length "1..max"; length "1..max";
} }
description description
"A glob style pattern (following POSIX.2 fnmatch() without 'A glob style pattern (following POSIX.2 fnmatch() without
special treatment of file paths): special treatment of file paths):
* matches a sequence of characters * matches a sequence of characters
? matches a single character ? matches a single character
[seq] matches any character in seq [seq] matches any character in seq
[!seq] matches any character not in seq [!seq] matches any character not in seq
A backslash followed by a character matches the following A backslash followed by a character matches the following
character. In particular: character. In particular:
\* matches * \* matches *
\? matches ? \? matches ?
\\ matches \ \\ matches \
A sequence seq may be a sequence of characters (e.g., [abc] A sequence seq may be a sequence of characters (e.g., [abc]
or a range of characters (e.g., [a-c])."; or a range of characters (e.g., [a-c]).';
} }
typedef wildcard { typedef wildcard {
type string { type string {
pattern '\*'; pattern '\*';
} }
description description
"A wildcard for calendar scheduling entries."; "A wildcard for calendar scheduling entries.";
} }
typedef cycle-number {
type string {
pattern '[0-9]{8}\.[0-9]{6}';
}
description
"A cycle number represented in the format YYYYMMDD.HHMMSS
where YYYY represents the year, MM the month (1..12), DD
the day of the months (01..31), HH the hour (00..23), MM
the minute (00..59), and SS the second (00..59).";
}
typedef month { typedef month {
type enumeration { type enumeration {
enum january { enum january {
value 1; value 1;
description description
"January of the Gregorian calendar."; "January of the Gregorian calendar.";
} }
enum february { enum february {
value 2; value 2;
description description
skipping to change at page 15, line 21 skipping to change at page 16, line 40
equivalent to +00:00. The value -00:00 indicates and equivalent to +00:00. The value -00:00 indicates and
unknown time-offset."; unknown time-offset.";
reference reference
"RFC 6991: Common YANG Data Types"; "RFC 6991: Common YANG Data Types";
} }
/* /*
* Groupings * Groupings
*/ */
grouping metrics-grouping { grouping registry-grouping {
description description
"This grouping models a list of entries in a metrics "This grouping models a list of entries in a registry
registry."; that identify functions of a tasks.";
list metric { list metric {
key uri; key uri;
description description
"A list of entries in a metrics registry."; "A list of entries in a registry identifying functions.";
leaf uri { leaf uri {
type inet:uri; type inet:uri;
description description
"A URI identifying an entry in a metrics registry."; "A URI identifying an entry in a registry.";
} }
leaf-list role { leaf-list role {
type string; type string;
description description
"A set of roles for this metrics."; "A set of roles for the identified registry entry.";
} }
} }
} }
grouping task-options-grouping { grouping task-options-grouping {
description description
"A list of options of a task. Each option is a name/value "A list of options of a task. Each option is a name/value
pair (where the value may be absent)."; pair (where the value may be absent).";
list option { list option {
skipping to change at page 16, line 33 skipping to change at page 18, line 4
"The name of the option."; "The name of the option.";
} }
leaf value { leaf value {
type string; type string;
description description
"The value of the option."; "The value of the option.";
} }
} }
} }
} }
<CODE ENDS> <CODE ENDS>
<CODE BEGINS> file "ietf-lmap-control@2016-07-07.yang" 4.2. LMAP Control YANG Module
module ietf-lmap-control {
namespace "urn:ietf:params:xml:ns:yang:ietf-lmap-control"; This module imports definitions from [RFC6536], [RFC6991] and the
prefix "lmapc"; common LMAP module and it references [RFC7398].
import ietf-yang-types { <CODE BEGINS> file "ietf-lmap-control@2016-10-10.yang"
prefix yang; module ietf-lmap-control {
}
import ietf-inet-types {
prefix inet;
}
import ietf-netconf-acm {
prefix nacm;
} namespace "urn:ietf:params:xml:ns:yang:ietf-lmap-control";
import ietf-lmap-common { prefix "lmapc";
prefix lmap;
}
organization import ietf-yang-types {
"IETF Large-Scale Measurement Platforms Working Group"; prefix yang;
}
import ietf-inet-types {
prefix inet;
}
import ietf-netconf-acm {
prefix nacm;
}
import ietf-lmap-common {
prefix lmap;
}
contact organization
"WG Web: <http://tools.ietf.org/wg/lmap/> "IETF Large-Scale Measurement Platforms Working Group";
WG List: <mailto:lmap@ietf.org>
Editor: Juergen Schoenwaelder contact
<j.schoenwaelder@jacobs-university.de> "WG Web: <http://tools.ietf.org/wg/lmap/>
WG List: <mailto:lmap@ietf.org>
Editor: Vaibhav Bajpai Editor: Juergen Schoenwaelder
<v.bajpai@jacobs-university.de>"; <j.schoenwaelder@jacobs-university.de>
description Editor: Vaibhav Bajpai
"This module defines a data model for controlling measurement <v.bajpai@jacobs-university.de>";
agents that are part of a Large-Scale Measurement Platform
(LMAP). This data model is expected to be implemented by a
measurement agent.";
revision "2016-07-07" { description
description "This module defines a data model for controlling measurement
agents that are part of a Large-Scale Measurement Platform
(LMAP). This data model is expected to be implemented by a
measurement agent.";
revision "2016-10-10" {
description
"Initial version"; "Initial version";
reference reference
"RFC XXX: A YANG Data Model for LMAP Measurement Agents"; "RFC XXX: A YANG Data Model for LMAP Measurement Agents";
} }
/* /*
* Typedefs * Typedefs
*/ */
typedef event-ref { typedef event-ref {
type leafref { type leafref {
path "/lmap/events/event/name"; path "/lmap/events/event/name";
} }
description description
"This type is used by data models that need to reference "This type is used by data models that need to reference
a configured event source."; a configured event source.";
} }
typedef task-ref { typedef task-ref {
type leafref { type leafref {
path "/lmap/tasks/task/name"; path "/lmap/tasks/task/name";
} }
description description
"This type is used by data models that need to reference "This type is used by data models that need to reference
a configured task."; a configured task.";
} }
typedef schedule-ref { typedef schedule-ref {
type leafref { type leafref {
path "/lmap/schedules/schedule/name"; path "/lmap/schedules/schedule/name";
} }
description description
"This type is used by data models that need to reference "This type is used by data models that need to reference
a configured schedule."; a configured schedule.";
} }
/* /*
* Groupings * Groupings
*/ */
grouping timing-start-end-grouping { grouping timing-start-end-grouping {
description description
"A grouping that provides start and end times for "A grouping that provides start and end times for
timing objects."; timing objects.";
leaf start { leaf start {
type yang:date-and-time; type yang:date-and-time;
description description
"The date and time when the timing object "The date and time when the timing object
starts to create triggers."; starts to create triggers.";
} }
leaf end { leaf end {
type yang:date-and-time; type yang:date-and-time;
description description
"The date and time when the timing object "The date and time when the timing object
stops to create triggers. stops to create triggers.
It is generally a good idea to always configure It is generally a good idea to always configure
an end time and to refresh the configuration an end time and to refresh the configuration
of timing object as needed to ensure that agents of timing object as needed to ensure that agents
that loose connectivity to their controller that loose connectivity to their controller
do not continue their tasks forever."; do not continue their tasks forever.";
} }
} }
/* /*
* Configuration data nodes * Configuration data nodes
*/ */
container lmap { container lmap {
description description
"Configuration of the LMAP agent."; "Configuration of the LMAP agent.";
/* /*
* Agent Configuration * Agent Configuration
*/ */
container agent { container agent {
description description
"Configuration of parameters affecting the whole "Configuration of parameters affecting the whole
measurement agent."; measurement agent.";
leaf agent-id { leaf agent-id {
type yang:uuid; type yang:uuid;
description description
"The agent-id identifies a measurement agent with "The agent-id identifies a measurement agent with
a very low probability of collision. In certain a very low probability of collision. In certain
deployments, the agent-id may be considered deployments, the agent-id may be considered
sensitive and hence this object is optional."; sensitive and hence this object is optional.";
} }
leaf device-id { leaf device-id {
type inet:uri; type inet:uri;
description description
"The device-id identifies a property of the "The device-id identifies the device running the
device running the measurement agent. In certain measurement agent. In certain deployments, the
deployments, the device-id may be considered device-id may be considered sensitive and hence
sensitive and hence this object is optional."; this object is optional.";
} }
leaf group-id { leaf group-id {
type string; type string;
description description
"The group-id identifies a group of measurement "The group-id identifies a group of measurement
agents. In certain deployments, the group-id agents. In certain deployments, the group-id
may be considered less sensitive than the may be considered less sensitive than the
agent-id."; agent-id.";
} }
leaf measurement-point { leaf measurement-point {
type string; type string;
description description
"The measurement point indicating where the "The measurement point indicating where the
measurement agent is located on a path."; measurement agent is located on a path.";
reference reference
"RFC 7398: A Reference Path and Measurement Points "RFC 7398: A Reference Path and Measurement Points
for Large-Scale Measurement of Broadband for Large-Scale Measurement of Broadband
Performance"; Performance";
} }
leaf report-agent-id {
type boolean;
must '. != "true" or ../agent-id' {
description
"An agent-id must exist for this to be set
to true.";
}
default false;
description
"The 'report-agent-id' controls whether the
'agent-id' is reported to collectors if the
'group-id' is configured. If the 'group-id'
is not configured, the agent-id is always
reported.";
}
leaf report-measurement-point { leaf report-agent-id {
type boolean; type boolean;
must '. != "true" or ../measurement-point' { must '. != "true" or ../agent-id' {
description description
"A measurement-point must exist for this to be "An agent-id must exist for this to be set
set to true."; to true.";
} }
default false; default false;
description description
"The 'report-measurement-point' controls whether "The 'report-agent-id' controls whether the
the 'measurement-point' is reported to collectors 'agent-id' is reported to collectors if the
if the 'measurement-point' is configured."; 'group-id' is configured. If the 'group-id'
} is not configured, the agent-id is always
reported.";
}
leaf controller-timeout { leaf report-measurement-point {
type uint32; type boolean;
units "seconds"; must '. != "true" or ../measurement-point' {
description description
"A timer is started after each successful contact "A measurement-point must exist for this to be
with a controller. When the timer reaches the set to true.";
controller-timeout, an event is raised indicating }
that connectivity to the controller has been lost."; default false;
} description
} "The 'report-measurement-point' controls whether
the 'measurement-point' is reported to collectors
if the 'measurement-point' is configured.";
}
/* leaf controller-timeout {
* Task Configuration type uint32;
*/ units "seconds";
description
"A timer is started after each successful contact
with a controller. When the timer reaches the
controller-timeout, an event (controller-lost) is
raised indicating that connectivity to the controller
has been lost.";
}
}
container tasks { /*
description * Task Configuration
"Configuration of LMAP tasks."; */
list task { container tasks {
key name; description
description "Configuration of LMAP tasks.";
"The list of tasks configured on the LMAP agent.";
leaf name { list task {
type lmap:identifier; key name;
description description
"The unique name of a task."; "The list of tasks configured on the LMAP agent.";
}
uses lmap:metrics-grouping; leaf name {
type lmap:identifier;
description
"The unique name of a task.";
}
leaf program { uses lmap:registry-grouping;
type string;
nacm:default-deny-write;
description
"The (local) program to invoke in order to execute
the task.";
}
uses lmap:task-options-grouping { leaf program {
description type string;
"The list of task specific options."; nacm:default-deny-write;
} description
"The (local) program to invoke in order to execute
the task. If this leaf is not set, then the system
will try to identify a suitable program based on
the registry information present.";
}
uses lmap:task-options-grouping {
description
"The list of task specific options.";
}
leaf-list tag { leaf-list tag {
type lmap:identifier; type lmap:identifier;
description description
"A tag contains additional information that is "A set of task specific tags that are reported
passed with the result record to the collector. together with the measurement results to a collector.
A tag can be used, for example, to carry the A tag can be used, for example, to carry the
Measurement Cycle ID."; Measurement Cycle ID.";
} }
} }
} }
/* /*
* Schedule Instructions * Schedule Instructions
*/ */
container schedules { container schedules {
description description
"Configuration of LMAP schedules. Schedules control "Configuration of LMAP schedules. Schedules control
which tasks are executed by the LMAP implementation."; which tasks are executed by the LMAP implementation.";
list schedule { list schedule {
key name; key name;
description description
"Configuration of a particular schedule."; "Configuration of a particular schedule.";
leaf name { leaf name {
type lmap:identifier; type lmap:identifier;
description description
"The locally-unique, administratively assigned name "The locally-unique, administratively assigned name
for this schedule."; for this schedule.";
} }
leaf start { leaf start {
type event-ref; type event-ref;
mandatory true; mandatory true;
description description
"The event source controlling the start of the "The event source controlling the start of the
scheduled actions."; scheduled actions.";
} }
choice stop { choice stop {
description description
"This choice contains optional leafs that control the "This choice contains optional leafs that control the
graceful forced termination of scheduled actions. graceful forced termination of scheduled actions.
When the end has been reached, the scheduled actions When the end has been reached, the scheduled actions
should be forced to terminate the measurements. should be forced to terminate the measurements.
This may involve being active some additional time in This may involve being active some additional time in
order to properly finish the action's activity (e.g., order to properly finish the action's activity (e.g.,
waiting for any still outstanding messages)."; waiting for any still outstanding messages).";
leaf end { leaf end {
type event-ref; type event-ref;
description description
"The event source controlling the graceful "The event source controlling the graceful
forced termination of the scheduled actions."; forced termination of the scheduled actions.";
} }
leaf duration { leaf duration {
type uint32; type uint32;
units "seconds"; units "seconds";
description description
"The duration controlling the graceful forced "The duration controlling the graceful forced
termination of the scheduled actions."; termination of the scheduled actions.";
} }
} }
leaf execution-mode { leaf execution-mode {
type enumeration { type enumeration {
enum sequential { enum sequential {
value 1; value 1;
description description
"The actions of the schedule are executed "The actions of the schedule are executed
sequentially."; sequentially.";
} }
enum parallel { enum parallel {
value 2; value 2;
description description
"The actions of the schedule are executed "The actions of the schedule are executed
concurrently"; concurrently";
} }
enum pipelined { enum pipelined {
value 3; value 3;
description description
"The actions of the schedule are executed in a "The actions of the schedule are executed in a
pipelined mode. Output created by an action is pipelined mode. Output created by an action is
passed as input to the subsequent action."; passed as input to the subsequent action.";
} }
} }
default pipelined; default pipelined;
description description
"The execution mode of this schedule determins in "The execution mode of this schedule determins in
which order the actions of the schedule are executed."; which order the actions of the schedule are executed.";
} }
leaf-list tag { leaf-list tag {
type lmap:tag; type lmap:tag;
description description
"A list of schedule specific tags that are "A set of schedule specific tags that are reported
reported together with the measurement results together with the measurement results to a collector.";
to a collector."; }
}
leaf-list suppression-tag { leaf-list suppression-tag {
type lmap:tag; type lmap:tag;
description description
"A list of suppression tags that are used to select "A set of suppression tags that are used to select
schedules to be suppressed."; schedules to be suppressed.";
} }
list action { list action {
key name; key name;
description description
"An action describes a task that is invoked by the "An action describes a task that is invoked by the
schedule. Multiple actions are invoked sequentially."; schedule. Multiple actions are invoked sequentially.";
leaf name { leaf name {
type lmap:identifier; type lmap:identifier;
description description
"The unique identifier for this action."; "The unique identifier for this action.";
} }
leaf task { leaf task {
type task-ref; type task-ref;
mandatory true; mandatory true;
description description
"The task invoked by this action."; "The task invoked by this action.";
} }
container parameters { container parameters {
description description
"This container is a place-holder for run-time "This container is a place-holder for run-time
parameters defined in task-specific or parameters defined in task-specific data models
metric-specific data models augmenting the augmenting the base lmap control data model.";
base lmap control data model.";
choice extension { choice extension {
description description
"This choice is provided to augment in different "This choice is provided to augment in different
sets of parameters."; sets of parameters.";
} }
} }
uses lmap:task-options-grouping {
description
"The list of action specific options that are
appended to the list of task specific options.";
}
uses lmap:task-options-grouping { leaf-list destination {
description type schedule-ref;
"The list of action specific options that are description
appended to the list of task specific options."; "A set of schedules receiving the output produced
} by this action. A queue is internally used to pass
results to another schedule. The behaviour of
an action passing data to its own schedule is
implementation specific.
leaf-list destination { Data passed to a sequential or pipelined schedule
type schedule-ref; is received by the schedule's first action. Data
description passed to a parallel schedule is received by all
"A schedule of receiving the output produced by actions of the schedule.";
this action. A queue is internally used to pass }
results to another schedule. The behaviour of
an action passing data to its own schedule is
implementation specific.
Data passed to a sequential or pipelined schedule leaf-list tag {
is consumed by the schedule's first action. Data type lmap:tag;
passed to a parallel schedule is consumed by all description
actions of the schedule."; "A set of action specific tags that are reported
} together with the measurement results to a collector.";
}
leaf-list tag { leaf-list suppression-tag {
type lmap:tag; type lmap:tag;
description description
"A list of action specific tags that are "A set of suppression tags that are used to select
reported together with the measurement results actions to be suppressed.";
to a collector."; }
} }
}
}
leaf-list suppression-tag { /*
type lmap:tag; * Suppression Instructions
description */
"A list of suppression tags that are used to select
actions to be suppressed.";
}
}
}
}
/* container suppressions {
* Suppression Instructions description
*/ "Suppression information to prevent schedules or
certain actions from starting.";
container suppressions { list suppression {
description key name;
"Suppression information to prevent schedules or description
certain actions from starting."; "Configuration of a particular suppression.";
list suppression { leaf name {
key name; type lmap:identifier;
description description
"Configuration of a particular suppression."; "The locally-unique, administratively assigned name
for this suppression.";
}
leaf name { leaf start {
type lmap:identifier; type event-ref;
description description
"The locally-unique, administratively assigned name "The event source controlling the start of the
for this suppression."; suppression period.";
} }
leaf start { leaf end {
type event-ref; type event-ref;
description description
"The event source controlling the start of the "The event source controlling the end of the
suppression period."; suppression period. If not present, supression
} continues indefinitely.";
}
leaf end { leaf-list match {
type event-ref; type lmap:glob-pattern;
description description
"The event source controlling the end of the "A set of suppression match pattern. The suppression
suppression period. If not present, supression will apply to all schedules (and their actions) that
continues indefinitely."; have a matching value in their suppression-tags
} and to all actions that have a matching value in
their suppression-tags.";
}
leaf-list match { leaf stop-running {
type lmap:glob-pattern; type boolean;
description default false;
"A list of suppression tags. The suppression will description
apply to all schedules (and their actions) that "If 'stop-running' is true, running schedules and
have a matching value in their suppression-tags actions matching the suppression will be terminated
and to all actions that have a matching value in when suppression is activated. If 'stop-running' is
their suppression-tags."; false, running schedules and actions will not be
} affected if suppression is activated.";
}
}
}
/*
* Event Instructions
*/
leaf stop-running { container events {
type boolean; description
default false; "Configuration of LMAP events.
description
"If 'stop-running' is true, running schedules and
actions matching the suppression will be terminated
when suppression is activated. If 'stop-running' is
false, running schedules and actions will not be
affected if suppression is activated.";
}
}
}
/* Implementations may be forced to delay acting
* Event Instructions upon the occurance of events in the face of local
*/ constraints. An action triggered by an event
therefore should not rely on the accuracy
provided by the scheduler implementation.";
container events { list event {
description key name;
"Configuration of LMAP events. description
"The list of event sources configured on the
LMAP agent.";
Implementations may be forced to delay acting leaf name {
upon the occurance of events in the face of local type lmap:identifier;
constraints. An action triggered by an event description
therefore should not rely on the accuracy "The unique name of an event source.";
provided by the scheduler implementation."; }
list event { choice event-type {
key name; description
description "Different types of events are handled by
"The list of event sources configured on the different branches of this choice. Note that
LMAP agent."; this choice can be extended via augmentations.";
leaf name { case periodic {
type lmap:identifier; container periodic {
description description
"The unique name of an event source."; "A periodic timing object triggers periodically
} according to a regular interval.";
choice event-type { leaf interval {
description type uint32 {
"Different types of events are handled by range "1..max";
different branches of this choice. Note that }
this choice can be extended via augmentations."; units "seconds";
mandatory true;
description
"The number of seconds between two triggers
generated by this periodic timing object.";
}
uses timing-start-end-grouping;
}
}
case periodic { case calendar {
container periodic { container calendar {
description description
"A periodic timing object triggers periodically "A calendar timing object triggers based on the
according to a regular interval."; current calendar date and time.";
leaf interval { leaf-list month {
type uint32 { type lmap:month-or-all;
range "1..max"; min-elements 1;
} description
units "seconds"; "A set of month at which this calendar timing
mandatory true; will trigger. The wildcard means all months.";
description }
"The number of seconds between two triggers
generated by this periodic timing object.";
}
uses timing-start-end-grouping;
}
}
case calendar { leaf-list day-of-month {
container calendar { type lmap:day-of-months-or-all;
description min-elements 1;
"A calendar timing object triggers based on the description
current calendar date and time."; "A set of days of the month at which this
calendar timing will trigger. The wildcard means
all days of a month.";
}
leaf-list month { leaf-list day-of-week {
type lmap:month-or-all; type lmap:weekday-or-all;
min-elements 1; min-elements 1;
description description
"A month at which this calendar timing will "A set of weekdays at which this calendar timing
trigger. The wildcard means all months."; will trigger. The wildcard means all weekdays.";
} }
leaf-list day-of-month { leaf-list hour {
type lmap:day-of-months-or-all; type lmap:hour-or-all;
min-elements 1; min-elements 1;
description description
"A day of the month at which this calendar "A set of hours at which this calendar timing will
timing will trigger. The wildcard means all trigger. The wildcard means all hours of a day.";
days of a month."; }
}
leaf-list day-of-week { leaf-list minute {
type lmap:weekday-or-all; type lmap:minute-or-all;
min-elements 1; min-elements 1;
description description
"A weekday at which this calendar timing will "A set of minutes at which this calendar timing
trigger. The wildcard means all weekdays."; will trigger. The wildcard means all minutes of
} an hour.";
}
leaf-list hour { leaf-list second {
type lmap:hour-or-all; type lmap:second-or-all;
min-elements 1; min-elements 1;
description description
"An hour at which this calendar timing will "A set of second at which this calendar timing
trigger. The wildcard means all hours of a will trigger. The wildcard means all seconds of
day."; a minute.";
} }
leaf-list minute { leaf timezone-offset {
type lmap:minute-or-all; type lmap:timezone-offset;
min-elements 1; description
description "The timezone in which this calendar timing
"A minute at which this calendar timing will object will be evaluated. If not present,
trigger. The wildcard means all minutes of the systems' local timezone will be used.";
an hour."; }
} uses timing-start-end-grouping;
}
}
leaf-list second { case one-off {
type lmap:second-or-all; container one-off {
min-elements 1; description
description "A one-off timing object triggers exactly once.";
"A second at which this calendar timing will
trigger. The wildcard means all seconds of
a minute.";
}
leaf timezone-offset { leaf time {
type lmap:timezone-offset; type yang:date-and-time;
description mandatory true;
"The timezone in which this calendar timing description
object will be evaluated. If not present, "This one-off timing object triggers once at
the systems' local timezone will be used."; the configured date and time.";
} }
uses timing-start-end-grouping; }
}
} case immediate {
} leaf immediate {
type empty;
mandatory true;
description
"This immediate event object triggers immediately
when it is configured.";
}
}
case startup {
leaf startup {
type empty;
mandatory true;
description
"This startup event object triggers whenever the
LMAP agent (re)starts.";
}
}
case one-off { case controller-lost {
container one-off { leaf controller-lost {
description type empty;
"A one-off timing object triggers exactly once."; mandatory true;
description
"The controller-lost event object triggers when
the connectivity to the controller has been lost
for at least 'controller-timeout' seconds.";
}
}
leaf time { case controller-connected {
type yang:date-and-time; leaf controller-connected {
mandatory true; type empty;
description mandatory true;
"This one-off timing object triggers once at description
the configured date and time."; "The controller-connected event object triggers
} when the connectivity to the controller has been
} restored after it was lost for at least
} 'controller-timeout' seconds.";
}
}
}
case immediate { leaf random-spread {
leaf immediate { type uint32;
type empty; units seconds;
mandatory true; description
description "This optional leaf adds a random spread to the
"This immediate event object triggers immediately computation of the event's trigger time. The
when it is configured."; random spread is a uniformly distributed random
} number taken from the interval [0:random-spread].";
} }
case startup { leaf cycle-interval {
leaf startup { type uint32;
type empty; units seconds;
mandatory true; description
description "The optional cycle-interval defines the duration
"This startup event object triggers whenever the of the time interval in seconds that is used to
LMAP agent (re)starts."; calculate cycle numbers. No cycle number is
} calculated if the optional cycle-interval does
} not exist.";
}
}
}
}
case controller-lost { /*
leaf controller-lost { * The state subtree provides information about the capabilities
type empty; * and the current status of the MA.
mandatory true; */
description
"The controller-lost event object triggers when
the connectivity to the controller has been lost
for at least 'controller-timeout' seconds.";
}
}
case controller-connected {
leaf controller-connected {
type empty;
mandatory true;
description
"The controller-connected event object triggers
when the connectivity to the controller has been
restored after it was lost for at least
'controller-timeout' seconds.";
}
}
}
leaf random-spread { container lmap-state {
type uint32; config false;
units seconds; description
description "A tree exporting state information about the LMAP agent.";
"This optional leaf adds a random spread to the
computation of the event's trigger time. The
random spread is a uniformly distributed random
number taken from the interval [0:random-spread].";
}
}
}
}
/* container agent {
* The state subtree provides information about the capabilities description
* and the current status of the MA. "Operations state of the measurement agent.";
*/
container lmap-state { leaf agent-id {
config false; type yang:uuid;
description description
"A tree exporting state information about the LMAP agent."; "The agent-id identifies a measurement agent with
a very low probability of collision. In certain
deployments, the agent-id may be considered
sensitive and hence this object is optional.";
}
container agent { leaf device-id {
description type inet:uri;
"Operations state of the measurement agent."; description
"The device-id identifies the device running the
measurement agent. In certain deployments, the
device-id may be considered sensitive and hence
this object is optional.";
}
leaf hardware {
type string;
mandatory true;
description
"A short description of the hardware the measurement
agent is running on. This should include the version
number of the hardware";
leaf agent-id { }
type yang:uuid; leaf firmware {
mandatory true; type string;
description mandatory true;
"The agent-id identifies a measurement agent with description
a very low probability of collision. In certain "A short description of the firmware the measurement
deployments, the agent-id may be considered agent is running on. This should include the version
sensitive and hence this object is optional."; number of the firmware.";
}
leaf version {
type string;
mandatory true;
description
"A short description of the software implementing the
measurement agent. This should include the version
number of the measurement agent software.";
}
leaf-list tag {
type lmap:tag;
description
"An optional unordered set of tags that provide
additional information about the capabilities of
the measurement agent.";
}
leaf last-started {
type yang:date-and-time;
mandatory true;
description
"The date and time the measurement agent last started.";
}
}
} container tasks {
description
"Available LMAP tasks, including information about their
last execution and their last failed execution.";
leaf device-id { list task {
type inet:uri; key name;
mandatory true; description
description "The list of tasks available on the LMAP agent.";
"The device-id identifies a property of the
device running the measurement agent. In certain
deployments, the device-id may be considered
sensitive and hence this object is optional.";
}
leaf hardware {
type string;
mandatory true;
description
"A short description of the hardware the measurement
agent is running on. This should include the version
number of the hardware";
}
leaf firmware {
type string;
mandatory true;
description
"A short description of the firmware the measurement
agent is running on. This should include the version
number of the firmware.";
}
leaf version {
type string;
mandatory true;
description
"A short description of the software implementing the
measurement agent. This should include the version
number of the measurement agent software.";
}
leaf last-started {
type yang:date-and-time;
mandatory true;
description
"The date and time the measurement agent last started.";
}
}
container tasks { leaf name {
description type lmap:identifier;
"Available LMAP tasks, including information about their description
last execution and their last failed execution."; "The unique name of a task.";
}
uses lmap:registry-grouping;
list task { leaf version {
key name; type string;
description description
"The list of tasks available on the LMAP agent."; "A short description of the software implementing
the task. This should include the version
number of the measurement task software.";
}
leaf name { leaf program {
type lmap:identifier; type string;
description description
"The unique name of a task."; "The (local) program to invoke in order to execute
} the task.";
}
}
}
uses lmap:metrics-grouping; container schedules {
description
"State of LMAP schedules.";
leaf version { list schedule {
type string; key name;
description description
"A short description of the software implementing "State of a particular schedule.";
the task. This should include the version
number of the measurement task software.";
}
leaf program { leaf name {
type string; type lmap:identifier;
description description
"The (local) program to invoke in order to execute "The locally-unique, administratively assigned name
the task."; for this schedule.";
} }
}
}
container schedules { leaf state {
description type enumeration {
"State of LMAP schedules."; enum enabled {
value 1;
description
"The value 'enabled' indicates that the
schedule is currently enabled.";
}
enum disabled {
value 2;
description
"The value 'disabled' indicates that the
schedule is currently disabled.";
list schedule { }
key name; enum running {
description value 3;
"State of a particular schedule."; description
"The value 'running' indicates that the
schedule is currently running.";
}
enum suppressed {
value 4;
description
"The value 'suppressed' indicates that the
schedule is currently suppressed.";
}
}
description
"The current state of the schedule.";
}
leaf name { leaf storage {
type lmap:identifier; type yang:gauge64;
description units "bytes";
"The locally-unique, administratively assigned name description
for this schedule."; "The amount of secondary storage (e.g., allocated in a
} file system) holding temporary data allocated to the
schedule in bytes. This object reports the amount of
allocated physical storage and not the storage used
by logical data records.";
}
leaf state { leaf invocations {
type enumeration { type yang:counter32;
enum enabled { description
value 1; "Number of invocations of this schedule. This counter
description does not include suppressed invocations or invocations
"The value 'enabled' indicates that the that were prevented due to an overlap with a previous
schedule is currently enabled."; invocation of this schedule.";
} }
enum disabled {
value 2;
description
"The value 'disabled' indicates that the
schedule is currently disabled.";
}
enum running {
value 3;
description
"The value 'running' indicates that the
schedule is currently running.";
}
enum suppressed {
value 4;
description
"The value 'suppressed' indicates that the
schedule is currently suppressed.";
}
}
description
"The current state of the schedule.";
}
leaf storage { leaf suppressions {
type yang:gauge64; type yang:counter32;
units "bytes"; description
description "Number of suppressed executions of this schedule.";
"The amount of storage allocated to the schedule in }
bytes. This object reports the amount of allocated
physical storage and not the storage used by logical
data records.";
}
leaf invocations { leaf overlaps {
type yang:counter32; type yang:counter32;
description description
"Number of invocations of this schedule. This counter "Number of executions prevented due to overlaps with
does not include suppressed invocations or invocations a previous invocation of this schedule.";
that were prevented due to an overlap with a previous }
invocation of this schedule.";
}
leaf suppressions {
type yang:counter32;
description
"Number of suppressed executions of this schedule.";
}
leaf overlaps { leaf failures {
type yang:counter32; type yang:counter32;
description description
"Number of executions prevented due to overlaps with "Number of failed executions of this schedule. A
a previous invocation of this schedule."; failed execution is an execution where at least
} one action failed.";
}
leaf failures { leaf last-invocation {
type yang:counter32; type yang:date-and-time;
description description
"Number of failed executions of this schedule. A "The date and time of the last invocation of
failed execution is an execution where at least this schedule.";
one action failed."; }
}
leaf last-invocation { list action {
type yang:date-and-time; key name;
description description
"The date and time of the last invocation of "The state of the actions associated with this
this schedule."; schedule entry.";
}
list action { leaf name {
key name; type lmap:identifier;
description description
"The state of the actions associated with this "The unique identifier for this action.";
schedule entry."; }
leaf name { leaf state {
type lmap:identifier; type enumeration {
description enum enabled {
"The unique identifier for this action."; value 1;
} description
"The value 'enabled' indicates that the
action is currently enabled.";
}
enum disabled {
value 2;
description
"The value 'disabled' indicates that the
action is currently disabled.";
}
enum running {
value 3;
description
"The value 'running' indicates that the
action is currently runnning.";
}
enum suppressed {
value 4;
description
"The value 'suppressed' indicates that the
action is currently suppressed.";
}
}
description
"The current state of the action.";
}
leaf state { leaf storage {
type enumeration { type yang:gauge64;
enum enabled { units "bytes";
value 1; description
description "The amount of secondary storage (e.g., allocated in a
"The value 'enabled' indicates that the file system) holding temporary data allocated to the
action is currently enabled."; schedule in bytes. This object reports the amount of
} allocated physical storage and not the storage used
enum disabled { by logical data records.";
value 2; }
description
"The value 'disabled' indicates that the
action is currently disabled.";
}
enum running {
value 3;
description
"The value 'running' indicates that the
action is currently runnning.";
}
enum suppressed {
value 4;
description
"The value 'suppressed' indicates that the
action is currently suppressed.";
}
}
description
"The current state of the action.";
}
leaf storage { leaf invocations {
type yang:gauge64; type yang:counter32;
units "bytes"; description
description "Number of invocations of this action. This counter
"The amount of storage allocated to the schedule in does not include suppressed invocations or invocations
bytes. This object reports the amount of allocated that were prevented due to an overlap with a previous
physical storage and not the storage used by logical invocation of this action.";
data records."; }
}
leaf invocations { leaf suppressions {
type yang:counter32; type yang:counter32;
description description
"Number of invocations of this action. This counter "Number of suppressed executions of this action.";
does not include suppressed invocations or invocations }
that were prevented due to an overlap with a previous
invocation of this action.";
}
leaf suppressions { leaf overlaps {
type yang:counter32; type yang:counter32;
description description
"Number of suppressed executions of this action."; "Number of executions prevented due to overlaps with
} a previous invocation of this action.";
leaf overlaps { }
type yang:counter32;
description
"Number of executions prevented due to overlaps with
a previous invocation of this action.";
}
leaf failures { leaf failures {
type yang:counter32; type yang:counter32;
description description
"Number of failed executions of this action."; "Number of failed executions of this action.";
} }
leaf last-invocation { leaf last-invocation {
type yang:date-and-time; type yang:date-and-time;
description description
"The date and time of the last invocation of "The date and time of the last invocation of
this action."; this action.";
} }
leaf last-completion { leaf last-completion {
type yang:date-and-time; type yang:date-and-time;
description description
"The date and time of the last completion of "The date and time of the last completion of
this action."; this action.";
} }
leaf last-status { leaf last-status {
type lmap:status-code; type lmap:status-code;
description description
"The status code returned by the last execution of "The status code returned by the last execution of
this action."; this action.";
} }
leaf last-message { leaf last-message {
type string; type string;
description description
"The status message produced by the last execution "The status message produced by the last execution
of this action."; of this action.";
} }
leaf last-failed-completion { leaf last-failed-completion {
type yang:date-and-time; type yang:date-and-time;
description description
"The date and time of the last failed completion "The date and time of the last failed completion
of this action."; of this action.";
} }
leaf last-failed-status {
type lmap:status-code;
description
"The status code returned by the last failed
execution of this action.";
}
leaf last-failed-message { leaf last-failed-status {
type string; type lmap:status-code;
description description
"The status message produced by the last failed "The status code returned by the last failed
execution of this action."; execution of this action.";
} }
}
}
}
container suppressions { leaf last-failed-message {
description type string;
"State of LMAP suppressions."; description
"The status message produced by the last failed
execution of this action.";
}
}
}
}
list suppression { container suppressions {
key name; description
description "State of LMAP suppressions.";
"State of a particular suppression.";
leaf name { list suppression {
type lmap:identifier; key name;
description description
"The locally-unique, administratively assigned name "State of a particular suppression.";
for this suppression.";
}
leaf state { leaf name {
type enumeration { type lmap:identifier;
enum enabled { description
value 1; "The locally-unique, administratively assigned name
description for this suppression.";
"The value 'enabled' indicates that the }
suppression is currently enabled.";
}
enum disabled {
value 2;
description
"The value 'disabled' indicates that the
suppression is currently disabled.";
}
enum active {
value 3;
description
"The value 'active' indicates that the
suppression is currently active.";
}
}
description
"The current state of the suppression.";
}
}
}
}
}
<CODE ENDS>
<CODE BEGINS> file "ietf-lmap-report@2016-07-07.yang" leaf state {
type enumeration {
enum enabled {
value 1;
description
"The value 'enabled' indicates that the
suppression is currently enabled.";
}
enum disabled {
value 2;
description
"The value 'disabled' indicates that the
suppression is currently disabled.";
}
enum active {
value 3;
description
"The value 'active' indicates that the
suppression is currently active.";
}
}
description
"The current state of the suppression.";
}
}
}
}
}
<CODE ENDS>
4.3. LMAP Report YANG Module
This module imports definitions from [RFC6536] and the common LMAP
module.
<CODE BEGINS> file "ietf-lmap-report@2016-10-10.yang"
module ietf-lmap-report { module ietf-lmap-report {
namespace "urn:ietf:params:xml:ns:yang:ietf-lmap-report"; namespace "urn:ietf:params:xml:ns:yang:ietf-lmap-report";
prefix "lmapr"; prefix "lmapr";
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
} }
import ietf-lmap-common { import ietf-lmap-common {
prefix lmap; prefix lmap;
skipping to change at page 39, line 5 skipping to change at page 40, line 48
Editor: Vaibhav Bajpai Editor: Vaibhav Bajpai
<v.bajpai@jacobs-university.de>"; <v.bajpai@jacobs-university.de>";
description description
"This module defines a data model for reporting results from "This module defines a data model for reporting results from
measurement agents, which are part of a Large-Scale Measurement measurement agents, which are part of a Large-Scale Measurement
Platform (LMAP), to result data collectors. This data model is Platform (LMAP), to result data collectors. This data model is
expected to be implemented by a collector."; expected to be implemented by a collector.";
revision "2016-07-07" { revision "2016-10-10" {
description description
"Initial version"; "Initial version";
reference reference
"RFC XXX: A YANG Data Model for LMAP Measurement Agents"; "RFC XXX: A YANG Data Model for LMAP Measurement Agents";
} }
rpc report { rpc report {
description description
"The report operation is used by an LMAP measurement agent to "The report operation is used by an LMAP measurement agent to
submit measurement results produced by measurement tasks to submit measurement results produced by measurement tasks to
a collector."; a collector.";
input { input {
skipping to change at page 40, line 24 skipping to change at page 42, line 20
"The name of the action in the schedule that produced "The name of the action in the schedule that produced
the result."; the result.";
} }
leaf task-name { leaf task-name {
type lmap:identifier; type lmap:identifier;
description description
"The name of the task that produced the result."; "The name of the task that produced the result.";
} }
container parameters {
description
"This container is a place-holder for run-time
parameters defined in task-specific data models
augmenting the base lmap report data model.";
choice extension {
description
"This choice is provided to augment in different
sets of parameters.";
}
}
uses lmap:task-options-grouping { uses lmap:task-options-grouping {
description description
"The list of options there were in use then the "The list of options there were in use then the
measurement was performed. This list must include measurement was performed. This list must include
both the task specific options as well as the action both the task specific options as well as the action
specific options."; specific options.";
} }
leaf-list tag { leaf-list tag {
type lmap:tag; type lmap:tag;
description description
"A tag contains additional information that is passed "A tag contains additional information that is passed
with the result record to the collector. This is the with the result record to the collector. This is the
joined set of tags defined for the task object and the joined set of tags defined for the task object and the
action object. A tag can be used to carry the action object. A tag can be used to carry the
Measurement Cycle ID."; Measurement Cycle ID.";
} }
leaf event {
type yang:date-and-time;
description
"The date and time of the event that triggered the
schedule of the action that produced the reported
result values. The date and time does not include
any added randomization.";
}
leaf start { leaf start {
type yang:date-and-time; type yang:date-and-time;
mandatory true; mandatory true;
description description
"The date and time when the task producing "The date and time when the task producing
this result started."; this result started.";
} }
leaf end { leaf end {
type yang:date-and-time; type yang:date-and-time;
description description
"The date and time when the task producing "The date and time when the task producing
this result finished."; this result finished.";
} }
leaf cycle-number {
type lmap:cycle-number;
description
"The optional cycle number is the time closest to
the time reported in the event leaf that is a multiple
of the cycle-interval of the event that triggered the
execution of the schedule. The value is only present
if the event that triggered the execution of the
schedule has a defined cycle-interval.";
}
leaf status { leaf status {
type lmap:status-code; type lmap:status-code;
mandatory true; mandatory true;
description description
"The status code returned by the execution of this "The status code returned by the execution of this
task."; action.";
} }
list conflict { list conflict {
description description
"The names of tasks overlapping with the execution "The names of tasks overlapping with the execution
of the task that has produced this result."; of the task that has produced this result.";
leaf schedule-name { leaf schedule-name {
type lmap:identifier; type lmap:identifier;
description description
skipping to change at page 41, line 40 skipping to change at page 44, line 21
type lmap:identifier; type lmap:identifier;
description description
"The name of an action within the schedule that "The name of an action within the schedule that
might have impacted the execution of the task that might have impacted the execution of the task that
has produced this result."; has produced this result.";
} }
leaf task-name { leaf task-name {
type lmap:identifier; type lmap:identifier;
description description
"The name of the task executed by an action within the "The name of the task executed by an action within
schedule that might have impacted the execution of the the schedule that might have impacted the execution
task that has produced this result."; of the task that has produced this result.";
} }
} }
list table { list table {
description description
"A list of result tables."; "A list of result tables.";
uses lmap:metrics-grouping; uses lmap:registry-grouping;
leaf-list column { leaf-list column {
type string; type string;
description description
"An ordered list of column labels. The order is "An ordered list of column labels. The order is
determined by the system and must match the order determined by the system and must match the order
of the columns in the result rows."; of the columns in the result rows.";
} }
list row { list row {
description description
skipping to change at page 45, line 37 skipping to change at page 48, line 22
prefix: lmapc prefix: lmapc
reference: RFC XXXX reference: RFC XXXX
name: ietf-lmap-report name: ietf-lmap-report
namespace: urn:ietf:params:xml:ns:yang:ietf-lmap-report namespace: urn:ietf:params:xml:ns:yang:ietf-lmap-report
prefix: lmapr prefix: lmapr
reference: RFC XXXX reference: RFC XXXX
7. Acknowledgements 7. Acknowledgements
Several people contributed to this specification by reviewing early
versions and actively participating in the LMAP working group
(apologies to those unintentionally omitted): Timothy Carey, Al
Morton, Dan Romascanu, Andrea Soppera, and Barbara Stark. (XXX:
complete this list)
Juergen Schoenwaelder and Vaibhav Bajpai worked in part on the Leone Juergen Schoenwaelder and Vaibhav Bajpai worked in part on the Leone
research project, which received funding from the European Union research project, which received funding from the European Union
Seventh Framework Programme [FP7/2007-2013] under grant agreement Seventh Framework Programme [FP7/2007-2013] under grant agreement
number 317647. number 317647.
Juergen Schoenwaelder and Vaibhav Bajpai were partly funded by Juergen Schoenwaelder and Vaibhav Bajpai were partly funded by
Flamingo, a Network of Excellence project (ICT-318488) supported by Flamingo, a Network of Excellence project (ICT-318488) supported by
the European Commission under its Seventh Framework Programme. the European Commission under its Seventh Framework Programme.
8. References 8. References
skipping to change at page 46, line 29 skipping to change at page 49, line 15
[RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", RFC [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", RFC
6991, DOI 10.17487/RFC6991, July 2013, 6991, DOI 10.17487/RFC6991, July 2013,
<http://www.rfc-editor.org/info/rfc6991>. <http://www.rfc-editor.org/info/rfc6991>.
8.2. Informative References 8.2. Informative References
[I-D.ietf-lmap-information-model] [I-D.ietf-lmap-information-model]
Burbridge, T., Eardley, P., Bagnulo, M., and J. Burbridge, T., Eardley, P., Bagnulo, M., and J.
Schoenwaelder, "Information Model for Large-Scale Schoenwaelder, "Information Model for Large-Scale
Measurement Platforms (LMAP)", draft-ietf-lmap- Measurement Platforms (LMAP)", draft-ietf-lmap-
information-model-09 (work in progress), March 2016. information-model-11 (work in progress), August 2016.
[I-D.ietf-netconf-server-model] [I-D.ietf-netconf-server-model]
Watsen, K. and J. Schoenwaelder, "NETCONF Server and Watsen, K. and J. Schoenwaelder, "NETCONF Server and
RESTCONF Server Configuration Models", draft-ietf-netconf- RESTCONF Server Configuration Models", draft-ietf-netconf-
server-model-09 (work in progress), March 2016. server-model-09 (work in progress), March 2016.
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
DOI 10.17487/RFC3688, January 2004, DOI 10.17487/RFC3688, January 2004,
<http://www.rfc-editor.org/info/rfc3688>. <http://www.rfc-editor.org/info/rfc3688>.
skipping to change at page 47, line 26 skipping to change at page 50, line 11
Large-Scale Measurement of Broadband Performance", RFC Large-Scale Measurement of Broadband Performance", RFC
7398, DOI 10.17487/RFC7398, February 2015, 7398, DOI 10.17487/RFC7398, February 2015,
<http://www.rfc-editor.org/info/rfc7398>. <http://www.rfc-editor.org/info/rfc7398>.
[RFC7594] Eardley, P., Morton, A., Bagnulo, M., Burbridge, T., [RFC7594] Eardley, P., Morton, A., Bagnulo, M., Burbridge, T.,
Aitken, P., and A. Akhter, "A Framework for Large-Scale Aitken, P., and A. Akhter, "A Framework for Large-Scale
Measurement of Broadband Performance (LMAP)", RFC 7594, Measurement of Broadband Performance (LMAP)", RFC 7594,
DOI 10.17487/RFC7594, September 2015, DOI 10.17487/RFC7594, September 2015,
<http://www.rfc-editor.org/info/rfc7594>. <http://www.rfc-editor.org/info/rfc7594>.
Appendix A. Open Issues Appendix A. Example IPPM Extension Module for UDP Latency Metrics
A.1.
The information model makes a distinction between control tasks and
schedules and instruction tasks and schedules. The YANG model kind
of ignores this distinction. Should we have special subtrees to
separate control from instruction tasks and schedules? Or should we
somehow flag control tasks and schedules? It may be conceivable that
people want to apply different access control policies for control
schedules and for instruction schedules (which would favour a
solution that separates things into different subtrees).
A.2. Examples
Do we want to keep the examples? If yes, they should be better
aligned. If we keep the examples, do we need to keep both versions
(XML and JSON)?
Appendix B. Non-editorial Changes since -04
o Tagged /lmap/tasks/task/program with nacm:default-deny-write.
o Added /lmap-state/schedules/schedule/storage and /lmap-state/
schedules/schedule/action/storage.
o Removed suppress-by-default.
o Moved the metric list from /report/result into /report/result/
table.
o Conflicts are now reported as a triple (schedule, action, task).
o Replaced IPv4 address in the examples with IPv6 addresses.
o Added result/status.
Appendix C. Non-editorial Changes since -03
o Reworked the reporting data model to align it with the changes in
the information model.
Appendix D. Non-editorial Changes since -02
o Added a mechanism to enforce a runtime limit for schedules.
o Added security considerations text warning about possible shell
expansions of options.
o Restricted all user-defined names and tags to lmap:identifier.
Added security considerations text to make implementors aware of
possible security issues if identifiers are naively mapped to say
filesystem paths.
o Schedules and actions now have tags (echoed to the collector) and
suppression tags (used for suppression selection).
o Introduced glob-style pattern to match tags.
o Added an example module for IPPM udp latency metrics to
demonstrate the usage of the extension mechanism.
o Introduced parameters, an extension point for task/metric specific
parameters defined in augmenting YANG modules.
o Introduced the typedefs event-ref, task-ref, and schedule-ref.
o Changed schedule/event to schedule/start and added the optional
schedule/stop and schedule/duration leafs.
Appendix E. Non-editorial Changes since -01
o Updated and split examples (config vs state vs report).
o Refactored the definitions so that common definitions used by both
the control and report data models are in the new module ietf-
lmap-common.
o A report is submitted via an RPC operation instead of using a
notification.
o The default execution mode is pipelined.
o Clarified which action consumes data in sequential, pipelines, and
parallel execution mode.
o Added /lmap/agent/measurement-point, /lmap/agent/report-
measurement-point, and /report/measurement-point to configure and
report the measurement point.
o Turned /lmap/suppression into a list /lmap/suppressions/
suppression that uses a start and stop event to define the
beginning and end of a suppression period.
o Added controller-lost an controller-ok event choices to /lmap/
events/event.
o Added a metrics-grouping to identify entries in a metric registry
and associated roles.
o Added /lmap-state/schedules to report the status of schedules and
their actions. Refactored /lmap-state/tasks to only report the
task capabilities.
Appendix F. Non-editorial Changes since -00
o A task can now reference multiply registry entries.
o Schedules are triggered by Events instead of Timings; Timings are
just one of many possible event sources.
o Actions feed into other Schedules (instead of Actions within other
Schedules).
o Removed the notion of multiple task outputs.
o Support for sequential, parallel, and pipelined execution of
Actions.
Appendix G. Example IPPM Module for UDP Latency Metrics
module example-ietf-ippm-udp-latency {
namespace "urn:example:ietf-ippm-udp-latency"; Sometimes tasks may require complicated parameters that cannot easily
prefix "ippm-udp-latency"; be fit into options, i.e., a list of name/value pairs. In such a
situation, it is possible to augment the ietf-lmap-control.yang and
ietf-lmap-report.yang data models with definitions for more complex
parameters. The following example module demontrates this idea using
the parameters of UDP latency metrics as an example (although UDP
latency metric parameters do not really need such an extension
module).
import ietf-inet-types { module example-ietf-ippm-udp-latency {
prefix inet;
}
import ietf-lmap-control { namespace "urn:example:ietf-ippm-udp-latency";
prefix "lmap"; prefix "ippm-udp-latency";
}
augment "/lmap:lmap/lmap:schedules/lmap:schedule/lmap:action" import ietf-inet-types {
+ "/lmap:parameters/lmap:extension" { prefix inet;
description }
"This augmentation adds parameters specific to IPPM UDP import ietf-lmap-control {
latency metrics."; prefix "lmapc";
}
import ietf-lmap-report {
prefix "lmapr";
}
case "ietf-ippm-udp-latency" { grouping ippm-udp-latency-parameter-grouping {
leaf src-ip { leaf src-ip {
type inet:ip-address; type inet:ip-address;
description description
"The source IP address of the UDP measurement traffic."; "The source IP address of the UDP measurement traffic.";
} }
leaf src-port { leaf src-port {
type inet:port-number; type inet:port-number;
description description
"The source port number of the UDP measurement traffic."; "The source port number of the UDP measurement traffic.";
skipping to change at page 51, line 25 skipping to change at page 51, line 35
type decimal64 { type decimal64 {
fraction-digits 4; fraction-digits 4;
} }
units "seconds"; units "seconds";
default 30.0000; default 30.0000;
description description
"The upper limit on the poisson distribution with a resolution "The upper limit on the poisson distribution with a resolution
of 0.0001 seconds (0.1 ms)."; of 0.0001 seconds (0.1 ms).";
} }
} }
augment "/lmapc:lmap/lmapc:schedules/lmapc:schedule/lmapc:action"
+ "/lmapc:parameters/lmapc:extension" {
description
"This augmentation adds parameters specific to IPPM UDP
latency metrics to actions.";
case "ietf-ippm-udp-latency" {
uses ippm-udp-latency-parameter-grouping;
}
}
augment "/lmapr:report/lmapr:input/lmapr:result"
+ "/lmapr:parameters/lmapr:extension" {
description
"This augmentation adds parameters specific to IPPM UDP
latency metrics to reports.";
case "ietf-ippm-udp-latency" {
uses ippm-udp-latency-parameter-grouping;
}
}
} }
}
Appendix H. Example Configuration (XML) Appendix B. Example Configuration
<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<lmap xmlns="urn:ietf:params:xml:ns:yang:ietf-lmap-control"> <lmap xmlns="urn:ietf:params:xml:ns:yang:ietf-lmap-control">
<agent>
<agent-id>550e8400-e29b-41d4-a716-446655440000</agent-id>
<device-id>urn:dev:mac:0024befffe804ff1</device-id>
<report-agent-id>true</report-agent-id>
</agent>
<schedules>
<!-- The schedule S1 first updates a list of ping targets
and subsequently sends a ping to all targets. -->
<schedule>
<name>S1</name>
<start>E1</start>
<execution-mode>sequential</execution-mode>
<action>
<name>A1</name>
<task>update-ping-targets</task>
</action>
<action>
<name>A2</name>
<task>ping-all-targets</task>
<destination>S3</destination>
</action>
<suppression-tag>measurement:ping</suppression-tag>
</schedule>
<!-- The schedule S2 executes two traceroutes concurrently. -->
<schedule>
<name>S2</name>
<start>E1</start>
<execution-mode>parallel</execution-mode>
<action>
<name>A1</name>
<task>traceroute</task>
<option>
<id>target</id>
<name>target</name>
<value>2001:db8::1</value>
</option>
<destination>S3</destination>
</action>
<action>
<name>A2</name>
<task>traceroute</task>
<option>
<id>target</id>
<name>target</name>
<value>2001:db8::2</value>
</option>
<destination>S3</destination>
</action>
<suppression-tag>measurement:traceroute</suppression-tag>
</schedule>
<!-- The schedule S3 sends measurement data to a collector. -->
<schedule>
<name>S3</name>
<start>E2</start>
<action>
<name>A1</name>
<task>report</task>
<option>
<id>collector</id>
<name>collector</name>
<value>https://collector.example.com/</value>
</option>
</action>
</schedule>
</schedules>
<suppressions>
<!-- stop all measurements if we got orphaned -->
<suppression>
<name>orphaned</name>
<start>controller-lost</start>
<end>controller-connected</end>
<match>measurement:*</match>
</suppression>
</suppressions>
<tasks>
<!-- configuration of an update-ping-targets task -->
<task>
<name>update-ping-targets</name>
<program>/usr/bin/fping-update-targets</program>
</task>
<!-- configuration of a ping-all-targets task -->
<task>
<name>ping-all-targets</name>
<program>/usr/bin/fping</program>
</task>
<!-- configuration of a traceroute task -->
<task>
<name>traceroute</name>
<program>/usr/bin/mtr</program>
<option>
<id>csv</id>
<name>--csv</name>
</option>
</task>
<!-- configuration of a reporter task -->
<task>
<name>report</name>
<program>/usr/bin/lmap-report</program>
</task>
<task>
<name>ippm-udp-latency-client</name>
<program>/usr/bin/ippm-udp-latency</program>
<metric>
<uri>urn:example:tbd</uri>
<role>client</role>
</metric>
<tag>active</tag>
</task>
</tasks>
<events>
<!-- The event E1 triggers every hour during September 2016
with a random spread of one minute. -->
<event>
<name>E1</name>
<periodic>
<interval>3600000</interval>
<start>2016-09-01T00:00:00+00:00</start>
<end>2016-11-01T00:00:00+00:00</end>
</periodic>
<random-spread>60</random-spread> <!-- seconds -->
</event>
<!-- The event E2 triggers on Mondays at 4am UTC -->
<event>
<name>E2</name>
<calendar>
<month>*</month>
<day-of-week>monday</day-of-week>
<day-of-month>*</day-of-month>
<hour>4</hour>
<minute>0</minute>
<second>0</second>
<timezone-offset>+00:00</timezone-offset>
</calendar>
</event>
<!-- The event contoller-lost triggers when we lost
connectivity with the controller. -->
<event>
<name>controller-lost</name>
<controller-lost/>
</event>
<!-- The event contoller-connected triggers when we
(re)established connectivity with the controller. -->
<event>
<name>controller-connected</name>
<controller-connected/>
</event>
</events>
</lmap>
</config>
Appendix C. Example State
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<lmap-state xmlns="urn:ietf:params:xml:ns:yang:ietf-lmap-control">
<agent> <agent>
<agent-id>550e8400-e29b-41d4-a716-446655440000</agent-id> <agent-id>550e8400-e29b-41d4-a716-446655440000</agent-id>
<device-id>urn:dev:mac:0024befffe804ff1</device-id> <device-id>urn:dev:mac:0024befffe804ff1</device-id>
<group-id>network measurement at the north-pole</group-id> <hardware>Linux x86_64</hardware>
<report-agent-id>true</report-agent-id> <firmware>#1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24)</firmware>
<version>lmapd version 0.3</version>
<last-started>2016-10-31T21:26:06+01:00</last-started>
</agent> </agent>
<tasks> <tasks>
<!-- configuration of an iperf server task -->
<task> <task>
<name>iperf-server</name> <name>fping-update-targets</name>
<program>/usr/bin/iperf</program> <program>/usr/bin/fping-update-targets</program>
<option>
<id>server</id>
<name>-s</name>
</option>
<tag>passive</tag>
<tag>iperf</tag>
</task> </task>
<!-- configuration of an iperf client task -->
<task> <task>
<name>iperf-client</name> <name>fping</name>
<program>/usr/bin/iperf</program> <program>/usr/bin/fping</program>
<option>
<id>client</id>
<name>-c</name>
</option>
<tag>active</tag>
<tag>iperf</tag>
</task> </task>
<!-- configuration of a reporter task -->
<task> <task>
<name>lmap-reporting-task</name> <name>mtr</name>
<program>/usr/bin/lmap-reporter</program> <program>/usr/bin/mtr</program>
<option>
<id>collector-uri</id>
<value>https://example.com/restconf/operations/ietf-lmap-report:report</value>
</option>
</task> </task>
<task> <task>
<name>fcc-measurement-suite</name> <name>report</name>
<program>/usr/bin/fcc-suite</program> <program>/usr/bin/lmap-report</program>
</task> </task>
<task> <task>
<name>ippm-udp-latency-client</name> <name>ippm-udp-latency-client</name>
<program>/usr/bin/ippm-udp-latency</program> <program>/usr/bin/ippm-udp-latency</program>
<metric> <metric>
<uri>urn:example:what?</uri> <uri>urn:example:tbd</uri>
<role>client</role> <role>client</role>
</metric> </metric>
<tag>active</tag>
</task> </task>
</tasks> </tasks>
<schedules> <schedules>
<!-- execute the fcc measurement suite during (Sep 2016) -->
<schedule> <schedule>
<name>fcc-campain-2016</name> <name>S1</name>
<start>fcc-hourly-sep-2016</start> <state>enabled</state>
<duration>600</duration> <storage>0</storage>
<execution-mode>pipelined</execution-mode> <invocations>0</invocations>
<action> <suppressions>0</suppressions>
<name>fcc-measurement</name> <overlaps>0</overlaps>
<task>fcc-measurement-suite</task> <failures>0</failures>
</action>
<action>
<name>fcc-report</name>
<task>lmap-reporting-task</task>
<option>
<id>collector-uri</id>
<value>https://fcc.example.com/restconf/operations/ietf-lmap-report:report</value>
</option>
</action>
</schedule>
<!-- run two iperf measurements sequentially against mlab1 and
mlab2 and feed the results into our result reporting tasks -->
<schedule>
<name>iperf-hourly</name>
<start>hourly</start>
<execution-mode>sequential</execution-mode>
<action>
<name>iperf-hourly-mlab1</name>
<task>iperf-client</task>
<option>
<id>mlab1</id>
<value>mlab1.example.com</value>
</option>
</action>
<action> <action>
<name>iperf-hourly-mlab2</name> <name>A1</name>
<task>iperf-client</task> <state>enabled</state>
<option> <storage>0</storage>
<id>mlab2</id> <invocations>0</invocations>
<value>mlab2.example.com</value> <suppressions>0</suppressions>
</option> <overlaps>0</overlaps>
<destination>report-collector</destination> <failures>0</failures>
<destination>report-shadow-collector</destination>
</action> </action>
</schedule>
<!-- start an iperf server on startup -->
<schedule>
<name>startup</name>
<start>startup</start>
<action> <action>
<name>iperf-server</name> <name>A2</name>
<task>iperf-server</task> <state>enabled</state>
<storage>0</storage>
<invocations>0</invocations>
<suppressions>0</suppressions>
<overlaps>0</overlaps>
<failures>0</failures>
</action> </action>
</schedule> </schedule>
<!-- report results every six hours to our main collector -->
<schedule> <schedule>
<name>report-collector</name> <name>S2</name>
<start>once-every-six-hours</start> <state>enabled</state>
<storage>0</storage>
<invocations>0</invocations>
<suppressions>0</suppressions>
<overlaps>0</overlaps>
<failures>0</failures>
<action> <action>
<name>report-action</name> <name>A1</name>
<task>lmap-reporting-task</task> <state>enabled</state>
<option> <storage>0</storage>
<id>collector-uri</id> <invocations>0</invocations>
<value>https://collector.example.com/restconf/operations/ietf-lmap-report:report</value> <suppressions>0</suppressions>
</option> <overlaps>0</overlaps>
<failures>0</failures>
</action> </action>
</schedule>
<!-- report results once per day to our shadow collector -->
<schedule>
<name>report-shadow-collector</name>
<start>daily</start>
<action> <action>
<name>report-action</name> <name>A2</name>
<task>lmap-reporting-task</task> <state>enabled</state>
<option> <storage>0</storage>
<id>collector-uri</id> <invocations>0</invocations>
<value>https://shadow.example.com/restconf/operations/ietf-lmap-report:report</value> <suppressions>0</suppressions>
</option> <overlaps>0</overlaps>
<failures>0</failures>
</action> </action>
</schedule> </schedule>
<!-- IPPM udp latency measurement -->
<schedule> <schedule>
<name>ippm-udp-latency</name> <name>S3</name>
<start>hourly</start> <state>enabled</state>
<execution-mode>sequential</execution-mode> <storage>0</storage>
<action> <invocations>0</invocations>
<name>ippm-udp-latency</name> <suppressions>0</suppressions>
<task>ippm-udp-latency-client</task> <overlaps>0</overlaps>
<parameters xmlns:udp="urn:example:ietf-ippm-udp-latency"> <failures>0</failures>
<udp:src-ip>2001:db8::1</udp:src-ip>
<udp:src-port>54321</udp:src-port>
<udp:dst-ip>2001:db8::2</udp:dst-ip>
<udp:dst-port>12345</udp:dst-port>
<udp:poisson-lambda>42</udp:poisson-lambda>
</parameters>
</action>
<action> <action>
<name>ippm-udp-latency-report</name> <name>A1</name>
<task>lmap-reporting-task</task> <state>enabled</state>
<option> <storage>0</storage>
<id>collector-uri</id> <invocations>0</invocations>
<value>https://ippm.example.com/restconf/operations/ietf-lmap-report:report</value> <suppressions>0</suppressions>
</option> <overlaps>0</overlaps>
<failures>0</failures>
</action> </action>
</schedule> </schedule>
</schedules> </schedules>
<suppressions> <suppressions>
<!-- stop all measurements if we got orphaned -->
<suppression> <suppression>
<name>orphaned</name> <name>orphaned</name>
<start>controller-lost</start> <state>enabled</state>
<end>controller-connected</end>
<match>*</match>
</suppression>
<!-- stop all active measurements during new year's evening -->
<suppression>
<name>new-year-evening</name>
<start>dec-31-11:00</start>
<end>jan-01-15:00</end>
<match>active</match>
</suppression> </suppression>
</suppressions> </suppressions>
<events>
<event>
<name>fcc-hourly-sep-2016</name>
<periodic>
<interval>3600000</interval>
<start>2016-09-01T00:00:00+00:00</start>
<end>2016-10-01T00:00:00+00:00</end>
</periodic>
<random-spread>300000</random-spread> <!-- ms -->
</event>
<event>
<name>monthly</name>
<calendar>
<month>*</month>
<day-of-week>*</day-of-week>
<day-of-month>1</day-of-month>
<hour>0</hour>
<minute>0</minute>
<second>0</second>
<timezone-offset>+00:00</timezone-offset>
</calendar>
</event>
<event>
<name>weekly</name>
<calendar>
<month>*</month>
<day-of-week>monday</day-of-week>
<day-of-month>*</day-of-month>
<hour>0</hour>
<minute>0</minute>
<second>0</second>
<timezone-offset>+00:00</timezone-offset>
</calendar>
</event>
<event>
<name>daily</name>
<calendar>
<month>*</month>
<day-of-week>*</day-of-week>
<day-of-month>*</day-of-month>
<hour>0</hour>
<minute>0</minute>
<second>0</second>
<timezone-offset>+00:00</timezone-offset>
</calendar>
</event>
<event>
<name>hourly</name>
<calendar>
<month>*</month>
<day-of-month>*</day-of-month>
<day-of-week>*</day-of-week>
<hour>*</hour>
<minute>0</minute>
<second>0</second>
<timezone-offset>+00:00</timezone-offset>
</calendar>
</event>
<event>
<name>once-every-six-hours</name>
<calendar>
<month>*</month>
<day-of-month>*</day-of-month>
<day-of-week>*</day-of-week>
<hour>0</hour>
<hour>6</hour>
<hour>12</hour>
<hour>18</hour>
<minute>0</minute>
<second>0</second>
</calendar>
<random-spread>3600000</random-spread>
</event>
<event>
<name>dec-31-11:00</name>
<calendar>
<month>december</month>
<day-of-month>31</day-of-month>
<day-of-week>*</day-of-week>
<hour>11</hour>
<minute>00</minute>
<second>00</second>
</calendar>
</event>
<event>
<name>jan-01-15:00</name>
<calendar>
<month>january</month>
<day-of-month>1</day-of-month>
<day-of-week>*</day-of-week>
<hour>15</hour>
<minute>00</minute>
<second>00</second>
</calendar>
</event>
<event>
<name>startup</name>
<startup/>
<!-- avoid synchronization issues -->
<random-spread>12345</random-spread>
</event>
<event>
<name>controller-lost</name>
<controller-lost/>
</event>
<event>
<name>controller-connected</name>
<controller-connected/>
<!-- avoid synchronization issues -->
<random-spread>12345</random-spread>
</event>
</events>
</lmap>
</config>
Appendix I. Example Configuration (JSON)
{
"ietf-lmap-control:lmap": {
"agent": {
"agent-id": "550e8400-e29b-41d4-a716-446655440000",
"device-id": "urn:dev:mac:0024befffe804ff1",
"group-id": "network measurement at the north-pole",
"report-agent-id": true
},
"tasks": {
"task": [
{
"name": "iperf-server",
"program": "/usr/bin/iperf",
"option": [
{
"id": "server",
"name": "-s"
}
],
"tag": [
"passive",
"iperf"
]
},
{
"name": "iperf-client",
"program": "/usr/bin/iperf",
"option": [
{
"id": "client",
"name": "-c"
}
],
"tag": [
"active",
"iperf"
]
},
{
"name": "lmap-reporting-task",
"program": "/usr/bin/lmap-reporter",
"option": [
{
"id": "collector-uri",
"value": "https://example.com/restconf/operations/ietf-lmap-report:report"
}
]
},
{
"name": "fcc-measurement-suite",
"program": "/usr/bin/fcc-suite"
},
{
"name": "ippm-udp-latency-client",
"program": "/usr/bin/ippm-udp-latency",
"metric": [
{
"uri": "urn:example:what?",
"role": [
"client"
]
}
],
"tag": [
"active"
]
}
]
},
"schedules": {
"schedule": [
{
"name": "fcc-campain-2016",
"start": "fcc-hourly-sep-2016",
"duration": 600,
"execution-mode": "pipelined",
"action": [
{
"name": "fcc-measurement",
"task": "fcc-measurement-suite"
},
{
"name": "fcc-report",
"task": "lmap-reporting-task",
"option": [
{
"id": "collector-uri",
"value": "https://fcc.example.com/restconf/operations/ietf-lmap-report:report"
}
]
}
]
},
{
"name": "iperf-hourly",
"start": "hourly",
"execution-mode": "sequential",
"action": [
{
"name": "iperf-hourly-mlab1",
"task": "iperf-client",
"option": [
{
"id": "mlab1",
"value": "mlab1.example.com"
}
]
},
{
"name": "iperf-hourly-mlab2",
"task": "iperf-client",
"option": [
{
"id": "mlab2",
"value": "mlab2.example.com"
}
],
"destination": [
"report-collector",
"report-shadow-collector"
]
}
]
},
{
"name": "startup",
"start": "startup",
"action": [
{
"name": "iperf-server",
"task": "iperf-server"
}
]
},
{
"name": "report-collector",
"start": "once-every-six-hours",
"action": [
{
"name": "report-action",
"task": "lmap-reporting-task",
"option": [
{
"id": "collector-uri",
"value": "https://collector.example.com/restconf/operations/ietf-lmap-report:report"
}
]
}
]
},
{
"name": "report-shadow-collector",
"start": "daily",
"action": [
{
"name": "report-action",
"task": "lmap-reporting-task",
"option": [
{
"id": "collector-uri",
"value": "https://shadow.example.com/restconf/operations/ietf-lmap-report:report"
}
]
}
]
},
{
"name": "ippm-udp-latency",
"start": "hourly",
"execution-mode": "sequential",
"action": [
{
"name": "ippm-udp-latency",
"task": "ippm-udp-latency-client",
"parameters": {
"src-ip": "2001:db8::1",
"src-port": 54321,
"dst-ip": "2001:db8::2",
"dst-port": 12345,
"poisson-lambda": "42"
}
},
{
"name": "ippm-udp-latency-report",
"task": "lmap-reporting-task",
"option": [
{
"id": "collector-uri",
"value": "https://ippm.example.com/restconf/operations/ietf-lmap-report:report"
}
]
}
]
}
]
},
"suppressions": {
"suppression": [
{
"name": "orphaned",
"start": "controller-lost",
"end": "controller-connected",
"match": [
"*"
]
},
{
"name": "new-year-evening",
"start": "dec-31-11:00",
"end": "jan-01-15:00",
"match": [
"active"
]
}
]
},
"events": {
"event": [
{
"name": "fcc-hourly-sep-2016",
"periodic": {
"interval": 3600000,
"start": "2016-09-01T00:00:00+00:00",
"end": "2016-10-01T00:00:00+00:00"
},
"random-spread": 300000
},
{
"name": "monthly",
"calendar": {
"month": [
"*"
],
"day-of-week": [
"*"
],
"day-of-month": [
1
],
"hour": [
0
],
"minute": [
0
],
"second": [
0
],
"timezone-offset": "+00:00"
}
},
{
"name": "weekly",
"calendar": {
"month": [
"*"
],
"day-of-week": [
"monday"
],
"day-of-month": [
"*"
],
"hour": [
0
],
"minute": [
0
],
"second": [
0
],
"timezone-offset": "+00:00"
}
},
{
"name": "daily",
"calendar": {
"month": [
"*"
],
"day-of-week": [
"*"
],
"day-of-month": [
"*"
],
"hour": [
0
],
"minute": [
0
],
"second": [
0
],
"timezone-offset": "+00:00"
}
},
{
"name": "hourly",
"calendar": {
"month": [
"*"
],
"day-of-month": [
"*"
],
"day-of-week": [
"*"
],
"hour": [
"*"
],
"minute": [
0
],
"second": [
0
],
"timezone-offset": "+00:00"
}
},
{
"name": "once-every-six-hours",
"calendar": {
"month": [
"*"
],
"day-of-month": [
"*"
],
"day-of-week": [
"*"
],
"hour": [
0,
6,
12,
18
],
"minute": [
0
],
"second": [
0
]
},
"random-spread": 3600000
},
{
"name": "dec-31-11:00",
"calendar": {
"month": [
"december"
],
"day-of-month": [
31
],
"day-of-week": [
"*"
],
"hour": [
11
],
"minute": [
00
],
"second": [
00
]
}
},
{
"name": "jan-01-15:00",
"calendar": {
"month": [
"january"
],
"day-of-month": [
1
],
"day-of-week": [
"*"
],
"hour": [
15
],
"minute": [
00
],
"second": [
00
]
}
},
{
"name": "startup",
"startup": [null],
"random-spread": 12345
},
{
"name": "controller-lost",
"controller-lost": [null]
},
{
"name": "controller-connected",
"controller-connected": [null],
"random-spread": 12345
}
]
}
}
}
Appendix J. Example State (XML)
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<lmap-state xmlns="urn:ietf:params:xml:ns:yang:ietf-lmap-control">
<agent>
<agent-id>550e8400-e29b-41d4-a716-446655440000</agent-id>
<device-id>urn:dev:mac:0024befffe804ff1</device-id>
<hardware>ACME home router</hardware>
<firmware>OpenWrt version 10.03.1</firmware>
<version>Measurement Agent Daemon (MAD) 4.2</version>
<last-started>2015-04-10T17:24:42+02:00</last-started>
</agent>
<tasks>
<task>
<name>udp-latency-measurement</name>
<metric>
<uri>urn:....</uri>
<role>source</role>
<role>target</role>
</metric>
</task>
<task>
<name>icmp-latency-measurement</name>
<metric>
<uri>urn:....</uri>
</metric>
</task>
<task>
<name>iperf</name>
<program>iperf</program>
</task>
<task>
<name>lmap-reporting-task</name>
<program>lmap-reportd</program>
</task>
</tasks>
<schedules>
<schedule>
<name>hourly-schedule</name>
<state>enabled</state>
<last-invocation>2015-01-23T12:00:00+01:00</last-invocation>
<action>
<name>icmp-latency-hourly</name>
<state>enabled</state>
<last-invocation>2015-01-23T12:00:00+01:00</last-invocation>
<last-completion>2015-01-23T12:00:01+01:00</last-completion>
<last-status>0</last-status>
<last-message>OK</last-message>
<last-failed-completion>2015-01-23T03:00:00+01:00</last-failed-completion>
<last-failed-status>42</last-failed-status>
<last-failed-message>connection timed out</last-failed-message>
</action>
<action>
<name>udp-latency-weekdays-hourly</name>
<last-invocation>2015-01-23T12:00:01+01:00</last-invocation>
<last-completion>2015-01-23T12:00:02+01:00</last-completion>
<last-status>0</last-status>
<last-message>OK</last-message>
<last-failed-completion>2015-01-23T03:00:00+01:00</last-failed-completion>
<last-failed-status>42</last-failed-status>
<last-failed-message>connection timed out</last-failed-message>
</action>
</schedule>
</schedules>
</lmap-state> </lmap-state>
</data> </data>
Appendix K. Example State (JSON) Appendix D. Example Report
{
"ietf-lmap-control:lmap-state": {
"agent": {
"agent-id": "550e8400-e29b-41d4-a716-446655440000",
"device-id": "urn:dev:mac:0024befffe804ff1",
"hardware": "ACME home router",
"firmware": "OpenWrt version 10.03.1",
"version": "Measurement Agent Daemon (MAD) 4.2",
"last-started": "2015-04-10T17:24:42+02:00"
},
"tasks": {
"task": [
{
"name": "udp-latency-measurement",
"metric": [
{
"uri": "urn:....",
"role": [
"source",
"target"
]
}
]
},
{
"name": "icmp-latency-measurement",
"metric": [
{
"uri": "urn:...."
}
]
},
{
"name": "iperf",
"program": "iperf"
},
{
"name": "lmap-reporting-task",
"program": "lmap-reportd"
}
]
},
"schedules": {
"schedule": [
{
"name": "hourly-schedule",
"state": "enabled",
"last-invocation": "2015-01-23T12:00:00+01:00",
"action": [
{
"name": "icmp-latency-hourly",
"state": "enabled",
"last-invocation": "2015-01-23T12:00:00+01:00",
"last-completion": "2015-01-23T12:00:01+01:00",
"last-status": 0,
"last-message": "OK",
"last-failed-completion": "2015-01-23T03:00:00+01:00",
"last-failed-status": 42,
"last-failed-message": "connection timed out"
},
{
"name": "udp-latency-weekdays-hourly",
"last-invocation": "2015-01-23T12:00:01+01:00",
"last-completion": "2015-01-23T12:00:02+01:00",
"last-status": 0,
"last-message": "OK",
"last-failed-completion": "2015-01-23T03:00:00+01:00",
"last-failed-status": 42,
"last-failed-message": "connection timed out"
}
]
}
]
}
}
}
Appendix L. Example Report (XML)
<?xml version="1.0" encoding="utf-8"?>
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" <rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
message-id="1"> message-id="1">
<report xmlns="urn:ietf:params:xml:ns:yang:ietf-lmap-report"> <report xmlns="urn:ietf:params:xml:ns:yang:ietf-lmap-report">
<date>2015-10-28T13:27:42+02:00</date> <date>2015-10-28T13:27:42+02:00</date>
<agent-id>550e8400-e29b-41d4-a716-446655440000</agent-id> <agent-id>550e8400-e29b-41d4-a716-446655440000</agent-id>
<group-id>wireless measurement at the north-pole</group-id>
<result> <result>
<schedule-name>pinger</schedule-name> <schedule-name>S1</schedule-name>
<action-name>fping</action-name> <action-name>A1</action-name>
<task-name>fping</task-name> <task-name>update-ping-targets</task-name>
<option> <start>2016-03-21T10:48:55+01:00</start>
<id>display-address</id> <end>2016-03-21T10:48:57+01:00</end>
<name>-A</name> <status>0</status>
</option> </result>
<option> <result>
<id>display-DNS-lookup</id> <schedule-name>S1</schedule-name>
<name>-d</name> <action-name>A2</action-name>
</option> <task-name>ping-all-targets</task-name>
<start>2016-03-21T10:48:55+01:00</start>
<end>2016-03-21T10:48:57+01:00</end>
<status>0</status>
<table>
<column>target</column>
<column>rtt</column>
<row>
<value>2001:db8::1</value>
<value>42</value>
</row>
<row>
<value>2001:db8::2</value>
<value>24</value>
</row>
</table>
</result>
<result>
<schedule-name>S2</schedule-name>
<action-name>A1</action-name>
<task-name>traceroute</task-name>
<option> <option>
<id>number-of-packets</id> <id>target</id>
<name>-C</name> <name>target</name>
<value>5</value> <value>2001:db8::1</value>
</option> </option>
<option> <option>
<id>quiet</id> <id>csv</id>
<name>-q</name> <name>--csv</name>
</option> </option>
<start>2016-03-21T10:48:55+01:00</start>
<end>2016-03-21T10:48:57+01:00</end>
<status>1</status>
<table>
<column>hop</column>
<column>ip</column>
<column>rtt</column>
<row>
<value>1</value>
<value>2001:638:709:5::1</value>
<value>10.5</value>
</row>
<row>
<value>2</value>
<value>?</value>
<value></value>
</row>
</table>
</result>
<result>
<schedule-name>S2</schedule-name>
<action-name>A2</action-name>
<task-name>traceroute</task-name>
<option> <option>
<id>www.example.org</id> <id>target</id>
<name>www.example.org</name> <name>target</name>
<value>2001:db8::2</value>
</option> </option>
<option> <option>
<id>mail.example.com</id> <id>csv</id>
<name>mail.example.com</name> <name>--csv</name>
</option> </option>
<start>2016-03-21T10:48:55+01:00</start> <start>2016-03-21T10:48:55+01:00</start>
<end>2016-03-21T10:48:57+01:00</end> <end>2016-03-21T10:48:57+01:00</end>
<status>0</status> <status>1</status>
<table> <table>
<column>target</column> <column>hop</column>
<column>ip</column> <column>ip</column>
<column>rtt-1</column> <column>rtt</column>
<column>rtt-2</column>
<column>rtt-3</column>
<column>rtt-4</column>
<column>rtt-5</column>
<row> <row>
<value>www.example.org</value> <value>1</value>
<value>2001:db8::1</value> <value>2001:638:709:5::1</value>
<value>14.15</value> <value>11.8</value>
<value>14.14</value>
<value>14.09</value>
<value>14.17</value>
<value>14.51</value>
</row> </row>
<row> <row>
<value>mail.example.org</value> <value>2</value>
<value>2001:db8::2</value> <value>?</value>
<value>12.24</value> <value></value>
<value>11.99</value>
<value>12.49</value>
<value>11.87</value>
<value>12.45</value>
</row> </row>
</table> </table>
</result> </result>
</report> </report>
</rpc> </rpc>
Appendix M. Example Report (JSON) Appendix E. Open Issues
{ Note to the RFC Editor: this section should be removed on publication
"report": { as an RFC.
"date": "2015-10-28T13:27:42+02:00",
"agent-id": "550e8400-e29b-41d4-a716-446655440000", E.1. Martin's Review Comments
"group-id": "wireless measurement at the north-pole",
"result": [ o Why is the device-id configurable? Should the device not report
{ its own id without explicitely configuring it? Note, this would
"schedule-name": "pinger", also be a change of the information model.
"action-name": "fping",
"task-name": "fping", o Some objects in the information model (e.g., agent-id) are marked
"option": [ optional because of sensitivity considerations. Since there is an
{ access control model, it would feel more natural to make these
"id": "display-address", objects mandatory in YANG and leave it to the access control model
"name": "-A" to prevent access to them in deployments where this is needed.
},
{ o /lmap-state/agent/{hardware,firmware,device-id} overlap with
"id": "display-DNS-lookup", /system-state/platform/{machine,os-release/os-version} and the
"name": "-d" upcoming entity (aka hardware) model provide a URI for hardware
}, components. Shall we remove the {hardware,firmware,device-id}
{ objects and instead add text to section 3 pointing to the places
"id": "number-of-packets", where these objects can be found?
"name": "-C",
"value": "5" Appendix F. Change History
},
{ Note to the RFC Editor: this section should be removed on publication
"id": "quiet", as an RFC.
"name": "-q"
}, F.1. Non-editorial Changes since -05
{
"id": "www.example.org", o Update the example in an attempt to aligned it with the example in
"name": "www.example.org" the information model.
},
{ o Added an extension hook to reports so that task-specific
"id": "mail.example.com", parameters can be echoed back to the collector. Updated the
"name": "mail.example.com" example extension module accordingly.
}
], o Added text and Figure 1 to describe the function and purpose of
"start": "2016-03-21T10:48:55+01:00", the three YANG modules.
"end": "2016-03-21T10:48:57+01:00",
"status": 0, o Added a cycle-number type definition.
"table": [
{ o Added the optional cycle-interval to event definitions.
"column": [
"target", o Added tags that report additional capabilities of the measurement
"ip", agent.
"rtt-1",
"rtt-2", o Added event time and cycle-number to the result report.
"rtt-3",
"rtt-4", o Renamed the metrics-grouping to registry-grouping.
"rtt-5"
], o Removed JSON encoding of the examples (they will go into the
"row": [ RESTCONF document).
{
"value": [ F.2. Non-editorial Changes since -04
"www.example.org",
"2001:db8::1", o Tagged /lmap/tasks/task/program with nacm:default-deny-write.
"14.15",
"14.14", o Added /lmap-state/schedules/schedule/storage and /lmap-state/
"14.09", schedules/schedule/action/storage.
"14.17",
"14.51" o Removed suppress-by-default.
]
}, o Moved the metric list from /report/result into /report/result/
{ table.
"value": [
"mail.example.org", o Conflicts are now reported as a triple (schedule, action, task).
"2001:db8::2",
"12.24", o Replaced IPv4 address in the examples with IPv6 addresses.
"11.99",
"12.49", o Added result/status.
"11.87",
"12.45" F.3. Non-editorial Changes since -03
]
} o Reworked the reporting data model to align it with the changes in
] the information model.
}
] F.4. Non-editorial Changes since -02
}
] o Added a mechanism to enforce a runtime limit for schedules.
}
} o Added security considerations text warning about possible shell
expansions of options.
o Restricted all user-defined names and tags to lmap:identifier.
Added security considerations text to make implementors aware of
possible security issues if identifiers are naively mapped to say
filesystem paths.
o Schedules and actions now have tags (echoed to the collector) and
suppression tags (used for suppression selection).
o Introduced glob-style pattern to match tags.
o Added an example module for IPPM udp latency metrics to
demonstrate the usage of the extension mechanism.
o Introduced parameters, an extension point for task/metric specific
parameters defined in augmenting YANG modules.
o Introduced the typedefs event-ref, task-ref, and schedule-ref.
o Changed schedule/event to schedule/start and added the optional
schedule/stop and schedule/duration leafs.
F.5. Non-editorial Changes since -01
o Updated and split examples (config vs state vs report).
o Refactored the definitions so that common definitions used by both
the control and report data models are in the new module ietf-
lmap-common.
o A report is submitted via an RPC operation instead of using a
notification.
o The default execution mode is pipelined.
o Clarified which action consumes data in sequential, pipelines, and
parallel execution mode.
o Added /lmap/agent/measurement-point, /lmap/agent/report-
measurement-point, and /report/measurement-point to configure and
report the measurement point.
o Turned /lmap/suppression into a list /lmap/suppressions/
suppression that uses a start and stop event to define the
beginning and end of a suppression period.
o Added controller-lost an controller-ok event choices to /lmap/
events/event.
o Added a metrics-grouping to identify entries in a metric registry
and associated roles.
o Added /lmap-state/schedules to report the status of schedules and
their actions. Refactored /lmap-state/tasks to only report the
task capabilities.
F.6. Non-editorial Changes since -00
o A task can now reference multiply registry entries.
o Schedules are triggered by Events instead of Timings; Timings are
just one of many possible event sources.
o Actions feed into other Schedules (instead of Actions within other
Schedules).
o Removed the notion of multiple task outputs.
o Support for sequential, parallel, and pipelined execution of
Actions.
Authors' Addresses Authors' Addresses
Juergen Schoenwaelder Juergen Schoenwaelder
Jacobs University Bremen Jacobs University Bremen
Email: j.schoenwaelder@jacobs-university.de Email: j.schoenwaelder@jacobs-university.de
Vaibhav Bajpai Vaibhav Bajpai
Jacobs University Bremen Jacobs University Bremen
 End of changes. 221 change blocks. 
2067 lines changed or deleted 1614 lines changed or added

This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/