From 6beb9be42cc0109f95e2ed56761f38d0b48d910c Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Mon, 26 Oct 2015 15:25:43 +0900 Subject: [PATCH] add CloudWatch Alarm API support --- pkg/api/cloudwatch/cloudwatch.go | 80 +++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 7 deletions(-) diff --git a/pkg/api/cloudwatch/cloudwatch.go b/pkg/api/cloudwatch/cloudwatch.go index d5abe4958ea..7fdb722e72a 100644 --- a/pkg/api/cloudwatch/cloudwatch.go +++ b/pkg/api/cloudwatch/cloudwatch.go @@ -31,13 +31,15 @@ type cwRequest struct { func init() { actionHandlers = map[string]actionHandler{ - "GetMetricStatistics": handleGetMetricStatistics, - "ListMetrics": handleListMetrics, - "DescribeInstances": handleDescribeInstances, - "__GetRegions": handleGetRegions, - "__GetNamespaces": handleGetNamespaces, - "__GetMetrics": handleGetMetrics, - "__GetDimensions": handleGetDimensions, + "GetMetricStatistics": handleGetMetricStatistics, + "ListMetrics": handleListMetrics, + "DescribeAlarmsForMetric": handleDescribeAlarmsForMetric, + "DescribeAlarmHistory": handleDescribeAlarmHistory, + "DescribeInstances": handleDescribeInstances, + "__GetRegions": handleGetRegions, + "__GetNamespaces": handleGetNamespaces, + "__GetMetrics": handleGetMetrics, + "__GetDimensions": handleGetDimensions, } } @@ -137,6 +139,70 @@ func handleListMetrics(req *cwRequest, c *middleware.Context) { c.JSON(200, resp) } +func handleDescribeAlarmsForMetric(req *cwRequest, c *middleware.Context) { + svc := cloudwatch.New(&aws.Config{Region: aws.String(req.Region)}) + reqParam := &struct { + Parameters struct { + Namespace string `json:"namespace"` + MetricName string `json:"metricName"` + Dimensions []*cloudwatch.Dimension `json:"dimensions"` + Statistic string `json:"statistic"` + Period int64 `json:"period"` + } `json:"parameters"` + }{} + json.Unmarshal(req.Body, reqParam) + + params := &cloudwatch.DescribeAlarmsForMetricInput{ + Namespace: aws.String(reqParam.Parameters.Namespace), + MetricName: aws.String(reqParam.Parameters.MetricName), + Period: aws.Int64(reqParam.Parameters.Period), + } + if len(reqParam.Parameters.Dimensions) != 0 { + params.Dimensions = reqParam.Parameters.Dimensions + } + if reqParam.Parameters.Statistic != "" { + params.Statistic = aws.String(reqParam.Parameters.Statistic) + } + + resp, err := svc.DescribeAlarmsForMetric(params) + if err != nil { + c.JsonApiErr(500, "Unable to call AWS API", err) + return + } + + c.JSON(200, resp) +} + +func handleDescribeAlarmHistory(req *cwRequest, c *middleware.Context) { + svc := cloudwatch.New(&aws.Config{Region: aws.String(req.Region)}) + reqParam := &struct { + Parameters struct { + AlarmName string `json:"alarmName"` + HistoryItemType string `json:"historyItemType"` + StartDate int64 `json:"startDate"` + EndDate int64 `json:"endDate"` + } `json:"parameters"` + }{} + json.Unmarshal(req.Body, reqParam) + + params := &cloudwatch.DescribeAlarmHistoryInput{ + AlarmName: aws.String(reqParam.Parameters.AlarmName), + StartDate: aws.Time(time.Unix(reqParam.Parameters.StartDate, 0)), + EndDate: aws.Time(time.Unix(reqParam.Parameters.EndDate, 0)), + } + if reqParam.Parameters.HistoryItemType != "" { + params.HistoryItemType = aws.String(reqParam.Parameters.HistoryItemType) + } + + resp, err := svc.DescribeAlarmHistory(params) + if err != nil { + c.JsonApiErr(500, "Unable to call AWS API", err) + return + } + + c.JSON(200, resp) +} + func handleDescribeInstances(req *cwRequest, c *middleware.Context) { sess := session.New() creds := credentials.NewChainCredentials(