From e32991a3bc01064fd23b268adf0e31a1a93d9f5d Mon Sep 17 00:00:00 2001 From: Adam Tyler Date: Tue, 9 Aug 2022 20:52:25 -0400 Subject: [PATCH 1/5] feat: Add support for EventBridge --- client/client.go | 3 + client/mocks/mock_eventbridge.go | 96 +++++++++ client/services.go | 8 + .../tables/aws_eventbridge_event_bus_rules.md | 17 ++ docs/tables/aws_eventbridge_event_buses.md | 12 ++ go.mod | 11 +- go.sum | 17 +- resources/provider/provider.go | 2 + resources/services/eventbridge/event_buses.go | 192 ++++++++++++++++++ .../eventbridge/event_buses_mock_test.go | 52 +++++ resources/services/eventbridge/gen.hcl | 60 ++++++ terraform/eventbridge/local/main.tf | 4 + terraform/eventbridge/local/variables.tf | 8 + .../eventbridge/modules/test/eventbridge.tf | 13 ++ .../eventbridge/modules/test/provider.tf | 3 + .../eventbridge/modules/test/terraform.tf | 9 + .../eventbridge/modules/test/variables.tf | 15 ++ terraform/eventbridge/prod/main.tf | 4 + terraform/eventbridge/prod/terraform.tf | 7 + 19 files changed, 523 insertions(+), 10 deletions(-) create mode 100644 client/mocks/mock_eventbridge.go create mode 100644 docs/tables/aws_eventbridge_event_bus_rules.md create mode 100644 docs/tables/aws_eventbridge_event_buses.md create mode 100644 resources/services/eventbridge/event_buses.go create mode 100644 resources/services/eventbridge/event_buses_mock_test.go create mode 100644 resources/services/eventbridge/gen.hcl create mode 100644 terraform/eventbridge/local/main.tf create mode 100644 terraform/eventbridge/local/variables.tf create mode 100644 terraform/eventbridge/modules/test/eventbridge.tf create mode 100644 terraform/eventbridge/modules/test/provider.tf create mode 100644 terraform/eventbridge/modules/test/terraform.tf create mode 100644 terraform/eventbridge/modules/test/variables.tf create mode 100644 terraform/eventbridge/prod/main.tf create mode 100644 terraform/eventbridge/prod/terraform.tf diff --git a/client/client.go b/client/client.go index 24c81b55f..d6b7f627c 100644 --- a/client/client.go +++ b/client/client.go @@ -46,6 +46,7 @@ import ( elbv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2" "github.com/aws/aws-sdk-go-v2/service/elasticsearchservice" "github.com/aws/aws-sdk-go-v2/service/emr" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" "github.com/aws/aws-sdk-go-v2/service/fsx" "github.com/aws/aws-sdk-go-v2/service/glue" "github.com/aws/aws-sdk-go-v2/service/guardduty" @@ -152,6 +153,7 @@ type Services struct { ELBv1 ElbV1Client ELBv2 ElbV2Client EMR EmrClient + EventBridge EventBridgeClient FSX FsxClient Glue GlueClient GuardDuty GuardDutyClient @@ -651,6 +653,7 @@ func initServices(region string, c aws.Config) Services { ELBv1: elbv1.NewFromConfig(awsCfg), ELBv2: elbv2.NewFromConfig(awsCfg), EMR: emr.NewFromConfig(awsCfg), + EventBridge: eventbridge.NewFromConfig(awsCfg), FSX: fsx.NewFromConfig(awsCfg), Glue: glue.NewFromConfig(awsCfg), GuardDuty: guardduty.NewFromConfig(awsCfg), diff --git a/client/mocks/mock_eventbridge.go b/client/mocks/mock_eventbridge.go new file mode 100644 index 000000000..1464b7968 --- /dev/null +++ b/client/mocks/mock_eventbridge.go @@ -0,0 +1,96 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/cloudquery/cq-provider-aws/client (interfaces: EventBridgeClient) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + eventbridge "github.com/aws/aws-sdk-go-v2/service/eventbridge" + gomock "github.com/golang/mock/gomock" +) + +// MockEventBridgeClient is a mock of EventBridgeClient interface. +type MockEventBridgeClient struct { + ctrl *gomock.Controller + recorder *MockEventBridgeClientMockRecorder +} + +// MockEventBridgeClientMockRecorder is the mock recorder for MockEventBridgeClient. +type MockEventBridgeClientMockRecorder struct { + mock *MockEventBridgeClient +} + +// NewMockEventBridgeClient creates a new mock instance. +func NewMockEventBridgeClient(ctrl *gomock.Controller) *MockEventBridgeClient { + mock := &MockEventBridgeClient{ctrl: ctrl} + mock.recorder = &MockEventBridgeClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockEventBridgeClient) EXPECT() *MockEventBridgeClientMockRecorder { + return m.recorder +} + +// ListEventBuses mocks base method. +func (m *MockEventBridgeClient) ListEventBuses(arg0 context.Context, arg1 *eventbridge.ListEventBusesInput, arg2 ...func(*eventbridge.Options)) (*eventbridge.ListEventBusesOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListEventBuses", varargs...) + ret0, _ := ret[0].(*eventbridge.ListEventBusesOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListEventBuses indicates an expected call of ListEventBuses. +func (mr *MockEventBridgeClientMockRecorder) ListEventBuses(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListEventBuses", reflect.TypeOf((*MockEventBridgeClient)(nil).ListEventBuses), varargs...) +} + +// ListRules mocks base method. +func (m *MockEventBridgeClient) ListRules(arg0 context.Context, arg1 *eventbridge.ListRulesInput, arg2 ...func(*eventbridge.Options)) (*eventbridge.ListRulesOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListRules", varargs...) + ret0, _ := ret[0].(*eventbridge.ListRulesOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListRules indicates an expected call of ListRules. +func (mr *MockEventBridgeClientMockRecorder) ListRules(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListRules", reflect.TypeOf((*MockEventBridgeClient)(nil).ListRules), varargs...) +} + +// ListTagsForResource mocks base method. +func (m *MockEventBridgeClient) ListTagsForResource(arg0 context.Context, arg1 *eventbridge.ListTagsForResourceInput, arg2 ...func(*eventbridge.Options)) (*eventbridge.ListTagsForResourceOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListTagsForResource", varargs...) + ret0, _ := ret[0].(*eventbridge.ListTagsForResourceOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTagsForResource indicates an expected call of ListTagsForResource. +func (mr *MockEventBridgeClientMockRecorder) ListTagsForResource(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0, arg1}, arg2...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListTagsForResource", reflect.TypeOf((*MockEventBridgeClient)(nil).ListTagsForResource), varargs...) +} diff --git a/client/services.go b/client/services.go index e27916afd..51de61c14 100644 --- a/client/services.go +++ b/client/services.go @@ -36,6 +36,7 @@ import ( elbv2 "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2" "github.com/aws/aws-sdk-go-v2/service/elasticsearchservice" "github.com/aws/aws-sdk-go-v2/service/emr" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" "github.com/aws/aws-sdk-go-v2/service/fsx" "github.com/aws/aws-sdk-go-v2/service/glue" "github.com/aws/aws-sdk-go-v2/service/guardduty" @@ -790,3 +791,10 @@ type KinesisClient interface { ListStreams(ctx context.Context, params *kinesis.ListStreamsInput, optFns ...func(*kinesis.Options)) (*kinesis.ListStreamsOutput, error) ListTagsForStream(ctx context.Context, params *kinesis.ListTagsForStreamInput, optFns ...func(*kinesis.Options)) (*kinesis.ListTagsForStreamOutput, error) } + +//go:generate mockgen -package=mocks -destination=./mocks/mock_eventbridge.go . EventBridgeClient +type EventBridgeClient interface { + ListEventBuses(ctx context.Context, params *eventbridge.ListEventBusesInput, optFns ...func(*eventbridge.Options)) (*eventbridge.ListEventBusesOutput, error) + ListRules(ctx context.Context, params *eventbridge.ListRulesInput, optFns ...func(*eventbridge.Options)) (*eventbridge.ListRulesOutput, error) + ListTagsForResource(ctx context.Context, params *eventbridge.ListTagsForResourceInput, optFns ...func(*eventbridge.Options)) (*eventbridge.ListTagsForResourceOutput, error) +} diff --git a/docs/tables/aws_eventbridge_event_bus_rules.md b/docs/tables/aws_eventbridge_event_bus_rules.md new file mode 100644 index 000000000..b658c93a9 --- /dev/null +++ b/docs/tables/aws_eventbridge_event_bus_rules.md @@ -0,0 +1,17 @@ + +# Table: aws_eventbridge_event_bus_rules +Contains information about a rule in Amazon EventBridge +## Columns +| Name | Type | Description | +| ------------- | ------------- | ----- | +|event_bus_cq_id|uuid|Unique CloudQuery ID of aws_eventbridge_event_buses table (FK)| +|tags|jsonb|| +|arn|text|The Amazon Resource Name (ARN) of the rule| +|description|text|The description of the rule| +|event_bus_name|text|The name or ARN of the event bus associated with the rule| +|event_pattern|text|The event pattern of the rule| +|managed_by|text|If the rule was created on behalf of your account by an Amazon Web Services service, this field displays the principal name of the service that created the rule| +|name|text|The name of the rule| +|role_arn|text|The Amazon Resource Name (ARN) of the role that is used for target invocation If you're setting an event bus in another account as the target and that account granted permission to your account through an organization instead of directly by the account ID, you must specify a RoleArn with proper permissions in the Target structure, instead of here in this parameter| +|schedule_expression|text|The scheduling expression| +|state|text|The state of the rule| diff --git a/docs/tables/aws_eventbridge_event_buses.md b/docs/tables/aws_eventbridge_event_buses.md new file mode 100644 index 000000000..37d8b2805 --- /dev/null +++ b/docs/tables/aws_eventbridge_event_buses.md @@ -0,0 +1,12 @@ + +# Table: aws_eventbridge_event_buses +An event bus receives events from a source and routes them to rules associated with that event bus +## Columns +| Name | Type | Description | +| ------------- | ------------- | ----- | +|account_id|text|The AWS Account ID of the resource.| +|region|text|The AWS Region of the resource.| +|tags|jsonb|| +|arn|text|The ARN of the event bus| +|name|text|The name of the event bus| +|policy|text|The permissions policy of the event bus, describing which other Amazon Web Services accounts can write events to this event bus| diff --git a/go.mod b/go.mod index 5aea81178..a3cd73e6e 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/cloudquery/cq-provider-aws go 1.18 require ( - github.com/aws/aws-sdk-go-v2 v1.16.8 + github.com/aws/aws-sdk-go-v2 v1.16.10 github.com/aws/aws-sdk-go-v2/config v1.15.14 github.com/aws/aws-sdk-go-v2/credentials v1.12.9 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.20 @@ -66,7 +66,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/wafv2 v1.20.4 github.com/aws/aws-sdk-go-v2/service/workspaces v1.19.1 github.com/aws/aws-sdk-go-v2/service/xray v1.13.8 - github.com/aws/smithy-go v1.12.0 + github.com/aws/smithy-go v1.12.1 github.com/basgys/goxml2json v1.1.0 github.com/bxcodec/faker v2.0.1+incompatible github.com/cloudquery/cq-gen v0.0.8 @@ -85,7 +85,8 @@ require ( require ( github.com/BurntSushi/toml v1.2.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.8 // indirect + github.com/aws/aws-sdk-go-v2/service/eventbridge v1.16.8 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.9 // indirect github.com/bitly/go-simplejson v0.5.0 // indirect github.com/elliotchance/orderedmap v1.4.0 // indirect @@ -104,8 +105,8 @@ require ( github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.8 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.11 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15 // indirect github.com/aws/aws-sdk-go-v2/service/athena v1.16.0 github.com/aws/aws-sdk-go-v2/service/backup v1.16.3 diff --git a/go.sum b/go.sum index 2dd5d2868..f7a1fc422 100644 --- a/go.sum +++ b/go.sum @@ -56,8 +56,9 @@ github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6 github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/aws/aws-sdk-go-v2 v1.16.6/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= github.com/aws/aws-sdk-go-v2 v1.16.7/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= -github.com/aws/aws-sdk-go-v2 v1.16.8 h1:gOe9UPR98XSf7oEJCcojYg+N2/jCRm4DdeIsP85pIyQ= github.com/aws/aws-sdk-go-v2 v1.16.8/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw= +github.com/aws/aws-sdk-go-v2 v1.16.10 h1:+yDD0tcuHRQZgqONkpDwzepqmElQaSlFPymHRHR9mrc= +github.com/aws/aws-sdk-go-v2 v1.16.10/go.mod h1:WTACcleLz6VZTp7fak4EO5b9Q4foxbn+8PIz3PmyKlo= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3 h1:S/ZBwevQkr7gv5YxONYpGQxlMFFYSRfz3RMcjsC9Qhk= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.3/go.mod h1:gNsR5CaXKmQSSzrmGxmwmct/r+ZBfbxorAuXYsj/M5Y= github.com/aws/aws-sdk-go-v2/config v1.15.14 h1:+BqpqlydTq4c2et9Daury7gE+o67P4lbk7eybiCBNc4= @@ -70,16 +71,19 @@ github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.20 h1:J7/+NFr8N7ebaC/Khie8 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.20/go.mod h1:IOgK2DAat3WO2qAaPmIzTdF+QqL18samL3dqZdjRBZI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.13/go.mod h1:wLLesU+LdMZDM3U0PP9vZXJW39zmD/7L4nY2pSrYZ/g= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14/go.mod h1:kdjrMwHwrC3+FsKhNcCMJ7tUVj/8uSD5CZXeQ4wV6fM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.15 h1:bx5F2mr6H6FC7zNIQoDoUr8wEKnvmwRncujT3FYRtic= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.15/go.mod h1:pWrr2OoHlT7M/Pd2y4HV3gJyPb3qj5qMmnPkKSNPYK4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.17 h1:U8DZvyFFesBmK62dYC6BRXm4Cd/wPP3aPcecu3xv/F4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.17/go.mod h1:6qtGip7sJEyvgsLjphRZWF9qPe3xJf1mL/MM01E35Wc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.7/go.mod h1:93Uot80ddyVzSl//xEJreNKMhxntr71WtR3v/A1cRYk= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.8/go.mod h1:ZIV8GYoC6WLBW5KGs+o4rsc65/ozd+eQ0L31XF5VDwk= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.9 h1:5sbyznZC2TeFpa4fvtpvpcGbzeXEEs1l1Jo51ynUNsQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.9/go.mod h1:08tUpeSGN33QKSO7fwxXczNfiwCpbj+GxK6XKwqWVv0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.11 h1:GMp98usVW5tzQhxd26KWhoNQPlR2noIlfbzqjVGBhLU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.11/go.mod h1:cYAfnB+9ZkmZWpQWmPDsuIGm4EA+6k2ZVtxKjw/XJBY= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15 h1:QquxR7NH3ULBsKC+NoTpilzbKKS+5AELfNREInbhvas= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.15/go.mod h1:Tkrthp/0sNBShQQsamR7j/zY4p19tVTAs+nnqhH6R3c= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.5 h1:tEEHn+PGAxRVqMPEhtU8oCSW/1Ge3zP5nUgPrGQNUPs= github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.5/go.mod h1:aIwFF3dUk95ocCcA3zfk3nhz0oLkpzHFWuMp8l/4nNs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.8 h1:9PY5a+kHQzC6d9eR+KLNSJP3DHDLYmPFA5/+eSDBo9o= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.8/go.mod h1:pcQfUOFVK4lMnSzgX3dCA81UsA9YCilRUSYgkjSU2i8= github.com/aws/aws-sdk-go-v2/service/accessanalyzer v1.15.8 h1:5P7QmaYl7Q0wcSUK8Cuvvijm51fw7STKl+s1YmmOMWo= github.com/aws/aws-sdk-go-v2/service/accessanalyzer v1.15.8/go.mod h1:YKtx2MNPsEyWsZTeyZYhory0lwpm8Qn/jgjUvNnUE/8= github.com/aws/aws-sdk-go-v2/service/acm v1.14.8 h1:4JNBqDNPNp+0ZLZMIaY8iMwZ9czfd8RseQOb3MhxuaY= @@ -146,6 +150,8 @@ github.com/aws/aws-sdk-go-v2/service/elasticsearchservice v1.15.7 h1:X2y6k6CLSpV github.com/aws/aws-sdk-go-v2/service/elasticsearchservice v1.15.7/go.mod h1:w2COcofMWoC7brXNfjcuZj4PGzaAL5FOdEBSBMokr0I= github.com/aws/aws-sdk-go-v2/service/emr v1.20.0 h1:2xjz2hES5SnQLgmW1bBVdVz6j0mjXyy7/4lrq2W/0j8= github.com/aws/aws-sdk-go-v2/service/emr v1.20.0/go.mod h1:OVVv6VrQG33CuCR+V0GiaBuWbwYGogGxWGi9TDrM2yk= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.16.8 h1:RE7eIYoWMJRqMNM8cdQfEOV0ruexieh/J3yM3PYh+HU= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.16.8/go.mod h1:ShtRcolaihIMdVmjL7qqWXkOlMCz64L3XfjaeEBXnTg= github.com/aws/aws-sdk-go-v2/service/fsx v1.24.2 h1:8ko+AFpvJUbpjtCIEgtaXcXtndkZBi0N7e2ePGocqf8= github.com/aws/aws-sdk-go-v2/service/fsx v1.24.2/go.mod h1:K3Ym90NBYdXV+BCHvpuiDXCeMAtayFdiGdJ0I1uop5Q= github.com/aws/aws-sdk-go-v2/service/glue v1.28.1 h1:rG+jzafWyw73tdv+48e4jZYyehihEORcEcqzyBbZUGA= @@ -222,8 +228,9 @@ github.com/aws/aws-sdk-go-v2/service/workspaces v1.19.1 h1:9RPddc77OH7e7JNYlUyZd github.com/aws/aws-sdk-go-v2/service/workspaces v1.19.1/go.mod h1:osYwY68aqK2yF7/uBKhf6TTT9PP1h2lpaHBMwku4OiA= github.com/aws/aws-sdk-go-v2/service/xray v1.13.8 h1:dUvwdvAQT1CGzJZkM6k7WOK8DqKgHAJIPndcU6wWKMU= github.com/aws/aws-sdk-go-v2/service/xray v1.13.8/go.mod h1:7lySrwul/Rp89ZBnZqSiALFosEFiYyLvBR32ze0DUPI= -github.com/aws/smithy-go v1.12.0 h1:gXpeZel/jPoWQ7OEmLIgCUnhkFftqNfwWUwAHSlp1v0= github.com/aws/smithy-go v1.12.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.12.1 h1:yQRC55aXN/y1W10HgwHle01DRuV9Dpf31iGkotjt3Ag= +github.com/aws/smithy-go v1.12.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/basgys/goxml2json v1.1.0 h1:4ln5i4rseYfXNd86lGEB+Vi652IsIXIvggKM/BhUKVw= github.com/basgys/goxml2json v1.1.0/go.mod h1:wH7a5Np/Q4QoECFIU8zTQlZwZkrilY0itPfecMw41Dw= github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= diff --git a/resources/provider/provider.go b/resources/provider/provider.go index d506dcd58..be189d8c9 100644 --- a/resources/provider/provider.go +++ b/resources/provider/provider.go @@ -36,6 +36,7 @@ import ( "github.com/cloudquery/cq-provider-aws/resources/services/elbv1" "github.com/cloudquery/cq-provider-aws/resources/services/elbv2" "github.com/cloudquery/cq-provider-aws/resources/services/emr" + "github.com/cloudquery/cq-provider-aws/resources/services/eventbridge" "github.com/cloudquery/cq-provider-aws/resources/services/fsx" "github.com/cloudquery/cq-provider-aws/resources/services/glue" "github.com/cloudquery/cq-provider-aws/resources/services/guardduty" @@ -170,6 +171,7 @@ func Provider() *provider.Provider { "elbv2.target_groups": elbv2.Elbv2TargetGroups(), "emr.block_public_access_configs": emr.EmrBlockPublicAccessConfigs(), "emr.clusters": emr.EmrClusters(), + "eventbridge.event_buses": eventbridge.EventBuses(), "fsx.backups": fsx.FsxBackups(), "glue.classifiers": glue.Classifiers(), "glue.connections": glue.Connections(), diff --git a/resources/services/eventbridge/event_buses.go b/resources/services/eventbridge/event_buses.go new file mode 100644 index 000000000..8a708329d --- /dev/null +++ b/resources/services/eventbridge/event_buses.go @@ -0,0 +1,192 @@ +package eventbridge + +import ( + "context" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" + "github.com/aws/aws-sdk-go-v2/service/eventbridge/types" + "github.com/cloudquery/cq-provider-aws/client" + "github.com/cloudquery/cq-provider-sdk/provider/diag" + "github.com/cloudquery/cq-provider-sdk/provider/schema" +) + +//go:generate cq-gen --resource event_buses --config gen.hcl --output . +func EventBuses() *schema.Table { + return &schema.Table{ + Name: "aws_eventbridge_event_buses", + Description: "An event bus receives events from a source and routes them to rules associated with that event bus", + Resolver: fetchEventbridgeEventBuses, + Multiplex: client.ServiceAccountRegionMultiplexer("appsync"), + IgnoreError: client.IgnoreCommonErrors, + DeleteFilter: client.DeleteAccountRegionFilter, + Options: schema.TableCreationOptions{PrimaryKeys: []string{"arn"}}, + Columns: []schema.Column{ + { + Name: "account_id", + Description: "The AWS Account ID of the resource.", + Type: schema.TypeString, + Resolver: client.ResolveAWSAccount, + }, + { + Name: "region", + Description: "The AWS Region of the resource.", + Type: schema.TypeString, + Resolver: client.ResolveAWSRegion, + }, + { + Name: "tags", + Type: schema.TypeJSON, + Resolver: resolveEventbridgeEventBusTags, + }, + { + Name: "arn", + Description: "The ARN of the event bus", + Type: schema.TypeString, + }, + { + Name: "name", + Description: "The name of the event bus", + Type: schema.TypeString, + }, + { + Name: "policy", + Description: "The permissions policy of the event bus, describing which other Amazon Web Services accounts can write events to this event bus", + Type: schema.TypeString, + }, + }, + Relations: []*schema.Table{ + { + Name: "aws_eventbridge_event_bus_rules", + Description: "Contains information about a rule in Amazon EventBridge", + Resolver: fetchEventbridgeEventBusRules, + Options: schema.TableCreationOptions{PrimaryKeys: []string{"event_bus_cq_id", "arn"}}, + Columns: []schema.Column{ + { + Name: "event_bus_cq_id", + Description: "Unique CloudQuery ID of aws_eventbridge_event_buses table (FK)", + Type: schema.TypeUUID, + Resolver: schema.ParentIdResolver, + }, + { + Name: "tags", + Type: schema.TypeJSON, + Resolver: resolveEventbridgeEventBusRuleTags, + }, + { + Name: "arn", + Description: "The Amazon Resource Name (ARN) of the rule", + Type: schema.TypeString, + }, + { + Name: "description", + Description: "The description of the rule", + Type: schema.TypeString, + }, + { + Name: "event_bus_name", + Description: "The name or ARN of the event bus associated with the rule", + Type: schema.TypeString, + }, + { + Name: "event_pattern", + Description: "The event pattern of the rule", + Type: schema.TypeString, + }, + { + Name: "managed_by", + Description: "If the rule was created on behalf of your account by an Amazon Web Services service, this field displays the principal name of the service that created the rule", + Type: schema.TypeString, + }, + { + Name: "name", + Description: "The name of the rule", + Type: schema.TypeString, + }, + { + Name: "role_arn", + Description: "The Amazon Resource Name (ARN) of the role that is used for target invocation If you're setting an event bus in another account as the target and that account granted permission to your account through an organization instead of directly by the account ID, you must specify a RoleArn with proper permissions in the Target structure, instead of here in this parameter", + Type: schema.TypeString, + }, + { + Name: "schedule_expression", + Description: "The scheduling expression", + Type: schema.TypeString, + }, + { + Name: "state", + Description: "The state of the rule", + Type: schema.TypeString, + }, + }, + }, + }, + } +} + +// ==================================================================================================================== +// Table Resolver Functions +// ==================================================================================================================== + +func fetchEventbridgeEventBuses(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + var input eventbridge.ListEventBusesInput + c := meta.(*client.Client) + svc := c.Services().EventBridge + for { + response, err := svc.ListEventBuses(ctx, &input) + if err != nil { + return diag.WrapError(err) + } + res <- response.EventBuses + if aws.ToString(response.NextToken) == "" { + break + } + input.NextToken = response.NextToken + } + return nil +} +func resolveEventbridgeEventBusTags(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error { + eventBusArn := resource.Item.(types.EventBus).Arn + return resolveEventBridgeTags(ctx, meta, resource, c, *eventBusArn) +} +func fetchEventbridgeEventBusRules(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + p := parent.Item.(types.EventBus) + input := eventbridge.ListRulesInput{ + EventBusName: p.Arn, + } + c := meta.(*client.Client) + svc := c.Services().EventBridge + for { + response, err := svc.ListRules(ctx, &input) + if err != nil { + return diag.WrapError(err) + } + res <- response.Rules + if aws.ToString(response.NextToken) == "" { + break + } + input.NextToken = response.NextToken + } + return nil +} +func resolveEventbridgeEventBusRuleTags(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error { + eventBusArn := resource.Item.(types.Rule).Arn + return resolveEventBridgeTags(ctx, meta, resource, c, *eventBusArn) +} + +// ==================================================================================================================== +// User Defined Helpers +// ==================================================================================================================== + +func resolveEventBridgeTags(ctx context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column, resourceArn string) error { + cl := meta.(*client.Client) + svc := cl.Services().EventBridge + input := eventbridge.ListTagsForResourceInput{ + ResourceARN: &resourceArn, + } + output, err := svc.ListTagsForResource(ctx, &input) + if err != nil { + return diag.WrapError(err) + } + return diag.WrapError(resource.Set(c.Name, client.TagsToMap(output.Tags))) +} diff --git a/resources/services/eventbridge/event_buses_mock_test.go b/resources/services/eventbridge/event_buses_mock_test.go new file mode 100644 index 000000000..59c523698 --- /dev/null +++ b/resources/services/eventbridge/event_buses_mock_test.go @@ -0,0 +1,52 @@ +package eventbridge + +import ( + "testing" + + "github.com/aws/aws-sdk-go-v2/service/eventbridge" + "github.com/aws/aws-sdk-go-v2/service/eventbridge/types" + "github.com/cloudquery/cq-provider-aws/client" + "github.com/cloudquery/cq-provider-aws/client/mocks" + "github.com/cloudquery/faker/v3" + "github.com/golang/mock/gomock" +) + +func buildEventBridgeEventBusesMock(t *testing.T, ctrl *gomock.Controller) client.Services { + m := mocks.NewMockEventBridgeClient(ctrl) + bus := types.EventBus{} + err := faker.FakeData(&bus) + if err != nil { + t.Fatal(err) + } + + rule := types.Rule{} + err = faker.FakeData(&rule) + if err != nil { + t.Fatal(err) + } + + tags := eventbridge.ListTagsForResourceOutput{} + err = faker.FakeData(&tags) + if err != nil { + t.Fatal(err) + } + + m.EXPECT().ListEventBuses(gomock.Any(), gomock.Any(), gomock.Any()).Return( + &eventbridge.ListEventBusesOutput{ + EventBuses: []types.EventBus{bus}, + }, nil) + m.EXPECT().ListRules(gomock.Any(), gomock.Any(), gomock.Any()).Return( + &eventbridge.ListRulesOutput{ + Rules: []types.Rule{rule}, + }, nil) + m.EXPECT().ListTagsForResource(gomock.Any(), gomock.Any(), gomock.Any()).MinTimes(2).Return( + &tags, nil) + + return client.Services{ + EventBridge: m, + } +} + +func TestEventBridgeEventBuses(t *testing.T) { + client.AwsMockTestHelper(t, EventBuses(), buildEventBridgeEventBusesMock, client.TestOptions{}) +} diff --git a/resources/services/eventbridge/gen.hcl b/resources/services/eventbridge/gen.hcl new file mode 100644 index 000000000..d0df78c21 --- /dev/null +++ b/resources/services/eventbridge/gen.hcl @@ -0,0 +1,60 @@ +service = "aws" +output_directory = "." +add_generate = true + +description_modifier "remove_read_only" { + words = [" This member is required."] +} + +resource "aws" "eventbridge" "event_buses" { + path = "github.com/aws/aws-sdk-go-v2/service/eventbridge/types.EventBus" + + ignoreError "IgnoreCommonErrors" { + path = "github.com/cloudquery/cq-provider-aws/client.IgnoreCommonErrors" + } + multiplex "AwsAccountRegion" { + path = "github.com/cloudquery/cq-provider-aws/client.ServiceAccountRegionMultiplexer" + params = ["events"] + } + deleteFilter "AccountRegionFilter" { + path = "github.com/cloudquery/cq-provider-aws/client.DeleteAccountRegionFilter" + } + + options { + primary_keys = ["arn"] + } + + userDefinedColumn "account_id" { + type = "string" + description = "The AWS Account ID of the resource." + resolver "resolveAWSAccount" { + path = "github.com/cloudquery/cq-provider-aws/client.ResolveAWSAccount" + } + } + userDefinedColumn "region" { + type = "string" + description = "The AWS Region of the resource." + resolver "resolveAWSRegion" { + path = "github.com/cloudquery/cq-provider-aws/client.ResolveAWSRegion" + } + } + userDefinedColumn "tags" { + type = "json" + generate_resolver = true + } + + user_relation "aws" "eventbridge" "rules" { + path = "github.com/aws/aws-sdk-go-v2/service/eventbridge/types.Rule" + options { + primary_keys = [ + "event_bus_cq_id", + "arn" + ] + } + + userDefinedColumn "tags" { + type = "json" + generate_resolver = true + } + } +} diff --git a/terraform/eventbridge/local/main.tf b/terraform/eventbridge/local/main.tf new file mode 100644 index 000000000..21bb27978 --- /dev/null +++ b/terraform/eventbridge/local/main.tf @@ -0,0 +1,4 @@ +module "demo" { + source = "../modules/test" + prefix = var.prefix +} \ No newline at end of file diff --git a/terraform/eventbridge/local/variables.tf b/terraform/eventbridge/local/variables.tf new file mode 100644 index 000000000..97b504923 --- /dev/null +++ b/terraform/eventbridge/local/variables.tf @@ -0,0 +1,8 @@ +variable "prefix" { + description = "Prefix to use for all name resources" + type = string + validation { + condition = length(var.prefix) == 2 + error_message = "The prefix should be exactly two characters." + } +} diff --git a/terraform/eventbridge/modules/test/eventbridge.tf b/terraform/eventbridge/modules/test/eventbridge.tf new file mode 100644 index 000000000..d35b82792 --- /dev/null +++ b/terraform/eventbridge/modules/test/eventbridge.tf @@ -0,0 +1,13 @@ +module "eventbridge" { + source = "terraform-aws-modules/eventbridge/aws" + bus_name = "${var.prefix}-bus" + create_targets = false + tags = var.tags + + rules = { + logs = { + description = "Capture log data" + event_pattern = jsonencode({ "source" : ["my.app.logs"] }) + } + } +} \ No newline at end of file diff --git a/terraform/eventbridge/modules/test/provider.tf b/terraform/eventbridge/modules/test/provider.tf new file mode 100644 index 000000000..e70fb2fc9 --- /dev/null +++ b/terraform/eventbridge/modules/test/provider.tf @@ -0,0 +1,3 @@ +provider "aws" { + region = "us-east-1" +} \ No newline at end of file diff --git a/terraform/eventbridge/modules/test/terraform.tf b/terraform/eventbridge/modules/test/terraform.tf new file mode 100644 index 000000000..0518c15da --- /dev/null +++ b/terraform/eventbridge/modules/test/terraform.tf @@ -0,0 +1,9 @@ +terraform { + required_version = ">= 0.15" + required_providers { + aws = { + source = "hashicorp/aws" + version = ">= 3.74.0" + } + } +} \ No newline at end of file diff --git a/terraform/eventbridge/modules/test/variables.tf b/terraform/eventbridge/modules/test/variables.tf new file mode 100644 index 000000000..456eb670d --- /dev/null +++ b/terraform/eventbridge/modules/test/variables.tf @@ -0,0 +1,15 @@ +variable "prefix" { + description = "Prefix to use for all name resources" + type = string + validation { + condition = length(var.prefix) == 2 + error_message = "The prefix should be exactly two characters." + } +} + +variable "tags" { + type = map(any) + default = { + Environment = "cq-provider-aws" + } +} diff --git a/terraform/eventbridge/prod/main.tf b/terraform/eventbridge/prod/main.tf new file mode 100644 index 000000000..380fd1e95 --- /dev/null +++ b/terraform/eventbridge/prod/main.tf @@ -0,0 +1,4 @@ +module "demo" { + source = "../modules/test" + prefix = "cq" +} \ No newline at end of file diff --git a/terraform/eventbridge/prod/terraform.tf b/terraform/eventbridge/prod/terraform.tf new file mode 100644 index 000000000..e69173f2d --- /dev/null +++ b/terraform/eventbridge/prod/terraform.tf @@ -0,0 +1,7 @@ +terraform { + backend "s3" { + bucket = "cq-provider-aws-tf" + key = "eventbridge" + region = "us-east-1" + } +} From 845b6200707c03f7501eb1d9d11237ee28c43263 Mon Sep 17 00:00:00 2001 From: Adam Tyler Date: Tue, 9 Aug 2022 20:54:52 -0400 Subject: [PATCH 2/5] Rerun cq-gen --- resources/services/eventbridge/event_buses.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/services/eventbridge/event_buses.go b/resources/services/eventbridge/event_buses.go index 8a708329d..fa1d08140 100644 --- a/resources/services/eventbridge/event_buses.go +++ b/resources/services/eventbridge/event_buses.go @@ -17,7 +17,7 @@ func EventBuses() *schema.Table { Name: "aws_eventbridge_event_buses", Description: "An event bus receives events from a source and routes them to rules associated with that event bus", Resolver: fetchEventbridgeEventBuses, - Multiplex: client.ServiceAccountRegionMultiplexer("appsync"), + Multiplex: client.ServiceAccountRegionMultiplexer("events"), IgnoreError: client.IgnoreCommonErrors, DeleteFilter: client.DeleteAccountRegionFilter, Options: schema.TableCreationOptions{PrimaryKeys: []string{"arn"}}, From 649142e9729b2d87b0580830fc679b614af38a40 Mon Sep 17 00:00:00 2001 From: bbernays Date: Wed, 10 Aug 2022 10:47:59 -0500 Subject: [PATCH 3/5] Update resources/services/eventbridge/gen.hcl --- resources/services/eventbridge/gen.hcl | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/services/eventbridge/gen.hcl b/resources/services/eventbridge/gen.hcl index d0df78c21..ea8f3925a 100644 --- a/resources/services/eventbridge/gen.hcl +++ b/resources/services/eventbridge/gen.hcl @@ -1,3 +1,4 @@ +//check-for-changes service = "aws" output_directory = "." add_generate = true From a303ad2be424aacbfc785d1947aa2f6eee8fcecb Mon Sep 17 00:00:00 2001 From: Adam Tyler Date: Thu, 11 Aug 2022 23:47:54 -0400 Subject: [PATCH 4/5] Remove primary keys --- resources/services/eventbridge/gen.hcl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/resources/services/eventbridge/gen.hcl b/resources/services/eventbridge/gen.hcl index ea8f3925a..f8fd16149 100644 --- a/resources/services/eventbridge/gen.hcl +++ b/resources/services/eventbridge/gen.hcl @@ -46,12 +46,6 @@ resource "aws" "eventbridge" "event_buses" { user_relation "aws" "eventbridge" "rules" { path = "github.com/aws/aws-sdk-go-v2/service/eventbridge/types.Rule" - options { - primary_keys = [ - "event_bus_cq_id", - "arn" - ] - } userDefinedColumn "tags" { type = "json" From e886bcd1688b9a8d54ca028b1855dd1155c38f18 Mon Sep 17 00:00:00 2001 From: Adam Tyler Date: Fri, 12 Aug 2022 00:13:08 -0400 Subject: [PATCH 5/5] Rerun cq-gen --- resources/services/eventbridge/event_buses.go | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/services/eventbridge/event_buses.go b/resources/services/eventbridge/event_buses.go index fa1d08140..4f8cfb67c 100644 --- a/resources/services/eventbridge/event_buses.go +++ b/resources/services/eventbridge/event_buses.go @@ -60,7 +60,6 @@ func EventBuses() *schema.Table { Name: "aws_eventbridge_event_bus_rules", Description: "Contains information about a rule in Amazon EventBridge", Resolver: fetchEventbridgeEventBusRules, - Options: schema.TableCreationOptions{PrimaryKeys: []string{"event_bus_cq_id", "arn"}}, Columns: []schema.Column{ { Name: "event_bus_cq_id",