blob: 312b198ed77a35b9bab44c1b73020376d11497f1 [file] [log] [blame]
---
title: Setup and Configuration
---
<!--
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.
-->
The <%=vars.product_name_long%> Developer REST interface runs as an embedded HTTP or HTTPS service (Jetty server) within one
or more <%=vars.product_name%> servers.
# REST API Libraries
All <%=vars.product_name%> REST interface classes and required JAR files are distributed as a WAR file with the <%=vars.product_name%> product distribution. You can find the file in the following location:
<code>
<i>install-dir</i>/tools/Extensions/geode-web-api-<i>n.n.n.</i>war
</code>
where _install-dir_ is the server installation directory and _n.n.n_ is a version number.
Setting a `GEODE_HOME` environment variable with a path to the
<%=vars.product_name%> installation directory allows a server launcher
to find the WAR file without any changes to the CLASSPATH.
# <a id="setup_config_enabling_rest" class="no-quick-link"></a>Enabling the REST API
The REST API service for application development runs only on servers; you cannot run the service on a locator.
To enable the Developer REST API service on a given server, use the `gfsh start server` command with the `--start-rest-api` option,
or set the `start-dev-rest-api` property to `true` for the server via the ServerLauncher API.
This starts an embedded Jetty server and deploys the Developer REST API WAR file on that server.
## Enabling the REST API on Multiple Servers
You can configure multiple REST-enabled servers in a single cluster. Each server should
have a separate host name and unique end point. To ensure that the server is reachable on a
machine with multiple NIC addresses, use `http-service-bind-address` to bind an address to
the REST API service (as well as the other embedded web services, such as Pulse).
You can configure the Developer REST API service to run over HTTPS by enabling SSL for the `http`
component in `gemfire.properties` or `gfsecurity.properties`, or on server startup. See
[SSL](../managing/security/ssl_overview.html) for details on configuring SSL parameters. These SSL
parameters apply to all HTTP services hosted on the configured server, which can include the
following:
- Developer REST API service
- Management REST API service (for remote cluster management)
- Pulse monitoring tool
# <a id="setup_config_starting_rest" class="no-quick-link"></a> Starting the REST API Service
To start a REST API service-enabled <%=vars.product_name%> deployment, configure PDX serialization for your
cluster, then start the service on one or more server nodes.
## Configure PDX for your cluster
You must configure PDX if either or both of the following conditions apply:
- Application peer member caches will access REST-accessible regions (resources) with `Region.get(key)`.
- Your deployment has persistent regions that must be available as resources to the REST API.
To configure PDX in your cluster, perform the following steps:
1. Start a locator running the [cluster configuration service](../configuring/cluster_config/gfsh_persist.html) (enabled by default). For example:
``` pre
gfsh>start locator --name=locator1
```
2. If your deployment has application peer member caches (for example, Java clients) that must also access REST-accessible Regions (resources), use the following gfsh command:
``` pre
gfsh>configure pdx --read-serialized=true
```
**Note:**
You do not need to configure `--read-serialized=true` if no application peer member caches are accessing the REST-accessible regions (resources) in your deployment.
3. If your deployment contains **persistent regions** that must be REST-accessible, use the following gfsh command:
``` pre
gfsh>configure pdx --disk-store
```
This command sets `pdx` `persistent` equal to true and sets the disk-store-name to DEFAULT. If desired, specify an existing disk store name as the value for `--disk-store`.
4. If both of the above cases apply to your deployment, then configure PDX with the following single command:
``` pre
gfsh>configure pdx --read-serialized=true --disk-store
```
After you have configured PDX for your caches, then proceed with starting your REST-enabled servers and other servers.
## Start the REST API Service on One or More Servers
As described above, you can start the REST API service on a server by using `gfsh start server --start-rest-api`,
or by setting the <%=vars.product_name%> property `start-dev-rest-api` to `true`.
If you wish to start the service on multiple servers, use `http-service-bind-address` and `http-service-port` to
identify the cache server and specific port that will host REST services. If you do not specify
the `http-service-port`, the default port is 7070, which may collide with other locators and servers.
If you do not specify `http-service-bind-address`, the HTTP service will bind to all local addresses by default.
**Note:** If your application will be running in a VM (as when running in the cloud, for example),
it is good practice to specify `http-service-bind-address` and `http-service-port` so they will be
publicly visible. The default values may not be visible outside the VM in which the application is
running.
For example:
```
gfsh>start server --name=server1 --start-rest-api=true \
--http-service-port=8080 --http-service-bind-address=localhost
```
Any server that hosts data, even a server acting as a JMX manager, can start the Developer REST API service. For example, to start the service on a server that is also a JMX manager, you would run:
```
gfsh>start server --name=server1 --start-rest-api=true \
--http-service-port=8080 --http-service-bind-address=localhost \
--J=-Dgemfire.jmx-manager=true --J=-Dgemfire.jmx-manager-start=true
```
Note that when started as a JMX Manager, the server will also host the Pulse web application in the same HTTP service.
You may need to specify a CLASSPATH to load any functions that need to be made available to your REST services. For example:
```
gfsh>start server --name=server1 --start-rest-api=true \
--http-service-port=8080 --http-service-bind-address=localhost \
--classpath=/myapps/testfunctions.jar
```
You can specify these properties either upon server startup or in the servers gemfire.properties configuration file. For example:
```
gfsh>start server --name=serverX --server-port=40405 --cache-xml-file=cache-config.xml \
--properties-file=gemfire.properties --classpath=/myapps/testfunctions.jar
```
where gemfire.properties contains:
```
http-service-port=8080
http-service-bind-address=localhost
start-dev-rest-api=true
```
## Verify That The Service is Running
Verify that the <%=vars.product_name%> REST API service is up and running. To validate this, you can perform the following checks:
1. Test the list resources endpoint (this step assumes that you have regions defined on your cluster):
``` pre
curl -i http://localhost:8080/geode/v1
```
2. Examine the server logs for the following messages:
``` pre
[info 2017/06/13 13:48:14.090 PDT gfsec-server1 <main> tid=0x1] Initializing Spring FrameworkServlet 'geode-mgmt'
[info 2017/06/13 13:48:14.091 PDT gfsec-server1 <main> tid=0x1] FrameworkServlet 'geode-mgmt': initialization started
```
3. Open a browser and enter the following URL to browse the Swagger-enabled REST APIs:
``` pre
http://<http-service-bind-address>:<http-service-port>/geode/docs/index.html
```
where *http-service-bind-address* is the address and *http-service-port* is the port number that you specified when starting the Development REST API service on the server. For example, based on the server started in an earlier example, you would enter:
``` pre
http://localhost:8080/geode/docs/index.html
```
If you did not specify these properties upon server startup or in `gemfire.properties`, then use the
default of localhost and port 7070. See [Using the Swagger UI to Browse REST
APIs](using_swagger.html#concept_rlr_y3c_54) for more information.
# <a id="setup_config_implementing_auth" class="no-quick-link"></a>Implementing Authentication
To turn on integrated security, start your servers and locators with the security-manager property
set in your gemfire.properties file or on the gfsh command-line.
The following example uses the sample implementation that is included in the <%=vars.product_name%> source,
`org.apache.geode.examples.security.ExampleSecurityManager`.
This implementation requires a JSON security configuration file which defines the allowed users and their corresponding
permissions. (See the javadocs for `ExampleSecurityManager` for details on how to compose the JSON file.)
Place a copy of the JSON security configuration file in the execution directory of each security-enabled member, then
specify `--classpath=.` in the start command for each of those members.
To start a server using a username and password that are defined in that server's security configuration, include the
`--user=username` and `--password=password` options in the server's start command:
For example, suppose the JSON config file defines user "super-user" with password "1234567":
```
gfsh>start server --name=server1 --start-rest-api=true \
--http-service-port=8080 --http-service-bind-address=localhost \
--J=-Dgemfire.security-manager=org.apache.geode.examples.security.ExampleSecurityManager \
--classpath=. --user=super-user --password=1234567
```
To contact the server through the REST interface, you must provide the username and password. Various REST GUI interfaces
provide different ways of accomplishing this. The `curl` command offers the `--user` (or `-u`) option for this purpose,
where username and password are specified as a colon-separated pair:
```
curl -i --user super-user:1234567 http://localhost:8080/geode/v1
```
In a simple URL, such as in a browser address bar, the credentials can be given as a prefix to the host name
in the form `username:password@`:
```
http://super-user:1234567@localhost:8080/geode/v1
```
# <a id="setup_config_implementing_auth" class="no-quick-link"></a>Programmatic Startup
You can also start and configure <%=vars.product_name%> REST services programmatically. For example:
``` pre
import org.apache.geode.distributed.ServerLauncher;
public class MyEmbeddedRestServer {
public static void main(String[] args){
ServerLauncher serverLauncher = new ServerLauncher.Builder()
.set("start-dev-rest-api", "true")
.set("http-service-port", "8080")
.set("http-service-bind-address", "localhost")
.setPdxReadSerialized(true)
.build();
serverLauncher.start();
System.out.println("REST server successfully started");
}
}
```
You can then verify that the Developer REST API service has been started programmatically by visiting the following URL:
``` pre
http://localhost:8080/geode/docs/index.html
```