We are pleased to announce the release of Inmanta Service Orchestrator 6. This new major version introduces several significant changes and features including:
- Partial compiles are now generally available. Read more about it here
- Trees of entities can now be written as a tree of nested constructors. This will make interaction with YANG much easier.
- The Web Console is now the only frontend. In this release it got a lot more polish and feature parity with the old dashboard.
Make sure you upgrade now to take advantage of all these great new features! The full change log is available in our documentation, including the instructions for upgrading to the new release.
Many types of configuration are structured as a tree. When you model this configuration in Inmanta, you often use indexes to enforce the tree structure. For example, by making relations bidirectional and referring to the parent in the child. These indexes will force you to write the tree as a flat list, because indexed relations have to be set in the constructor.
The modelling language now supports writing this as a tree and will take care of correctly assigning the attributes in the double relation. We added an example using the SR Linux configuration from our quickstart.
The following definition is used inside our SR Linux adapter:
entity Address extends srlinux::Base: bool? anycast_gw = null srlinux::types::srl_nokia_common::ipv4_prefix_with_host_bits ip_prefix bool? primary = null end Address.parent_ipv4  -- subinterface::Ipv4.address [0:64] index Address(ip_prefix, parent_ipv4)
The following piece of code comes from the quickstart to create a subinterface and add an IPv4 address to it:
leaf1 = srlinux::GnmiDevice( auto_agent = true, name = "leaf1", mgmt_ip = "172.30.0.210", yang_credentials = yang::Credentials( username = "admin", password = "admin" ) ) leaf1_eth1 = srlinux::Interface( device = leaf1, name = "ethernet-1/1", mtu = 9000, subinterface = [leaf1_eth1_subint] ) leaf1_eth1_subint = srinterface::Subinterface( parent_interface = leaf1_eth1, x_index = 0, ipv4 = leaf1_eth1_subint_address ) leaf1_eth1_subint_address = srsubinterface::Ipv4( parent_subinterface = leaf1_eth1_subint, address = sripv4::Address( parent_ipv4 = leaf1_eth1_subint_address, ip_prefix = "10.10.11.2/30" ) )
A much more natural way to write this is in a tree structure, just like the YANG data model defines.
leaf1 = srlinux::GnmiDevice( auto_agent = true, name = "leaf1", mgmt_ip = "172.30.0.210", yang_credentials = yang::Credentials( username = "admin", password = "admin" ) ) leaf1_eth1 = srlinux::Interface( device=leaf1, name="ethernet-1/1", mtu=9000, subinterface=[ srinterface::Subinterface( x_index=0, ipv4=srsubinterface::Ipv4( address=sripv4::Address( ip_prefix="10.10.11.2/30" ) ) ) ] )
In previous version it would result in an error message because the
parent_ipv4 relation of the
Address constructor is not set.
Invalid Constructor call: * Missing relation 'parent_ipv4'. The relation srlinux::interface::subinterface::ipv4::Address.parent_ipv4 is part of an index. (reported in Construct(sripv4::Address) (./interfaces_tree.cf:29))
In the newest release this will compile and the first and second piece of code is equivalent.
The Web Console fully replaces the old dashboard. It not only offers new features like the service catalog, notifications and comparing desired states but also a reworked UX for existing features. For example the dry-run view from the dashboard has been reworked as a compare against the current state.
This view shows a clear diff between the desired state and the current state. It also shows you the progress of the dry-run and offers filtering capabilities
In Inmanta Service Orchestrator 6, you now also have the inmanta-workon command. This is a small improvement, but it can save you a lot of time diagnosing issues. When you execute the command you get a shell that provides you with the exact same Python environment the compiler uses to compile the orchestration model.
This release introduces finalizers in the compiler. Functions with the
@finalizer Python decorator will be called when the compilation ends. This allows you to do some cleanup, e.g. close a connection or file.
connection = None # This method might be called by a plugin function during compilation. # It opens a connection and puts it in the `connection` global variable def get_connection(): global connection if connection is None: connection = ... return connection @finalizer def finalize_connection(): if connection: connection.close()
Inmanta Service Orchestrator 5.4
We also made the final minor release of version 5. Version 5.4 contains mostly bug fixes and some features from version 6 that have been back ported such as: the workon command, compiler finalizers and improved support for tree-like constructs in the modelling language. From now one, version 5 will only receive patches in the next 18 months.
In this version we also remove some deprecated features and deprecated some new ones. Most of them are cleanups of inconsistenties. This allows us to further optimize performance and introduce new features in upcoming releases. The changelog in the documentation provides a detailed list.
Most notable changes are:
- All attributes need to have values assigned, including nullable attributes.
- The old dashboard web interface has been removed.
- Hyphens in identifiers are now deprecated and will be removed in the future.