Skip to main content

The ncs-uml creates plantUML files for the given YANG file and its dependencies

Project description

NCS-UML

License: Apache 2.0 Downloads GitHub issues open

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

Commands

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
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

Plant UML code:

@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.

License and Copyright

Author and Thanks

ncs-uml was developed by Kiran Kumar Kotari

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ncs-uml-1.2.2.tar.gz (27.3 kB view details)

Uploaded Source

Built Distribution

ncs_uml-1.2.2-py3-none-any.whl (24.6 kB view details)

Uploaded Python 3

File details

Details for the file ncs-uml-1.2.2.tar.gz.

File metadata

  • Download URL: ncs-uml-1.2.2.tar.gz
  • Upload date:
  • Size: 27.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for ncs-uml-1.2.2.tar.gz
Algorithm Hash digest
SHA256 9a491d17c3819ec628a8018c9fa181633d362aef967b212c6828a7e627094c94
MD5 4fed0c4c90dbde95cdcd9059505ed4cb
BLAKE2b-256 e91dfa3c50563e7d34f2ae32b6bcc962fa135f978fd5fa111f228549142b9934

See more details on using hashes here.

File details

Details for the file ncs_uml-1.2.2-py3-none-any.whl.

File metadata

  • Download URL: ncs_uml-1.2.2-py3-none-any.whl
  • Upload date:
  • Size: 24.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for ncs_uml-1.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ed2f04bac328184fc033475f6db542ff751c1208ebfce930477f587fdd4b6a17
MD5 7e0b59a86488b58ad35da505f96e9a8a
BLAKE2b-256 4c47d59b6b0db45f5b6a195cc26c05c1f228dcbcd489fcd351688a47ee1ac8e7

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page