# NCS-UML
[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-yellow)](https://opensource.org/license/apache-2-0/)
[![Downloads](https://pepy.tech/badge/ncs-uml)](https://pepy.tech/project/ncs-uml)
[![GitHub issues open](https://img.shields.io/github/issues/kirankotari/ncs-uml.svg?)](https://github.com/kirankotari/ncs-uml/issues)
- [Introduction](#introduction)
- [Commands](#commands)
- [Documentation](#docs)
- [Pre-requisites](#pre-requisites)
- [Installation and Downloads](#installation-and-downloads)
- [FAQ](#faq)
- [Bug Tracker and Support](#bug-tracker-and-support)
- [License and Copyright](#license-and-copyright)
- [Author and Thanks](#author-and-thanks)
## Introduction
A Python library and CLI tool that generates plantUML code from the given input YANG Model file. It grabs the dependencies yang models from the Makefile and from NCS.
To generate a png image or a svg file, install plantUML plugin for VSCode or other editors. plantUML has the web editor available at [plantuml.com](http://www.plantuml.com/)
## Commands
```sh
Usage: ncs-uml [options] [<filename>...]
Creates plantUML file for the YANG module in <filename>, and all its dependencies.
It can be converted into PNG/SVG images using www.plantuml.com or with editor plugins.
Options:
-h, --help Show this help message and exit
-v, --version Show version number and exit
-V, --verbose
--no-inline-groupings
--dependent-yang-paths=DEPENDENT_YANG_PATHS
dependent yang module paths
--no-inline-groupings-from=NO_INLINE_GROUPINGS_FROM
Skips given modules from inline groupings. Example
--uml-no-inline-groupings-from=ietf-yang-push
--add-legend Adds legend about grouping yang file in the UML
```
## Docs
**How to use ncs-uml?**
- Command Line
Type `ncs-uml <YangFile>`. For more help type `ncs-uml --help`
```shell
user$ ncs-uml $NCS_DIR/examples.ncs/getting-started/developing-with-ncs/17-mpls-vpn-python/packages/l3vpn/src/yang/l3vpn.yang --no-inline-groupings-from=tailf-ncs --add-legend
INFO | main | uml file: l3vpn.uml
INFO | main | uml clean up done.
user$
```
It returns plantUML code, which can easily converted to image.
![l3vpn](l3vpn.png)
Plant UML code:
```plantuml.server
@startuml l3vpn
hide empty fields
hide empty methods
hide <<case>> circle
hide <<augment>> circle
hide <<choice>> circle
hide <<leafref>> stereotype
hide <<leafref>> circle
page 1x1
Title l3vpn
class "l3vpn" as l3vpn << (M, #33CCFF) module>>
class "dscp-type" as dscp_type << (T, YellowGreen) typedef>>
dscp_type : union{uint16, enumeration}
enum "protocol-type" as l3vpn_I_protocol_type {
icmp
igmp
ipip
MORE
}
class "qos-match-type" as qos_match_type << (T, YellowGreen) typedef>>
qos_match_type : union{tailf:ipv4-address-and-prefix-length, enumeration}
class "topology" as l3vpn_I_topology <<container>>
l3vpn *-- "1" l3vpn_I_topology
class "role" as l3vpn_I_topology_I_role << (L, #FF7700) list>>
l3vpn_I_topology *-- "0..N" l3vpn_I_topology_I_role
l3vpn_I_topology_I_role : +role : enumeration : {ce,pe,p,} {key}
l3vpn_I_topology_I_role : device []: leafref : /ncs:devices/ncs:device/ncs:name
class "connection" as l3vpn_I_topology_I_connection << (L, #FF7700) list>>
l3vpn_I_topology *-- "0..N" l3vpn_I_topology_I_connection
l3vpn_I_topology_I_connection : +name : string {key}
class "endpoint-1" as l3vpn_I_topology_I_connection_I_endpoint_1 <<container>>
l3vpn_I_topology_I_connection *-- "1" l3vpn_I_topology_I_connection_I_endpoint_1
l3vpn_I_topology_I_connection_I_endpoint_1 : device : leafref : /ncs:devices/ncs:device/ncs:name
l3vpn_I_topology_I_connection_I_endpoint_1 : interface : string
l3vpn_I_topology_I_connection_I_endpoint_1 : ip-address : tailf:ipv4-address-and-prefix-length
class "endpoint-2" as l3vpn_I_topology_I_connection_I_endpoint_2 <<container>>
l3vpn_I_topology_I_connection *-- "1" l3vpn_I_topology_I_connection_I_endpoint_2
l3vpn_I_topology_I_connection_I_endpoint_2 : device : leafref : /ncs:devices/ncs:device/ncs:name
l3vpn_I_topology_I_connection_I_endpoint_2 : interface : string
l3vpn_I_topology_I_connection_I_endpoint_2 : ip-address : tailf:ipv4-address-and-prefix-length
l3vpn_I_topology_I_connection : link-vlan : uint32
class "qos" as l3vpn_I_qos <<container>>
l3vpn *-- "1" l3vpn_I_qos
class "qos-policy" as l3vpn_I_qos_I_qos_policy << (L, #FF7700) list>>
l3vpn_I_qos *-- "0..N" l3vpn_I_qos_I_qos_policy
l3vpn_I_qos_I_qos_policy : +name : string {key}
class "class" as l3vpn_I_qos_I_qos_policy_I_class << (L, #FF7700) list>>
l3vpn_I_qos_I_qos_policy *-- "0..N" l3vpn_I_qos_I_qos_policy_I_class
l3vpn_I_qos_I_qos_policy_I_class : +qos-class : leafref : /qos/qos-class/name {key}
l3vpn_I_qos_I_qos_policy_I_class : bandwidth-percentage : uint32
l3vpn_I_qos_I_qos_policy_I_class : priority : empty
class "qos-class" as l3vpn_I_qos_I_qos_class << (L, #FF7700) list>>
l3vpn_I_qos *-- "0..N" l3vpn_I_qos_I_qos_class
l3vpn_I_qos_I_qos_class : +name : string {key}
l3vpn_I_qos_I_qos_class : dscp-value : dscp-type
class "match-traffic" as l3vpn_I_qos_I_qos_class_I_match_traffic << (L, #FF7700) list>>
l3vpn_I_qos_I_qos_class *-- "0..N" l3vpn_I_qos_I_qos_class_I_match_traffic
l3vpn_I_qos_I_qos_class_I_match_traffic : +name : string {key}
l3vpn_I_qos_I_qos_class_I_match_traffic : source-ip : qos-match-type
l3vpn_I_qos_I_qos_class_I_match_traffic : destination-ip : qos-match-type
l3vpn_I_qos_I_qos_class_I_match_traffic : port-start : inet:port-number
l3vpn_I_qos_I_qos_class_I_match_traffic : port-end : inet:port-number
l3vpn_I_qos_I_qos_class_I_match_traffic : protocol : protocol-type
class "vpn" as l3vpn_I_vpn <<container>>
l3vpn *-- "1" l3vpn_I_vpn
class "l3vpn" as l3vpn_I_vpn_I_l3vpn << (L, #FF7700) list>>
l3vpn_I_vpn *-- "0..N" l3vpn_I_vpn_I_l3vpn
l3vpn_I_vpn_I_l3vpn : +name : string {key}
l3vpn_I_vpn_I_l3vpn : callpoint:ncs-rfs-service-hook()
l3vpn_I_vpn_I_l3vpn : check-sync( in: outformat in: suppress_positive_result in: service_depth in: choice_lsa_grouping)
l3vpn_I_vpn_I_l3vpn : deep-check-sync( in: outformat in: suppress_positive_result in: choice_lsa_grouping in: wait_for_lock)
l3vpn_I_vpn_I_l3vpn : re-deploy( in: dry_run in: reconcile in: ncs_commit_params in: service_depth out: ncs_commit_result)
l3vpn_I_vpn_I_l3vpn : reactive-re-deploy( in: sync out: ncs_commit_result)
l3vpn_I_vpn_I_l3vpn : touch()
class "modified" as l3vpn_I_vpn_I_l3vpn_I_modified <<container>>
l3vpn_I_vpn_I_l3vpn *-- "1" l3vpn_I_vpn_I_l3vpn_I_modified
l3vpn_I_vpn_I_l3vpn_I_modified : callpoint:ncs()
l3vpn_I_vpn_I_l3vpn_I_modified : devices []: leafref : /ncs:devices/ncs:device/ncs:name
l3vpn_I_vpn_I_l3vpn_I_modified : services []: instance-identifier
l3vpn_I_vpn_I_l3vpn_I_modified : lsa-services []: instance-identifier
class "directly-modified" as l3vpn_I_vpn_I_l3vpn_I_directly_modified <<container>>
l3vpn_I_vpn_I_l3vpn *-- "1" l3vpn_I_vpn_I_l3vpn_I_directly_modified
l3vpn_I_vpn_I_l3vpn_I_directly_modified : callpoint:ncs()
l3vpn_I_vpn_I_l3vpn_I_directly_modified : devices []: leafref : /ncs:devices/ncs:device/ncs:name
l3vpn_I_vpn_I_l3vpn_I_directly_modified : services []: instance-identifier
l3vpn_I_vpn_I_l3vpn_I_directly_modified : lsa-services []: instance-identifier
l3vpn_I_vpn_I_l3vpn : get-modifications( in: outformat in: reverse in: service_depth in: choice_lsa_grouping)
l3vpn_I_vpn_I_l3vpn : un-deploy( in: ignore_refcount in: dry_run in: ncs_commit_params out: ncs_commit_result)
l3vpn_I_vpn_I_l3vpn : used-by-customer-service []: leafref : /ncs:services/ncs:customer-service/ncs:object-id {Config : false}
class "commit-queue" as l3vpn_I_vpn_I_l3vpn_I_commit_queue <<container>>
l3vpn_I_vpn_I_l3vpn *-- "1" l3vpn_I_vpn_I_l3vpn_I_commit_queue
l3vpn_I_vpn_I_l3vpn_I_commit_queue : cdboper()
l3vpn_I_vpn_I_l3vpn_I_commit_queue : clear()
class "queue-item" as l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item << (L, #FF7700) list>>
l3vpn_I_vpn_I_l3vpn_I_commit_queue *-- "0..N" l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : +id : uint64 {key}
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : status : enumeration : {waiting,executing,blocking,...}
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : cleared-by-admin : empty
class "failed-device" as l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device << (L, #FF7700) list>>
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item *-- "0..N" l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device : +name : leafref : /ncs:devices/ncs:device/ncs:name {key}
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device : time : yang:date-and-time
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device : config-data : string
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device : error : string
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : admin-clear()
l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : delete()
class "private" as l3vpn_I_vpn_I_l3vpn_I_private <<container>>
l3vpn_I_vpn_I_l3vpn *-- "1" l3vpn_I_vpn_I_l3vpn_I_private
l3vpn_I_vpn_I_l3vpn_I_private : diff-set : binary
l3vpn_I_vpn_I_l3vpn_I_private : forward-diff-set : binary
l3vpn_I_vpn_I_l3vpn_I_private : device-list []: string
l3vpn_I_vpn_I_l3vpn_I_private : ned-id-list []: string
l3vpn_I_vpn_I_l3vpn_I_private : service-list []: instance-identifier
l3vpn_I_vpn_I_l3vpn_I_private : lsa-service-list []: yang:xpath1.0
l3vpn_I_vpn_I_l3vpn_I_private : synthesizer-kicker-list []: instance-identifier
class "property-list" as l3vpn_I_vpn_I_l3vpn_I_private_I_property_list <<container>>
l3vpn_I_vpn_I_l3vpn_I_private *-- "1" l3vpn_I_vpn_I_l3vpn_I_private_I_property_list
class "property" as l3vpn_I_vpn_I_l3vpn_I_private_I_property_list_I_property << (L, #FF7700) list>>
l3vpn_I_vpn_I_l3vpn_I_private_I_property_list *-- "0..N" l3vpn_I_vpn_I_l3vpn_I_private_I_property_list_I_property
l3vpn_I_vpn_I_l3vpn_I_private_I_property_list_I_property : +name : string {key}
l3vpn_I_vpn_I_l3vpn_I_private_I_property_list_I_property : value : string
l3vpn_I_vpn_I_l3vpn_I_private : re-deploy-counter : int32 = 0
l3vpn_I_vpn_I_l3vpn_I_private : latest-commit-params : binary
l3vpn_I_vpn_I_l3vpn_I_private : latest-u-info : binary
l3vpn_I_vpn_I_l3vpn : plan-location : instance-identifier {Config : false}
class "log" as l3vpn_I_vpn_I_l3vpn_I_log <<container>>
l3vpn_I_vpn_I_l3vpn *-- "1" l3vpn_I_vpn_I_l3vpn_I_log
l3vpn_I_vpn_I_l3vpn_I_log : cdboper()
l3vpn_I_vpn_I_l3vpn_I_log : purge( in: filter_input out: purged_log_entries)
class "log-entry" as l3vpn_I_vpn_I_l3vpn_I_log_I_log_entry << (L, #FF7700) list>>
l3vpn_I_vpn_I_l3vpn_I_log *-- "0..N" l3vpn_I_vpn_I_l3vpn_I_log_I_log_entry
l3vpn_I_vpn_I_l3vpn_I_log_I_log_entry : +when : yang:date-and-time {key}
l3vpn_I_vpn_I_l3vpn_I_log_I_log_entry : type : log-entry-t {mandatory}
l3vpn_I_vpn_I_l3vpn_I_log_I_log_entry : level : log-entry-level-t {mandatory}
l3vpn_I_vpn_I_l3vpn_I_log_I_log_entry : message : string
l3vpn_I_vpn_I_l3vpn : as-number : uint32 {mandatory}
class "endpoint" as l3vpn_I_vpn_I_l3vpn_I_endpoint << (L, #FF7700) list>>
l3vpn_I_vpn_I_l3vpn *-- "0..N" l3vpn_I_vpn_I_l3vpn_I_endpoint
l3vpn_I_vpn_I_l3vpn_I_endpoint : +id : string {key}
l3vpn_I_vpn_I_l3vpn_I_endpoint : ce-device : leafref : /ncs:devices/ncs:device/ncs:name {mandatory}
l3vpn_I_vpn_I_l3vpn_I_endpoint : ce-interface : string {mandatory}
l3vpn_I_vpn_I_l3vpn_I_endpoint : ip-network : inet:ip-prefix {mandatory}
l3vpn_I_vpn_I_l3vpn_I_endpoint : bandwidth : uint32 {mandatory}
class "qos" as l3vpn_I_vpn_I_l3vpn_I_qos <<container>>
l3vpn_I_vpn_I_l3vpn *-- "1" l3vpn_I_vpn_I_l3vpn_I_qos
l3vpn_I_vpn_I_l3vpn_I_qos : qos-policy : leafref : /l3vpn:qos/qos-policy/name
class "custom-qos-match" as l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match << (L, #FF7700) list>>
l3vpn_I_vpn_I_l3vpn_I_qos *-- "0..N" l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match
l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : +name : string {key}
l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : qos-class : leafref : /l3vpn:qos/qos-class/name {mandatory}
l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : source-ip : qos-match-type
l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : destination-ip : qos-match-type
l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : port-start : inet:port-number
l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : port-end : inet:port-number
l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : protocol : protocol-type
class "/ncs:devices/ncs:device" as tailf_ncs_devices_I_devices_I_device <<leafref>>
class "/qos/qos-class" as l3vpn_I_qos_I_qos_class <<leafref>>
class "/ncs:devices/ncs:device" as tailf_ncs_devices_I_devices_I_device <<leafref>>
l3vpn_I_topology_I_role-->"ncs:name"tailf_ncs_devices_I_devices_I_device: device
l3vpn_I_qos_I_qos_policy_I_class-->"name"l3vpn_I_qos_I_qos_class: qos-class
l3vpn_I_vpn_I_l3vpn_I_endpoint-->"ncs:name"tailf_ncs_devices_I_devices_I_device: ce-device
l3vpn_I_vpn_I_l3vpn_I_qos-->"name"l3vpn_I_qos_I_qos_policy: qos-policy
l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match-->"name"l3vpn_I_qos_I_qos_class: qos-class
@enduml
```
## Pre-requisites
ncs-uml supports both trains of **python** `2.7+ and 3.1+`, the OS should not matter.
- pyang is used to translate the data.
## Installation and Downloads
The best way to get ncs-uml is with setuptools or pip. If you already have setuptools, you can install as usual:
`python -m pip install ncs-uml`
Otherwise download it from PyPi, extract it and run the `setup.py` script
`python setup.py install`
If you're Interested in the source, you can always pull from the github repo:
- From github `git clone https://github.com/kirankotari/ncs-uml.git`
## FAQ
- **Question:** Can we create uml diagram for the yang sub-module?
**Answer:** No, currently we are allowing modules only, we are going to add sub-modules to the module before generating uml diagram
- **Question:** Can I create uml diagram for 2 files at at time?
**Answer:** No, currently we are allowing one file at a time.
## Bug Tracker and Support
- Please report any suggestions, bug reports, or annoyances with pingping through the [Github bug tracker](https://github.com/kirankotari/ncs-uml/issues).
## License and Copyright
- ncs-uml is licensed [Apache 2.0](https://opensource.org/license/apache-2-0/) *2023*
[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-yellow)](https://opensource.org/license/apache-2-0/)
## Author and Thanks
ncs-uml was developed by [Kiran Kumar Kotari](https://github.com/kirankotari)
Raw data
{
"_id": null,
"home_page": "https://github.com/kirankotari/ncs-uml.git",
"name": "ncs-uml",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "ncs-uml,ncs_uml",
"author": "Kiran Kumar Kotari",
"author_email": "kirankotari@live.com",
"download_url": "https://files.pythonhosted.org/packages/e9/1d/fa3c50563e7d34f2ae32b6bcc962fa135f978fd5fa111f228549142b9934/ncs-uml-1.2.2.tar.gz",
"platform": null,
"description": "# NCS-UML\n\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-yellow)](https://opensource.org/license/apache-2-0/)\n[![Downloads](https://pepy.tech/badge/ncs-uml)](https://pepy.tech/project/ncs-uml)\n[![GitHub issues open](https://img.shields.io/github/issues/kirankotari/ncs-uml.svg?)](https://github.com/kirankotari/ncs-uml/issues)\n\n- [Introduction](#introduction)\n- [Commands](#commands)\n- [Documentation](#docs)\n- [Pre-requisites](#pre-requisites)\n- [Installation and Downloads](#installation-and-downloads)\n- [FAQ](#faq)\n- [Bug Tracker and Support](#bug-tracker-and-support)\n- [License and Copyright](#license-and-copyright)\n- [Author and Thanks](#author-and-thanks)\n\n## Introduction\n\nA Python library and CLI tool that generates plantUML code from the given input YANG Model file. It grabs the dependencies yang models from the Makefile and from NCS. \n\nTo generate a png image or a svg file, install plantUML plugin for VSCode or other editors. plantUML has the web editor available at [plantuml.com](http://www.plantuml.com/)\n\n## Commands\n\n```sh\nUsage: ncs-uml [options] [<filename>...]\n\nCreates plantUML file for the YANG module in <filename>, and all its dependencies.\nIt can be converted into PNG/SVG images using www.plantuml.com or with editor plugins.\n\nOptions:\n -h, --help Show this help message and exit\n -v, --version Show version number and exit\n -V, --verbose\n --no-inline-groupings\n --dependent-yang-paths=DEPENDENT_YANG_PATHS\n dependent yang module paths\n --no-inline-groupings-from=NO_INLINE_GROUPINGS_FROM\n Skips given modules from inline groupings. Example\n --uml-no-inline-groupings-from=ietf-yang-push\n --add-legend Adds legend about grouping yang file in the UML\n```\n\n## Docs\n\n**How to use ncs-uml?**\n\n- Command Line \n Type `ncs-uml <YangFile>`. For more help type `ncs-uml --help`\n\n```shell\nuser$ ncs-uml $NCS_DIR/examples.ncs/getting-started/developing-with-ncs/17-mpls-vpn-python/packages/l3vpn/src/yang/l3vpn.yang --no-inline-groupings-from=tailf-ncs --add-legend\n INFO | main | uml file: l3vpn.uml\n INFO | main | uml clean up done.\nuser$\n```\n\nIt returns plantUML code, which can easily converted to image.\n\n![l3vpn](l3vpn.png)\n\nPlant UML code:\n```plantuml.server\n@startuml l3vpn\nhide empty fields \nhide empty methods \nhide <<case>> circle\nhide <<augment>> circle\nhide <<choice>> circle\nhide <<leafref>> stereotype\nhide <<leafref>> circle\npage 1x1 \nTitle l3vpn \nclass \"l3vpn\" as l3vpn << (M, #33CCFF) module>> \nclass \"dscp-type\" as dscp_type << (T, YellowGreen) typedef>>\ndscp_type : union{uint16, enumeration}\nenum \"protocol-type\" as l3vpn_I_protocol_type {\nicmp\nigmp\nipip\nMORE\n}\nclass \"qos-match-type\" as qos_match_type << (T, YellowGreen) typedef>>\nqos_match_type : union{tailf:ipv4-address-and-prefix-length, enumeration}\nclass \"topology\" as l3vpn_I_topology <<container>> \nl3vpn *-- \"1\" l3vpn_I_topology \nclass \"role\" as l3vpn_I_topology_I_role << (L, #FF7700) list>> \nl3vpn_I_topology *-- \"0..N\" l3vpn_I_topology_I_role \nl3vpn_I_topology_I_role : +role : enumeration : {ce,pe,p,} {key} \nl3vpn_I_topology_I_role : device []: leafref : /ncs:devices/ncs:device/ncs:name \nclass \"connection\" as l3vpn_I_topology_I_connection << (L, #FF7700) list>> \nl3vpn_I_topology *-- \"0..N\" l3vpn_I_topology_I_connection \nl3vpn_I_topology_I_connection : +name : string {key} \nclass \"endpoint-1\" as l3vpn_I_topology_I_connection_I_endpoint_1 <<container>> \nl3vpn_I_topology_I_connection *-- \"1\" l3vpn_I_topology_I_connection_I_endpoint_1 \nl3vpn_I_topology_I_connection_I_endpoint_1 : device : leafref : /ncs:devices/ncs:device/ncs:name \nl3vpn_I_topology_I_connection_I_endpoint_1 : interface : string \nl3vpn_I_topology_I_connection_I_endpoint_1 : ip-address : tailf:ipv4-address-and-prefix-length \nclass \"endpoint-2\" as l3vpn_I_topology_I_connection_I_endpoint_2 <<container>> \nl3vpn_I_topology_I_connection *-- \"1\" l3vpn_I_topology_I_connection_I_endpoint_2 \nl3vpn_I_topology_I_connection_I_endpoint_2 : device : leafref : /ncs:devices/ncs:device/ncs:name \nl3vpn_I_topology_I_connection_I_endpoint_2 : interface : string \nl3vpn_I_topology_I_connection_I_endpoint_2 : ip-address : tailf:ipv4-address-and-prefix-length \nl3vpn_I_topology_I_connection : link-vlan : uint32 \nclass \"qos\" as l3vpn_I_qos <<container>> \nl3vpn *-- \"1\" l3vpn_I_qos \nclass \"qos-policy\" as l3vpn_I_qos_I_qos_policy << (L, #FF7700) list>> \nl3vpn_I_qos *-- \"0..N\" l3vpn_I_qos_I_qos_policy \nl3vpn_I_qos_I_qos_policy : +name : string {key} \nclass \"class\" as l3vpn_I_qos_I_qos_policy_I_class << (L, #FF7700) list>> \nl3vpn_I_qos_I_qos_policy *-- \"0..N\" l3vpn_I_qos_I_qos_policy_I_class \nl3vpn_I_qos_I_qos_policy_I_class : +qos-class : leafref : /qos/qos-class/name {key} \nl3vpn_I_qos_I_qos_policy_I_class : bandwidth-percentage : uint32 \nl3vpn_I_qos_I_qos_policy_I_class : priority : empty \nclass \"qos-class\" as l3vpn_I_qos_I_qos_class << (L, #FF7700) list>> \nl3vpn_I_qos *-- \"0..N\" l3vpn_I_qos_I_qos_class \nl3vpn_I_qos_I_qos_class : +name : string {key} \nl3vpn_I_qos_I_qos_class : dscp-value : dscp-type \nclass \"match-traffic\" as l3vpn_I_qos_I_qos_class_I_match_traffic << (L, #FF7700) list>> \nl3vpn_I_qos_I_qos_class *-- \"0..N\" l3vpn_I_qos_I_qos_class_I_match_traffic \nl3vpn_I_qos_I_qos_class_I_match_traffic : +name : string {key} \nl3vpn_I_qos_I_qos_class_I_match_traffic : source-ip : qos-match-type \nl3vpn_I_qos_I_qos_class_I_match_traffic : destination-ip : qos-match-type \nl3vpn_I_qos_I_qos_class_I_match_traffic : port-start : inet:port-number \nl3vpn_I_qos_I_qos_class_I_match_traffic : port-end : inet:port-number \nl3vpn_I_qos_I_qos_class_I_match_traffic : protocol : protocol-type \nclass \"vpn\" as l3vpn_I_vpn <<container>> \nl3vpn *-- \"1\" l3vpn_I_vpn \nclass \"l3vpn\" as l3vpn_I_vpn_I_l3vpn << (L, #FF7700) list>> \nl3vpn_I_vpn *-- \"0..N\" l3vpn_I_vpn_I_l3vpn \nl3vpn_I_vpn_I_l3vpn : +name : string {key} \nl3vpn_I_vpn_I_l3vpn : callpoint:ncs-rfs-service-hook()\nl3vpn_I_vpn_I_l3vpn : check-sync( in: outformat in: suppress_positive_result in: service_depth in: choice_lsa_grouping)\nl3vpn_I_vpn_I_l3vpn : deep-check-sync( in: outformat in: suppress_positive_result in: choice_lsa_grouping in: wait_for_lock)\nl3vpn_I_vpn_I_l3vpn : re-deploy( in: dry_run in: reconcile in: ncs_commit_params in: service_depth out: ncs_commit_result)\nl3vpn_I_vpn_I_l3vpn : reactive-re-deploy( in: sync out: ncs_commit_result)\nl3vpn_I_vpn_I_l3vpn : touch()\nclass \"modified\" as l3vpn_I_vpn_I_l3vpn_I_modified <<container>> \nl3vpn_I_vpn_I_l3vpn *-- \"1\" l3vpn_I_vpn_I_l3vpn_I_modified \nl3vpn_I_vpn_I_l3vpn_I_modified : callpoint:ncs()\nl3vpn_I_vpn_I_l3vpn_I_modified : devices []: leafref : /ncs:devices/ncs:device/ncs:name \nl3vpn_I_vpn_I_l3vpn_I_modified : services []: instance-identifier \nl3vpn_I_vpn_I_l3vpn_I_modified : lsa-services []: instance-identifier \nclass \"directly-modified\" as l3vpn_I_vpn_I_l3vpn_I_directly_modified <<container>> \nl3vpn_I_vpn_I_l3vpn *-- \"1\" l3vpn_I_vpn_I_l3vpn_I_directly_modified \nl3vpn_I_vpn_I_l3vpn_I_directly_modified : callpoint:ncs()\nl3vpn_I_vpn_I_l3vpn_I_directly_modified : devices []: leafref : /ncs:devices/ncs:device/ncs:name \nl3vpn_I_vpn_I_l3vpn_I_directly_modified : services []: instance-identifier \nl3vpn_I_vpn_I_l3vpn_I_directly_modified : lsa-services []: instance-identifier \nl3vpn_I_vpn_I_l3vpn : get-modifications( in: outformat in: reverse in: service_depth in: choice_lsa_grouping)\nl3vpn_I_vpn_I_l3vpn : un-deploy( in: ignore_refcount in: dry_run in: ncs_commit_params out: ncs_commit_result)\nl3vpn_I_vpn_I_l3vpn : used-by-customer-service []: leafref : /ncs:services/ncs:customer-service/ncs:object-id {Config : false}\nclass \"commit-queue\" as l3vpn_I_vpn_I_l3vpn_I_commit_queue <<container>> \nl3vpn_I_vpn_I_l3vpn *-- \"1\" l3vpn_I_vpn_I_l3vpn_I_commit_queue \nl3vpn_I_vpn_I_l3vpn_I_commit_queue : cdboper()\nl3vpn_I_vpn_I_l3vpn_I_commit_queue : clear()\nclass \"queue-item\" as l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item << (L, #FF7700) list>> \nl3vpn_I_vpn_I_l3vpn_I_commit_queue *-- \"0..N\" l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item \nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : +id : uint64 {key} \nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : status : enumeration : {waiting,executing,blocking,...} \nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : cleared-by-admin : empty \nclass \"failed-device\" as l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device << (L, #FF7700) list>> \nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item *-- \"0..N\" l3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device \nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device : +name : leafref : /ncs:devices/ncs:device/ncs:name {key} \nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device : time : yang:date-and-time \nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device : config-data : string \nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item_I_failed_device : error : string \nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : admin-clear()\nl3vpn_I_vpn_I_l3vpn_I_commit_queue_I_queue_item : delete()\nclass \"private\" as l3vpn_I_vpn_I_l3vpn_I_private <<container>> \nl3vpn_I_vpn_I_l3vpn *-- \"1\" l3vpn_I_vpn_I_l3vpn_I_private \nl3vpn_I_vpn_I_l3vpn_I_private : diff-set : binary \nl3vpn_I_vpn_I_l3vpn_I_private : forward-diff-set : binary \nl3vpn_I_vpn_I_l3vpn_I_private : device-list []: string \nl3vpn_I_vpn_I_l3vpn_I_private : ned-id-list []: string \nl3vpn_I_vpn_I_l3vpn_I_private : service-list []: instance-identifier \nl3vpn_I_vpn_I_l3vpn_I_private : lsa-service-list []: yang:xpath1.0 \nl3vpn_I_vpn_I_l3vpn_I_private : synthesizer-kicker-list []: instance-identifier \nclass \"property-list\" as l3vpn_I_vpn_I_l3vpn_I_private_I_property_list <<container>> \nl3vpn_I_vpn_I_l3vpn_I_private *-- \"1\" l3vpn_I_vpn_I_l3vpn_I_private_I_property_list \nclass \"property\" as l3vpn_I_vpn_I_l3vpn_I_private_I_property_list_I_property << (L, #FF7700) list>> \nl3vpn_I_vpn_I_l3vpn_I_private_I_property_list *-- \"0..N\" l3vpn_I_vpn_I_l3vpn_I_private_I_property_list_I_property \nl3vpn_I_vpn_I_l3vpn_I_private_I_property_list_I_property : +name : string {key} \nl3vpn_I_vpn_I_l3vpn_I_private_I_property_list_I_property : value : string \nl3vpn_I_vpn_I_l3vpn_I_private : re-deploy-counter : int32 = 0 \nl3vpn_I_vpn_I_l3vpn_I_private : latest-commit-params : binary \nl3vpn_I_vpn_I_l3vpn_I_private : latest-u-info : binary \nl3vpn_I_vpn_I_l3vpn : plan-location : instance-identifier {Config : false}\nclass \"log\" as l3vpn_I_vpn_I_l3vpn_I_log <<container>> \nl3vpn_I_vpn_I_l3vpn *-- \"1\" l3vpn_I_vpn_I_l3vpn_I_log \nl3vpn_I_vpn_I_l3vpn_I_log : cdboper()\nl3vpn_I_vpn_I_l3vpn_I_log : purge( in: filter_input out: purged_log_entries)\nclass \"log-entry\" as l3vpn_I_vpn_I_l3vpn_I_log_I_log_entry << (L, #FF7700) list>> \nl3vpn_I_vpn_I_l3vpn_I_log *-- \"0..N\" l3vpn_I_vpn_I_l3vpn_I_log_I_log_entry \nl3vpn_I_vpn_I_l3vpn_I_log_I_log_entry : +when : yang:date-and-time {key} \nl3vpn_I_vpn_I_l3vpn_I_log_I_log_entry : type : log-entry-t {mandatory}\nl3vpn_I_vpn_I_l3vpn_I_log_I_log_entry : level : log-entry-level-t {mandatory}\nl3vpn_I_vpn_I_l3vpn_I_log_I_log_entry : message : string \nl3vpn_I_vpn_I_l3vpn : as-number : uint32 {mandatory}\nclass \"endpoint\" as l3vpn_I_vpn_I_l3vpn_I_endpoint << (L, #FF7700) list>> \nl3vpn_I_vpn_I_l3vpn *-- \"0..N\" l3vpn_I_vpn_I_l3vpn_I_endpoint \nl3vpn_I_vpn_I_l3vpn_I_endpoint : +id : string {key} \nl3vpn_I_vpn_I_l3vpn_I_endpoint : ce-device : leafref : /ncs:devices/ncs:device/ncs:name {mandatory}\nl3vpn_I_vpn_I_l3vpn_I_endpoint : ce-interface : string {mandatory}\nl3vpn_I_vpn_I_l3vpn_I_endpoint : ip-network : inet:ip-prefix {mandatory}\nl3vpn_I_vpn_I_l3vpn_I_endpoint : bandwidth : uint32 {mandatory}\nclass \"qos\" as l3vpn_I_vpn_I_l3vpn_I_qos <<container>> \nl3vpn_I_vpn_I_l3vpn *-- \"1\" l3vpn_I_vpn_I_l3vpn_I_qos \nl3vpn_I_vpn_I_l3vpn_I_qos : qos-policy : leafref : /l3vpn:qos/qos-policy/name \nclass \"custom-qos-match\" as l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match << (L, #FF7700) list>> \nl3vpn_I_vpn_I_l3vpn_I_qos *-- \"0..N\" l3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match \nl3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : +name : string {key} \nl3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : qos-class : leafref : /l3vpn:qos/qos-class/name {mandatory}\nl3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : source-ip : qos-match-type \nl3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : destination-ip : qos-match-type \nl3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : port-start : inet:port-number \nl3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : port-end : inet:port-number \nl3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match : protocol : protocol-type \nclass \"/ncs:devices/ncs:device\" as tailf_ncs_devices_I_devices_I_device <<leafref>> \nclass \"/qos/qos-class\" as l3vpn_I_qos_I_qos_class <<leafref>> \nclass \"/ncs:devices/ncs:device\" as tailf_ncs_devices_I_devices_I_device <<leafref>> \nl3vpn_I_topology_I_role-->\"ncs:name\"tailf_ncs_devices_I_devices_I_device: device\nl3vpn_I_qos_I_qos_policy_I_class-->\"name\"l3vpn_I_qos_I_qos_class: qos-class\nl3vpn_I_vpn_I_l3vpn_I_endpoint-->\"ncs:name\"tailf_ncs_devices_I_devices_I_device: ce-device\nl3vpn_I_vpn_I_l3vpn_I_qos-->\"name\"l3vpn_I_qos_I_qos_policy: qos-policy\nl3vpn_I_vpn_I_l3vpn_I_qos_I_custom_qos_match-->\"name\"l3vpn_I_qos_I_qos_class: qos-class\n@enduml\n\n```\n\n## Pre-requisites\n\nncs-uml supports both trains of **python** `2.7+ and 3.1+`, the OS should not matter.\n\n- pyang is used to translate the data.\n\n## Installation and Downloads\n\nThe best way to get ncs-uml is with setuptools or pip. If you already have setuptools, you can install as usual:\n\n`python -m pip install ncs-uml`\n\nOtherwise download it from PyPi, extract it and run the `setup.py` script\n\n`python setup.py install`\n\nIf you're Interested in the source, you can always pull from the github repo:\n\n- From github `git clone https://github.com/kirankotari/ncs-uml.git`\n\n## FAQ\n\n- **Question:** Can we create uml diagram for the yang sub-module? \n **Answer:** No, currently we are allowing modules only, we are going to add sub-modules to the module before generating uml diagram\n\n- **Question:** Can I create uml diagram for 2 files at at time? \n **Answer:** No, currently we are allowing one file at a time.\n\n## Bug Tracker and Support\n\n- Please report any suggestions, bug reports, or annoyances with pingping through the [Github bug tracker](https://github.com/kirankotari/ncs-uml/issues).\n\n\n## License and Copyright\n\n- ncs-uml is licensed [Apache 2.0](https://opensource.org/license/apache-2-0/) *2023*\n\n [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-yellow)](https://opensource.org/license/apache-2-0/)\n\n## Author and Thanks\n\nncs-uml was developed by [Kiran Kumar Kotari](https://github.com/kirankotari)\n\n",
"bugtrack_url": null,
"license": "",
"summary": "The ncs-uml creates plantUML files for the given YANG file and its dependencies",
"version": "1.2.2",
"project_urls": {
"Homepage": "https://github.com/kirankotari/ncs-uml.git"
},
"split_keywords": [
"ncs-uml",
"ncs_uml"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "4c47d59b6b0db45f5b6a195cc26c05c1f228dcbcd489fcd351688a47ee1ac8e7",
"md5": "7e0b59a86488b58ad35da505f96e9a8a",
"sha256": "ed2f04bac328184fc033475f6db542ff751c1208ebfce930477f587fdd4b6a17"
},
"downloads": -1,
"filename": "ncs_uml-1.2.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7e0b59a86488b58ad35da505f96e9a8a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 24584,
"upload_time": "2023-07-11T23:03:18",
"upload_time_iso_8601": "2023-07-11T23:03:18.848650Z",
"url": "https://files.pythonhosted.org/packages/4c/47/d59b6b0db45f5b6a195cc26c05c1f228dcbcd489fcd351688a47ee1ac8e7/ncs_uml-1.2.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e91dfa3c50563e7d34f2ae32b6bcc962fa135f978fd5fa111f228549142b9934",
"md5": "4fed0c4c90dbde95cdcd9059505ed4cb",
"sha256": "9a491d17c3819ec628a8018c9fa181633d362aef967b212c6828a7e627094c94"
},
"downloads": -1,
"filename": "ncs-uml-1.2.2.tar.gz",
"has_sig": false,
"md5_digest": "4fed0c4c90dbde95cdcd9059505ed4cb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27325,
"upload_time": "2023-07-11T23:03:20",
"upload_time_iso_8601": "2023-07-11T23:03:20.825910Z",
"url": "https://files.pythonhosted.org/packages/e9/1d/fa3c50563e7d34f2ae32b6bcc962fa135f978fd5fa111f228549142b9934/ncs-uml-1.2.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-07-11 23:03:20",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "kirankotari",
"github_project": "ncs-uml",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "pyang",
"specs": [
[
">=",
"2.5.0"
]
]
}
],
"lcname": "ncs-uml"
}