providers/datadog/datadog_provider.go (258 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 datadog import ( "context" "errors" "fmt" "net/url" "os" "strconv" "github.com/DataDog/datadog-api-client-go/v2/api/datadog" "github.com/GoogleCloudPlatform/terraformer/terraformutils" "github.com/zclconf/go-cty/cty" ) type DatadogProvider struct { //nolint terraformutils.Provider apiKey string appKey string apiURL string validate bool auth context.Context datadogClient *datadog.APIClient } // Init check env params and initialize API Client func (p *DatadogProvider) Init(args []string) error { if args[3] != "" { validate, validateErr := strconv.ParseBool(args[3]) if validateErr != nil { return fmt.Errorf(`invalid validate arg : %v`, validateErr) } p.validate = validate } else if os.Getenv("DATADOG_VALIDATE") != "" { validate, validateErr := strconv.ParseBool(os.Getenv("DATADOG_VALIDATE")) if validateErr != nil { return fmt.Errorf(`invalid DATADOG_VALIDATE env var : %v`, validateErr) } p.validate = validate } else { p.validate = true } if args[0] != "" { p.apiKey = args[0] } else { if apiKey := os.Getenv("DATADOG_API_KEY"); apiKey != "" { p.apiKey = apiKey } else if p.validate { return errors.New("api-key requirement") } } if args[1] != "" { p.appKey = args[1] } else { if appKey := os.Getenv("DATADOG_APP_KEY"); appKey != "" { p.appKey = appKey } else if p.validate { return errors.New("app-key requirement") } } if args[2] != "" { p.apiURL = args[2] } else if v := os.Getenv("DATADOG_HOST"); v != "" { p.apiURL = v } // Initialize the Datadog V1 API client auth := context.WithValue( context.Background(), datadog.ContextAPIKeys, map[string]datadog.APIKey{ "apiKeyAuth": { Key: p.apiKey, }, "appKeyAuth": { Key: p.appKey, }, }, ) if p.apiURL != "" { parsedAPIURL, parseErr := url.Parse(p.apiURL) if parseErr != nil { return fmt.Errorf(`invalid API Url : %v`, parseErr) } if parsedAPIURL.Host == "" || parsedAPIURL.Scheme == "" { return fmt.Errorf(`missing protocol or host : %v`, p.apiURL) } // If api url is passed, set and use the api name and protocol on ServerIndex{1} auth = context.WithValue(auth, datadog.ContextServerIndex, 1) auth = context.WithValue(auth, datadog.ContextServerVariables, map[string]string{ "name": parsedAPIURL.Host, "protocol": parsedAPIURL.Scheme, }) } configV1 := datadog.NewConfiguration() datadogClient := datadog.NewAPIClient(configV1) p.auth = auth p.datadogClient = datadogClient return nil } // GetName return string of provider name for Datadog func (p *DatadogProvider) GetName() string { return "datadog" } // GetConfig return map of provider config for Datadog func (p *DatadogProvider) GetConfig() cty.Value { return cty.ObjectVal(map[string]cty.Value{ "api_key": cty.StringVal(p.apiKey), "app_key": cty.StringVal(p.appKey), "api_url": cty.StringVal(p.apiURL), "validate": cty.BoolVal(p.validate), }) } // InitService ... func (p *DatadogProvider) InitService(serviceName string, verbose bool) error { var isSupported bool if _, isSupported = p.GetSupportedService()[serviceName]; !isSupported { return errors.New(p.GetName() + ": " + serviceName + " not supported service") } p.Service = p.GetSupportedService()[serviceName] p.Service.SetName(serviceName) p.Service.SetVerbose(verbose) p.Service.SetProviderName(p.GetName()) p.Service.SetArgs(map[string]interface{}{ "api-key": p.apiKey, "app-key": p.appKey, "api-url": p.apiURL, "validate": p.validate, "auth": p.auth, "datadogClient": p.datadogClient, }) return nil } // GetSupportedService return map of support service for Datadog func (p *DatadogProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { return map[string]terraformutils.ServiceGenerator{ "dashboard_list": &DashboardListGenerator{}, "dashboard": &DashboardGenerator{}, "dashboard_json": &DashboardJSONGenerator{}, "downtime": &DowntimeGenerator{}, "logs_archive": &LogsArchiveGenerator{}, "logs_archive_order": &LogsArchiveOrderGenerator{}, "logs_custom_pipeline": &LogsCustomPipelineGenerator{}, "logs_index": &LogsIndexGenerator{}, "logs_index_order": &LogsIndexOrderGenerator{}, "logs_integration_pipeline": &LogsIntegrationPipelineGenerator{}, "logs_metric": &LogsMetricGenerator{}, "logs_pipeline_order": &LogsPipelineOrderGenerator{}, "integration_aws": &IntegrationAWSGenerator{}, "integration_aws_lambda_arn": &IntegrationAWSLambdaARNGenerator{}, "integration_aws_log_collection": &IntegrationAWSLogCollectionGenerator{}, "integration_azure": &IntegrationAzureGenerator{}, "integration_gcp": &IntegrationGCPGenerator{}, "integration_pagerduty": &IntegrationPagerdutyGenerator{}, "integration_pagerduty_service_object": &IntegrationPagerdutyServiceObjectGenerator{}, "integration_slack_channel": &IntegrationSlackChannelGenerator{}, "metric_metadata": &MetricMetadataGenerator{}, "monitor": &MonitorGenerator{}, "security_monitoring_default_rule": &SecurityMonitoringDefaultRuleGenerator{}, "security_monitoring_rule": &SecurityMonitoringRuleGenerator{}, "service_level_objective": &ServiceLevelObjectiveGenerator{}, "synthetics_test": &SyntheticsTestGenerator{}, "synthetics_global_variable": &SyntheticsGlobalVariableGenerator{}, "synthetics_private_location": &SyntheticsPrivateLocationGenerator{}, "user": &UserGenerator{}, "role": &RoleGenerator{}, } } // GetResourceConnections return map of resource connections for Datadog func (p DatadogProvider) GetResourceConnections() map[string]map[string][]string { return map[string]map[string][]string{ "dashboard": { "monitor": { "widget.alert_graph_definition.alert_id", "id", "widget.group_definition.widget.alert_graph_definition.alert_id", "id", "widget.alert_value_definition.alert_id", "id", "widget.group_definition.widget.alert_value_definition.alert_id", "id", }, "service_level_objective": { "widget.service_level_objective_definition.slo_id", "id", "widget.group_definition.widget.service_level_objective_definition.slo_id", "id", }, }, "dashboard_list": { "dashboard": { "dash_item.dash_id", "id", }, }, "downtime": { "monitor": { "monitor_id", "id", }, }, "integration_aws_lambda_arn": { "integration_aws": { "account_id", "account_id", }, }, "integration_aws_log_collection": { "integration_aws": { "account_id", "account_id", }, }, "logs_archive": { "integration_aws": { "s3.account_id", "account_id", "s3.role_name", "role_name", "s3_archive.account_id", "account_id", "s3_archive.role_name", "role_name", }, "integration_gcp": { "gcs.project_id", "project_id", "gcs.client_email", "client_email", "gcs_archive.project_id", "project_id", "gcs_archive.client_email", "client_email", }, "integration_azure": { "azure.client_id", "client_id", "azure.tenant_id", "tenant_name", "azure_archive.client_id", "client_id", "azure_archive.tenant_id", "tenant_name", }, }, "logs_archive_order": { "logs_archive": { "archive_ids", "id", }, }, "logs_index_order": { "logs_index": { "indexes", "id", }, }, "logs_pipeline_order": { "logs_integration_pipeline": { "pipelines", "id", }, "logs_custom_pipeline": { "pipelines", "id", }, }, "monitor": { "role": { "restricted_roles", "id", }, }, "service_level_objective": { "monitor": { "monitor_ids", "id", }, }, "synthetics_test": { "synthetics_private_location": { "locations", "id", }, }, "synthetics_global_variable": { "synthetics_test": { "parse_test_id", "id", }, }, "user": { "role": { "roles", "id", }, }, } } // GetProviderData return map of provider data for Datadog func (p DatadogProvider) GetProviderData(arg ...string) map[string]interface{} { return map[string]interface{}{} }