From 2b8a9a59f318f0c77c2e421acc3810638c6fdaeb Mon Sep 17 00:00:00 2001
From: Gregory Nagy <gergo.nagy094@gmail.com>
Date: Mon, 3 Feb 2014 17:44:03 +0100
Subject: [PATCH] Calvin.py added

---
 circle/monitor/calvin/calvin/calvin.py | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 176 insertions(+)

diff --git a/circle/monitor/calvin/calvin/calvin.py b/circle/monitor/calvin/calvin/calvin.py
index e69de29..37a50c1 100644
--- a/circle/monitor/calvin/calvin/calvin.py
+++ b/circle/monitor/calvin/calvin/calvin.py
@@ -0,0 +1,176 @@
+import requests
+import os
+
+
+class GraphiteHandler:
+	def __init__(self):
+		if os.getenv("NODE_MONITOR_SERVER") is "":
+			raise RuntimeError
+		self.__server_name = os.getenv("NODE_MONITOR_SERVER")
+		if os.getenv("NODE_MONITOR_PORT") is "":
+			raise RuntimeError
+		self.__server_port = os.getenv("NODE_MONITOR_PORT")
+		self.__queries = []
+		self.__responses = []
+
+	def put(self, query):
+		self.__queries.append(query)
+
+
+	def cleanUpQueries(self):
+		self.__queries = []
+
+
+	def cleanUpResponses(self):
+		self.__responses = []
+
+
+	def isEmpty(self):
+		return len(self.__queries) is 0
+
+
+	def generateAll(self):
+		"""
+		Regenerate the queries before sending.
+		"""
+		for query in self.__queries:
+			query.generate()
+
+
+	def send(self):
+		"""
+		Generates the corrent query for the Graphite webAPI and flush all the
+		queries in the fifo.
+		Important: After sending queries to the server the fifo will lost its
+		content.
+		"""
+		url_base = "http://%s:%s/render?" % (self.__server_name,
+		                                     self.__server_port)
+		for query in self.__queries:
+			response = requests.get(url_base + query.getGenerated())
+			if query.getFormat() is "json":
+				self.__responses.append(response.json())  # DICT
+			else:
+				self.__responses.append(response)
+		self.cleanUpQueries()
+
+
+	def pop(self):
+		"""
+		Pop the first query has got from the server.
+		"""
+		try:
+			return self.__responses.pop(0)  # Transform to dictionary
+		except:
+			raise RuntimeError
+
+
+class Query:
+	def __init__(self):
+		"""
+		Query initializaion:
+			default format is json dictionary
+			keys: ("target <string>","datapoints <list>")
+		"""
+		self.__target = ""
+		self.__metric = ""
+		self.__start = ""
+		self.__end = ""
+		self.__function = ""
+		self.__response_format = "json"
+		self.__generated = ""
+
+	def setTarget(self, target):
+		"""
+		Hostname of the target we should get the information from.
+		After the hostname you should use the domain the target is in.
+		Example: "foo.foodomain.domain.com.DOMAIN" where DOMAIN is
+		the root of the graphite server.
+		"""
+		self.__target = '.'.join(target.split('.')[::-1])
+
+	def getTarget(self):
+		return self.__target
+
+	def setMetric(self, metric):
+		self.__metric = metric
+
+	def getMetric(self):
+		return self.__metric
+
+	def setAbsoluteStart(self, year, month, day, hour, minute):
+		"""
+		Function for setting the time you want to get the reports from.
+		"""
+		if (len(year) > 4 or len(year) < 2):
+			raise
+		self.__start = hour + ":" + minute + "_" + year + month + day
+
+	def setRelativeStart(self, value, scale):
+		"""
+		Function for setting the time you want to get the reports from.
+		"""
+		if (scale not in ["years",
+		                  "months", "days", "hours", "minutes", "seconds"]):
+			raise
+		self.__start = "-" + str(value) + scale
+
+	def getStart(self):
+		return self.__start
+
+	def setAbsoluteEnd(self, year, month, day, hour, minute):
+		"""
+		Function for setting the time until you want to get the reports from.
+		"""
+		if (len(year) > 4 or len(year) < 2):
+			raise
+		self.__end = hour + ":" + minute + "_" + year + month + day
+
+	def setRelativeEnd(self, value, scale):
+		"""
+		Function for setting the time until you want to get the reports from.
+		"""
+		if (scale not in ["years",
+		                  "months", "days", "hours", "minutes", "seconds"]):
+			raise
+		self.__end = "-" + str(value) + scale
+
+	def getEnd(self):
+		return self.__end
+
+	def setFormat(self, fmat):
+		"""
+		Function for setting the format of the response from the server.
+		Valid values: ["csv", "raw", "json"]
+		"""
+		valid_formats = ["csv", "raw", "json"]
+		if fmat not in valid_formats:
+			raise
+		self.__response_format = fmat
+
+	def getFormat(self):
+		return self.__response_format
+
+	def generate(self):
+		"""
+		You must always call this function before sending the metric to the
+		server for it generates the valid format that the graphite API can
+		parse.
+		"""
+		tmp = "target=" + self.__target + "." + self.__metric
+		if len(self.__start) is not 0:
+			tmp = tmp + "&from=" + self.__start
+		if len(self.__end) is not 0:
+			tmp = tmp + "&until=" + self.__end
+		tmp = tmp + "&format=" + self.__response_format
+		self.__generated = tmp
+		return self.__generated
+
+	def getGenerated(self):
+		"""
+		Returns the generated query string.
+		Throws exception if it haven't been done yet.
+		"""
+		if len(self.__generated) is 0:
+			raise
+		return self.__generated
--
libgit2 0.26.0