---
title: Cluster Management Service
---

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

**Note:** This feature is experimental and is subject to change in future releases of <%=vars.product_name_long%>.

The cluster management service enables you to change the configuration of
the cluster (for example, create/destroy regions, indexes, or gateway receivers/senders), and have these
changes replicated on all the applicable servers and persisted in the cluster configuration service.

With the cluster management service, you can:

- Create regions/indexes on the fly.

- Persist the configuration and apply it to the cluster, so when a new node joins, it has the configuration, and when the server restarts, it has the configuration.

- Obtain a consistent view of the current configuration

- Apply a change to all elements of the cluster in the same way

- Be able to change the configuration in one place

- Obtain this configuration without being on the cluster

- Invoke the configuration service from the server or from a client

The cluster management service is documented in the Geode Wiki: [Cluster Management Service](https://cwiki.apache.org/confluence/display/GEODE/Cluster+Management+Service).
The Wiki write-up offers separate choices for the cluster management service implementation on each Geode version that supports it.

The cluster management service is available as a [REST API](#cms-reference) and as a [Java API](#cms-java-api).

## <a id='cms-reference'>Cluster Management Service REST API</a>

The cluster management service REST API adheres to standard REST semantics, so users can use POST, PATCH, DELETE, and GET to create,
update, delete, and read, respectively.

This version of <%=vars.product_name%> uses the [<%=vars.product_version_geode%>.0 Management REST API](https://cwiki.apache.org/confluence/display/GEODE/<%=vars.product_version_geode%>.0+Management+REST+API+-+v1).
As mentioned, the feature is experimental and still undergoing revision.

For a definitive description of the cluster management service for your version of <%=vars.product_name%>, you can use the Swagger™ framework.
To use the Swagger UI to browse the cluster management service API:

1. Using `gfsh`, start a locator using the default settings.
2. Open a browser and enter the following URL:

```
http://localhost:7070/management/docs
```

This produces a browsable description of the cluster management service API:

<img src="../../images/swagger_cluster_mgmt.png" class="image" />


## <a id='cms-java-api'>Cluster Management Service Java API</a>

The cluster management service is available to Java clients via a Java API. To enable the cluster management service Java API, include `geode-management.jar` in your client classpath.
See the [Cluster Management Service Java Client topic on the Geode Wiki](https://cwiki.apache.org/confluence/display/GEODE/Cluster+Management+Service#ClusterManagementService-JavaClient) for more details.
