blob: 0f62fac1407721b0ac47741c428c659002901f2b [file] [log] [blame]
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "cloudstack.ent">
%BOOK_ENTITIES;
]>
<!-- Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<section id="event-framework">
<title>Event Notification</title>
<para>Event notification framework provides a means for the Management Server components to
publish and subscribe to &PRODUCT; events. Event notification is achieved by implementing the
concept of event bus abstraction in the Management Server. An event bus is introduced in the
Management Server that allows the &PRODUCT; components and extension plug-ins to subscribe to the
events by using the Advanced Message Queuing Protocol (AMQP) client. In &PRODUCT;, a default
implementation of event bus is provided as a plug-in that uses the RabbitMQ AMQP client. The
AMQP client pushes the published events to a compatible AMQP server. Therefore all the &PRODUCT;
events are published to an exchange in the AMQP server. </para>
<para>A new event for state change, resource state change, is introduced as part of Event
notification framework. Every resource, such as user VM, volume, NIC, network, public IP,
snapshot, and template, is associated with a state machine and generates events as part of the
state change. That implies that a change in the state of a resource results in a state change
event, and the event is published in the corresponding state machine on the event bus. All the
&PRODUCT; events (alerts, action events, usage events) and the additional category of resource
state change events, are published on to the events bus.</para>
<formalpara>
<title>Use Cases</title>
<para>The following are some of the use cases:</para>
</formalpara>
<itemizedlist>
<listitem>
<para>Usage or Billing Engines: A third-party cloud usage solution can implement a plug-in
that can connects to &PRODUCT; to subscribe to &PRODUCT; events and generate usage data. The
usage data is consumed by their usage software.</para>
</listitem>
<listitem>
<para>AMQP plug-in can place all the events on the a message queue, then a AMQP message broker
can provide topic-based notification to the subscribers.</para>
</listitem>
<listitem>
<para>Publish and Subscribe notification service can be implemented as a pluggable service in
&PRODUCT; that can provide rich set of APIs for event notification, such as topics-based
subscription and notification. Additionally, the pluggable service can deal with
multi-tenancy, authentication, and authorization issues.</para>
</listitem>
</itemizedlist>
<formalpara>
<title>Configuration</title>
<para>As a &PRODUCT; administrator, perform the following one-time configuration to enable event
notification framework. At run time no changes can control the behaviour.</para>
</formalpara>
<orderedlist>
<listitem>
<para>Open <filename>'componentContext.xml</filename>.</para>
</listitem>
<listitem>
<para>Define a bean named <filename>eventNotificationBus</filename> as follows:</para>
<itemizedlist>
<listitem>
<para>name : Specify a name for the bean.</para>
</listitem>
<listitem>
<para>server : The name or the IP address of the RabbitMQ AMQP server.</para>
</listitem>
<listitem>
<para>port : The port on which RabbitMQ server is running.</para>
</listitem>
<listitem>
<para>username : The username associated with the account to access the RabbitMQ
server.</para>
</listitem>
<listitem>
<para>password : The password associated with the username of the account to access the
RabbitMQ server.</para>
</listitem>
<listitem>
<para>exchange : The exchange name on the RabbitMQ server where &PRODUCT; events are
published.</para>
<para>A sample bean is given below:</para>
<programlisting>&lt;bean id="eventNotificationBus" class="org.apache.cloudstack.mom.rabbitmq.RabbitMQEventBus"&gt;
&lt;property name="name" value="eventNotificationBus"/&gt;
&lt;property name="server" value="127.0.0.1"/&gt;
&lt;property name="port" value="5672"/&gt;
&lt;property name="username" value="guest"/&gt;
&lt;property name="password" value="guest"/&gt;
&lt;property name="exchange" value="cloudstack-events"/&gt;
&lt;/bean&gt;</programlisting>
<para>The <filename>eventNotificationBus</filename> bean represents the
<filename>org.apache.cloudstack.mom.rabbitmq.RabbitMQEventBus</filename> class.</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Restart the Management Server.</para>
</listitem>
</orderedlist>
</section>