providers/gcp/monitoring.go (163 lines of code) (raw):
// Copyright 2018 The Terraformer Authors.
//
// Licensed 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.
package gcp
import (
"context"
"log"
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
"google.golang.org/api/iterator"
monitoring "cloud.google.com/go/monitoring/apiv3" // nolint
monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3"
)
var monitoringAllowEmptyValues = []string{}
var monitoringAdditionalFields = map[string]interface{}{}
type MonitoringGenerator struct {
GCPService
}
func (g *MonitoringGenerator) loadAlerts(ctx context.Context, project string) error {
client, err := monitoring.NewAlertPolicyClient(ctx)
if err != nil {
return err
}
req := &monitoringpb.ListAlertPoliciesRequest{
Name: "projects/" + project,
}
alertIterator := client.ListAlertPolicies(ctx, req)
for {
alert, err := alertIterator.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Println("error with alert:", err)
continue
}
g.Resources = append(g.Resources, terraformutils.NewResource(
alert.Name,
alert.Name,
"google_monitoring_alert_policy",
g.ProviderName,
map[string]string{
"name": alert.Name,
"project": project,
},
monitoringAllowEmptyValues,
monitoringAdditionalFields,
))
}
return nil
}
func (g *MonitoringGenerator) loadGroups(ctx context.Context, project string) error {
client, err := monitoring.NewGroupClient(ctx)
if err != nil {
return err
}
req := &monitoringpb.ListGroupsRequest{
Name: "projects/" + project,
}
groupsIterator := client.ListGroups(ctx, req)
for {
group, err := groupsIterator.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Println("error with group:", err)
continue
}
g.Resources = append(g.Resources, terraformutils.NewResource(
group.Name,
group.Name,
"google_monitoring_group",
g.ProviderName,
map[string]string{
"name": group.Name,
"project": project,
},
monitoringAllowEmptyValues,
monitoringAdditionalFields,
))
}
return nil
}
func (g *MonitoringGenerator) loadNotificationChannel(ctx context.Context, project string) error {
client, err := monitoring.NewNotificationChannelClient(ctx)
if err != nil {
return err
}
req := &monitoringpb.ListNotificationChannelsRequest{
Name: "projects/" + project,
}
notificationChannelIterator := client.ListNotificationChannels(ctx, req)
for {
notificationChannel, err := notificationChannelIterator.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Println("error with notification Channel:", err)
continue
}
g.Resources = append(g.Resources, terraformutils.NewResource(
notificationChannel.Name,
notificationChannel.Name,
"google_monitoring_notification_channel",
g.ProviderName,
map[string]string{
"name": notificationChannel.Name,
"project": project,
},
monitoringAllowEmptyValues,
monitoringAdditionalFields,
))
}
return nil
}
func (g *MonitoringGenerator) loadUptimeCheck(ctx context.Context, project string) error {
client, err := monitoring.NewUptimeCheckClient(ctx)
if err != nil {
return err
}
req := &monitoringpb.ListUptimeCheckConfigsRequest{
Parent: "projects/" + project,
}
uptimeCheckConfigsIterator := client.ListUptimeCheckConfigs(ctx, req)
for {
uptimeCheckConfigs, err := uptimeCheckConfigsIterator.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Println("error with uptimeCheckConfigs:", err)
continue
}
g.Resources = append(g.Resources, terraformutils.NewResource(
uptimeCheckConfigs.Name,
uptimeCheckConfigs.Name,
"google_monitoring_uptime_check_config",
g.ProviderName,
map[string]string{
"name": uptimeCheckConfigs.Name,
"project": project,
},
monitoringAllowEmptyValues,
monitoringAdditionalFields,
))
}
return nil
}
// Generate TerraformResources from GCP API,
// from each alert create 1 TerraformResource
// Need alert name as ID for terraform resource
func (g *MonitoringGenerator) InitResources() error {
project := g.GetArgs()["project"].(string)
ctx := context.Background()
if err := g.loadAlerts(ctx, project); err != nil {
return err
}
if err := g.loadGroups(ctx, project); err != nil {
return err
}
if err := g.loadNotificationChannel(ctx, project); err != nil {
return err
}
if err := g.loadUptimeCheck(ctx, project); err != nil {
return err
}
return nil
}