Metadata-Version: 2.1
Name: serviceprovider
Version: 1.1
Summary: A service discovery service provider using zookeeper for providing updates
Home-page: https://github.com/Tushar-Naik/python-ranger-daemon
Author: Tushar Naik
Author-email: tushar.knaik@gmail.com
License:  License 2.0
Keywords: ranger,zookeeper,service discovery,periodic task,interval,periodic job,flask style,decorator
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Utilities
Classifier: Topic :: System :: Networking
Classifier: Topic :: System :: Distributed Computing
Description-Content-Type: text/markdown
License-File: LICENCE

# Python ranger daemon

This is a simple light daemon that can run alongside your software to provide regular service discovery updates to zookeeper.
Check [Ranger](https://github.com/appform-io/ranger) for more details. You'll need it to follow some jargon being used in this readme.

## Intent
Ideally, you would directly use the standard Ranger java client to deeply integrate the service's health updates with ranger.<br>  
In scenarios where you can't do the above, you can rely on this daemon. 
Say you need discovery updates to be published for a service written in a langauge other than java, or you are unable to add the ranger dependency directly, in your java application.

The intent of this daemon is to run along-side your application and publish updates, as long as your service is up and healthy.
Currently, support has been added for a dockerized setup.
You can use docker compose to run your service and this daemon as a multi container docker application<br>
After this, your application should be ready for service discovery.

### How to run
The following is the docker command to run the script, using environment variables

| Env Variable | Description                                         |
|--------------|-----------------------------------------------------|
| HOST         | Hostname                                            |
| PORT         | Port                                                |
| RANGER_ZK    | Zookeeper connection string                         |
| SERVICE_NAME | Name of service                                     |
| ENV          | Environment (stage/prod)                            |
| NAMESPACE    | Namespace in zookeeper                              |
| HEALTH_CHECK | [optional] GET healthcheck URL to be used for pings |


```shell
docker run --rm -d -e RANGER_ZK=<zookeeper_info> -e SERVICE_NAME=<name_of_service> -e HOST=<host_of_machine> -e PORT=<port> -e ENV=<environment> -e NAMESPACE=<namespace> -e HEALTH_CHECK=<health_check_url> --name python-ranger-daemon tusharknaik/python-ranger-daemon:1.0
```

Here is an example for running it on a Mac machine, assuming your zookeeper is already running on `localhost:2181` (notice the network being set to `host` and zookeeper being sent as `host.docker.internal` for connecting to localhost from within docker)
```shell
docker run --rm -d --network host -e RANGER_ZK=host.docker.internal:2181 -e SERVICE_NAME=python-test -e HOST=localhost -e PORT=12211 -e ENV=stage -e NAMESPACE=myorg -e HEALTH_CHECK="localhost:12211/health" --name python-ranger-daemon tusharknaik/python-ranger-daemon:1.1
```

### Docker
Docker containers are available on the [DockerHub](https://hub.docker.com/repository/docker/tusharknaik/python-ranger-daemon).

---

### Under the hood
The daemon will write data to zookeeper in the following format (datamodel from ranger):
```json
{
  "host": "localhost",
  "port": 12211,
  "nodeData": {
    "environment": "stage"
  },
  "healthcheckStatus": "healthy",
  "lastUpdatedTimeStamp": 1639044989841
}
```
in the path: /$NAMESPACE/$SERVICE_NAME
at a periodic intervals of --interval (default: 1 second)

**Takes care of the following :**
- Infinite retry and connection reattempts in case of zk connection issues
- Proper cleanup of zk connections to get rid of ephemeral nodes
- Proper logging



### In the works
- [ ] Healthcheck capabilities before updating zookeeper


