From 77d0ad88d5c0c9f48ac103ba5bbe5825fc0ea5a1 Mon Sep 17 00:00:00 2001 From: Kpacha Date: Mon, 5 Oct 2015 23:47:23 +0200 Subject: [PATCH 1/3] docker env setup --- Dockerfile | 19 +++++++++++++++++++ requirements.txt | 1 + run.sh | 7 +++++++ 3 files changed, 27 insertions(+) create mode 100644 Dockerfile create mode 100644 requirements.txt create mode 100644 run.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d9dfba3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3-onbuild +MAINTAINER kpacha + +COPY ./examples/mesos_ec2.py mesos_ec2.py + +ENV MESOS_HOST=master.mesos +ENV MESOS_PORT=5050 +ENV MESOS_ENDPOINT=/metrics/snapshot +ENV MIN_CPUS=1 +ENV MAX_CPUS=3 +ENV MIN_MEM=512 +ENV MAX_MEM=10000 +ENV MIN_DISK=1000 +ENV MAX_DISK=100000 +ENV EC2_REGION=us-west-2 +ENV EC2_ASG="mesos-MesosSlaveStack-1AB12345ABC-ServerGroup-789XYZ789" +ENV AUTOSCALER_LOG_LEVEL=info + +ENTRYPOINT [ "/bin/sh", "./run.sh" ] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bbb0c49 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +autoscale \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..3353a34 --- /dev/null +++ b/run.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +python ./mesos_ec2.py -u "http://${MESOS_HOST}:${MESOS_PORT}" \ + -c "${MIN_CPUS},${MAX_CPUS}" -r "${EC2_REGION}" \ + -a "${EC2_ASG}" -l "${AUTOSCALER_LOG_LEVEL}" \ + -e "${MESOS_ENDPOINT}" \ + -d "${MIN_DISK},${MAX_DISK}" -m "${MIN_MEM},${MAX_MEM}" \ No newline at end of file From 85fa244673dfdb20ad71489de101c6adbc4fe6ed Mon Sep 17 00:00:00 2001 From: Kpacha Date: Tue, 6 Oct 2015 08:37:28 +0200 Subject: [PATCH 2/3] mesos endpoint as a configurable param --- autoscale.py | 5 +++-- examples/mesos_ec2.py | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/autoscale.py b/autoscale.py index ac743c4..be5cb5d 100644 --- a/autoscale.py +++ b/autoscale.py @@ -10,9 +10,10 @@ class MesosReporter(): - def __init__(self, mesos_url): + def __init__(self, mesos_url, mesos_endpoint): self.mesos_url = mesos_url.rstrip('/') - stats_url = '/'.join([self.mesos_url, '/stats.json']) + stats_url = '/'.join([self.mesos_url, mesos_endpoint]) + logger.info('Stats url: %s', stats_url) self._state = requests.get(stats_url).json() @property diff --git a/examples/mesos_ec2.py b/examples/mesos_ec2.py index 2b3575b..2624316 100644 --- a/examples/mesos_ec2.py +++ b/examples/mesos_ec2.py @@ -10,6 +10,7 @@ def main(): parser = argparse.ArgumentParser() parser.add_argument('-l', '--log-level', default="warn", help='Log level (debug, [default] info, warn, error)') parser.add_argument('-u', '--mesos-url', help='Mesos cluster URL', required=True) + parser.add_argument('-e', '--mesos-endpoint', default="/master/snapshot", help='Mesos endpoint URL (/master/snapshot or /stats.json)') parser.add_argument('-c', '--cpus', help='Comma-delimited CPU thresholds (lower,upper)') parser.add_argument('-d', '--disk', help='Comma-delimited disk thresholds (lower,upper)') parser.add_argument('-m', '--mem', help='Comma-delimited memory thresholds (lower,upper)') @@ -32,7 +33,7 @@ def main(): lower, upper = args.mem.split(',') thresholds['mem'] = dict(lower=int(lower), upper=int(upper)) - reporter = MesosReporter(args.mesos_url) + reporter = MesosReporter(args.mesos_url, args.mesos_endpoint) decider = MesosDecider(thresholds) scaler = AwsAsgScaler(args.region, args.asg) From 4170fbcdeefb20c2f6ea7691cacc94a17b915c0e Mon Sep 17 00:00:00 2001 From: kpacha Date: Tue, 6 Oct 2015 15:55:53 +0200 Subject: [PATCH 3/3] remove the initial / from the mesos endpoint --- autoscale.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/autoscale.py b/autoscale.py index be5cb5d..2a01408 100644 --- a/autoscale.py +++ b/autoscale.py @@ -12,7 +12,8 @@ class MesosReporter(): def __init__(self, mesos_url, mesos_endpoint): self.mesos_url = mesos_url.rstrip('/') - stats_url = '/'.join([self.mesos_url, mesos_endpoint]) + self.mesos_endpoint = mesos_endpoint.lstrip('/') + stats_url = '/'.join([self.mesos_url, self.mesos_endpoint]) logger.info('Stats url: %s', stats_url) self._state = requests.get(stats_url).json()