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

=== Deploy Cellar

This chapter describes how to deploy and start Cellar into a running Apache Karaf instance. This chapter
assumes that you already know Apache Karaf basics, especially the notion of features and shell usage.

==== Registering Cellar features

Karaf Cellar is provided as a Karaf features XML descriptor.

Simply register the Cellar feature URL in your Karaf instance:

----
karaf@root()> feature:repo-add cellar
----

Now you have Cellar features available in your Karaf instance:

----
karaf@root()> feature:list |grep -i cellar
----

==== Starting Cellar

To start Cellar in your Karaf instance, you only need to install the Cellar feature:

----
karaf@root()> feature:install cellar
----

You can now see the Cellar components (bundles) installed:

----
karaf@root()> la|grep -i cellar
----

And Cellar cluster commands are now available:

----
karaf@root()> cluster:<TAB>
----

==== Optional features

Optionally, you can install additional features.

The cellar-event feature adds support of OSGi EventAdmin on the cluster:

----
karaf@root()> feature:install cellar-event
----

The cellar-obr feature adds support of OBR sync on the cluster:

----
karaf@root()> feature:install cellar-obr
----

The cellar-dosgi feature adds support of DOSGi (Distributed OSGi):

----
karaf@root()> feature:install cellar-dosgi
----

The cellar-cloud feature adds support of cloud blobstore, allowing to use instances located on a cloud provider:

----
karaf@root()> feature:install cellar-cloud
----

The cellar-http feature adds HTTP support:

----
karaf@root()> feature:install cellar-http
----

The cellar-log feature adds centralized log support:

----
karaf@root()> feature:install cellar-log
----

Please, see the sections dedicated to these features for details.
