module opendaylight-flow-statistics {
    namespace "urn:opendaylight:flow:statistics";
    prefix flowstat;

    import yang-ext {prefix ext; revision-date "2013-07-09";}
    import opendaylight-inventory {prefix inv;revision-date "2013-08-19";}
    import opendaylight-flow-types {prefix flow-types;revision-date "2013-10-26";}
    import opendaylight-statistics-types {prefix stat-types;revision-date "2013-09-25";}
    import opendaylight-table-types {prefix table-types;revision-date "2013-10-26";}
    import flow-node-inventory {prefix flow-node;revision-date "2013-08-19";}
    import flow-capable-transaction {prefix tr;}
    import ietf-inet-types {prefix inet; revision-date "2013-07-15";}
    import opendaylight-multipart-types { prefix multipart; revision-date "2017-01-12"; }

    description "Openflow statistics polling.";

    revision "2013-08-19" {
        description "Initial revision of flow statistics service";
    }

    augment "/inv:nodes/inv:node/flow-node:table/flow-node:flow" {
        ext:augment-identifier "flow-statistics-data";
        description "Openflow flow statistics data into the flow-capable-node->table->flow";

        uses flow-statistics;
    }

    grouping flow-statistics {
        container flow-statistics {
            uses stat-types:generic-statistics;
        }
    }

    typedef flow-id {
        description "flow id, TODO:: replace with inv:flow-id.";
        type inet:uri;
    }

    grouping flow-and-statistics-map-list {
        description "List of flow and statistics map";
        list flow-and-statistics-map-list {
            leaf flow-id {
                type flow-id;
            }
            uses flow-and-statistics-map;
        }
    }

    grouping flow-and-statistics-map{
        description "Mapping between flow and its statistics";
        uses flow-types:flow;
        uses stat-types:generic-statistics;
    }

    // RPC calls to fetch flow statistics
    rpc get-all-flows-statistics-from-all-flow-tables {
        status deprecated;
        description "Fetch statistics of all the flow present in all the flow tables of the switch";
        input {
            uses inv:node-context-ref;
        }
        output {
            uses flow-and-statistics-map-list;
            uses tr:transaction-aware;
        }

    }

    rpc get-all-flow-statistics-from-flow-table {
        status deprecated;
        description "Fetch statistics of all the flow present in the specific flow table of the switch";
        input {
            uses inv:node-context-ref;
            leaf table-id {
                type table-types:table-id;
            }
        }
        output {
            uses flow-and-statistics-map-list;
            uses tr:transaction-aware;
        }
    }

    rpc get-flow-statistics-from-flow-table {
        status deprecated;
        description "Fetch statistics of the specific flow present in the specific flow table of the switch";
        input {
            uses inv:node-context-ref;
            uses flow-types:flow;
        }
        output {
            uses flow-and-statistics-map-list;
            uses tr:transaction-aware;
        }
    }

    notification flows-statistics-update {
        status deprecated;
        description "Flows statistics sent by switch";
        leaf moreReplies {
            type boolean;
        }
        uses inv:node;
        uses flow-and-statistics-map-list;
        uses tr:transaction-aware;
    }

    //Models for aggregate flow statistics collection
    augment "/inv:nodes/inv:node/flow-node:table" {
        status deprecated;
        ext:augment-identifier "aggregate-flow-statistics-data";
        uses aggregate-flow-statistics;
    }

    grouping aggregate-flow-statistics {
        container aggregate-flow-statistics {
            uses stat-types:aggregate-flow-statistics;
        }
    }

    // RPC calls to fetch aggregate flow statistics
    rpc get-aggregate-flow-statistics-from-flow-table-for-all-flows {
        status deprecated;
        description "Fetch aggregate statistics for all the flows present in the specific flow table of the switch";

        input {
            uses inv:node-context-ref;
            leaf table-id {
                type table-types:table-id;
            }
        }
        output {
            uses stat-types:aggregate-flow-statistics;
            uses tr:transaction-aware;
        }
    }

    rpc get-aggregate-flow-statistics-from-flow-table-for-given-match {
        description "Fetch aggregate statistics for flows filtered by
          - table (eventually all tables)
          - match
          - port
          - group
          - cookie
          This values are contained in flow (among others).
          TODO:: filter values should be modeled more exact - omitting unusable fields.";

        input {
            uses inv:node-context-ref;
            uses flow-types:flow;
        }
        output {
            list aggregated-flow-statistics {
                uses stat-types:aggregate-flow-statistics;
            }
            uses tr:transaction-aware;
        }
    }

    notification aggregate-flow-statistics-update {
        status deprecated;

        description "Aggregate flow statistics for a table, sent by switch";
        uses inv:node;
        uses stat-types:aggregate-flow-statistics;
        uses tr:multipart-transaction-aware;
    }

    augment "/multipart:multipart-reply/multipart:multipart-reply-body" {
        case multipart-reply-flow-stats {
            uses flow-and-statistics-map-list;
        }

        case multipart-reply-flow-aggregate-stats {
            uses stat-types:aggregate-flow-statistics;
        }
    }
}