vendor_fabric.google

Google Cloud and Workspace connector built on extended-data primitives.

Submodules

Package Contents

Classes

GoogleConnector

Google Cloud and Workspace connector.

Data

API

vendor_fabric.google.DEFAULT_SCOPES = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/cloud-billing', ...
class vendor_fabric.google.GoogleConnector(service_account_info: dict[str, Any] | str | None = None, scopes: list[str] | None = None, subject: str | None = None, logger: extended_data.logging.Logging | None = None, **kwargs: Any)

Bases: vendor_fabric.google.workspace.GoogleWorkspaceMixin, vendor_fabric.google.cloud.GoogleCloudMixin, vendor_fabric.google.billing.GoogleBillingMixin, vendor_fabric.google.services.GoogleServicesMixin, vendor_fabric.base.ConnectorBase

Google Cloud and Workspace connector.

This first-class connector provides:

  • Authentication via service account

  • Service client creation and caching

  • Subject impersonation for domain-wide delegation

  • Workspace, Cloud Resource Manager, Billing, and service discovery operations

Initialization

Initialize the Google connector.

Args: service_account_info: Service account JSON as dict or string. If not provided, reads from GOOGLE_SERVICE_ACCOUNT input. scopes: OAuth scopes to request. Defaults to common scopes. subject: Email to impersonate via domain-wide delegation. logger: Optional Logging instance. **kwargs: Additional arguments passed to ConnectorBase.

property credentials: google.oauth2.service_account.Credentials

Get or create Google credentials.

Returns: Authenticated service account credentials.

get_credentials_for_subject(subject: str) google.oauth2.service_account.Credentials

Get credentials impersonating a specific user.

Args: subject: Email address to impersonate.

Returns: Credentials with the specified subject.

get_connector_for_user(primary_email: str, scopes: list[str] | None = None) vendor_fabric.google.GoogleConnector

Get a connector instance impersonating a specific user.

This is useful for terraform-style operations where you need to perform actions as a specific user rather than the service account.

Args: primary_email: Email address of the user to impersonate. scopes: Optional custom scopes. Defaults to current connector’s scopes.

Returns: A new GoogleConnector instance configured to impersonate the user.

get_service(service_name: str, version: str, subject: str | None = None) Any

Get a Google API service client.

Args: service_name: Google API service name (e.g., ‘admin’, ‘cloudresourcemanager’). version: API version (e.g., ‘v1’, ‘directory_v1’). subject: Optional subject to impersonate for this service.

Returns: Google API service client.

get_admin_directory_service(subject: str | None = None) Any

Get the Admin Directory API service.

get_cloud_resource_manager_service() Any

Get the Cloud Resource Manager API service.

get_iam_service() Any

Get the IAM API service.

get_billing_service() Any

Get the Cloud Billing API service.

get_compute_service() Any

Get the Compute Engine API service.

get_container_service() Any

Get the GKE API service.

get_storage_service() Any

Get the Cloud Storage API service.

get_sqladmin_service() Any

Get the Cloud SQL Admin API service.

get_pubsub_service() Any

Get the Pub/Sub API service.

get_serviceusage_service() Any

Get the Service Usage API service.

get_cloudkms_service() Any

Get the Cloud KMS API service.

list_users(domain: str | None = None, max_results: int = 500, *, ou_allow_list: collections.abc.Sequence[str] | str | None = None, ou_deny_list: collections.abc.Sequence[str] | str | None = None, include_suspended: bool | None = None, exclude_bots: bool | None = None, flatten_names: bool | None = None, key_by_email: bool | None = None) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict] | extended_data.containers.ExtendedDict

List users from Google Workspace with optional filtering.

Args: domain: Domain to list users from. max_results: Maximum results per page. ou_allow_list: Only include users from these OUs. ou_deny_list: Exclude users from these OUs. include_suspended: Include suspended users (default False). exclude_bots: Exclude service/bot accounts (default True). flatten_names: Flatten nested name structure (default False). key_by_email: Return dict keyed by email instead of list (default False).

Returns: List of user dicts, or dict keyed by email if key_by_email=True.

list_groups(domain: str | None = None, max_results: int = 200, *, ou_allow_list: collections.abc.Sequence[str] | str | None = None, ou_deny_list: collections.abc.Sequence[str] | str | None = None, include_suspended: bool | None = None, exclude_bots: bool | None = None, flatten_names: bool | None = None, key_by_email: bool | None = None) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict] | extended_data.containers.ExtendedDict

List groups from Google Workspace with optional filtering.

Args: domain: Domain to list groups from. max_results: Maximum results per page. ou_allow_list: Only include groups from these OUs. ou_deny_list: Exclude groups from these OUs. include_suspended: Include suspended groups (default False). exclude_bots: Exclude bot groups (default True). flatten_names: Flatten nested name structure (default False). key_by_email: Return dict keyed by email instead of list (default False).

Returns: List of group dicts, or dict keyed by email if key_by_email=True.

list_workspace_users(domain: str | None = None, max_results: int = 500, unhump_users: bool = False, subject: str | None = None) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
get_user(user_key: str, subject: str | None = None) extended_data.containers.ExtendedDict | None
create_user(primary_email: str, given_name: str, family_name: str, password: str | None = None, change_password_at_next_login: bool = True, org_unit_path: str = '/', subject: str | None = None, **additional_fields: Any) extended_data.containers.ExtendedDict
update_user(user_key: str, subject: str | None = None, **fields: Any) extended_data.containers.ExtendedDict
delete_user(user_key: str, subject: str | None = None) None
list_workspace_groups(domain: str | None = None, max_results: int = 200, unhump_groups: bool = False, subject: str | None = None) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
get_group(group_key: str, subject: str | None = None) extended_data.containers.ExtendedDict | None
create_group(email: str, name: str, description: str = '', subject: str | None = None) extended_data.containers.ExtendedDict
delete_group(group_key: str, subject: str | None = None) None
list_group_members(group_key: str, roles: list[str] | None = None, unhump_members: bool = False, subject: str | None = None) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
add_group_member(group_key: str, email: str, role: str = 'MEMBER', subject: str | None = None) extended_data.containers.ExtendedDict
remove_group_member(group_key: str, member_key: str, subject: str | None = None) None
list_org_units(org_unit_path: str = '/', org_unit_type: str = 'all', subject: str | None = None) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
create_or_update_user(primary_email: str, given_name: str, family_name: str, password: str | None = None, update_if_exists: bool = False, change_password_at_next_login: bool = True, org_unit_path: str = '/', subject: str | None = None, **additional_fields: Any) extended_data.containers.ExtendedDict
create_or_update_group(email: str, name: str, description: str = '', update_if_exists: bool = False, subject: str | None = None, **additional_fields: Any) extended_data.containers.ExtendedDict
list_available_licenses(customer_id: str = 'my_customer', product_id: str | None = None, subject: str | None = None) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
get_license_summary(customer_id: str = 'my_customer', subject: str | None = None) extended_data.containers.ExtendedDict
get_organization_id() extended_data.containers.ExtendedString
get_organization() extended_data.containers.ExtendedDict
list_projects(parent: str | None = None, filter_query: str | None = None, unhump_projects: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
get_project(project_id: str) extended_data.containers.ExtendedDict | None
create_project(project_id: str, display_name: str, parent: str | None = None, labels: dict[str, str] | None = None) extended_data.containers.ExtendedDict
delete_project(project_id: str) extended_data.containers.ExtendedDict
move_project(project_id: str, destination_parent: str) extended_data.containers.ExtendedDict
list_folders(parent: str, unhump_folders: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
get_org_policy(resource: str, constraint: str) extended_data.containers.ExtendedDict | None
set_org_policy(resource: str, policy: dict[str, Any]) extended_data.containers.ExtendedDict
get_iam_policy(resource: str, resource_type: str = 'projects') extended_data.containers.ExtendedDict
set_iam_policy(resource: str, policy: collections.abc.Mapping[str, Any], resource_type: str = 'projects') extended_data.containers.ExtendedDict
add_iam_binding(resource: str, role: str, member: str, resource_type: str = 'projects') extended_data.containers.ExtendedDict
list_service_accounts(project_id: str, unhump_accounts: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
create_service_account(project_id: str, account_id: str, display_name: str, description: str = '') extended_data.containers.ExtendedDict
list_billing_accounts(filter_query: str | None = None, unhump_accounts: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
get_billing_account(billing_account_id: str) extended_data.containers.ExtendedDict | None
get_project_billing_info(project_id: str) extended_data.containers.ExtendedDict | None
update_project_billing_info(project_id: str, billing_account_name: str) extended_data.containers.ExtendedDict
disable_project_billing(project_id: str) extended_data.containers.ExtendedDict
list_billing_account_projects(billing_account_id: str, unhump_projects: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
get_billing_account_iam_policy(billing_account_id: str) extended_data.containers.ExtendedDict
set_billing_account_iam_policy(billing_account_id: str, policy: dict[str, Any]) extended_data.containers.ExtendedDict
get_bigquery_billing_dataset(project_id: str, dataset_id: str = 'billing_export') extended_data.containers.ExtendedDict | None
setup_billing_export(billing_account_id: str, project_id: str, dataset_id: str = 'billing_export', location: str = 'US') extended_data.containers.ExtendedDict
list_compute_instances(project_id: str, zone: str | None = None, unhump_instances: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
list_gke_clusters(project_id: str, location: str = '-', unhump_clusters: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
get_gke_cluster(project_id: str, location: str, cluster_id: str) extended_data.containers.ExtendedDict | None
list_storage_buckets(project_id: str, unhump_buckets: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
list_sql_instances(project_id: str, unhump_instances: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
list_pubsub_topics(project_id: str, unhump_topics: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
list_pubsub_subscriptions(project_id: str, unhump_subscriptions: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
list_enabled_services(project_id: str, unhump_services: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
enable_service(project_id: str, service_name: str) extended_data.containers.ExtendedDict
disable_service(project_id: str, service_name: str, force: bool = False) extended_data.containers.ExtendedDict
batch_enable_services(project_id: str, service_names: list[str]) extended_data.containers.ExtendedDict
list_kms_keyrings(project_id: str, location: str, unhump_keyrings: bool = False) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
create_kms_keyring(project_id: str, location: str, keyring_id: str) extended_data.containers.ExtendedDict
create_kms_key(project_id: str, location: str, keyring_id: str, key_id: str, purpose: str = 'ENCRYPT_DECRYPT', algorithm: str = 'GOOGLE_SYMMETRIC_ENCRYPTION') extended_data.containers.ExtendedDict
is_project_empty(project_id: str, check_compute: bool = True, check_gke: bool = True, check_storage: bool = True, check_sql: bool = True, check_pubsub: bool = True) bool
get_project_iam_users(project_id: str) extended_data.containers.ExtendedDict
get_pubsub_resources_for_project(project_id: str, include_subscriptions: bool = True, unhump_resources: bool = False) extended_data.containers.ExtendedDict
find_inactive_projects(projects: collections.abc.MutableMapping[str, collections.abc.MutableMapping[str, Any]] | None = None, check_resources: bool = True, days_since_activity: int = 90) extended_data.containers.ExtendedList[extended_data.containers.ExtendedDict]
BASE_URL: ClassVar[str] = <Multiline-String>
API_KEY_ENV: ClassVar[str] = <Multiline-String>
CONNECTOR_CATEGORY: ClassVar[str] = 'external'
CONNECTOR_CAPABILITIES: ClassVar[tuple[str, ...]] = ()
TIMEOUT: ClassVar[float] = 300.0
MIN_REQUEST_INTERVAL: ClassVar[float] = 0.0
MAX_RETRIES: ClassVar[int] = 5
property api_key: str
property client: httpx.Client
close() None
request(method: str, endpoint: str, *, headers: dict[str, str] | None = None, **kwargs: Any) httpx.Response
decode_response(response: httpx.Response, *, suffix: str | None = None, as_extended: bool = True) Any
decode_response_file(response: httpx.Response, *, source: str | None = None, suffix: str | None = None, as_extended: bool = True, metadata: collections.abc.Mapping[str, Any] | None = None) extended_data.io.DataFile
extend_result(value: Any) Any
request_data(method: str, endpoint: str, *, headers: dict[str, str] | None = None, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) Any
request_data_file(method: str, endpoint: str, *, headers: dict[str, str] | None = None, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) extended_data.io.DataFile
request_workflow(method: str, endpoint: str, *, headers: dict[str, str] | None = None, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) extended_data.workflows.DataWorkflow
get(endpoint: str, **kwargs: Any) httpx.Response
get_data(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) Any
get_workflow(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) extended_data.workflows.DataWorkflow
post(endpoint: str, **kwargs: Any) httpx.Response
post_data(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) Any
post_workflow(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) extended_data.workflows.DataWorkflow
put(endpoint: str, **kwargs: Any) httpx.Response
put_data(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) Any
put_workflow(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) extended_data.workflows.DataWorkflow
delete(endpoint: str, **kwargs: Any) httpx.Response
delete_data(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) Any
delete_workflow(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) extended_data.workflows.DataWorkflow
patch(endpoint: str, **kwargs: Any) httpx.Response
patch_data(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) Any
patch_workflow(endpoint: str, *, suffix: str | None = None, as_extended: bool = True, **kwargs: Any) extended_data.workflows.DataWorkflow
download(url: str, output_path: str) int
vendor_capabilities: ClassVar[dict[str, vendor_fabric.capabilities.CapabilitySpec]] = None
vendor_capability_methods: ClassVar[dict[str, str]] = None
get_input(k: str, default: Any | None = None, required: bool = False, is_bool: bool = False, is_integer: bool = False, is_float: bool = False, is_path: bool = False, is_datetime: bool = False, as_extended: bool = False) Any
decode_input(k: str, default: Any | None = None, required: bool = False, decode_from_json: bool = False, decode_from_yaml: bool = False, decode_from_base64: bool = False, allow_none: bool = True, as_extended: bool = False) Any
freeze_inputs() extended_data.containers.mappings.ExtendedDict
thaw_inputs() extended_data.containers.mappings.ExtendedDict
snapshot_inputs(*, frozen: bool = False) extended_data.containers.mappings.ExtendedDict
replace_inputs(new_inputs: collections.abc.Mapping[str, Any] | None, *, clear_frozen: bool = True) extended_data.containers.mappings.ExtendedDict
merge_inputs(new_inputs: collections.abc.Mapping[str, Any] | None) extended_data.containers.mappings.ExtendedDict
shift_inputs() extended_data.containers.mappings.ExtendedDict