diff --git a/doc/source/articles/app_pkg.rst b/doc/source/articles/app_pkg.rst index 34fef688..3f7a9492 100644 --- a/doc/source/articles/app_pkg.rst +++ b/doc/source/articles/app_pkg.rst @@ -110,16 +110,16 @@ Example *telnet.yaml* Note, that -* *io.murano.system.Resources* is a system class, defined in MuranoPL. -* *io.murano.resources.Instance* is a class, defined in the core Murano library, which is available here. This library contains Murano agent templates and init scripts. -* $this.find(std:Environment).reporter.report($this, 'Creating VM for Telnet instace.') - this is the way of sending reports to Murano dashboard during deployment +* *io.murano.system.Resources* is a system class, defined in MuranoPL. More information about MuranoPL system classes is available here: :ref:`class_definitions`. +* *io.murano.resources.Instance* is a class, defined in the core Murano library, which is available here. :ref:`This library ` contains Murano Agent templates and virtual machine initialization scripts. +* $this.find(std:Environment).reporter.report($this, 'Creating VM for Telnet instance.') - this is the way of sending reports to Murano dashboard during deployment Step 3. Prepare dynamic UI form definition =========================================== Create a form definition in a yaml format. Before configuring a form, compose a list of parameters that will be required to set by a user. Some form fields that are responsible for choosing a flavor, image and availability zone are better to use in every application creation wizard. Syntax of Dynamic UI can be found see here: :ref:`Dynamic UI Spec` -Full example with Telnet application form definition is available here :ref:`telnet-yaml` +Full example with Telnet application form definition :ref:`telnet-yaml`. Step 4. Prepare application logo ================================= diff --git a/doc/source/articles/core_classes.rst b/doc/source/articles/core_classes.rst new file mode 100644 index 00000000..583a3f2a --- /dev/null +++ b/doc/source/articles/core_classes.rst @@ -0,0 +1,639 @@ +.. + Copyright 2014 Mirantis, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +.. _cory_library: + +===================== +MuranoPL Core Library +===================== + +Some objects and actions could be used in several application deployments. All common parts are grouped into MuranoPL libraries. +Murano core library is a set of classes needed in every deployment. Class names from core library could be used in the application definitions. +This library is located under the `meta `_ directory. +The following classes are included into the Murano core library: + +**io.murano:** + +- :ref:`Object` +- :ref:`Application` +- :ref:`SecurityGroupManager` +- :ref:`Environment` + +**io.murano.resources:** + +- :ref:`Instance` + :ref:`Resources `: + - Agent-v1.template + - Agent-v2.template + - linux-init.sh + - windows-init.sh +- :ref:`Network` + +**io.murano.lib.networks.neutron:** + +- :ref:`NewNetwork` + +.. _Object: + +Class: Object +============= +Parent class for all MuranoPL classes, which implements initialize method, and setAttr and getAttr methods, which are defined in the pythonic part of the Object class. +All MuranoPL classes are implicitly inherited from this class. + +.. _Application: + +Class: Application +================== +Defines application itself. All custom applications should be derived from this class. +Has two properties: + +.. code-block:: yaml + + Namespaces: + =: io.murano + + Name: Application + + Workflow: + reportDeployed: + Arguments: + - title: + Contract: $.string() + Default: null + - unitCount: + Contract: $.int() + Default: null + Body: + - $this.find(Environment).instanceNotifier.trackApplication($this, $title, $unitCount) + + reportDestroyed: + Body: + - $this.find(Environment).instanceNotifier.untrackApplication($this) + + +.. _SecurityGroupManager: + +Class: SecurityGroupManager +=========================== +Manages security groups during application deployment. + +.. code-block:: yaml + + Namespaces: + =: io.murano.system + std: io.murano + + Name: SecurityGroupManager + + Properties: + environment: + Contract: $.class(std:Environment).notNull() + + defaultGroupName: + Contract: $.string() + Usage: Runtime + Default: format('MuranoSecurityGroup-{0}', $.environment.name) + + Workflow: + addGroupIngress: + Arguments: + - rules: + Contract: + - FromPort: $.int().notNull() + ToPort: $.int().notNull() + IpProtocol: $.string().notNull() + External: $.bool().notNull() + - groupName: + Contract: $.string().notNull() + Default: $this.defaultGroupName + Body: + - $ext_keys: + true: + ext_key: remote_ip_prefix + ext_val: '0.0.0.0/0' + false: + ext_key: remote_mode + ext_val: remote_group_id + + - $stack: $.environment.stack + - $template: + Resources: + $groupName: + Type: 'OS::Neutron::SecurityGroup' + Properties: + description: format('Composite security group of Murano environment {0}', $.environment.name) + rules: + - port_range_min: null + port_range_max: null + protocol: icmp + remote_ip_prefix: '0.0.0.0/0' + - $.environment.stack.updateTemplate($template) + + - $ingress: $rules.select(dict( + port_range_min => $.FromPort, + port_range_max => $.ToPort, + protocol => $.IpProtocol, + $ext_keys.get($.External).ext_key => $ext_keys.get($.External).ext_val + )) + + - $template: + Resources: + $groupName: + Type: 'OS::Neutron::SecurityGroup' + Properties: + rules: $ingress + - $.environment.stack.updateTemplate($template) + + +.. _Environment: + +Class: Environment +================== + +Defines an Environment in terms of deployments process. Groups all the Applications and their related infrastructure, able to deploy them at once. +Environments is intent to group applications to manage them easily. + +- *name* - an environment name +- *applications* - list of applications belonging to an environment +- *agentListener* - property containing a ' :ref:`io.murano.system.AgentListener` object, which may be used to interact with Murano Agent +- *stack* - a property containing a HeatStack object which may be used to interact with the Heat Service +- *instanceNotifier* - a property containing a :ref:`io.murano.system.InstanceNotifier` which may be used to keep track of the amount of deployed instances +- *defaultNetworks* - a property containing user-defined Networks (:ref:`io.murano.resources.Network `), which may be used as the default networks for the Instances in this environment +- *securityGroupManager*- a property containing a :ref:`SecurityGroupManager ` object, which may be used to construct a security group associated with this environment + +.. code-block:: yaml + + Namespaces: + =: io.murano + res: io.murano.resources + sys: io.murano.system + + Name: Environment + + Properties: + name: + Contract: $.string().notNull() + + applications: + Contract: [$.class(Application).owned().notNull()] + + agentListener: + Contract: $.class(sys:AgentListener) + Usage: Runtime + + stack: + Contract: $.class(sys:HeatStack) + Usage: Runtime + + instanceNotifier: + Contract: $.class(sys:InstanceNotifier) + Usage: Runtime + + defaultNetworks: + Contract: + environment: $.class(res:Network) + flat: $.class(res:Network) + Usage: In + + securityGroupManager: + Contract: $.class(sys:SecurityGroupManager) + Usage: Runtime + + Workflow: + initialize: + Body: + - $this.agentListener: new(sys:AgentListener, name => $.name) + - $this.stack: new(sys:HeatStack, name => $.name) + - $this.instanceNotifier: new(sys:InstanceNotifier, environment => $this) + - $this.reporter: new(sys:StatusReporter, environment => $this) + - $this.securityGroupManager: new(sys:SecurityGroupManager, environment => $this) + + + deploy: + Body: + - $.agentListener.start() + - If: len($.applications) = 0 + Then: + - $.stack.delete() + Else: + - $.applications.pselect($.deploy()) + - $.agentListener.stop() + +.. _Instance: + +Class: Instance +=============== + +Defines virtual machine parameters and manage instance lifecycle: spawning, deploying, joining to the network, applying security group and destroying. + +- *name* - instance name +- *flavor* - instance flavor, defining virtual machine 'hardware' parameters +- *image* - instance image, defining operation system +- *keyname* - key pair name, used to make connect easily to the instance; optional +- *agent* - configures interaction with Murano Agent using :ref:`MuranoPL system class ` +- *ipAddresses* - list of all IP addresses, assigned to an instance +- *networks* - configures type of networks, to which instance will be joined. + Custom networks, that extends :ref:`Network class ` could be specified and an instance will be connected to them + and for a default environment network or flat network if corresponding values are set to true; + without additional configurations, instance will be joined to the default network that are set in the current environment. +- *assignFloatingIp* - determines, if floating IP need to be assigned to an instance, default is false +- *floatingIpAddress* - IP addresses, assigned to an instance after an application deployment +- *securityGroupName* - security group, to which instance will be joined, could be set; optional + +.. code-block:: yaml + + Namespaces: + =: io.murano.resources + std: io.murano + sys: io.murano.system + + Name: Instance + + Properties: + name: + Contract: $.string().notNull() + flavor: + Contract: $.string().notNull() + image: + Contract: $.string().notNull() + keyname: + Contract: $.string() + Default: null + + agent: + Contract: $.class(sys:Agent) + Usage: Runtime + ipAddresses: + Contract: [$.string()] + Usage: Out + networks: + Contract: + useEnvironmentNetwork: $.bool().notNull() + useFlatNetwork: $.bool().notNull() + customNetworks: [$.class(Network).notNull()] + Default: + useEnvironmentNetwork: true + useFlatNetwork: false + customNetworks: [] + assignFloatingIp: + Contract: $.bool().notNull() + Default: false + floatingIpAddress: + Contract: $.string() + Usage: Out + securityGroupName: + Contract: $.string() + Default: null + + Workflow: + initialize: + Body: + - $.environment: $.find(std:Environment).require() + - $.agent: new(sys:Agent, host => $) + - $.resources: new(sys:Resources) + + deploy: + Body: + - $securityGroupName: coalesce( + $.securityGroupName, + $.environment.securityGroupManager.defaultGroupName + ) + - $.createDefaultInstanceSecurityGroupRules($securityGroupName) + + - If: $.networks.useEnvironmentNetwork + Then: + $.joinNet($.environment.defaultNetworks.environment, $securityGroupName) + - If: $.networks.useFlatNetwork + Then: + $.joinNet($.environment.defaultNetworks.flat, $securityGroupName) + - $.networks.customNetworks.select($this.joinNet($, $securityGroupName)) + + - $userData: $.prepareUserData() + + - $template: + Resources: + $.name: + Type: 'AWS::EC2::Instance' + Properties: + InstanceType: $.flavor + ImageId: $.image + UserData: $userData + KeyName: $.keyname + + Outputs: + format('{0}-PublicIp', $.name): + Value: + - Fn::GetAtt: [$.name, PublicIp] + - $.environment.stack.updateTemplate($template) + - $.environment.stack.push() + - $outputs: $.environment.stack.output() + - $.ipAddresses: $outputs.get(format('{0}-PublicIp', $this.name)) + - $.floatingIpAddress: $outputs.get(format('{0}-FloatingIPaddress', $this.name)) + - $.environment.instanceNotifier.trackApplication($this) + + joinNet: + Arguments: + - net: + Contract: $.class(Network) + - securityGroupName: + Contract: $.string() + Body: + - If: $net != null + Then: + - If: $.assignFloatingIp and (not bool($.getAttr(fipAssigned))) + Then: + - $assignFip: true + - $.setAttr(fipAssigned, true) + Else: + - $assignFip: false + - $net.addHostToNetwork($, $assignFip, $securityGroupName) + + destroy: + Body: + - $template: $.environment.stack.current() + - $patchBlock: + op: remove + path: format('/Resources/{0}', $.name) + - $template: patch($template, $patchBlock) + - $.environment.stack.setTemplate($template) + - $.environment.stack.push() + - $.environment.instanceNotifier.untrackApplication($this) + + createDefaultInstanceSecurityGroupRules: + Arguments: + - groupName: + Contract: $.string().notNull() + Body: + + - If: !yaql "'w' in toLower($.image)" + Then: + - $rules: + - ToPort: 3389 + IpProtocol: tcp + FromPort: 3389 + External: true + Else: + - $rules: + - ToPort: 22 + IpProtocol: tcp + FromPort: 22 + External: true + - $.environment.securityGroupManager.addGroupIngress( + rules => $rules, groupName => $groupName) + + getDefaultSecurityRules: + prepareUserData: + Body: + - If: !yaql "'w' in toLower($.image)" + Then: + - $configFile: $.resources.string('Agent-v1.template') + - $initScript: $.resources.string('windows-init.ps1') + Else: + - $configFile: $.resources.string('Agent-v2.template') + - $initScript: $.resources.string('linux-init.sh') + + - $configReplacements: + "%RABBITMQ_HOST%": config(rabbitmq, host) + "%RABBITMQ_PORT%": config(rabbitmq, port) + "%RABBITMQ_USER%": config(rabbitmq, login) + "%RABBITMQ_PASSWORD%": config(rabbitmq, password) + "%RABBITMQ_VHOST%": config(rabbitmq, virtual_host) + "%RABBITMQ_SSL%": str(config(rabbitmq, ssl)).toLower() + "%RABBITMQ_INPUT_QUEUE%": $.agent.queueName() + "%RESULT_QUEUE%": $.environment.agentListener.queueName() + + - $scriptReplacements: + "%AGENT_CONFIG_BASE64%": base64encode($configFile.replace($configReplacements)) + "%INTERNAL_HOSTNAME%": $.name + "%MURANO_SERVER_ADDRESS%": coalesce(config(file_server), config(rabbitmq, host)) + "%CA_ROOT_CERT_BASE64%": "" + + - Return: $initScript.replace($scriptReplacements) + +.. _Instance_resources: + +Instance class uses the following resources: + +- *Agent-v2.template* - Python Murano Agent template (This agent is unified and lately, Windows Agent will be included into it) +- *linux-init.sh* - Python Murano Agent initialization script, which sets up an agent with valid information, containing in updated agent template. +- *Agent-v1.template* - Windows Murano Agent template +- *windows-init.sh* - Windows Murano Agent initialization script + +.. _Network: + +Class: Network +============== + +Base abstract class for all MuranoPL classes, representing networks. + +.. code-block:: yaml + + Namespaces: + =: io.murano.resources + + Name: Network + + Workflow: + addHostToNetwork: + Arguments: + - instance: + Contract: $.class(Instance).notNull() + - assignFloatingIp: + Contract: $.bool().notNull() + Default: false + - securityGroupName: + Contract: $.string() + Default: null + +.. _NewNetwork: + +Class: NewNetwork +================= + +Defining network type, using in Neutron. + +- *name* - network name +- *autoUplink* - defines auto uplink network parameter; optional, turned on by default +- *autogenerateSubnet* - defines auto subnet generation; optional, turned on by default +- *subnetCidr* - CIDR, defining network subnet, optional +- *dnsNameserver* - DNS server name, optional +- *useDefaultDns* - defines ether set default DNS or not, optional, turned on by default + +.. code-block:: yaml + + Namespaces: + =: io.murano.lib.networks.neutron + res: io.murano.resources + std: io.murano + sys: io.murano.system + + Name: NewNetwork + + Extends: res:Network + + Properties: + name: + Contract: $.string().notNull() + + externalRouterId: + Contract: $.string() + Usage: InOut + + autoUplink: + Contract: $.bool().notNull() + Default: true + + autogenerateSubnet: + Contract: $.bool().notNull() + Default: true + + subnetCidr: + Contract: $.string() + Usage: InOut + + dnsNameserver: + Contract: $.string() + Usage: InOut + + useDefaultDns: + Contract: $.bool().notNull() + Default: true + + Workflow: + initialize: + Body: + - $.environment: $.find(std:Environment).require() + - $.netExplorer: new(sys:NetworkExplorer) + + deploy: + Body: + - $.ensureNetworkConfigured() + - $.environment.instanceNotifier.untrackApplication($this) + + addHostToNetwork: + Arguments: + - instance: + Contract: $.class(res:Instance).notNull() + - assignFloatingIp: + Contract: $.bool().notNull() + Default: false + - securityGroupName: + Contract: $.string() + Default: null + Body: + - $.ensureNetworkConfigured() + - $portname: $instance.name + '-port-to-' + $.id() + - $template: + Resources: + $portname: + Type: 'OS::Neutron::Port' + Properties: + network_id: {Ref: $.net_res_name} + fixed_ips: [{subnet_id: {Ref: $.subnet_res_name}}] + security_groups: + - Ref: $securityGroupName + $instance.name: + Properties: + NetworkInterfaces: + - Ref: $portname + - $.environment.stack.updateTemplate($template) + + - If: $assignFloatingIp + Then: + - $extNetId: $.netExplorer.getExternalNetworkIdForRouter($.externalRouterId) + - If: $extNetId != null + Then: + - $fip_name: $instance.name + '-FloatingIP-' + $.id() + - $template: + Resources: + $fip_name: + Type: 'OS::Neutron::FloatingIP' + Properties: + floating_network_id: $extNetId + $instance.name + '-FloatingIpAssoc-' + $.id(): + Type: 'OS::Neutron::FloatingIPAssociation' + Properties: + floatingip_id: + Ref: $fip_name + port_id: + Ref: $portname + Outputs: + $instance.name + '-FloatingIPaddress': + Value: + Fn::GetAtt: + - $fip_name + - floating_ip_address + Description: Floating IP assigned + - $.environment.stack.updateTemplate($template) + + ensureNetworkConfigured: + Body: + - If: !yaql "not bool($.getAttr(networkConfigured))" + Then: + - If: $.useDefaultDns and (not bool($.dnsNameserver)) + Then: + - $.dnsNameserver: $.netExplorer.getDefaultDns() + + - $.net_res_name: $.name + '-net-' + $.id() + - $.subnet_res_name: $.name + '-subnet-' + $.id() + - $.createNetwork() + - If: $.autoUplink and (not bool($.externalRouterId)) + Then: + - $.externalRouterId: $.netExplorer.getDefaultRouter() + - If: $.autogenerateSubnet and (not bool($.subnetCidr)) + Then: + - $.subnetCidr: $.netExplorer.getAvailableCidr($.externalRouterId, $.id()) + - $.createSubnet() + - If: !yaql "bool($.externalRouterId)" + Then: + - $.createRouterInterface() + + - $.environment.stack.push() + - $.setAttr(networkConfigured, true) + + + createNetwork: + Body: + - $template: + Resources: + $.net_res_name: + Type: 'OS::Neutron::Net' + Properties: + name: $.name + - $.environment.stack.updateTemplate($template) + + createSubnet: + Body: + - $template: + Resources: + $.subnet_res_name: + Type: 'OS::Neutron::Subnet' + Properties: + network_id: {Ref: $.net_res_name} + ip_version: 4 + dns_nameservers: [$.dnsNameserver] + cidr: $.subnetCidr + - $.environment.stack.updateTemplate($template) + + createRouterInterface: + Body: + - $template: + Resources: + $.name + '-ri-' + $.id(): + Type: 'OS::Neutron::RouterInterface' + Properties: + router_id: $.externalRouterId + subnet_id: {Ref: $.subnet_res_name} + - $.environment.stack.updateTemplate($template) diff --git a/doc/source/articles/index.rst b/doc/source/articles/index.rst index e4f3b03e..7be82c43 100644 --- a/doc/source/articles/index.rst +++ b/doc/source/articles/index.rst @@ -20,6 +20,6 @@ App Catalog .. toctree:: :maxdepth: 2 - murano_pl + murano_pl_index dynamic_ui app_pkg diff --git a/doc/source/articles/murano_pl.rst b/doc/source/articles/murano_pl.rst index c1463227..e17f044a 100644 --- a/doc/source/articles/murano_pl.rst +++ b/doc/source/articles/murano_pl.rst @@ -13,11 +13,6 @@ License for the specific language governing permissions and limitations under the License. -.. _MuranoPL Spec: - -====================== -MuranoPL specification -====================== YAML ==== @@ -35,6 +30,7 @@ MuranoPL engine relies on host deserialization code to automatically detect YAQL !!str $ - a string (because of YAML tag) !yaql "text" - YAQL (because of YAML tag) + YAQL ==== diff --git a/doc/source/articles/murano_pl_index.rst b/doc/source/articles/murano_pl_index.rst new file mode 100644 index 00000000..10123a7f --- /dev/null +++ b/doc/source/articles/murano_pl_index.rst @@ -0,0 +1,30 @@ +.. + Copyright 2014 2014 Mirantis, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http//www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +.. _MuranoPL Spec: + +===================================== +Murano Program Language Specification +===================================== + +Content +======= + +.. toctree:: + :maxdepth: 3 + + murano_pl + system_classes + core_classes diff --git a/doc/source/articles/system_classes.rst b/doc/source/articles/system_classes.rst new file mode 100644 index 00000000..b4e761e1 --- /dev/null +++ b/doc/source/articles/system_classes.rst @@ -0,0 +1,114 @@ +.. + Copyright 2014 Mirantis, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + License for the specific language governing permissions and limitations + under the License. + +.. _class_definitions: + +================================== +Murano PL System Class Definitions +================================== + +Murano program language has system classes, which make deploying process as convenient as it could be. +System classes are used in user class definitions for a custom applications. This article is going to help users to operate with Murano PL classes without any issues. +All classes are located in the murano-engine component and don`t require particular import. + +- :ref:`io.murano.system.Resources` +- :ref:`io.murano.system.Agent` +- :ref:`io.murano.system.AgentListener` +- :ref:`io.murano.system.HeatStack` +- :ref:`io.murano.system.InstanceNotifier` +- :ref:`io.murano.system.NetworkExplorer` +- :ref:`io.murano.system.StatusReporter` + +.. _io.murano.system.Resources: + +io.murano.system.Resources +========================== +Used to provide API to all files, located in the Resource directory of application package. Those Resources usually used in an application deployment and needed to be specified in a workflow definition. +Available methods: + +- *yaml* return resource file in yaml format +- *string* return resource file as string +- *json* return resource in json format + +.. _io.murano.system.Agent: + +io.murano.system.Agent +====================== +Defines Murano Agent and ways of interacting with it. +Available methods: + +- *call(template, resources)* - send an execution plan template and resource object, and wait for an operation to complete +- *send(template, resources)* - send execution plan template and resource class instance and continue execution without waiting for an end of the execution +- *callRaw(plan)* - send ready-to-perform murano agent execution plan and wait for an operation to complete +- *sendRaw(plan)* - send ready-to-perform murano agent execution plan and continue workflow execution +- *queueName()* - returns name of the queue with which Agent is working + +.. _io.murano.system.AgentListener: + +io.murano.system.AgentListener +============================== +Used for monitoring Murano Agent. + +- *start()* - start to monitor Murano Agent activity +- *stop()* - stop to monitor Murano Agent activity +- *subscribe(message_id, event)* - subscribe to the specified Agent event +- *queueName()* - returns name of the queue with which Agent is working + +.. _io.murano.system.HeatStack: + +io.murano.system.HeatStack +========================== +Manage Heat stack operations. + +- *current()* - returns current heat template +- *parameters()* - returns heat template parameters +- *reload()* - reload heat template +- *setTemplate(template)* - load heat template +- *updateTemplate(template)* - update current template with the specified part of heat stack +- *output()* - result of heat template execution +- *push()* - commit changes (requires after setTemplate and updateTemplate operations) +- *delete()* - delete current heat stack + +.. _io.murano.system.InstanceNotifier: + +io.murano.system.InstanceNotifier +================================= +Monitor application and instance statistics to provide billing feature. + +- *trackApplication(instance,* ``title``, ``unitCount``) - start to monitor an application activity; title, unitCount - are optional +- *untrackApplication(instance)* - stop to monitor an application activity +- *trackCloudInstance(instance)* - start to monitor an instance activity +- *untrackCloudInstance(instance)* - stop to monitor an instance activity + +.. _io.murano.system.NetworkExplorer: + +io.murano.system.NetworkExplorer +================================ +Determines and configures network topology. + +- *getDefaultRouter()* - determine default router +- *getAvailableCidr(routerId, netId)* - searching for non-allocated CIDR +- *getDefaultDns()* - get dns from config file +- *getExternalNetworkIdForRouter(routerId)* - Check for router connected to the external network +- *getExternalNetworkIdForNetwork(networkId)* - For each router this network is connected to check whether the router has external_gateway set + +.. _io.murano.system.StatusReporter: + +io.murano.system.StatusReporter +=============================== +Provides feedback feature. To follow the deployment process in the UI, all status changes should be included in the application configuration. + +- *report(instance, msg)* - Send message about an application deployment process +- *report_error(instance, msg)* - Report an error during an application deployment process