draft-ietf-lmap-yang-00.txt   draft-ietf-lmap-yang-01.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: October 12, 2015 April 10, 2015 Expires: January 4, 2016 July 3, 2015
A YANG Data Model for LMAP Measurement Agents A YANG Data Model for LMAP Measurement Agents
draft-ietf-lmap-yang-00.txt draft-ietf-lmap-yang-01.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 October 12, 2015. This Internet-Draft will expire on January 4, 2016.
Copyright Notice Copyright Notice
Copyright (c) 2015 IETF Trust and the persons identified as the Copyright (c) 2015 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 13 skipping to change at page 2, line 13
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 . . . . . . . . . . . . . . . . . . . . . . 2 1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 2
2. Data Model Overview . . . . . . . . . . . . . . . . . . . . . 3 2. Data Model Overview . . . . . . . . . . . . . . . . . . . . . 3
3. Relationship to the Information Model . . . . . . . . . . . . 6 3. Relationship to the Information Model . . . . . . . . . . . . 6
4. YANG Modules . . . . . . . . . . . . . . . . . . . . . . . . 7 4. YANG Modules . . . . . . . . . . . . . . . . . . . . . . . . 7
5. Security Considerations . . . . . . . . . . . . . . . . . . . 29 5. Security Considerations . . . . . . . . . . . . . . . . . . . 28
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 29 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 28
7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 30 7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 29
8. References . . . . . . . . . . . . . . . . . . . . . . . . . 30 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 29
8.1. Normative References . . . . . . . . . . . . . . . . . . 30 8.1. Normative References . . . . . . . . . . . . . . . . . . 29
8.2. Informative References . . . . . . . . . . . . . . . . . 30 8.2. Informative References . . . . . . . . . . . . . . . . . 29
Appendix A. Example Configuration (XML) . . . . . . . . . . . . 31 Appendix A. Open Issues . . . . . . . . . . . . . . . . . . . . 30
Appendix B. Example Configuration (JSON) . . . . . . . . . . . . 35 Appendix B. Non-editorial Changes since -06 . . . . . . . . . . 30
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 40 Appendix C. Example Configuration (XML) . . . . . . . . . . . . 30
Appendix D. Example Configuration (JSON) . . . . . . . . . . . . 34
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 38
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) [I-D.ietf-lmap-framework]. The data model is Platforms (LMAP) [I-D.ietf-lmap-framework]. The data model is
defined using the YANG [RFC6020] data modeling language. It aims to defined using the YANG [RFC6020] data modeling language. It aims to
be consistent with the LMAP Information Model be consistent with the LMAP Information Model
[I-D.ietf-lmap-information-model]. [I-D.ietf-lmap-information-model].
1.1. Terminology 1.1. Terminology
skipping to change at page 3, line 16 skipping to change at page 3, line 19
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 tree diagram below shows the structure of the configuration The tree diagram below shows the structure of the configuration
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 credentials? string | +--rw group-id? string
| +--rw group-id? string | +--rw report-agent-id? boolean
| +--rw report-agent-id? boolean | +--rw controller-timeout? uint32
| +--rw controller-lost-timeout? uint32 +--rw schedules
+--rw schedules | +--rw schedule* [name]
| +--rw schedule* [name] | +--rw name string
| +--rw name string | +--rw event -> /lmap/events/event/name
| +--rw action* [name] | +--rw action* [name]
| | +--rw name string | | +--rw name string
| | +--rw task -> /lmap/tasks/task/name | | +--rw task -> /lmap/tasks/task/name
| | +--rw option* [name] | | +--rw option* [name]
| | | +--rw name string | | | +--rw name string
| | | +--rw value? string | | | +--rw value? string
| | +--rw destination* [name] | | +--rw destination* -> /lmap/schedules/schedule/name
| | +--rw name string | +--rw execution-mode enumeration
| | +--rw output* uint16 +--rw suppression
| | +--rw schedule -> /lmap/schedules/schedule/name | +--rw enabled? boolean
| | +--rw action -> /lmap/schedules/schedule[name = current()/../schedule]/action/name | +--rw stop-running? boolean
| +--rw timing -> /lmap/timings/timing/name | +--rw start? yang:date-and-time
+--rw suppression | +--rw end? yang:date-and-time
| +--rw enabled? boolean | +--rw task* -> /lmap/tasks/task/name
| +--rw stop-running? boolean | +--rw schedule* -> /lmap/schedules/schedule/name
| +--rw start? yang:date-and-time +--rw tasks
| +--rw end? yang:date-and-time | +--rw task* [name]
| +--rw task* -> /lmap/tasks/task/name | +--rw name string
| +--rw schedule* -> /lmap/schedules/schedule/name | +--rw (task-identification)
+--rw channels | | +--:(registry)
| +--rw channel* [name] | | | +--rw registry* inet:uri
| +--rw name string | | +--:(program)
| +--rw target? inet:uri | | +--rw program? string
| +--rw credentials? string | +--rw option* [name]
| +--rw interface? -> /if:interfaces/interface/name | | +--rw name string
+--rw tasks | | +--rw value? string
| +--rw task* [name] | +--rw tag* string
| +--rw name string | +--rw suppress-by-default? boolean
| +--rw (task-identification) +--rw events
| | +--:(registry) +--rw event* [name]
| | | +--rw registry? inet:uri +--rw name string
| | +--:(program) +--rw (event-type)?
| | +--rw program? string | +--:(periodic)
| +--rw option* [name] | | +--rw periodic
| | +--rw name string | | +--rw interval uint32
| | +--rw value? string | | +--rw start? yang:date-and-time
| +--rw tag* string | | +--rw end? yang:date-and-time
| +--rw suppress-by-default? boolean | +--:(calendar)
+--rw timings | | +--rw calendar
+--rw timing* [name] | | +--rw month* union
+--rw name string | | +--rw weekday* union
+--rw (timing-type)? | | +--rw day-of-month* union
| +--:(periodic) | | +--rw hour* union
| | +--rw periodic | | +--rw minute* union
| | +--rw interval uint32 | | +--rw second* union
| | +--rw start? yang:date-and-time | | +--rw timezone-offset? timezone-offset
| | +--rw end? yang:date-and-time | | +--rw start? yang:date-and-time
| +--:(calendar) | | +--rw end? yang:date-and-time
| | +--rw calendar | +--:(one-off)
| | +--rw month* union | | +--rw one-off-time yang:date-and-time
| | +--rw weekday* union | +--:(immediate)
| | +--rw day-of-month* union | | +--rw immediate empty
| | +--rw hour* union | +--:(startup)
| | +--rw minute* union | +--rw startup empty
| | +--rw second* union +--rw random-spread? int32
| | +--rw timezone-offset? timezone-offset
| | +--rw start? yang:date-and-time
| | +--rw end? yang:date-and-time
| +--:(one-off)
| | +--rw one-off-time yang:date-and-time
| +--:(immediate)
| | +--rw immediate empty
| +--:(startup)
| +--rw startup empty
+--rw random-spread? int32
The tree diagram below shows the structure of the state model. The tree diagram below shows the structure of the state 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 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 string +--ro name string
+--ro (task-identification) +--ro (task-identification)
| +--:(registry) | +--:(registry)
| | +--ro registry? inet:uri | | +--ro registry* inet:uri
| +--:(program) | +--:(program)
| +--ro program? string | +--ro program? string
+--ro last-completion? yang:date-and-time +--ro last-completion? yang:date-and-time
+--ro last-status? status-code +--ro last-status? status-code
+--ro last-message? string +--ro last-message? string
+--ro last-failed-completion? yang:date-and-time +--ro last-failed-completion? yang:date-and-time
+--ro last-failed-status? status-code +--ro last-failed-status? status-code
+--ro last-failed-message? string +--ro last-failed-message? string
The tree diagram below shows the structure of the notification The tree diagram below shows the structure of the notification
skipping to change at page 6, line 41 skipping to change at page 6, line 41
3. Relationship to the Information Model 3. Relationship to the Information Model
The LMAP information model [I-D.ietf-lmap-information-model] is The LMAP information model [I-D.ietf-lmap-information-model] is
devided into six sections. They are mapped into the YANG data model devided into six sections. They are mapped into the YANG data model
as explained below: as explained below:
o Pre-Configuration Information: This is not modeled explicitly o Pre-Configuration Information: This is not modeled explicitly
since it is a subset of the configuration information. since it is a subset of the configuration information.
o Configuration Information: This is modeled in the /lmap/agent o Configuration Information: This is modeled in the /lmap/agent
subtree and the /lmap/schedules, /lmap/tasks, and /lmap/channels subtree and the /lmap/schedules and /lmap/tasks subtrees described
subtrees described below. Some items have been left out because below. Some items have been left out because they are expected to
they are expected to be dealt with by the underlying protocol. be dealt with by the underlying protocol.
o Instruction Information: This is modeled in the /lmap/suppression o Instruction Information: This is modeled in the /lmap/suppression
subtree and the /lmap/schedules, /lmap/tasks, and /lmap/channels subtree and the /lmap/schedules and /lmap/tasks subtrees described
subtrees described below. below.
o Logging Information: Some of the logging information, in o Logging Information: Some of the logging information, in
particular 'success/failure/warning messages in response to particular 'success/failure/warning messages in response to
information updates from the Controller', will be handled by the information updates from the Controller', will be handled by the
protocol used to manipulate the lmap specific configuration. protocol used to manipulate the lmap specific configuration.
[[CREF1: It needs to be discussed whether we can rely on informal [[CREF1: It needs to be discussed whether we can rely on informal
syslog messages that can be accessed via protocols such RFC 5277 syslog messages that can be accessed via protocols such RFC 5277
or whether we want to define specific notifications in the YANG or whether we want to define specific notifications in the YANG
data model. --JS]] data model. --JS]]
skipping to change at page 7, line 24 skipping to change at page 7, line 24
/lmap-state/tasks subtree including information about the last /lmap-state/tasks subtree including information about the last
execution and the last failed execution. execution and the last failed execution.
o Reporting Information: This is modeled by the report notification. o Reporting Information: This is modeled by the report notification.
These six sections are build on the following common information These six sections are build on the following common information
objects: objects:
o Schedules: This is modeled in the /lmap/schedules subtree. o Schedules: This is modeled in the /lmap/schedules subtree.
o Channels: This is modeled in the /lmap/channels subtree. o Channels: Channels are not modeled since the NETCONF and RESTCONF
server configuration data model [I-D.ietf-netconf-server-model]
already provides a mechanism to configure NETCONF and RESTCONF
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 Timing Information: This is modeled in the /lmap/timings subtree. o Event Information: This is modeled in the /lmap/events subtree.
4. YANG Modules 4. YANG Modules
The modules import definitions from [RFC6991] and [RFC7223]. The modules import definitions from [RFC6991] and [RFC7223].
<CODE BEGINS> file "ietf-lmap-control@2015-04-10.yang" <CODE BEGINS> file "ietf-lmap-control@2015-07-03.yang"
module ietf-lmap-control { module ietf-lmap-control {
namespace "urn:ietf:params:xml:ns:yang:ietf-lmap-control"; namespace "urn:ietf:params:xml:ns:yang:ietf-lmap-control";
prefix "lmapc"; prefix "lmapc";
import ietf-yang-types { import ietf-yang-types {
prefix yang; prefix yang;
} }
import ietf-inet-types { import ietf-inet-types {
prefix inet; prefix inet;
} }
import ietf-interfaces {
prefix if;
}
organization organization
"IETF Large-Scale Measurement Platforms Working Group"; "IETF Large-Scale Measurement Platforms Working Group";
contact contact
"WG Web: <http://tools.ietf.org/wg/lmap/> "WG Web: <http://tools.ietf.org/wg/lmap/>
WG List: <mailto:lmap@ietf.org> WG List: <mailto:lmap@ietf.org>
Editor: Juergen Schoenwaelder Editor: Juergen Schoenwaelder
<j.schoenwaelder@jacobs-university.de> <j.schoenwaelder@jacobs-university.de>
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 controlling measurement "This module defines a data model for controlling measurement
agents that are part of a Large-Scale Measurement Platform agents that are part of a Large-Scale Measurement Platform
(LMAP)."; (LMAP).";
revision "2015-04-10" { revision "2015-07-03" {
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
*/ */
skipping to change at page 10, line 39 skipping to change at page 10, line 39
type string { pattern '\*'; } type string { pattern '\*'; }
description description
"A wildcard for calendar scheduling entries."; "A wildcard for calendar scheduling entries.";
} }
typedef status-code { typedef status-code {
type int32; type int32;
description description
"A status code returned by the execution of a task. Note that "A status code returned by the execution of a task. Note that
the actual range is implementation dependent but it should the actual range is implementation dependent but it should
be portable to use values in the range 0..127. By convention, be portable to use values in the range 0..127 for regular
0 indicates successful termination."; exit codes. By convention, 0 indicates successful termination.
Negative values may be used to indicate abnormal termination
due to a signal; the absolute value may identify the signal
number in this case.";
} }
typedef timezone-offset { typedef timezone-offset {
type string { type string {
pattern 'Z|[\+\-]\d{2}:\d{2}'; pattern 'Z|[\+\-]\d{2}:\d{2}';
} }
description description
"A timezone-offset as it is use in the yang:date-and-time "A timezone-offset as it is use in the yang:date-and-time
type. The value Z is equivalent to +00:00. The value -00:00 type. The value Z is equivalent to +00:00. The value -00:00
indicates and unknown time-offset."; indicates and unknown time-offset.";
skipping to change at page 12, line 40 skipping to change at page 12, line 44
type string; type string;
description description
"The unique name of a task."; "The unique name of a task.";
} }
choice task-identification { choice task-identification {
mandatory true; mandatory true;
description description
"Information that identifies the task."; "Information that identifies the task.";
leaf registry { leaf-list registry {
type inet:uri; type inet:uri;
description description
"The registry entry identifying the configured task."; "A registry entry identifying the metrics a measurement
task supports.";
} }
leaf program { leaf program {
type string; type string;
description description
"The (local) program to invoke in order to execute "The (local) program to invoke in order to execute
the task."; the task.";
} }
} }
uses task-options-grouping { uses task-options-grouping {
description description
"The list of task specific options."; "The list of task specific options.";
} }
leaf-list tag { leaf-list tag {
type string; type string;
description description
skipping to change at page 14, line 16 skipping to change at page 14, line 21
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 a property of the
device running the measurement agent. In certain device running the measurement agent. In certain
deployments, the device-id may be considered deployments, the device-id may be considered
sensitive and hence this object is optional."; sensitive and hence this object is optional.";
} }
leaf credentials {
type string;
description
"The credentials of the agent.";
// XXX: This is way too simplistic. Credentials are
// specific to the authentication mechanism used
// by a protocol. Hence, this needs to be a far
// more complex and extensible choice or it might
// not be needed since the protocol data models
// already cover it.
}
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 report-agent-id { leaf report-agent-id {
skipping to change at page 14, line 50 skipping to change at page 14, line 43
// XXX: write a must expression that requires // XXX: write a must expression that requires
// group-id to be configured when this is true? // group-id to be configured when this is true?
description description
"The 'report-agent-id' controls whether the "The 'report-agent-id' controls whether the
'agent-id' is reported to collectors if the 'agent-id' is reported to collectors if the
'group-id' is configured. If the 'group-id' 'group-id' is configured. If the 'group-id'
is not configured, the agent-id is always is not configured, the agent-id is always
reported."; reported.";
} }
leaf controller-lost-timeout { leaf controller-timeout {
type uint32; type uint32;
units ""; units "seconds";
description description
"A timer is started after each successful contact "A timer is started after each successful contact
with a controller. When the timer reaches the with a controller. When the timer reaches the
controller-lost-timeout, all schedules will be controller-timeout, all schedules will be
disabled."; disabled, i.e., no new actions will be executed
(and hence no new tasks started). The disabled
schedules will be reenabled automatically once
contact with a controller has been established
successfully again. Note that this will not affect
the execution of actions that are essential to
establish contact with the controller or that
perform critical housekeeping functions.";
}
} }
}
/* /*
* Common Information Objects: Schedules * Common Information Objects: Schedules
*/ */
container schedules { container schedules {
description description
"Configuration of LMAP schedules. Schedules control with "Configuration of LMAP schedules. Schedules control with
tasks are executed by the LMAP implementation."; tasks are executed by the LMAP implementation.";
skipping to change at page 15, line 34 skipping to change at page 15, line 34
description description
"Configuration of a particular schedule."; "Configuration of a particular schedule.";
leaf name { leaf name {
type string; type string;
description description
"The locally-unique, administratively assigned name for "The locally-unique, administratively assigned name for
this scheduled task."; this scheduled task.";
} }
leaf event {
type leafref {
path "/lmap/events/event/name";
}
mandatory true;
description
"The event source controlling the start of the scheduled
tasks.";
}
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 string; type string;
description description
"The unique identifier for this action."; "The unique identifier for this action.";
skipping to change at page 16, line 13 skipping to change at page 16, line 23
description description
"The tasks invoked by this action."; "The tasks invoked by this action.";
} }
uses task-options-grouping { uses task-options-grouping {
description description
"The list of action specific options that are "The list of action specific options that are
appended to the list of task specific options."; appended to the list of task specific options.";
} }
list destination { leaf-list destination {
key "name"; type leafref {
description path "/lmap/schedules/schedule/name";
"A destination receives information from the task
associated with this action. A queue is internally
used to pass the information to another (scheduled)
action.";
leaf name {
type string;
description
"The name of this destination (queue) that passes
information to another (scheduled) action.";
} }
description
"A schedule of 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 output { leaf execution-mode {
type uint16; type enumeration {
enum sequential {
value 1;
description description
"The list of outputs of a task directed to another "The actions of the schedule are executed
(scheduled) action. If no output is specified, sequentially.";
then all output is directed to another (scheduled)
action.";
} }
enum parallel {
leaf schedule { value 2;
type leafref {
path "/lmap/schedules/schedule/name";
}
mandatory true;
description description
"The schedule of the (scheduled) action receiving "The actions of the schedule are executed
the output."; concurrently";
} }
enum pipelined {
leaf action { value 3;
type leafref {
path "/lmap/schedules/schedule"
+ "[name = current()/../schedule]"
+ "/action/name";
}
mandatory true;
description description
"The (scheduled) action receiving the output (the "The actions of the schedule are executed in a
destination consuming the data from the queue)."; pipelined mode. Output created by an action is
passed as input to the subsequent action.";
} }
} }
}
leaf timing {
type leafref {
path "/lmap/timings/timing/name";
}
mandatory true; mandatory true;
description description
"The timing source controlling the start of the scheduled "The execution mode of this schedule determins in
tasks."; which order the actions of the schedule are executed.";
} }
} }
} }
/* /*
* Suppression * Suppression
*/ */
container suppression { container suppression {
description description
skipping to change at page 18, line 43 skipping to change at page 18, line 37
path "/lmap/schedules/schedule/name"; path "/lmap/schedules/schedule/name";
} }
description description
"A specific schedule to suppress. If no schedules "A specific schedule to suppress. If no schedules
are listed, then all schedules will be suppressed."; are listed, then all schedules will be suppressed.";
} }
} }
/* /*
* Common Information Objects: Channels
*/
container channels {
description
"A channel describes properties of an LMAP control or
reporting channel.";
list channel {
key name;
description
"The list of channels configured on the LMAP agent.";
leaf name {
type string;
description
"The unique name of a channel.";
}
leaf target {
type inet:uri;
description
"The remote endpoint of the channel.";
}
leaf credentials {
type string;
description
"The credentials of the channel.";
// XXX: This is way too simplistic. Credentials are
// specific to the authentication mechanism used
// by a protocol. Hence, this needs to be a far
// more complex and extensible choice.
}
leaf interface {
type leafref {
path "/if:interfaces/if:interface/if:name";
}
description
"The local interface used to reach the remote
endpoint of the channel. If not present, the
system will select a suitable interface.";
}
}
}
/*
* Common Information Objects: Task Configurations * Common Information Objects: Task Configurations
*/ */
container tasks { container tasks {
description description
"Configuration of LMAP tasks."; "Configuration of LMAP tasks.";
uses task-grouping; uses task-grouping;
} }
/* /*
* Common Information Objects: Timing Information * Common Information Objects: Event Information
*/ */
container timings { container events {
description description
"Configuration of LMAP timings. "Configuration of LMAP events.
Implementations may be forced to delay acting Implementations may be forced to delay acting
upon triggers in the face of local constraints. upon the occurance of events in the face of local
A task triggered therefore not rely on the accuracy constraints. An action triggered by an event
therefore should not rely on the accuracy
provided by the scheduler implementation."; provided by the scheduler implementation.";
list timing { list event {
key name; key name;
description description
"The list of timings configured on the LMAP agent."; "The list of event sources configured on the
LMAP agent.";
leaf name { leaf name {
type string; type string;
description description
"The unique name of a timing."; "The unique name of an event source.";
} }
choice timing-type { choice event-type {
description description
"Different types of timing objects are handled by "Different types of events are handled by
different branches of this choices."; different branches of this choice. Note that
this choice can be extended via augmentations.";
case periodic { case periodic {
container periodic { container periodic {
description description
"A periodic timing object triggers periodically "A periodic timing object triggers periodically
driven by a regular interval."; according to a regular interval.";
leaf interval { leaf interval {
type uint32; type uint32;
units "milliseconds"; units "milliseconds";
mandatory true; mandatory true;
description description
"The number of milliseconds between two triggers "The number of milliseconds between two triggers
generated by this periodic timing object. generated by this periodic timing object.
The execution system must not generate triggers The execution system must not generate triggers
for periodic timing objects that have a interval for periodic timing objects that have a interval
value of 0. A timing object with an interval of value of 0. A periodic timing object with an
0 milliseconds will therefore never trigger."; interval of 0 milliseconds will therefore never
trigger.";
} }
uses timing-start-end-grouping; uses timing-start-end-grouping;
} }
} }
case calendar { case calendar {
container calendar { container calendar {
description description
"A calendar timing object trigger based on the "A calendar timing object triggers based on the
current calendar date and time."; current calendar date and time.";
leaf-list month { leaf-list month {
type union { type union {
type month; type month;
type wildcard; type wildcard;
} }
description description
"A month at which this calendar timing will "A month at which this calendar timing will
trigger. The wildcard means all months."; trigger. The wildcard means all months.";
skipping to change at page 23, line 7 skipping to change at page 22, line 6
"This one-off timing object triggers once at the "This one-off timing object triggers once at the
configured one-off-time."; configured one-off-time.";
} }
} }
case immediate { case immediate {
leaf immediate { leaf immediate {
type empty; type empty;
mandatory true; mandatory true;
description description
"This immediate timing object triggers immediately "This immediate event object triggers immediately
when it is configured."; when it is configured.";
} }
} }
case startup { case startup {
leaf startup { leaf startup {
type empty; type empty;
mandatory true; mandatory true;
description description
"This startup timing object triggers whenever the "This startup event object triggers whenever the
LMAP agent (re)starts."; LMAP agent (re)starts.";
} }
} }
} }
leaf random-spread { leaf random-spread {
type int32; type int32;
units milliseconds; units milliseconds;
description description
"This optional leaf adds a random spread to the "This optional leaf adds a random spread to the
skipping to change at page 24, line 45 skipping to change at page 23, line 44
leaf version { leaf version {
type string; type string;
mandatory true; mandatory true;
description description
"A short description of the software implementing the "A short description of the software implementing the
measurement agent. This should include the version measurement agent. This should include the version
number of the measurement agent software."; number of the measurement agent software.";
} }
leaf last-started { leaf last-started {
type yang:date-and-time; type yang:date-and-time;
mandatory true; mandatory true;
description description
"The date and time the measurement agent last started."; "The date and time the measurement agent last started.";
} }
} }
container tasks { container tasks {
description description
"Available LMAP tasks, including information about their "Available LMAP tasks, including information about their
last execution and their last failed execution."; last execution and their last failed execution.";
list task { list task {
key name; key name;
skipping to change at page 25, line 24 skipping to change at page 24, line 23
type string; type string;
description description
"The unique name of a task."; "The unique name of a task.";
} }
choice task-identification { choice task-identification {
mandatory true; mandatory true;
description description
"Information that identifies the task."; "Information that identifies the task.";
leaf registry { leaf-list registry {
type inet:uri; type inet:uri;
description description
"The registry entry identifying the configured task."; "The registry entry identifying the configured task.";
} }
leaf program { leaf program {
type string; type string;
description description
"The (local) program to invoke in order to execute "The (local) program to invoke in order to execute
the task."; the task.";
skipping to change at page 26, line 36 skipping to change at page 25, line 35
description description
"The status message produced by the last failed "The status message produced by the last failed
execution of this task."; execution of this task.";
} }
} }
} }
} }
} }
<CODE ENDS> <CODE ENDS>
<CODE BEGINS> file "ietf-lmap-report@2015-04-10.yang" <CODE BEGINS> file "ietf-lmap-report@2015-07-03.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-control { import ietf-lmap-control {
prefix lmapc; prefix lmapc;
skipping to change at page 30, line 51 skipping to change at page 29, line 51
[I-D.ietf-lmap-framework] [I-D.ietf-lmap-framework]
Eardley, P., Morton, A., Bagnulo, M., Burbridge, T., 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)", draft-ietf- Measurement of Broadband Performance (LMAP)", draft-ietf-
lmap-framework-12 (work in progress), March 2015. lmap-framework-12 (work in progress), March 2015.
[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-05 (work in progress), April 2015. information-model-06 (work in progress), July 2015.
[I-D.ietf-netconf-server-model]
Watsen, K. and J. Schoenwaelder, "NETCONF Server and
RESTCONF Server Configuration Models", draft-ietf-netconf-
server-model-06 (work in progress), February 2015.
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
January 2004. January 2004.
Appendix A. Example Configuration (XML) Appendix A. Open Issues
o The task-options-grouping needs fixing, see the comments inline.
o Should results be shipped via notifications or would it be more
practical to have a collector provding a RESTCONF server and data
is simply written via posts to suitable resources? This seems to
be the way current platforms work. If we do this, we also need to
think about how RESTCONF client credentials are configured.
Appendix B. Non-editorial Changes since -06
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 C. Example Configuration (XML)
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <data 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>
<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>wireless measurement at the north-pole</group-id> <group-id>wireless measurement at the north-pole</group-id>
<report-agent-id>true</report-agent-id> <report-agent-id>true</report-agent-id>
</agent> </agent>
<schedules> <schedules>
<schedule> <schedule>
<name>weekdays-hourly</name> <name>hourly-schedule</name>
<action> <event>hourly</event>
<name>udp-latency-weekdays-hourly</name>
<task>udp-latency-measurement</task>
<destination>
<name>q-all</name>
<schedule>daily</schedule>
<action>report-daily</action>
</destination>
</action>
<timing>hourly</timing>
</schedule>
<schedule>
<name>hourly</name>
<action> <action>
<name>icmp-latency-hourly</name> <name>icmp-latency-hourly</name>
<task>icmp-latency-measurement</task> <task>icmp-latency-measurement</task>
<destination> <destination>daily</destination>
<name>q-all</name>
<schedule>daily</schedule>
<action>report-daily</action>
</destination>
</action> </action>
<timing>hourly</timing> <action>
<name>udp-latency-weekdays-hourly</name>
<task>udp-latency-measurement</task>
<destination>daily</destination>
</action>
<execution-mode>sequential</execution-mode>
</schedule> </schedule>
<schedule> <schedule>
<name>daily</name> <name>daily-schedule</name>
<event>daily</event>
<action> <action>
<name>report-daily</name> <name>report-daily</name>
<task>lmap-reporting-task</task> <task>lmap-reporting-task</task>
<option> <option>
<name>channel</name> <name>channel</name>
<value>default-collector-channel</value> <value>http://collector.example.org/</value>
</option> </option>
</action> </action>
<timing>daily</timing> <execution-mode>sequential</execution-mode>
</schedule> </schedule>
<schedule> <schedule>
<name>immediate</name> <name>immediate-schedule</name>
<event>immediate</event>
<action> <action>
<name>icmp-latency-immediate</name> <name>icmp-latency-immediate</name>
<task>icmp-latency-measurement</task> <task>icmp-latency-measurement</task>
<destination>
<name>q-all</name>
<schedule>immediate</schedule>
<action>report-immediate</action>
</destination>
</action> </action>
<action> <action>
<name>report-immediate</name> <name>report-immediate</name>
<task>lmap-reporting-task</task> <task>lmap-reporting-task</task>
<option> <option>
<name>channel</name> <name>channel</name>
<value>default-collector-channel</value> <value>http://collector.example.org/</value>
</option> </option>
</action> </action>
<timing>immediate</timing> <execution-mode>pipelined</execution-mode>
<!-- for how long does this task stick around? -->
</schedule> </schedule>
</schedules> </schedules>
<suppression> <suppression>
<enabled>true</enabled> <enabled>true</enabled>
<start>2014-09-02T14:06:11+02:00</start> <start>2015-09-02T14:06:11+02:00</start>
<task>iperf-server</task> <task>iperf-server</task>
<schedule>hourly</schedule> <schedule>hourly</schedule>
<schedule>weekdays-hourly</schedule> <schedule>weekdays-hourly</schedule>
</suppression> </suppression>
<channels>
<channel>
<name>default-collector-channel</name>
</channel>
</channels>
<tasks> <tasks>
<task> <task>
<name>udp-latency-measurement</name> <name>udp-latency-measurement</name>
<registry>urn:....</registry> <registry>urn:....</registry>
</task> </task>
<task> <task>
<name>icmp-latency-measurement</name> <name>icmp-latency-measurement</name>
<registry>urn:....</registry> <registry>urn:....</registry>
</task> </task>
<task> <task>
<name>iperf-server</name> <name>iperf-server</name>
<program>iperf</program> <program>/usr/bin/iperf</program>
<option> <option>
<name>role</name> <name>role</name>
<value>server</value> <value>server</value>
</option> </option>
<suppress-by-default>false</suppress-by-default> <suppress-by-default>false</suppress-by-default>
</task> </task>
<task> <task>
<name>lmap-reporting-task</name> <name>lmap-reporting-task</name>
<program>lmap-reportd</program> <program>/usr/bin/lmap-reporter</program>
</task> </task>
</tasks> </tasks>
<timings> <events>
<timing> <event>
<name>hourly</name> <name>hourly</name>
<periodic> <periodic>
<interval>3600000</interval> <interval>3600000</interval>
<start>2014-09-01T17:44:00+02:00</start> <start>2014-09-01T17:44:00+02:00</start>
<end>2014-09-30T00:00:00+02:00</end> <end>2015-09-30T00:00:00+02:00</end>
</periodic> </periodic>
</timing> </event>
<timing> <event>
<name>daily</name> <name>daily</name>
<calendar> <calendar>
<hour>04</hour> <hour>4</hour>
</calendar>
</timing>
<timing>
<name>tuesday-thursday-sunday</name>
<calendar>
<weekday>tuesday</weekday>
<weekday>thursday</weekday>
<weekday>sunday</weekday>
<hour>18</hour>
<minute>04</minute>
<second>42</second>
<end>2014-09-30T00:00:00+02:00</end>
</calendar> </calendar>
</timing> </event>
<timing> <event>
<name>once-every-six-hours</name> <name>once-every-six-hours</name>
<calendar> <calendar>
<hour>0</hour> <hour>0</hour>
<hour>6</hour> <hour>6</hour>
<hour>12</hour> <hour>12</hour>
<hour>18</hour> <hour>18</hour>
<minute>0</minute> <minute>0</minute>
<second>0</second> <second>0</second>
<end>2014-09-30T00:00:00+02:00</end> <end>2014-09-30T00:00:00+02:00</end>
</calendar> </calendar>
<random-spread>21600000</random-spread> <random-spread>21600000</random-spread>
</timing> </event>
<timing> <event>
<name>immediate</name> <name>immediate</name>
<immediate/> <immediate/>
</timing> </event>
<timing> <event>
<name>startup</name> <name>startup</name>
<startup/> <startup/>
<random-spread>12345</random-spread> <random-spread>12345</random-spread>
</timing> </event>
</timings> </events>
</lmap> </lmap>
<lmap-state xmlns="urn:ietf:params:xml:ns:yang:ietf-lmap-control"> <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>
<hardware>ACME home router</hardware> <hardware>ACME home router</hardware>
<firmware>OpenWrt version 10.03.1</firmware> <firmware>OpenWrt version 10.03.1</firmware>
skipping to change at page 35, line 27 skipping to change at page 34, line 23
<last-message>OK</last-message> <last-message>OK</last-message>
<last-failed-completion>2015-01-23T03:00:00+01:00</last-failed-completion> <last-failed-completion>2015-01-23T03:00:00+01:00</last-failed-completion>
<last-failed-status>42</last-failed-status> <last-failed-status>42</last-failed-status>
<last-failed-message>connection timed out</last-failed-message> <last-failed-message>connection timed out</last-failed-message>
</task> </task>
</tasks> </tasks>
</lmap-state> </lmap-state>
</data> </data>
Appendix B. Example Configuration (JSON) Appendix D. Example Configuration (JSON)
{ {
"ietf-lmap-control:lmap": { "ietf-lmap-control:lmap": {
"agent": { "agent": {
"agent-id": "550e8400-e29b-41d4-a716-446655440000", "agent-id": "550e8400-e29b-41d4-a716-446655440000",
"device-id": "urn:dev:mac:0024befffe804ff1", "device-id": "urn:dev:mac:0024befffe804ff1",
"group-id": "wireless measurement at the north-pole", "group-id": "wireless measurement at the north-pole",
"report-agent-id": true "report-agent-id": true
}, },
"schedules": { "schedules": {
"schedule": [ "schedule": [
{ {
"name": "weekdays-hourly", "name": "hourly-schedule",
"event": "hourly",
"action": [ "action": [
{ {
"name": "udp-latency-weekdays-hourly", "name": "icmp-latency-hourly",
"task": "udp-latency-measurement", "task": "icmp-latency-measurement",
"destination": [ "destination": [
{ "daily"
"name": "q-all",
"schedule": "daily",
"action": "report-daily"
}
] ]
} },
],
"timing": "hourly"
},
{
"name": "hourly",
"action": [
{ {
"name": "icmp-latency-hourly", "name": "udp-latency-weekdays-hourly",
"task": "icmp-latency-measurement", "task": "udp-latency-measurement",
"destination": [ "destination": [
{ "daily"
"name": "q-all",
"schedule": "daily",
"action": "report-daily"
}
] ]
} }
], ],
"timing": "hourly" "execution-mode": "sequential"
}, },
{ {
"name": "daily", "name": "daily-schedule",
"event": "daily",
"action": [ "action": [
{ {
"name": "report-daily", "name": "report-daily",
"task": "lmap-reporting-task", "task": "lmap-reporting-task",
"option": [ "option": [
{ {
"name": "channel", "name": "channel",
"value": "default-collector-channel" "value": "http://collector.example.org/"
} }
] ]
} }
], ],
"timing": "daily" "execution-mode": "sequential"
}, },
{ {
"name": "immediate", "name": "immediate-schedule",
"event": "immediate",
"action": [ "action": [
{ {
"name": "icmp-latency-immediate", "name": "icmp-latency-immediate",
"task": "icmp-latency-measurement", "task": "icmp-latency-measurement"
"destination": [
{
"name": "q-all",
"schedule": "immediate",
"action": "report-immediate"
}
]
}, },
{ {
"name": "report-immediate", "name": "report-immediate",
"task": "lmap-reporting-task", "task": "lmap-reporting-task",
"option": [ "option": [
{ {
"name": "channel", "name": "channel",
"value": "default-collector-channel" "value": "http://collector.example.org/"
} }
] ]
} }
], ],
"timing": "immediate" "execution-mode": "pipelined"
} }
] ]
}, },
"suppression": { "suppression": {
"enabled": true, "enabled": true,
"start": "2014-09-02T14:06:11+02:00", "start": "2015-09-02T14:06:11+02:00",
"task": [ "task": [
"iperf-server" "iperf-server"
], ],
"schedule": [ "schedule": [
"hourly", "hourly",
"weekdays-hourly" "weekdays-hourly"
] ]
}, },
"channels": {
"channel": [
{
"name": "default-collector-channel"
}
]
},
"tasks": { "tasks": {
"task": [ "task": [
{ {
"name": "udp-latency-measurement", "name": "udp-latency-measurement",
"registry": "urn:...." "registry": [
"urn:...."
]
}, },
{ {
"name": "icmp-latency-measurement", "name": "icmp-latency-measurement",
"registry": "urn:...." "registry": [
"urn:...."
]
}, },
{ {
"name": "iperf-server", "name": "iperf-server",
"program": "iperf", "program": "/usr/bin/iperf",
"option": [ "option": [
{ {
"name": "role", "name": "role",
"value": "server" "value": "server"
} }
], ],
"suppress-by-default": false "suppress-by-default": false
}, },
{ {
"name": "lmap-reporting-task", "name": "lmap-reporting-task",
"program": "lmap-reportd" "program": "/usr/bin/lmap-reporter"
} }
] ]
}, },
"timings": { "events": {
"timing": [ "event": [
{ {
"name": "hourly", "name": "hourly",
"periodic": { "periodic": {
"interval": 3600000, "interval": 3600000,
"start": "2014-09-01T17:44:00+02:00", "start": "2014-09-01T17:44:00+02:00",
"end": "2014-09-30T00:00:00+02:00" "end": "2015-09-30T00:00:00+02:00"
} }
}, },
{ {
"name": "daily", "name": "daily",
"calendar": { "calendar": {
"hour": [ "hour": [
04 4
] ]
} }
}, },
{ {
"name": "tuesday-thursday-sunday",
"calendar": {
"weekday": [
"tuesday",
"thursday",
"sunday"
],
"hour": [
18
],
"minute": [
04
],
"second": [
42
],
"end": "2014-09-30T00:00:00+02:00"
}
},
{
"name": "once-every-six-hours", "name": "once-every-six-hours",
"calendar": { "calendar": {
"hour": [ "hour": [
0, 0,
6, 6,
12, 12,
18 18
], ],
"minute": [ "minute": [
0 0
skipping to change at page 40, line 7 skipping to change at page 38, line 10
"device-id": "urn:dev:mac:0024befffe804ff1", "device-id": "urn:dev:mac:0024befffe804ff1",
"hardware": "ACME home router", "hardware": "ACME home router",
"firmware": "OpenWrt version 10.03.1", "firmware": "OpenWrt version 10.03.1",
"version": "Measurement Agent Daemon (MAD) 4.2", "version": "Measurement Agent Daemon (MAD) 4.2",
"last-started": "2015-04-10T17:24:42+02:00" "last-started": "2015-04-10T17:24:42+02:00"
}, },
"tasks": { "tasks": {
"task": [ "task": [
{ {
"name": "udp-latency-measurement", "name": "udp-latency-measurement",
"registry": "urn:...." "registry": [
"urn:...."
]
}, },
{ {
"name": "icmp-latency-measurement", "name": "icmp-latency-measurement",
"registry": "urn:...." "registry": [
"urn:...."
]
}, },
{ {
"name": "iperf", "name": "iperf",
"program": "iperf" "program": "iperf"
}, },
{ {
"name": "lmap-reporting-task", "name": "lmap-reporting-task",
"program": "lmap-reportd", "program": "lmap-reportd",
"last-completion": "2015-01-23T12:00:00+01:00", "last-completion": "2015-01-23T12:00:00+01:00",
"last-status": 0, "last-status": 0,
 End of changes. 106 change blocks. 
391 lines changed or deleted 289 lines changed or added

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