vendor_fabric.google¶
Google Cloud and Workspace connector built on extended-data primitives.
Submodules¶
Package Contents¶
Classes¶
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.ConnectorBaseGoogle 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¶