From 1f1600f80310152899a308758b4a1338511ccada Mon Sep 17 00:00:00 2001 From: erezrokah Date: Mon, 26 Dec 2022 20:17:27 +0200 Subject: [PATCH 1/4] feat(gcp-resources): Add AppEngine resources --- .../source/gcp/codegen/recipes/appengine.go | 111 ++++++++ plugins/source/gcp/docs/tables/README.md | 8 + .../gcp/docs/tables/gcp_appengine_apps.md | 30 +++ .../gcp_appengine_authorized_certificates.md | 24 ++ .../gcp_appengine_authorized_domains.md | 17 ++ .../tables/gcp_appengine_domain_mappings.md | 19 ++ .../gcp_appengine_firewall_ingress_rules.md | 19 ++ .../docs/tables/gcp_appengine_instances.md | 36 +++ .../gcp/docs/tables/gcp_appengine_services.md | 25 ++ .../gcp/docs/tables/gcp_appengine_versions.md | 59 ++++ plugins/source/gcp/go.mod | 1 + plugins/source/gcp/go.sum | 2 + .../gcp/resources/plugin/autogen_tables.go | 7 + .../gcp/resources/services/appengine/apps.go | 105 ++++++++ .../services/appengine/apps_fetch.go | 30 +++ .../services/appengine/apps_mock_test.go | 35 +++ .../appengine/authorized_certificates.go | 107 ++++++++ .../authorized_certificates_mock_test.go | 37 +++ .../services/appengine/authorized_domains.go | 72 +++++ .../appengine/authorized_domains_mock_test.go | 37 +++ .../services/appengine/domain_mappings.go | 82 ++++++ .../appengine/domain_mappings_mock_test.go | 37 +++ .../appengine/firewall_ingress_rules.go | 79 ++++++ .../firewall_ingress_rules_mock_test.go | 37 +++ .../resources/services/appengine/instances.go | 147 ++++++++++ .../resources/services/appengine/services.go | 91 +++++++ .../services/appengine/services_mock_test.go | 63 +++++ .../resources/services/appengine/versions.go | 251 ++++++++++++++++++ .../pages/docs/plugins/sources/gcp/tables.md | 8 + 29 files changed, 1576 insertions(+) create mode 100644 plugins/source/gcp/codegen/recipes/appengine.go create mode 100644 plugins/source/gcp/docs/tables/gcp_appengine_apps.md create mode 100644 plugins/source/gcp/docs/tables/gcp_appengine_authorized_certificates.md create mode 100644 plugins/source/gcp/docs/tables/gcp_appengine_authorized_domains.md create mode 100644 plugins/source/gcp/docs/tables/gcp_appengine_domain_mappings.md create mode 100644 plugins/source/gcp/docs/tables/gcp_appengine_firewall_ingress_rules.md create mode 100644 plugins/source/gcp/docs/tables/gcp_appengine_instances.md create mode 100644 plugins/source/gcp/docs/tables/gcp_appengine_services.md create mode 100644 plugins/source/gcp/docs/tables/gcp_appengine_versions.md create mode 100644 plugins/source/gcp/resources/services/appengine/apps.go create mode 100644 plugins/source/gcp/resources/services/appengine/apps_fetch.go create mode 100644 plugins/source/gcp/resources/services/appengine/apps_mock_test.go create mode 100644 plugins/source/gcp/resources/services/appengine/authorized_certificates.go create mode 100644 plugins/source/gcp/resources/services/appengine/authorized_certificates_mock_test.go create mode 100644 plugins/source/gcp/resources/services/appengine/authorized_domains.go create mode 100644 plugins/source/gcp/resources/services/appengine/authorized_domains_mock_test.go create mode 100644 plugins/source/gcp/resources/services/appengine/domain_mappings.go create mode 100644 plugins/source/gcp/resources/services/appengine/domain_mappings_mock_test.go create mode 100644 plugins/source/gcp/resources/services/appengine/firewall_ingress_rules.go create mode 100644 plugins/source/gcp/resources/services/appengine/firewall_ingress_rules_mock_test.go create mode 100644 plugins/source/gcp/resources/services/appengine/instances.go create mode 100644 plugins/source/gcp/resources/services/appengine/services.go create mode 100644 plugins/source/gcp/resources/services/appengine/services_mock_test.go create mode 100644 plugins/source/gcp/resources/services/appengine/versions.go diff --git a/plugins/source/gcp/codegen/recipes/appengine.go b/plugins/source/gcp/codegen/recipes/appengine.go new file mode 100644 index 00000000000000..b734646c89ad96 --- /dev/null +++ b/plugins/source/gcp/codegen/recipes/appengine.go @@ -0,0 +1,111 @@ +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, + ListFunction: (&appengine.ServicesClient{}).ListServices, + 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, + ListFunction: (&appengine.VersionsClient{}).ListVersions, + 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, + ListFunction: (&appengine.InstancesClient{}).ListInstances, + 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, + ListFunction: (&appengine.AuthorizedCertificatesClient{}).ListAuthorizedCertificates, + 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, + ListFunction: (&appengine.AuthorizedDomainsClient{}).ListAuthorizedDomains, + 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, + ListFunction: (&appengine.DomainMappingsClient{}).ListDomainMappings, + 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, + ListFunction: (&appengine.FirewallClient{}).ListIngressRules, + 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"} + resource.ServiceDNS = "appengine.googleapis.com" + } + + 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..185de555093c8f --- /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 (f *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..27ed3854598a01 --- /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 (f *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 (f *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 (f *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) From 712aa0a5463b1ff96f8fd8d78862eaac92f6834b Mon Sep 17 00:00:00 2001 From: erezrokah Date: Mon, 26 Dec 2022 20:24:00 +0200 Subject: [PATCH 2/4] fix: Lint --- .../gcp/resources/services/appengine/apps_mock_test.go | 2 +- .../gcp/resources/services/appengine/services_mock_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/source/gcp/resources/services/appengine/apps_mock_test.go b/plugins/source/gcp/resources/services/appengine/apps_mock_test.go index 185de555093c8f..eef1a5481dd26a 100644 --- a/plugins/source/gcp/resources/services/appengine/apps_mock_test.go +++ b/plugins/source/gcp/resources/services/appengine/apps_mock_test.go @@ -22,7 +22,7 @@ type fakeAppsServer struct { pb.UnimplementedApplicationsServer } -func (f *fakeAppsServer) GetApplication(context.Context, *pb.GetApplicationRequest) (*pb.Application, error) { +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) diff --git a/plugins/source/gcp/resources/services/appengine/services_mock_test.go b/plugins/source/gcp/resources/services/appengine/services_mock_test.go index 27ed3854598a01..577ab26ec910bd 100644 --- a/plugins/source/gcp/resources/services/appengine/services_mock_test.go +++ b/plugins/source/gcp/resources/services/appengine/services_mock_test.go @@ -23,7 +23,7 @@ type fakeServicesServer struct { pb.UnimplementedServicesServer } -func (f *fakeServicesServer) ListServices(context.Context, *pb.ListServicesRequest) (*pb.ListServicesResponse, error) { +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) @@ -36,7 +36,7 @@ type fakeVersionsServer struct { pb.UnimplementedVersionsServer } -func (f *fakeVersionsServer) ListVersions(context.Context, *pb.ListVersionsRequest) (*pb.ListVersionsResponse, error) { +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) @@ -49,7 +49,7 @@ type fakeInstancesServer struct { pb.UnimplementedInstancesServer } -func (f *fakeInstancesServer) ListInstances(context.Context, *pb.ListInstancesRequest) (*pb.ListInstancesResponse, error) { +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) From 51dc5ff5455838b3333ab083c6262b16a3e05f46 Mon Sep 17 00:00:00 2001 From: erezrokah Date: Wed, 28 Dec 2022 18:54:17 +0200 Subject: [PATCH 3/4] refactor: Remove ServiceDNS --- plugins/source/gcp/codegen/recipes/appengine.go | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/source/gcp/codegen/recipes/appengine.go b/plugins/source/gcp/codegen/recipes/appengine.go index b734646c89ad96..0f6e721fb1546c 100644 --- a/plugins/source/gcp/codegen/recipes/appengine.go +++ b/plugins/source/gcp/codegen/recipes/appengine.go @@ -104,7 +104,6 @@ func init() { resource.MockTemplate = "newapi_list_grpc_mock" resource.ProtobufImport = "cloud.google.com/go/appengine/apiv1/appenginepb" resource.MockImports = []string{"cloud.google.com/go/appengine/apiv1"} - resource.ServiceDNS = "appengine.googleapis.com" } Resources = append(Resources, resources...) From c5d47c5f6425e4702c1b2494f74307f3f74448a3 Mon Sep 17 00:00:00 2001 From: erezrokah Date: Thu, 29 Dec 2022 13:25:58 +0200 Subject: [PATCH 4/4] chore: Clean up list functions --- plugins/source/gcp/codegen/recipes/appengine.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/plugins/source/gcp/codegen/recipes/appengine.go b/plugins/source/gcp/codegen/recipes/appengine.go index 0f6e721fb1546c..6184c96fa16fd0 100644 --- a/plugins/source/gcp/codegen/recipes/appengine.go +++ b/plugins/source/gcp/codegen/recipes/appengine.go @@ -24,7 +24,6 @@ func init() { Struct: &pb.Service{}, PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, NewFunction: appengine.NewServicesClient, - ListFunction: (&appengine.ServicesClient{}).ListServices, RegisterServer: pb.RegisterServicesServer, RequestStructFields: `Parent: "apps/" + c.ProjectId,`, Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services#Service", @@ -37,7 +36,6 @@ func init() { PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, NewFunction: appengine.NewVersionsClient, RegisterServer: pb.RegisterVersionsServer, - ListFunction: (&appengine.VersionsClient{}).ListVersions, 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, @@ -49,7 +47,6 @@ func init() { Struct: &pb.Instance{}, PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, NewFunction: appengine.NewInstancesClient, - ListFunction: (&appengine.InstancesClient{}).ListInstances, RegisterServer: pb.RegisterInstancesServer, RequestStructFields: `Parent: parent.Item.(*pb.Version).Name,`, ChildTable: true, @@ -61,7 +58,6 @@ func init() { Struct: &pb.AuthorizedCertificate{}, PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, NewFunction: appengine.NewAuthorizedCertificatesClient, - ListFunction: (&appengine.AuthorizedCertificatesClient{}).ListAuthorizedCertificates, RegisterServer: pb.RegisterAuthorizedCertificatesServer, RequestStructFields: `Parent: "apps/" + c.ProjectId,`, Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedCertificates#AuthorizedCertificate", @@ -71,7 +67,6 @@ func init() { Struct: &pb.AuthorizedDomain{}, PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, NewFunction: appengine.NewAuthorizedDomainsClient, - ListFunction: (&appengine.AuthorizedDomainsClient{}).ListAuthorizedDomains, RegisterServer: pb.RegisterAuthorizedDomainsServer, RequestStructFields: `Parent: "apps/" + c.ProjectId,`, Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.authorizedDomains#AuthorizedDomain", @@ -81,7 +76,6 @@ func init() { Struct: &pb.DomainMapping{}, PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, NewFunction: appengine.NewDomainMappingsClient, - ListFunction: (&appengine.DomainMappingsClient{}).ListDomainMappings, RegisterServer: pb.RegisterDomainMappingsServer, RequestStructFields: `Parent: "apps/" + c.ProjectId,`, Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.domainMappings#DomainMapping", @@ -91,7 +85,6 @@ func init() { Struct: &pb.FirewallRule{}, PrimaryKeys: []string{ProjectIdColumn.Name, "name"}, NewFunction: appengine.NewFirewallClient, - ListFunction: (&appengine.FirewallClient{}).ListIngressRules, RegisterServer: pb.RegisterFirewallServer, RequestStructFields: `Parent: "apps/" + c.ProjectId,`, Description: "https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.firewall.ingressRules#FirewallRule",