diff --git a/plugins/source/gcp/codegen/recipes/appengine.go b/plugins/source/gcp/codegen/recipes/appengine.go new file mode 100644 index 00000000000000..6184c96fa16fd0 --- /dev/null +++ b/plugins/source/gcp/codegen/recipes/appengine.go @@ -0,0 +1,103 @@ +package recipes + +import ( + appengine "cloud.google.com/go/appengine/apiv1" + pb "cloud.google.com/go/appengine/apiv1/appenginepb" +) + +func init() { + resources := []*Resource{ + { + SubService: "apps", + Struct: &pb.Application{}, + PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, + NewFunction: appengine.NewApplicationsClient, + ListFunction: (&appengine.ApplicationsClient{}).GetApplication, + RegisterServer: pb.RegisterApplicationsServer, + RequestStructFields: `Parent: "apps/" + c.ProjectId,`, + Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps#Application", + SkipFetch: true, + SkipMock: true, + }, + { + SubService: "services", + Struct: &pb.Service{}, + PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, + NewFunction: appengine.NewServicesClient, + RegisterServer: pb.RegisterServicesServer, + RequestStructFields: `Parent: "apps/" + c.ProjectId,`, + Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services#Service", + Relations: []string{"Versions()"}, + SkipMock: true, + }, + { + SubService: "versions", + Struct: &pb.Version{}, + PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, + NewFunction: appengine.NewVersionsClient, + RegisterServer: pb.RegisterVersionsServer, + RequestStructFields: `Parent: parent.Item.(*pb.Service).Name,`, + Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions#Version", + ChildTable: true, + Relations: []string{"Instances()"}, + SkipMock: true, + }, + { + SubService: "instances", + Struct: &pb.Instance{}, + PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, + NewFunction: appengine.NewInstancesClient, + RegisterServer: pb.RegisterInstancesServer, + RequestStructFields: `Parent: parent.Item.(*pb.Version).Name,`, + ChildTable: true, + Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions.instances#Instance", + SkipMock: true, + }, + { + SubService: "authorized_certificates", + Struct: &pb.AuthorizedCertificate{}, + PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, + NewFunction: appengine.NewAuthorizedCertificatesClient, + RegisterServer: pb.RegisterAuthorizedCertificatesServer, + RequestStructFields: `Parent: "apps/" + c.ProjectId,`, + Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedCertificates#AuthorizedCertificate", + }, + { + SubService: "authorized_domains", + Struct: &pb.AuthorizedDomain{}, + PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, + NewFunction: appengine.NewAuthorizedDomainsClient, + RegisterServer: pb.RegisterAuthorizedDomainsServer, + RequestStructFields: `Parent: "apps/" + c.ProjectId,`, + Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedDomains#AuthorizedDomain", + }, + { + SubService: "domain_mappings", + Struct: &pb.DomainMapping{}, + PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, + NewFunction: appengine.NewDomainMappingsClient, + RegisterServer: pb.RegisterDomainMappingsServer, + RequestStructFields: `Parent: "apps/" + c.ProjectId,`, + Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.domainMappings#DomainMapping", + }, + { + SubService: "firewall_ingress_rules", + Struct: &pb.FirewallRule{}, + PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, + NewFunction: appengine.NewFirewallClient, + RegisterServer: pb.RegisterFirewallServer, + RequestStructFields: `Parent: "apps/" + c.ProjectId,`, + Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.firewall.ingressRules#FirewallRule", + }, + } + + for _, resource := range resources { + resource.Service = "appengine" + resource.Template = "newapi_list" + resource.MockTemplate = "newapi_list_grpc_mock" + resource.ProtobufImport = "cloud.google.com/go/appengine/apiv1/appenginepb" + resource.MockImports = []string{"cloud.google.com/go/appengine/apiv1"} + } + + Resources = append(Resources, resources...) +} diff --git a/plugins/source/gcp/docs/tables/README.md b/plugins/source/gcp/docs/tables/README.md index d2bfb381c8b59e..8b8aef5773ecb1 100644 --- a/plugins/source/gcp/docs/tables/README.md +++ b/plugins/source/gcp/docs/tables/README.md @@ -35,6 +35,14 @@ - [gcp_apigateway_apis](gcp_apigateway_apis.md) - [gcp_apigateway_gateways](gcp_apigateway_gateways.md) - [gcp_apikeys_keys](gcp_apikeys_keys.md) +- [gcp_appengine_apps](gcp_appengine_apps.md) +- [gcp_appengine_services](gcp_appengine_services.md) + - [gcp_appengine_versions](gcp_appengine_versions.md) + - [gcp_appengine_instances](gcp_appengine_instances.md) +- [gcp_appengine_authorized_certificates](gcp_appengine_authorized_certificates.md) +- [gcp_appengine_authorized_domains](gcp_appengine_authorized_domains.md) +- [gcp_appengine_domain_mappings](gcp_appengine_domain_mappings.md) +- [gcp_appengine_firewall_ingress_rules](gcp_appengine_firewall_ingress_rules.md) - [gcp_bigquery_datasets](gcp_bigquery_datasets.md) - [gcp_bigquery_tables](gcp_bigquery_tables.md) - [gcp_billing_billing_accounts](gcp_billing_billing_accounts.md) diff --git a/plugins/source/gcp/docs/tables/gcp_appengine_apps.md b/plugins/source/gcp/docs/tables/gcp_appengine_apps.md new file mode 100644 index 00000000000000..6895bca3b80b93 --- /dev/null +++ b/plugins/source/gcp/docs/tables/gcp_appengine_apps.md @@ -0,0 +1,30 @@ +# Table: gcp_appengine_apps + +https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps#Application + +The composite primary key for this table is (**project_id**, **name**). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|project_id (PK)|String| +|name (PK)|String| +|id|String| +|dispatch_rules|JSON| +|auth_domain|String| +|location_id|String| +|code_bucket|String| +|default_cookie_expiration|Int| +|serving_status|String| +|default_hostname|String| +|default_bucket|String| +|service_account|String| +|iap|JSON| +|gcr_domain|String| +|database_type|String| +|feature_settings|JSON| \ No newline at end of file diff --git a/plugins/source/gcp/docs/tables/gcp_appengine_authorized_certificates.md b/plugins/source/gcp/docs/tables/gcp_appengine_authorized_certificates.md new file mode 100644 index 00000000000000..fabcbc436b37c3 --- /dev/null +++ b/plugins/source/gcp/docs/tables/gcp_appengine_authorized_certificates.md @@ -0,0 +1,24 @@ +# Table: gcp_appengine_authorized_certificates + +https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedCertificates#AuthorizedCertificate + +The composite primary key for this table is (**project_id**, **name**). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|project_id (PK)|String| +|name (PK)|String| +|id|String| +|display_name|String| +|domain_names|StringArray| +|expire_time|Timestamp| +|certificate_raw_data|JSON| +|managed_certificate|JSON| +|visible_domain_mappings|StringArray| +|domain_mappings_count|Int| \ No newline at end of file diff --git a/plugins/source/gcp/docs/tables/gcp_appengine_authorized_domains.md b/plugins/source/gcp/docs/tables/gcp_appengine_authorized_domains.md new file mode 100644 index 00000000000000..9f54d777992fc4 --- /dev/null +++ b/plugins/source/gcp/docs/tables/gcp_appengine_authorized_domains.md @@ -0,0 +1,17 @@ +# Table: gcp_appengine_authorized_domains + +https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedDomains#AuthorizedDomain + +The composite primary key for this table is (**project_id**, **name**). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|project_id (PK)|String| +|name (PK)|String| +|id|String| \ No newline at end of file diff --git a/plugins/source/gcp/docs/tables/gcp_appengine_domain_mappings.md b/plugins/source/gcp/docs/tables/gcp_appengine_domain_mappings.md new file mode 100644 index 00000000000000..eb240288dd0e3d --- /dev/null +++ b/plugins/source/gcp/docs/tables/gcp_appengine_domain_mappings.md @@ -0,0 +1,19 @@ +# Table: gcp_appengine_domain_mappings + +https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.domainMappings#DomainMapping + +The composite primary key for this table is (**project_id**, **name**). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|project_id (PK)|String| +|name (PK)|String| +|id|String| +|ssl_settings|JSON| +|resource_records|JSON| \ No newline at end of file diff --git a/plugins/source/gcp/docs/tables/gcp_appengine_firewall_ingress_rules.md b/plugins/source/gcp/docs/tables/gcp_appengine_firewall_ingress_rules.md new file mode 100644 index 00000000000000..a74c6028c3a767 --- /dev/null +++ b/plugins/source/gcp/docs/tables/gcp_appengine_firewall_ingress_rules.md @@ -0,0 +1,19 @@ +# Table: gcp_appengine_firewall_ingress_rules + +https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.firewall.ingressRules#FirewallRule + +The primary key for this table is **project_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|project_id (PK)|String| +|priority|Int| +|action|String| +|source_range|String| +|description|String| \ No newline at end of file diff --git a/plugins/source/gcp/docs/tables/gcp_appengine_instances.md b/plugins/source/gcp/docs/tables/gcp_appengine_instances.md new file mode 100644 index 00000000000000..6481a4d0e3eff6 --- /dev/null +++ b/plugins/source/gcp/docs/tables/gcp_appengine_instances.md @@ -0,0 +1,36 @@ +# Table: gcp_appengine_instances + +https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions.instances#Instance + +The composite primary key for this table is (**project_id**, **name**). + +## Relations + +This table depends on [gcp_appengine_versions](gcp_appengine_versions.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|project_id (PK)|String| +|name (PK)|String| +|id|String| +|app_engine_release|String| +|availability|String| +|vm_name|String| +|vm_zone_name|String| +|vm_id|String| +|start_time|Timestamp| +|requests|Int| +|errors|Int| +|qps|Float| +|average_latency|Int| +|memory_usage|Int| +|vm_status|String| +|vm_debug_enabled|Bool| +|vm_ip|String| +|vm_liveness|String| \ No newline at end of file diff --git a/plugins/source/gcp/docs/tables/gcp_appengine_services.md b/plugins/source/gcp/docs/tables/gcp_appengine_services.md new file mode 100644 index 00000000000000..61c5de956abbd1 --- /dev/null +++ b/plugins/source/gcp/docs/tables/gcp_appengine_services.md @@ -0,0 +1,25 @@ +# Table: gcp_appengine_services + +https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services#Service + +The composite primary key for this table is (**project_id**, **name**). + +## Relations + +The following tables depend on gcp_appengine_services: + - [gcp_appengine_versions](gcp_appengine_versions.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|project_id (PK)|String| +|name (PK)|String| +|id|String| +|split|JSON| +|labels|JSON| +|network_settings|JSON| \ No newline at end of file diff --git a/plugins/source/gcp/docs/tables/gcp_appengine_versions.md b/plugins/source/gcp/docs/tables/gcp_appengine_versions.md new file mode 100644 index 00000000000000..6c52dc9dc5b130 --- /dev/null +++ b/plugins/source/gcp/docs/tables/gcp_appengine_versions.md @@ -0,0 +1,59 @@ +# Table: gcp_appengine_versions + +https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions#Version + +The composite primary key for this table is (**project_id**, **name**). + +## Relations + +This table depends on [gcp_appengine_services](gcp_appengine_services.md). + +The following tables depend on gcp_appengine_versions: + - [gcp_appengine_instances](gcp_appengine_instances.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_source_name|String| +|_cq_sync_time|Timestamp| +|_cq_id|UUID| +|_cq_parent_id|UUID| +|project_id (PK)|String| +|name (PK)|String| +|id|String| +|inbound_services|IntArray| +|instance_class|String| +|network|JSON| +|zones|StringArray| +|resources|JSON| +|runtime|String| +|runtime_channel|String| +|threadsafe|Bool| +|vm|Bool| +|app_engine_apis|Bool| +|beta_settings|JSON| +|env|String| +|serving_status|String| +|created_by|String| +|create_time|Timestamp| +|disk_usage_bytes|Int| +|runtime_api_version|String| +|runtime_main_executable_path|String| +|service_account|String| +|handlers|JSON| +|error_handlers|JSON| +|libraries|JSON| +|api_config|JSON| +|env_variables|JSON| +|build_env_variables|JSON| +|default_expiration|Int| +|health_check|JSON| +|readiness_check|JSON| +|liveness_check|JSON| +|nobuild_files_regex|String| +|deployment|JSON| +|version_url|String| +|endpoints_api_service|JSON| +|entrypoint|JSON| +|vpc_access_connector|JSON| \ No newline at end of file diff --git a/plugins/source/gcp/go.mod b/plugins/source/gcp/go.mod index ce9e115e2a8acc..a39e29c642704f 100644 --- a/plugins/source/gcp/go.mod +++ b/plugins/source/gcp/go.mod @@ -6,6 +6,7 @@ require ( cloud.google.com/go/aiplatform v1.27.0 cloud.google.com/go/apigateway v1.4.0 cloud.google.com/go/apikeys v0.2.0 + cloud.google.com/go/appengine v1.5.0 cloud.google.com/go/billing v1.7.0 cloud.google.com/go/compute v1.14.0 cloud.google.com/go/container v1.8.0 diff --git a/plugins/source/gcp/go.sum b/plugins/source/gcp/go.sum index b74f7ecee973c2..f89d61b79e9860 100644 --- a/plugins/source/gcp/go.sum +++ b/plugins/source/gcp/go.sum @@ -21,6 +21,8 @@ cloud.google.com/go/apigateway v1.4.0 h1:IIoXKR7FKrEAQhMTz5hK2wiDz2WNFHS7eVr/L1l cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= cloud.google.com/go/apikeys v0.2.0 h1:s4nDYHB1cFBmo53BCX+iARtcSjK+6r/LH67lacUxWtQ= cloud.google.com/go/apikeys v0.2.0/go.mod h1:X11keBkNcspckbfFooIc9i2jZpyYt3YdWfMkkCVR2y4= +cloud.google.com/go/appengine v1.5.0 h1:lmG+O5oaR9xNwaRBwE2XoMhwQHsHql5IoiGr1ptdDwU= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= diff --git a/plugins/source/gcp/resources/plugin/autogen_tables.go b/plugins/source/gcp/resources/plugin/autogen_tables.go index 20f0330ed7d4cd..825bb5b15b84f9 100644 --- a/plugins/source/gcp/resources/plugin/autogen_tables.go +++ b/plugins/source/gcp/resources/plugin/autogen_tables.go @@ -7,6 +7,7 @@ import ( "github.com/cloudquery/plugins/source/gcp/resources/services/aiplatform" "github.com/cloudquery/plugins/source/gcp/resources/services/apigateway" "github.com/cloudquery/plugins/source/gcp/resources/services/apikeys" + "github.com/cloudquery/plugins/source/gcp/resources/services/appengine" "github.com/cloudquery/plugins/source/gcp/resources/services/bigquery" "github.com/cloudquery/plugins/source/gcp/resources/services/billing" "github.com/cloudquery/plugins/source/gcp/resources/services/compute" @@ -46,6 +47,12 @@ func PluginAutoGeneratedTables() []*schema.Table { apigateway.Apis(), apigateway.Gateways(), apikeys.Keys(), + appengine.Apps(), + appengine.Services(), + appengine.AuthorizedCertificates(), + appengine.AuthorizedDomains(), + appengine.DomainMappings(), + appengine.FirewallIngressRules(), bigquery.Datasets(), billing.BillingAccounts(), billing.Services(), diff --git a/plugins/source/gcp/resources/services/appengine/apps.go b/plugins/source/gcp/resources/services/appengine/apps.go new file mode 100644 index 00000000000000..b025d4c1b5692e --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/apps.go @@ -0,0 +1,105 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugins/source/gcp/client" +) + +func Apps() *schema.Table { + return &schema.Table{ + Name: "gcp_appengine_apps", + Description: `https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps#Application`, + Resolver: fetchApps, + Multiplex: client.ProjectMultiplexEnabledServices("appengine.googleapis.com"), + Columns: []schema.Column{ + { + Name: "project_id", + Type: schema.TypeString, + Resolver: client.ResolveProject, + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "name", + Type: schema.TypeString, + Resolver: schema.PathResolver("Name"), + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "id", + Type: schema.TypeString, + Resolver: schema.PathResolver("Id"), + }, + { + Name: "dispatch_rules", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("DispatchRules"), + }, + { + Name: "auth_domain", + Type: schema.TypeString, + Resolver: schema.PathResolver("AuthDomain"), + }, + { + Name: "location_id", + Type: schema.TypeString, + Resolver: schema.PathResolver("LocationId"), + }, + { + Name: "code_bucket", + Type: schema.TypeString, + Resolver: schema.PathResolver("CodeBucket"), + }, + { + Name: "default_cookie_expiration", + Type: schema.TypeInt, + Resolver: client.ResolveProtoDuration("DefaultCookieExpiration"), + }, + { + Name: "serving_status", + Type: schema.TypeString, + Resolver: client.ResolveProtoEnum("ServingStatus"), + }, + { + Name: "default_hostname", + Type: schema.TypeString, + Resolver: schema.PathResolver("DefaultHostname"), + }, + { + Name: "default_bucket", + Type: schema.TypeString, + Resolver: schema.PathResolver("DefaultBucket"), + }, + { + Name: "service_account", + Type: schema.TypeString, + Resolver: schema.PathResolver("ServiceAccount"), + }, + { + Name: "iap", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("Iap"), + }, + { + Name: "gcr_domain", + Type: schema.TypeString, + Resolver: schema.PathResolver("GcrDomain"), + }, + { + Name: "database_type", + Type: schema.TypeString, + Resolver: client.ResolveProtoEnum("DatabaseType"), + }, + { + Name: "feature_settings", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("FeatureSettings"), + }, + }, + } +} diff --git a/plugins/source/gcp/resources/services/appengine/apps_fetch.go b/plugins/source/gcp/resources/services/appengine/apps_fetch.go new file mode 100644 index 00000000000000..41e92f7ccc6e54 --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/apps_fetch.go @@ -0,0 +1,30 @@ +package appengine + +import ( + "context" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" + + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugins/source/gcp/client" + + appengine "cloud.google.com/go/appengine/apiv1" +) + +func fetchApps(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + req := &pb.GetApplicationRequest{ + Name: "apps/" + c.ProjectId, + } + gcpClient, err := appengine.NewApplicationsClient(ctx, c.ClientOptions...) + if err != nil { + return err + } + resp, err := gcpClient.GetApplication(ctx, req, c.CallOptions...) + if err != nil { + return err + } + res <- resp + + return nil +} diff --git a/plugins/source/gcp/resources/services/appengine/apps_mock_test.go b/plugins/source/gcp/resources/services/appengine/apps_mock_test.go new file mode 100644 index 00000000000000..eef1a5481dd26a --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/apps_mock_test.go @@ -0,0 +1,35 @@ +package appengine + +import ( + "context" + "fmt" + "testing" + + "github.com/cloudquery/plugin-sdk/faker" + "github.com/cloudquery/plugins/source/gcp/client" + "google.golang.org/grpc" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" +) + +func createApps(gsrv *grpc.Server) error { + fakeServer := &fakeAppsServer{} + pb.RegisterApplicationsServer(gsrv, fakeServer) + return nil +} + +type fakeAppsServer struct { + pb.UnimplementedApplicationsServer +} + +func (*fakeAppsServer) GetApplication(context.Context, *pb.GetApplicationRequest) (*pb.Application, error) { + resp := pb.Application{} + if err := faker.FakeObject(&resp); err != nil { + return nil, fmt.Errorf("failed to fake data: %w", err) + } + return &resp, nil +} + +func TestApps(t *testing.T) { + client.MockTestGrpcHelper(t, Apps(), createApps, client.TestOptions{}) +} diff --git a/plugins/source/gcp/resources/services/appengine/authorized_certificates.go b/plugins/source/gcp/resources/services/appengine/authorized_certificates.go new file mode 100644 index 00000000000000..380239b916180f --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/authorized_certificates.go @@ -0,0 +1,107 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "google.golang.org/api/iterator" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" + + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugins/source/gcp/client" + + "cloud.google.com/go/appengine/apiv1" +) + +func AuthorizedCertificates() *schema.Table { + return &schema.Table{ + Name: "gcp_appengine_authorized_certificates", + Description: `https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedCertificates#AuthorizedCertificate`, + Resolver: fetchAuthorizedCertificates, + Multiplex: client.ProjectMultiplexEnabledServices("appengine.googleapis.com"), + Columns: []schema.Column{ + { + Name: "project_id", + Type: schema.TypeString, + Resolver: client.ResolveProject, + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "name", + Type: schema.TypeString, + Resolver: schema.PathResolver("Name"), + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "id", + Type: schema.TypeString, + Resolver: schema.PathResolver("Id"), + }, + { + Name: "display_name", + Type: schema.TypeString, + Resolver: schema.PathResolver("DisplayName"), + }, + { + Name: "domain_names", + Type: schema.TypeStringArray, + Resolver: schema.PathResolver("DomainNames"), + }, + { + Name: "expire_time", + Type: schema.TypeTimestamp, + Resolver: client.ResolveProtoTimestamp("ExpireTime"), + }, + { + Name: "certificate_raw_data", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("CertificateRawData"), + }, + { + Name: "managed_certificate", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("ManagedCertificate"), + }, + { + Name: "visible_domain_mappings", + Type: schema.TypeStringArray, + Resolver: schema.PathResolver("VisibleDomainMappings"), + }, + { + Name: "domain_mappings_count", + Type: schema.TypeInt, + Resolver: schema.PathResolver("DomainMappingsCount"), + }, + }, + } +} + +func fetchAuthorizedCertificates(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + req := &pb.ListAuthorizedCertificatesRequest{ + Parent: "apps/" + c.ProjectId, + } + gcpClient, err := appengine.NewAuthorizedCertificatesClient(ctx, c.ClientOptions...) + if err != nil { + return err + } + it := gcpClient.ListAuthorizedCertificates(ctx, req, c.CallOptions...) + for { + resp, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + return err + } + + res <- resp + + } + return nil +} diff --git a/plugins/source/gcp/resources/services/appengine/authorized_certificates_mock_test.go b/plugins/source/gcp/resources/services/appengine/authorized_certificates_mock_test.go new file mode 100644 index 00000000000000..24b10f0ddb4c63 --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/authorized_certificates_mock_test.go @@ -0,0 +1,37 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "fmt" + "github.com/cloudquery/plugin-sdk/faker" + "github.com/cloudquery/plugins/source/gcp/client" + "google.golang.org/grpc" + "testing" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" +) + +func createAuthorizedCertificates(gsrv *grpc.Server) error { + fakeServer := &fakeAuthorizedCertificatesServer{} + pb.RegisterAuthorizedCertificatesServer(gsrv, fakeServer) + return nil +} + +type fakeAuthorizedCertificatesServer struct { + pb.UnimplementedAuthorizedCertificatesServer +} + +func (f *fakeAuthorizedCertificatesServer) ListAuthorizedCertificates(context.Context, *pb.ListAuthorizedCertificatesRequest) (*pb.ListAuthorizedCertificatesResponse, error) { + resp := pb.ListAuthorizedCertificatesResponse{} + if err := faker.FakeObject(&resp); err != nil { + return nil, fmt.Errorf("failed to fake data: %w", err) + } + resp.NextPageToken = "" + return &resp, nil +} + +func TestAuthorizedCertificates(t *testing.T) { + client.MockTestGrpcHelper(t, AuthorizedCertificates(), createAuthorizedCertificates, client.TestOptions{}) +} diff --git a/plugins/source/gcp/resources/services/appengine/authorized_domains.go b/plugins/source/gcp/resources/services/appengine/authorized_domains.go new file mode 100644 index 00000000000000..b13da0da6795c0 --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/authorized_domains.go @@ -0,0 +1,72 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "google.golang.org/api/iterator" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" + + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugins/source/gcp/client" + + "cloud.google.com/go/appengine/apiv1" +) + +func AuthorizedDomains() *schema.Table { + return &schema.Table{ + Name: "gcp_appengine_authorized_domains", + Description: `https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedDomains#AuthorizedDomain`, + Resolver: fetchAuthorizedDomains, + Multiplex: client.ProjectMultiplexEnabledServices("appengine.googleapis.com"), + Columns: []schema.Column{ + { + Name: "project_id", + Type: schema.TypeString, + Resolver: client.ResolveProject, + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "name", + Type: schema.TypeString, + Resolver: schema.PathResolver("Name"), + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "id", + Type: schema.TypeString, + Resolver: schema.PathResolver("Id"), + }, + }, + } +} + +func fetchAuthorizedDomains(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + req := &pb.ListAuthorizedDomainsRequest{ + Parent: "apps/" + c.ProjectId, + } + gcpClient, err := appengine.NewAuthorizedDomainsClient(ctx, c.ClientOptions...) + if err != nil { + return err + } + it := gcpClient.ListAuthorizedDomains(ctx, req, c.CallOptions...) + for { + resp, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + return err + } + + res <- resp + + } + return nil +} diff --git a/plugins/source/gcp/resources/services/appengine/authorized_domains_mock_test.go b/plugins/source/gcp/resources/services/appengine/authorized_domains_mock_test.go new file mode 100644 index 00000000000000..31c2bf2bf57207 --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/authorized_domains_mock_test.go @@ -0,0 +1,37 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "fmt" + "github.com/cloudquery/plugin-sdk/faker" + "github.com/cloudquery/plugins/source/gcp/client" + "google.golang.org/grpc" + "testing" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" +) + +func createAuthorizedDomains(gsrv *grpc.Server) error { + fakeServer := &fakeAuthorizedDomainsServer{} + pb.RegisterAuthorizedDomainsServer(gsrv, fakeServer) + return nil +} + +type fakeAuthorizedDomainsServer struct { + pb.UnimplementedAuthorizedDomainsServer +} + +func (f *fakeAuthorizedDomainsServer) ListAuthorizedDomains(context.Context, *pb.ListAuthorizedDomainsRequest) (*pb.ListAuthorizedDomainsResponse, error) { + resp := pb.ListAuthorizedDomainsResponse{} + if err := faker.FakeObject(&resp); err != nil { + return nil, fmt.Errorf("failed to fake data: %w", err) + } + resp.NextPageToken = "" + return &resp, nil +} + +func TestAuthorizedDomains(t *testing.T) { + client.MockTestGrpcHelper(t, AuthorizedDomains(), createAuthorizedDomains, client.TestOptions{}) +} diff --git a/plugins/source/gcp/resources/services/appengine/domain_mappings.go b/plugins/source/gcp/resources/services/appengine/domain_mappings.go new file mode 100644 index 00000000000000..1dba3d1554156c --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/domain_mappings.go @@ -0,0 +1,82 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "google.golang.org/api/iterator" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" + + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugins/source/gcp/client" + + "cloud.google.com/go/appengine/apiv1" +) + +func DomainMappings() *schema.Table { + return &schema.Table{ + Name: "gcp_appengine_domain_mappings", + Description: `https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.domainMappings#DomainMapping`, + Resolver: fetchDomainMappings, + Multiplex: client.ProjectMultiplexEnabledServices("appengine.googleapis.com"), + Columns: []schema.Column{ + { + Name: "project_id", + Type: schema.TypeString, + Resolver: client.ResolveProject, + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "name", + Type: schema.TypeString, + Resolver: schema.PathResolver("Name"), + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "id", + Type: schema.TypeString, + Resolver: schema.PathResolver("Id"), + }, + { + Name: "ssl_settings", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("SslSettings"), + }, + { + Name: "resource_records", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("ResourceRecords"), + }, + }, + } +} + +func fetchDomainMappings(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + req := &pb.ListDomainMappingsRequest{ + Parent: "apps/" + c.ProjectId, + } + gcpClient, err := appengine.NewDomainMappingsClient(ctx, c.ClientOptions...) + if err != nil { + return err + } + it := gcpClient.ListDomainMappings(ctx, req, c.CallOptions...) + for { + resp, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + return err + } + + res <- resp + + } + return nil +} diff --git a/plugins/source/gcp/resources/services/appengine/domain_mappings_mock_test.go b/plugins/source/gcp/resources/services/appengine/domain_mappings_mock_test.go new file mode 100644 index 00000000000000..25d61b5fe4ab3a --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/domain_mappings_mock_test.go @@ -0,0 +1,37 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "fmt" + "github.com/cloudquery/plugin-sdk/faker" + "github.com/cloudquery/plugins/source/gcp/client" + "google.golang.org/grpc" + "testing" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" +) + +func createDomainMappings(gsrv *grpc.Server) error { + fakeServer := &fakeDomainMappingsServer{} + pb.RegisterDomainMappingsServer(gsrv, fakeServer) + return nil +} + +type fakeDomainMappingsServer struct { + pb.UnimplementedDomainMappingsServer +} + +func (f *fakeDomainMappingsServer) ListDomainMappings(context.Context, *pb.ListDomainMappingsRequest) (*pb.ListDomainMappingsResponse, error) { + resp := pb.ListDomainMappingsResponse{} + if err := faker.FakeObject(&resp); err != nil { + return nil, fmt.Errorf("failed to fake data: %w", err) + } + resp.NextPageToken = "" + return &resp, nil +} + +func TestDomainMappings(t *testing.T) { + client.MockTestGrpcHelper(t, DomainMappings(), createDomainMappings, client.TestOptions{}) +} diff --git a/plugins/source/gcp/resources/services/appengine/firewall_ingress_rules.go b/plugins/source/gcp/resources/services/appengine/firewall_ingress_rules.go new file mode 100644 index 00000000000000..124aaacd3b2267 --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/firewall_ingress_rules.go @@ -0,0 +1,79 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "google.golang.org/api/iterator" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" + + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugins/source/gcp/client" + + "cloud.google.com/go/appengine/apiv1" +) + +func FirewallIngressRules() *schema.Table { + return &schema.Table{ + Name: "gcp_appengine_firewall_ingress_rules", + Description: `https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.firewall.ingressRules#FirewallRule`, + Resolver: fetchFirewallIngressRules, + Multiplex: client.ProjectMultiplexEnabledServices("appengine.googleapis.com"), + Columns: []schema.Column{ + { + Name: "project_id", + Type: schema.TypeString, + Resolver: client.ResolveProject, + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "priority", + Type: schema.TypeInt, + Resolver: schema.PathResolver("Priority"), + }, + { + Name: "action", + Type: schema.TypeString, + Resolver: client.ResolveProtoEnum("Action"), + }, + { + Name: "source_range", + Type: schema.TypeString, + Resolver: schema.PathResolver("SourceRange"), + }, + { + Name: "description", + Type: schema.TypeString, + Resolver: schema.PathResolver("Description"), + }, + }, + } +} + +func fetchFirewallIngressRules(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + req := &pb.ListIngressRulesRequest{ + Parent: "apps/" + c.ProjectId, + } + gcpClient, err := appengine.NewFirewallClient(ctx, c.ClientOptions...) + if err != nil { + return err + } + it := gcpClient.ListIngressRules(ctx, req, c.CallOptions...) + for { + resp, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + return err + } + + res <- resp + + } + return nil +} diff --git a/plugins/source/gcp/resources/services/appengine/firewall_ingress_rules_mock_test.go b/plugins/source/gcp/resources/services/appengine/firewall_ingress_rules_mock_test.go new file mode 100644 index 00000000000000..49483d6d74cafb --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/firewall_ingress_rules_mock_test.go @@ -0,0 +1,37 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "fmt" + "github.com/cloudquery/plugin-sdk/faker" + "github.com/cloudquery/plugins/source/gcp/client" + "google.golang.org/grpc" + "testing" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" +) + +func createFirewallIngressRules(gsrv *grpc.Server) error { + fakeServer := &fakeFirewallIngressRulesServer{} + pb.RegisterFirewallServer(gsrv, fakeServer) + return nil +} + +type fakeFirewallIngressRulesServer struct { + pb.UnimplementedFirewallServer +} + +func (f *fakeFirewallIngressRulesServer) ListIngressRules(context.Context, *pb.ListIngressRulesRequest) (*pb.ListIngressRulesResponse, error) { + resp := pb.ListIngressRulesResponse{} + if err := faker.FakeObject(&resp); err != nil { + return nil, fmt.Errorf("failed to fake data: %w", err) + } + resp.NextPageToken = "" + return &resp, nil +} + +func TestFirewallIngressRules(t *testing.T) { + client.MockTestGrpcHelper(t, FirewallIngressRules(), createFirewallIngressRules, client.TestOptions{}) +} diff --git a/plugins/source/gcp/resources/services/appengine/instances.go b/plugins/source/gcp/resources/services/appengine/instances.go new file mode 100644 index 00000000000000..7342e04b694751 --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/instances.go @@ -0,0 +1,147 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "google.golang.org/api/iterator" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" + + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugins/source/gcp/client" + + "cloud.google.com/go/appengine/apiv1" +) + +func Instances() *schema.Table { + return &schema.Table{ + Name: "gcp_appengine_instances", + Description: `https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions.instances#Instance`, + Resolver: fetchInstances, + Multiplex: client.ProjectMultiplexEnabledServices("appengine.googleapis.com"), + Columns: []schema.Column{ + { + Name: "project_id", + Type: schema.TypeString, + Resolver: client.ResolveProject, + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "name", + Type: schema.TypeString, + Resolver: schema.PathResolver("Name"), + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "id", + Type: schema.TypeString, + Resolver: schema.PathResolver("Id"), + }, + { + Name: "app_engine_release", + Type: schema.TypeString, + Resolver: schema.PathResolver("AppEngineRelease"), + }, + { + Name: "availability", + Type: schema.TypeString, + Resolver: client.ResolveProtoEnum("Availability"), + }, + { + Name: "vm_name", + Type: schema.TypeString, + Resolver: schema.PathResolver("VmName"), + }, + { + Name: "vm_zone_name", + Type: schema.TypeString, + Resolver: schema.PathResolver("VmZoneName"), + }, + { + Name: "vm_id", + Type: schema.TypeString, + Resolver: schema.PathResolver("VmId"), + }, + { + Name: "start_time", + Type: schema.TypeTimestamp, + Resolver: client.ResolveProtoTimestamp("StartTime"), + }, + { + Name: "requests", + Type: schema.TypeInt, + Resolver: schema.PathResolver("Requests"), + }, + { + Name: "errors", + Type: schema.TypeInt, + Resolver: schema.PathResolver("Errors"), + }, + { + Name: "qps", + Type: schema.TypeFloat, + Resolver: schema.PathResolver("Qps"), + }, + { + Name: "average_latency", + Type: schema.TypeInt, + Resolver: schema.PathResolver("AverageLatency"), + }, + { + Name: "memory_usage", + Type: schema.TypeInt, + Resolver: schema.PathResolver("MemoryUsage"), + }, + { + Name: "vm_status", + Type: schema.TypeString, + Resolver: schema.PathResolver("VmStatus"), + }, + { + Name: "vm_debug_enabled", + Type: schema.TypeBool, + Resolver: schema.PathResolver("VmDebugEnabled"), + }, + { + Name: "vm_ip", + Type: schema.TypeString, + Resolver: schema.PathResolver("VmIp"), + }, + { + Name: "vm_liveness", + Type: schema.TypeString, + Resolver: client.ResolveProtoEnum("VmLiveness"), + }, + }, + } +} + +func fetchInstances(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + req := &pb.ListInstancesRequest{ + Parent: parent.Item.(*pb.Version).Name, + } + gcpClient, err := appengine.NewInstancesClient(ctx, c.ClientOptions...) + if err != nil { + return err + } + it := gcpClient.ListInstances(ctx, req, c.CallOptions...) + for { + resp, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + return err + } + + res <- resp + + } + return nil +} diff --git a/plugins/source/gcp/resources/services/appengine/services.go b/plugins/source/gcp/resources/services/appengine/services.go new file mode 100644 index 00000000000000..6b37b459f63b5f --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/services.go @@ -0,0 +1,91 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "google.golang.org/api/iterator" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" + + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugins/source/gcp/client" + + "cloud.google.com/go/appengine/apiv1" +) + +func Services() *schema.Table { + return &schema.Table{ + Name: "gcp_appengine_services", + Description: `https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services#Service`, + Resolver: fetchServices, + Multiplex: client.ProjectMultiplexEnabledServices("appengine.googleapis.com"), + Columns: []schema.Column{ + { + Name: "project_id", + Type: schema.TypeString, + Resolver: client.ResolveProject, + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "name", + Type: schema.TypeString, + Resolver: schema.PathResolver("Name"), + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "id", + Type: schema.TypeString, + Resolver: schema.PathResolver("Id"), + }, + { + Name: "split", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("Split"), + }, + { + Name: "labels", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("Labels"), + }, + { + Name: "network_settings", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("NetworkSettings"), + }, + }, + + Relations: []*schema.Table{ + Versions(), + }, + } +} + +func fetchServices(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + req := &pb.ListServicesRequest{ + Parent: "apps/" + c.ProjectId, + } + gcpClient, err := appengine.NewServicesClient(ctx, c.ClientOptions...) + if err != nil { + return err + } + it := gcpClient.ListServices(ctx, req, c.CallOptions...) + for { + resp, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + return err + } + + res <- resp + + } + return nil +} diff --git a/plugins/source/gcp/resources/services/appengine/services_mock_test.go b/plugins/source/gcp/resources/services/appengine/services_mock_test.go new file mode 100644 index 00000000000000..577ab26ec910bd --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/services_mock_test.go @@ -0,0 +1,63 @@ +package appengine + +import ( + "context" + "fmt" + "testing" + + "github.com/cloudquery/plugin-sdk/faker" + "github.com/cloudquery/plugins/source/gcp/client" + "google.golang.org/grpc" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" +) + +func createServices(gsrv *grpc.Server) error { + pb.RegisterServicesServer(gsrv, &fakeServicesServer{}) + pb.RegisterVersionsServer(gsrv, &fakeVersionsServer{}) + pb.RegisterInstancesServer(gsrv, &fakeInstancesServer{}) + return nil +} + +type fakeServicesServer struct { + pb.UnimplementedServicesServer +} + +func (*fakeServicesServer) ListServices(context.Context, *pb.ListServicesRequest) (*pb.ListServicesResponse, error) { + resp := pb.ListServicesResponse{} + if err := faker.FakeObject(&resp); err != nil { + return nil, fmt.Errorf("failed to fake data: %w", err) + } + resp.NextPageToken = "" + return &resp, nil +} + +type fakeVersionsServer struct { + pb.UnimplementedVersionsServer +} + +func (*fakeVersionsServer) ListVersions(context.Context, *pb.ListVersionsRequest) (*pb.ListVersionsResponse, error) { + resp := pb.ListVersionsResponse{} + if err := faker.FakeObject(&resp); err != nil { + return nil, fmt.Errorf("failed to fake data: %w", err) + } + resp.NextPageToken = "" + return &resp, nil +} + +type fakeInstancesServer struct { + pb.UnimplementedInstancesServer +} + +func (*fakeInstancesServer) ListInstances(context.Context, *pb.ListInstancesRequest) (*pb.ListInstancesResponse, error) { + resp := pb.ListInstancesResponse{} + if err := faker.FakeObject(&resp); err != nil { + return nil, fmt.Errorf("failed to fake data: %w", err) + } + resp.NextPageToken = "" + return &resp, nil +} + +func TestServices(t *testing.T) { + client.MockTestGrpcHelper(t, Services(), createServices, client.TestOptions{}) +} diff --git a/plugins/source/gcp/resources/services/appengine/versions.go b/plugins/source/gcp/resources/services/appengine/versions.go new file mode 100644 index 00000000000000..2afbce3d751e7a --- /dev/null +++ b/plugins/source/gcp/resources/services/appengine/versions.go @@ -0,0 +1,251 @@ +// Code generated by codegen; DO NOT EDIT. + +package appengine + +import ( + "context" + "google.golang.org/api/iterator" + + pb "cloud.google.com/go/appengine/apiv1/appenginepb" + + "github.com/cloudquery/plugin-sdk/schema" + "github.com/cloudquery/plugins/source/gcp/client" + + "cloud.google.com/go/appengine/apiv1" +) + +func Versions() *schema.Table { + return &schema.Table{ + Name: "gcp_appengine_versions", + Description: `https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions#Version`, + Resolver: fetchVersions, + Multiplex: client.ProjectMultiplexEnabledServices("appengine.googleapis.com"), + Columns: []schema.Column{ + { + Name: "project_id", + Type: schema.TypeString, + Resolver: client.ResolveProject, + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "name", + Type: schema.TypeString, + Resolver: schema.PathResolver("Name"), + CreationOptions: schema.ColumnCreationOptions{ + PrimaryKey: true, + }, + }, + { + Name: "id", + Type: schema.TypeString, + Resolver: schema.PathResolver("Id"), + }, + { + Name: "inbound_services", + Type: schema.TypeIntArray, + Resolver: schema.PathResolver("InboundServices"), + }, + { + Name: "instance_class", + Type: schema.TypeString, + Resolver: schema.PathResolver("InstanceClass"), + }, + { + Name: "network", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("Network"), + }, + { + Name: "zones", + Type: schema.TypeStringArray, + Resolver: schema.PathResolver("Zones"), + }, + { + Name: "resources", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("Resources"), + }, + { + Name: "runtime", + Type: schema.TypeString, + Resolver: schema.PathResolver("Runtime"), + }, + { + Name: "runtime_channel", + Type: schema.TypeString, + Resolver: schema.PathResolver("RuntimeChannel"), + }, + { + Name: "threadsafe", + Type: schema.TypeBool, + Resolver: schema.PathResolver("Threadsafe"), + }, + { + Name: "vm", + Type: schema.TypeBool, + Resolver: schema.PathResolver("Vm"), + }, + { + Name: "app_engine_apis", + Type: schema.TypeBool, + Resolver: schema.PathResolver("AppEngineApis"), + }, + { + Name: "beta_settings", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("BetaSettings"), + }, + { + Name: "env", + Type: schema.TypeString, + Resolver: schema.PathResolver("Env"), + }, + { + Name: "serving_status", + Type: schema.TypeString, + Resolver: client.ResolveProtoEnum("ServingStatus"), + }, + { + Name: "created_by", + Type: schema.TypeString, + Resolver: schema.PathResolver("CreatedBy"), + }, + { + Name: "create_time", + Type: schema.TypeTimestamp, + Resolver: client.ResolveProtoTimestamp("CreateTime"), + }, + { + Name: "disk_usage_bytes", + Type: schema.TypeInt, + Resolver: schema.PathResolver("DiskUsageBytes"), + }, + { + Name: "runtime_api_version", + Type: schema.TypeString, + Resolver: schema.PathResolver("RuntimeApiVersion"), + }, + { + Name: "runtime_main_executable_path", + Type: schema.TypeString, + Resolver: schema.PathResolver("RuntimeMainExecutablePath"), + }, + { + Name: "service_account", + Type: schema.TypeString, + Resolver: schema.PathResolver("ServiceAccount"), + }, + { + Name: "handlers", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("Handlers"), + }, + { + Name: "error_handlers", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("ErrorHandlers"), + }, + { + Name: "libraries", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("Libraries"), + }, + { + Name: "api_config", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("ApiConfig"), + }, + { + Name: "env_variables", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("EnvVariables"), + }, + { + Name: "build_env_variables", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("BuildEnvVariables"), + }, + { + Name: "default_expiration", + Type: schema.TypeInt, + Resolver: client.ResolveProtoDuration("DefaultExpiration"), + }, + { + Name: "health_check", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("HealthCheck"), + }, + { + Name: "readiness_check", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("ReadinessCheck"), + }, + { + Name: "liveness_check", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("LivenessCheck"), + }, + { + Name: "nobuild_files_regex", + Type: schema.TypeString, + Resolver: schema.PathResolver("NobuildFilesRegex"), + }, + { + Name: "deployment", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("Deployment"), + }, + { + Name: "version_url", + Type: schema.TypeString, + Resolver: schema.PathResolver("VersionUrl"), + }, + { + Name: "endpoints_api_service", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("EndpointsApiService"), + }, + { + Name: "entrypoint", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("Entrypoint"), + }, + { + Name: "vpc_access_connector", + Type: schema.TypeJSON, + Resolver: schema.PathResolver("VpcAccessConnector"), + }, + }, + + Relations: []*schema.Table{ + Instances(), + }, + } +} + +func fetchVersions(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- any) error { + c := meta.(*client.Client) + req := &pb.ListVersionsRequest{ + Parent: parent.Item.(*pb.Service).Name, + } + gcpClient, err := appengine.NewVersionsClient(ctx, c.ClientOptions...) + if err != nil { + return err + } + it := gcpClient.ListVersions(ctx, req, c.CallOptions...) + for { + resp, err := it.Next() + if err == iterator.Done { + break + } + if err != nil { + return err + } + + res <- resp + + } + return nil +} diff --git a/website/pages/docs/plugins/sources/gcp/tables.md b/website/pages/docs/plugins/sources/gcp/tables.md index cb77f8597716a3..1fb64d6d67cc95 100644 --- a/website/pages/docs/plugins/sources/gcp/tables.md +++ b/website/pages/docs/plugins/sources/gcp/tables.md @@ -35,6 +35,14 @@ - [gcp_apigateway_apis](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_apigateway_apis.md) - [gcp_apigateway_gateways](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_apigateway_gateways.md) - [gcp_apikeys_keys](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_apikeys_keys.md) +- [gcp_appengine_apps](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_appengine_apps.md) +- [gcp_appengine_services](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_appengine_services.md) + - [gcp_appengine_versions](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_appengine_versions.md) + - [gcp_appengine_instances](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_appengine_instances.md) +- [gcp_appengine_authorized_certificates](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_appengine_authorized_certificates.md) +- [gcp_appengine_authorized_domains](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_appengine_authorized_domains.md) +- [gcp_appengine_domain_mappings](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_appengine_domain_mappings.md) +- [gcp_appengine_firewall_ingress_rules](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_appengine_firewall_ingress_rules.md) - [gcp_bigquery_datasets](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_bigquery_datasets.md) - [gcp_bigquery_tables](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_bigquery_tables.md) - [gcp_billing_billing_accounts](https://github.com/cloudquery/cloudquery/blob/main/plugins/source/gcp/docs/tables/gcp_billing_billing_accounts.md)