Skip to content

GCP

pulumi_extra.contrib.gcp

is_gcp_resource(resource_type)

Determine if a given resource type is an AWS resource.

Source code in pulumi_extra/contrib/gcp/common.py
2
3
4
def is_gcp_resource(resource_type: str) -> bool:
    """Determine if a given resource type is an AWS resource."""
    return resource_type.startswith("gcp:")

is_labelable(resource_type)

Determine if a given GCP resource type is labelable.

Source code in pulumi_extra/contrib/gcp/autolabel.py
def is_labelable(resource_type: str) -> bool:
    """Determine if a given GCP resource type is labelable."""
    if not is_gcp_resource(resource_type):
        pulumi.log.debug(f"Resource type {resource_type} is not a GCP resource")
        return False

    if resource_type in _NOT_LABELABLE_RESOURCES:
        pulumi.log.info(
            f"Resource type {resource_type} is set not-labelable explicitly",
        )
        return False

    return resource_has_attribute(resource_type, "labels")

register_auto_labeling(*, exclude=None, extra=None, no_default_labels=False)

Register a Pulumi stack transform that automatically labels resources.

Parameters:

Name Type Description Default
exclude set[str] | None

Resources to exclude from labeling.

None
extra dict[str, str] | None

Extra labels to add.

None
no_default_labels bool

If True, do not add default Pulumi labels; pulumi-organization, pulumi-project, pulumi-stack, managed-by.

False
Source code in pulumi_extra/contrib/gcp/autolabel.py
def register_auto_labeling(
    *,
    exclude: set[str] | None = None,
    extra: dict[str, str] | None = None,
    no_default_labels: bool = False,
) -> None:
    """Register a Pulumi stack transform that automatically labels resources.

    Args:
        exclude: Resources to exclude from labeling.
        extra: Extra labels to add.
        no_default_labels: If `True`, do not add default Pulumi labels;
            pulumi-organization, pulumi-project, pulumi-stack, managed-by.
    """
    labels = {}
    extra = extra or {}
    exclude = exclude or set()

    # Pulumi labels
    # NOTE: Labels need transformation because of strict GCP restrictions
    if not no_default_labels:
        org = pulumi.get_organization()
        project = pulumi.get_project()
        stack = pulumi.get_stack()
        labels.update(
            {
                "pulumi-organization": org,
                "pulumi-project": project.replace(".", "-"),
                "pulumi-stack": stack,
                "managed-by": "pulumi",
            },
        )

    labels.update(extra)

    def transform(
        args: pulumi.ResourceTransformArgs,
    ) -> pulumi.ResourceTransformResult | None:
        if args.type_ not in exclude and is_labelable(args.type_):
            if TYPE_CHECKING:
                assert isinstance(args.props, dict)
            args.props["labels"] = {
                **labels,
                **(args.props.get("labels", {})),
            }
            return pulumi.ResourceTransformResult(props=args.props, opts=args.opts)

        return None

    pulumi.runtime.register_resource_transform(transform)