{
  "repo": "tidbcloud/extension-provider-gcp",
  "binary": "gardener-extension-provider-gcp",
  "binary_path": "cmd/gardener-extension-provider-gcp/main.go",
  "dependencies": {
    "BackupBucketController.Reconcile": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Read BackupBucket secret for service account",
              "conditions": ["Always"],
              "implementation": "pkg/controller/backupbucket/actuator.go:47"
            },
            {
              "operation": "GET",
              "trigger": "Read service account secret",
              "conditions": ["Always"],
              "implementation": "pkg/internal/serviceaccount.go:57"
            }
          ]
        },
        {
          "name": "gcp-storage",
          "target_interface": "storage.Client.Bucket.Create",
          "operation_type": "gcp_api",
          "target_repo": "googleapis/google-cloud-go",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "CreateBucket",
              "trigger": "Create GCS bucket for backup",
              "conditions": ["Bucket does not exist"],
              "implementation": "pkg/gcp/client/storage.go:69-79"
            }
          ]
        }
      ]
    },
    "BackupBucketController.Delete": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Read BackupBucket secret for service account",
              "conditions": ["Always"],
              "implementation": "pkg/controller/backupbucket/actuator.go:56"
            }
          ]
        },
        {
          "name": "gcp-storage",
          "target_interface": "storage.Client.Bucket.Delete",
          "operation_type": "gcp_api",
          "target_repo": "googleapis/google-cloud-go",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "DeleteBucket",
              "trigger": "Delete GCS bucket",
              "conditions": ["Bucket exists"],
              "implementation": "pkg/gcp/client/storage.go:82-87"
            }
          ]
        }
      ]
    },
    "BackupEntryController.Delete": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Read BackupEntry secret for service account",
              "conditions": ["Always"],
              "implementation": "pkg/controller/backupentry/actuator.go:50"
            }
          ]
        },
        {
          "name": "gcp-storage",
          "target_interface": "storage.Client.Bucket.Objects",
          "operation_type": "gcp_api",
          "target_repo": "googleapis/google-cloud-go",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "ListObjects",
              "trigger": "List objects with prefix",
              "conditions": ["Always"],
              "implementation": "pkg/gcp/client/storage.go:89-91"
            },
            {
              "operation": "DeleteObject",
              "trigger": "Delete each object with prefix",
              "conditions": ["Object exists"],
              "implementation": "pkg/gcp/client/storage.go:100"
            }
          ]
        }
      ]
    },
    "InfrastructureController.Reconcile": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get/Update",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Read Infrastructure config",
              "conditions": ["Always"],
              "implementation": "pkg/controller/infrastructure/actuator_reconcile.go:33-36"
            },
            {
              "operation": "GET",
              "trigger": "Read service account secret",
              "conditions": ["Always"],
              "implementation": "pkg/controller/infrastructure/actuator_reconcile.go:38-41"
            },
            {
              "operation": "UPDATE",
              "trigger": "Update Infrastructure status",
              "conditions": ["Terraform apply succeeded"],
              "implementation": "pkg/controller/infrastructure/actuator.go:68-72"
            }
          ]
        },
        {
          "name": "terraformer",
          "target_interface": "terraformer.Terraformer.Apply",
          "operation_type": "cli_exec",
          "target_repo": "gardener/gardener",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "terraform init",
              "trigger": "Initialize Terraform configuration",
              "conditions": ["Always"],
              "implementation": "pkg/internal/terraform.go:53-63"
            },
            {
              "operation": "terraform apply",
              "trigger": "Apply Terraform configuration to create/update GCP resources",
              "conditions": ["Always"],
              "implementation": "pkg/controller/infrastructure/actuator_reconcile.go:58-66"
            }
          ]
        },
        {
          "name": "gcp-compute",
          "target_interface": "terraform.google_provider",
          "operation_type": "terraform_gcp",
          "target_repo": "hashicorp/terraform-provider-google",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "google_compute_network",
              "trigger": "Create VPC network",
              "conditions": ["create.vpc == true"],
              "implementation": "charts/internal/gcp-infra"
            },
            {
              "operation": "google_compute_subnetwork",
              "trigger": "Create subnets for nodes and internal",
              "conditions": ["Always"],
              "implementation": "charts/internal/gcp-infra"
            },
            {
              "operation": "google_compute_router",
              "trigger": "Create Cloud Router",
              "conditions": ["create.cloudRouter == true"],
              "implementation": "charts/internal/gcp-infra"
            },
            {
              "operation": "google_compute_address",
              "trigger": "Create NAT IPs",
              "conditions": ["cloudNAT.natIPNames specified"],
              "implementation": "charts/internal/gcp-infra"
            },
            {
              "operation": "google_compute_router_nat",
              "trigger": "Create Cloud NAT",
              "conditions": ["Always"],
              "implementation": "charts/internal/gcp-infra"
            },
            {
              "operation": "google_service_account",
              "trigger": "Create service account for nodes",
              "conditions": ["Always"],
              "implementation": "charts/internal/gcp-infra"
            }
          ]
        }
      ]
    },
    "InfrastructureController.Delete": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Read Infrastructure config",
              "conditions": ["Always"],
              "implementation": "pkg/controller/infrastructure/actuator_delete.go:86-89"
            },
            {
              "operation": "GET",
              "trigger": "Read service account secret",
              "conditions": ["Always"],
              "implementation": "pkg/controller/infrastructure/actuator_delete.go:91-94"
            }
          ]
        },
        {
          "name": "gcp-compute",
          "target_interface": "compute.Service.Firewalls",
          "operation_type": "gcp_api",
          "target_repo": "googleapis/google-api-go-client",
          "conditions": ["configExists"],
          "operations": [
            {
              "operation": "Firewalls.List",
              "trigger": "List Kubernetes firewall rules",
              "conditions": ["Always"],
              "implementation": "pkg/internal/infrastructure/infrastructure.go:36-58"
            },
            {
              "operation": "Firewalls.Delete",
              "trigger": "Delete Kubernetes firewall rules",
              "conditions": ["Firewall exists"],
              "implementation": "pkg/internal/infrastructure/infrastructure.go:83-90"
            }
          ]
        },
        {
          "name": "gcp-compute-routes",
          "target_interface": "compute.Service.Routes",
          "operation_type": "gcp_api",
          "target_repo": "googleapis/google-api-go-client",
          "conditions": ["configExists"],
          "operations": [
            {
              "operation": "Routes.List",
              "trigger": "List Kubernetes routes",
              "conditions": ["Always"],
              "implementation": "pkg/internal/infrastructure/infrastructure.go:62-78"
            },
            {
              "operation": "Routes.Delete",
              "trigger": "Delete Kubernetes routes",
              "conditions": ["Route exists"],
              "implementation": "pkg/internal/infrastructure/infrastructure.go:95-102"
            }
          ]
        },
        {
          "name": "terraformer",
          "target_interface": "terraformer.Terraformer.Destroy",
          "operation_type": "cli_exec",
          "target_repo": "gardener/gardener",
          "conditions": ["After firewall and route cleanup"],
          "operations": [
            {
              "operation": "terraform destroy",
              "trigger": "Destroy Terraform-managed resources",
              "conditions": ["Always"],
              "implementation": "pkg/controller/infrastructure/actuator_delete.go:131-135"
            }
          ]
        }
      ]
    },
    "WorkerController.DeployMachineClasses": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Read worker secret for service account",
              "conditions": ["Always"],
              "implementation": "pkg/controller/worker/machines.go:67-74"
            }
          ]
        },
        {
          "name": "kubernetes-chart-applier",
          "target_interface": "ChartApplier.Apply",
          "operation_type": "helm_deploy",
          "target_repo": "gardener/gardener",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "helm install/upgrade",
              "trigger": "Deploy machine classes as Helm chart",
              "conditions": ["Always"],
              "implementation": "pkg/controller/worker/machines.go:53"
            }
          ]
        }
      ]
    },
    "ControlPlaneController.GetConfigChartValues": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Read service account secret",
              "conditions": ["Always"],
              "implementation": "pkg/controller/controlplane/valuesprovider.go:298-301"
            }
          ]
        }
      ]
    },
    "ControlPlaneWebhook.EnsureKubeAPIServerDeployment": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["!(csiEnabled && csiMigrationComplete)"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Get checksum for cloud provider secret",
              "conditions": ["!(csiEnabled && csiMigrationComplete)"],
              "implementation": "pkg/webhook/controlplane/ensurer.go:325-328"
            }
          ]
        }
      ]
    },
    "ControlPlaneExposureWebhook.EnsureKubeAPIServerDeployment": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["!IsAPIServerExposureManaged && !IsHibernated"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Get cluster info",
              "conditions": ["Always"],
              "implementation": "pkg/webhook/controlplaneexposure/ensurer.go:63-66"
            },
            {
              "operation": "GET",
              "trigger": "Get kube-apiserver service load balancer address",
              "conditions": ["!IsHibernated"],
              "implementation": "pkg/webhook/controlplaneexposure/ensurer.go:73-76"
            }
          ]
        }
      ]
    },
    "HealthCheckController.RegisterHealthChecks": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get/List",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Check seed deployment health",
              "conditions": ["Always"],
              "implementation": "pkg/controller/healthcheck/add.go:67-68"
            },
            {
              "operation": "GET",
              "trigger": "Check CSI controller health",
              "conditions": ["k8sVersion >= 1.18"],
              "implementation": "pkg/controller/healthcheck/add.go:71-72"
            },
            {
              "operation": "GET",
              "trigger": "Check CSI snapshot controller health",
              "conditions": ["k8sVersion >= 1.18"],
              "implementation": "pkg/controller/healthcheck/add.go:75-78"
            },
            {
              "operation": "GET",
              "trigger": "Check managed resource",
              "conditions": ["Always"],
              "implementation": "pkg/controller/healthcheck/add.go:81-86"
            },
            {
              "operation": "GET",
              "trigger": "Check machine controller manager health",
              "conditions": ["Always"],
              "implementation": "pkg/controller/healthcheck/add.go:105-106"
            },
            {
              "operation": "LIST",
              "trigger": "Check sufficient nodes",
              "conditions": ["Always"],
              "implementation": "pkg/controller/healthcheck/add.go:109"
            }
          ]
        }
      ]
    },
    "BackupEntryController.GetETCDSecretData": {
      "infrastructure": {},
      "services": []
    },
    "CSIMigrationController.Reconcile": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get/Update",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Get Cluster resource",
              "conditions": ["Always"],
              "implementation": "vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/reconciler.go:84"
            },
            {
              "operation": "GET",
              "trigger": "Check ControlPlane object exists",
              "conditions": ["!AnnotationNeedsComplete"],
              "implementation": "vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/reconciler.go:113"
            },
            {
              "operation": "UPDATE",
              "trigger": "Update Cluster annotations for CSI migration status",
              "conditions": ["Migration in progress or completed"],
              "implementation": "vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/reconciler.go:122,198,225"
            },
            {
              "operation": "PATCH",
              "trigger": "Trigger webhook for kube-apiserver feature gates update",
              "conditions": ["AnnotationNeedsComplete"],
              "implementation": "vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/reconciler.go:203-219"
            },
            {
              "operation": "PATCH",
              "trigger": "Trigger webhook for kube-controller-manager feature gates update",
              "conditions": ["AnnotationNeedsComplete"],
              "implementation": "vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/reconciler.go:203-219"
            },
            {
              "operation": "PATCH",
              "trigger": "Trigger webhook for kube-scheduler feature gates update",
              "conditions": ["AnnotationNeedsComplete"],
              "implementation": "vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/reconciler.go:203-219"
            }
          ]
        },
        {
          "name": "shoot-kubernetes-api",
          "target_interface": "shootClient.List/Delete",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Shoot not hibernated && k8sVersion == 1.18"],
          "operations": [
            {
              "operation": "LIST",
              "trigger": "List nodes to check kubelet versions",
              "conditions": ["Shoot not hibernated"],
              "implementation": "vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/reconciler.go:159"
            },
            {
              "operation": "LIST",
              "trigger": "List storage classes for CSI migration",
              "conditions": ["All kubelets updated"],
              "implementation": "vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/reconciler.go:181"
            },
            {
              "operation": "DELETE",
              "trigger": "Delete legacy storage classes with old provisioner",
              "conditions": ["StorageClass uses legacy provisioner"],
              "implementation": "vendor/github.com/gardener/gardener/extensions/pkg/controller/csimigration/reconciler.go:188"
            }
          ]
        }
      ]
    },
    "WorkerController.GenerateMachineDeployments": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Read worker secret for service account",
              "conditions": ["Always"],
              "implementation": "pkg/controller/worker/machines.go:67-74"
            }
          ]
        }
      ]
    },
    "WorkerController.GetMachineControllerManagerChartValues": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Get Namespace UID for chart values",
              "conditions": ["Always"],
              "implementation": "pkg/controller/worker/machine_controller_manager.go:58-62"
            }
          ]
        }
      ]
    },
    "WorkerController.GetMachineControllerManagerShootChartValues": {
      "infrastructure": {},
      "services": []
    },
    "WorkerController.GetMachineImages": {
      "infrastructure": {},
      "services": []
    },
    "ControlPlaneWebhook.EnsureKubeControllerManagerDeployment": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["!(csiEnabled && csiMigrationComplete)"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Get checksum for cloud provider secret",
              "conditions": ["!(csiEnabled && csiMigrationComplete)"],
              "implementation": "pkg/webhook/controlplane/ensurer.go:325-328"
            },
            {
              "operation": "GET",
              "trigger": "Get checksum for cloud provider config map",
              "conditions": ["!(csiEnabled && csiMigrationComplete)"],
              "implementation": "pkg/webhook/controlplane/ensurer.go:328"
            }
          ]
        }
      ]
    },
    "ControlPlaneWebhook.EnsureKubeSchedulerDeployment": {
      "infrastructure": {},
      "services": []
    },
    "ControlPlaneWebhook.EnsureKubeletServiceUnitOptions": {
      "infrastructure": {},
      "services": []
    },
    "ControlPlaneWebhook.EnsureKubeletConfiguration": {
      "infrastructure": {},
      "services": []
    },
    "ControlPlaneWebhook.EnsureKubernetesGeneralConfiguration": {
      "infrastructure": {},
      "services": []
    },
    "ControlPlaneExposureWebhook.EnsureETCD": {
      "infrastructure": {},
      "services": []
    },
    "ControlPlaneController.GetControlPlaneChartValues": {
      "infrastructure": {},
      "services": [
        {
          "name": "kubernetes-api",
          "target_interface": "client.Get",
          "operation_type": "kubernetes_api",
          "target_repo": "kubernetes/kubernetes",
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GET",
              "trigger": "Read service account secret",
              "conditions": ["Always"],
              "implementation": "pkg/controller/controlplane/valuesprovider.go:323-326"
            }
          ]
        }
      ]
    },
    "ControlPlaneController.GetControlPlaneShootChartValues": {
      "infrastructure": {},
      "services": []
    },
    "ControlPlaneController.GetStorageClassesChartValues": {
      "infrastructure": {},
      "services": []
    }
  }
}
