Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions plugins/source/aws/docs/tables/README.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 26 additions & 0 deletions plugins/source/aws/docs/tables/aws_ec2_spot_fleet_instances.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Table: aws_ec2_spot_fleet_instances

https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ActiveInstance.html

The primary key for this table is **arn**.

## Relations

This table depends on [aws_ec2_spot_fleet_requests](aws_ec2_spot_fleet_requests.md).

## Columns

| Name | Type |
| ------------- | ------------- |
|_cq_source_name|String|
|_cq_sync_time|Timestamp|
|_cq_id|UUID|
|_cq_parent_id|UUID|
|account_id|String|
|region|String|
|arn (PK)|String|
|spot_fleet_request_id|String|
|instance_health|String|
|instance_id|String|
|instance_type|String|
|spot_instance_request_id|String|
27 changes: 27 additions & 0 deletions plugins/source/aws/docs/tables/aws_ec2_spot_fleet_requests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Table: aws_ec2_spot_fleet_requests

https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotFleetRequestConfig.html

The composite primary key for this table is (**account_id**, **region**, **spot_fleet_request_id**).

## Relations

The following tables depend on aws_ec2_spot_fleet_requests:
- [aws_ec2_spot_fleet_instances](aws_ec2_spot_fleet_instances.md)

## Columns

| Name | Type |
| ------------- | ------------- |
|_cq_source_name|String|
|_cq_sync_time|Timestamp|
|_cq_id|UUID|
|_cq_parent_id|UUID|
|account_id (PK)|String|
|region (PK)|String|
|tags|JSON|
|activity_status|String|
|create_time|Timestamp|
|spot_fleet_request_config|JSON|
|spot_fleet_request_id (PK)|String|
|spot_fleet_request_state|String|
35 changes: 35 additions & 0 deletions plugins/source/aws/docs/tables/aws_ec2_spot_instance_requests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Table: aws_ec2_spot_instance_requests

https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotInstanceRequest.html

The composite primary key for this table is (**account_id**, **region**, **spot_instance_request_id**).

## Columns

| Name | Type |
| ------------- | ------------- |
|_cq_source_name|String|
|_cq_sync_time|Timestamp|
|_cq_id|UUID|
|_cq_parent_id|UUID|
|account_id (PK)|String|
|region (PK)|String|
|tags|JSON|
|actual_block_hourly_price|String|
|availability_zone_group|String|
|block_duration_minutes|Int|
|create_time|Timestamp|
|fault|JSON|
|instance_id|String|
|instance_interruption_behavior|String|
|launch_group|String|
|launch_specification|JSON|
|launched_availability_zone|String|
|product_description|String|
|spot_instance_request_id (PK)|String|
|spot_price|String|
|state|String|
|status|JSON|
|type|String|
|valid_from|Timestamp|
|valid_until|Timestamp|
2 changes: 2 additions & 0 deletions plugins/source/aws/resources/plugin/tables.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ func tables() []*schema.Table {
ec2.ReservedInstances(),
ec2.RouteTables(),
ec2.SecurityGroups(),
ec2.SpotFleetRequests(),
ec2.SpotInstanceRequests(),
ec2.Subnets(),
ec2.TransitGateways(),
ec2.VpcEndpoints(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package ec2

import (
"context"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/aws/arn"
"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
"github.com/cloudquery/plugin-sdk/schema"
"github.com/cloudquery/plugin-sdk/transformers"
)

func spotFleetInstances() *schema.Table {
return &schema.Table{
Name: "aws_ec2_spot_fleet_instances",
Description: `https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ActiveInstance.html`,
Resolver: fetchEC2SpotFleetInstances,
Multiplex: client.ServiceAccountRegionMultiplexer("ec2"),
Transform: transformers.TransformWithStruct(&types.ActiveInstance{}),
Columns: []schema.Column{
client.DefaultAccountIDColumn(false),
client.DefaultRegionColumn(false),
{
Name: "arn",
Type: schema.TypeString,
Resolver: resolveActiveInstanceArn,
CreationOptions: schema.ColumnCreationOptions{
PrimaryKey: true,
},
},
{
Name: "spot_fleet_request_id",
Type: schema.TypeString,
Resolver: schema.ParentColumnResolver("spot_fleet_request_id"),
},
},
}
}

func fetchEC2SpotFleetInstances(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
p := parent.Item.(types.SpotFleetRequestConfig)

config := ec2.DescribeSpotFleetInstancesInput{
SpotFleetRequestId: p.SpotFleetRequestId,
}
c := meta.(*client.Client)
svc := c.Services().Ec2
for {
output, err := svc.DescribeSpotFleetInstances(ctx, &config)
if err != nil {
return err
}
res <- output.ActiveInstances
if aws.ToString(output.NextToken) == "" {
break
}
config.NextToken = output.NextToken
}
return nil
}

func resolveActiveInstanceArn(_ context.Context, meta schema.ClientMeta, resource *schema.Resource, c schema.Column) error {
cl := meta.(*client.Client)
item := resource.Item.(types.ActiveInstance)
a := arn.ARN{
Partition: cl.Partition,
Service: "ec2",
Region: cl.Region,
AccountID: cl.AccountID,
Resource: "instance/" + aws.ToString(item.InstanceId),
}
return resource.Set(c.Name, a.String())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package ec2

import (
"context"

"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
"github.com/cloudquery/plugin-sdk/schema"
"github.com/cloudquery/plugin-sdk/transformers"
)

func SpotFleetRequests() *schema.Table {
return &schema.Table{
Name: "aws_ec2_spot_fleet_requests",
Description: `https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotFleetRequestConfig.html`,
Resolver: fetchEC2SpotFleetRequests,
Multiplex: client.ServiceAccountRegionMultiplexer("ec2"),
Transform: transformers.TransformWithStruct(&types.SpotFleetRequestConfig{}, transformers.WithPrimaryKeys("SpotFleetRequestId")),
Columns: []schema.Column{
client.DefaultAccountIDColumn(true),
client.DefaultRegionColumn(true),
{
Name: "tags",
Type: schema.TypeJSON,
Resolver: client.ResolveTags,
},
},
Relations: []*schema.Table{
spotFleetInstances(),
},
}
}

func fetchEC2SpotFleetRequests(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
c := meta.(*client.Client)
svc := c.Services().Ec2
pag := ec2.NewDescribeSpotFleetRequestsPaginator(svc, &ec2.DescribeSpotFleetRequestsInput{})
for pag.HasMorePages() {
resp, err := pag.NextPage(ctx)
if err != nil {
return err
}
res <- resp.SpotFleetRequestConfigs
}
return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package ec2

import (
"testing"

"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
"github.com/cloudquery/cloudquery/plugins/source/aws/client/mocks"
"github.com/cloudquery/plugin-sdk/faker"
"github.com/golang/mock/gomock"
)

func buildSpotFleetRequests(t *testing.T, ctrl *gomock.Controller) client.Services {
m := mocks.NewMockEc2Client(ctrl)
item := types.SpotFleetRequestConfig{}
if err := faker.FakeObject(&item); err != nil {
t.Fatal(err)
}

ins := types.ActiveInstance{}
if err := faker.FakeObject(&ins); err != nil {
t.Fatal(err)
}

m.EXPECT().DescribeSpotFleetRequests(gomock.Any(), gomock.Any(), gomock.Any()).Return(
&ec2.DescribeSpotFleetRequestsOutput{
SpotFleetRequestConfigs: []types.SpotFleetRequestConfig{item},
}, nil)

m.EXPECT().DescribeSpotFleetInstances(gomock.Any(), gomock.Any(), gomock.Any()).Return(
&ec2.DescribeSpotFleetInstancesOutput{
ActiveInstances: []types.ActiveInstance{ins},
}, nil)
return client.Services{
Ec2: m,
}
}

func TestSpotFleetRequests(t *testing.T) {
client.AwsMockTestHelper(t, SpotFleetRequests(), buildSpotFleetRequests, client.TestOptions{})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package ec2

import (
"context"

"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
"github.com/cloudquery/plugin-sdk/schema"
"github.com/cloudquery/plugin-sdk/transformers"
)

func SpotInstanceRequests() *schema.Table {
return &schema.Table{
Name: "aws_ec2_spot_instance_requests",
Description: `https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotInstanceRequest.html`,
Resolver: fetchEC2SpotInstanceRequests,
Multiplex: client.ServiceAccountRegionMultiplexer("ec2"),
Transform: transformers.TransformWithStruct(&types.SpotInstanceRequest{}, transformers.WithPrimaryKeys("SpotInstanceRequestId")),
Columns: []schema.Column{
client.DefaultAccountIDColumn(true),
client.DefaultRegionColumn(true),
{
Name: "tags",
Type: schema.TypeJSON,
Resolver: client.ResolveTags,
},
},
}
}

func fetchEC2SpotInstanceRequests(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error {
c := meta.(*client.Client)
svc := c.Services().Ec2
pag := ec2.NewDescribeSpotInstanceRequestsPaginator(svc, &ec2.DescribeSpotInstanceRequestsInput{})
for pag.HasMorePages() {
resp, err := pag.NextPage(ctx)
if err != nil {
return err
}
res <- resp.SpotInstanceRequests
}
return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ec2

import (
"testing"

"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/cloudquery/cloudquery/plugins/source/aws/client"
"github.com/cloudquery/cloudquery/plugins/source/aws/client/mocks"
"github.com/cloudquery/plugin-sdk/faker"
"github.com/golang/mock/gomock"
)

func buildSpotInstanceRequests(t *testing.T, ctrl *gomock.Controller) client.Services {
m := mocks.NewMockEc2Client(ctrl)
item := types.SpotInstanceRequest{}
if err := faker.FakeObject(&item); err != nil {
t.Fatal(err)
}

m.EXPECT().DescribeSpotInstanceRequests(gomock.Any(), gomock.Any(), gomock.Any()).Return(
&ec2.DescribeSpotInstanceRequestsOutput{
SpotInstanceRequests: []types.SpotInstanceRequest{item},
}, nil)

return client.Services{
Ec2: m,
}
}

func TestSpotInstanceRequests(t *testing.T) {
client.AwsMockTestHelper(t, SpotInstanceRequests(), buildSpotInstanceRequests, client.TestOptions{})
}
3 changes: 3 additions & 0 deletions website/pages/docs/plugins/sources/aws/tables.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.