connectgateway/get_namespace.py (55 lines of code) (raw):
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# [START connectgateway_get_namespace]
import os
import sys
from google.api_core import exceptions
import google.auth
from google.auth.transport import requests
from google.cloud.gkeconnect import gateway_v1
from kubernetes import client
SCOPES = ['https://www.googleapis.com/auth/cloud-platform']
def get_gateway_url(membership_name: str, location: str) -> str:
"""Fetches the GKE Connect Gateway URL for the specified membership."""
try:
client_options = {}
if location != "global":
# If the location is not global, the endpoint needs to be set to the regional endpoint.
regional_endpoint = f"{location}-connectgateway.googleapis.com"
client_options = {"api_endpoint": regional_endpoint}
gateway_client = gateway_v1.GatewayControlClient(client_options=client_options)
request = gateway_v1.GenerateCredentialsRequest()
request.name = membership_name
response = gateway_client.generate_credentials(request=request)
print(f'GKE Connect Gateway Endpoint: {response.endpoint}')
if not response.endpoint:
print("Error: GKE Connect Gateway Endpoint is empty.")
sys.exit(1)
return response.endpoint
except exceptions.NotFound as e:
print(f'Membership not found: {e}')
sys.exit(1)
except Exception as e:
print(f'Error fetching GKE Connect Gateway URL: {e}')
sys.exit(1)
def configure_kubernetes_client(gateway_url: str) -> client.CoreV1Api:
"""Configures the Kubernetes client with the GKE Connect Gateway URL and credentials."""
configuration = client.Configuration()
# Configure the API client with the custom host.
configuration.host = gateway_url
# Configure API key using default auth.
credentials, _ = google.auth.default(scopes=SCOPES)
auth_req = requests.Request()
credentials.refresh(auth_req)
configuration.api_key = {'authorization': f'Bearer {credentials.token}'}
api_client = client.ApiClient(configuration=configuration)
return client.CoreV1Api(api_client)
def get_default_namespace(api_client: client.CoreV1Api) -> None:
"""Get default namespace in the Kubernetes cluster."""
try:
namespace = api_client.read_namespace(name="default")
return namespace
except client.ApiException as e:
print(f"Error getting default namespace: {e}\nStatus: {e.status}\nReason: {e.reason}")
sys.exit(1)
def get_namespace(membership_name: str, location: str) -> None:
"""Main function to connect to the cluster and get the default namespace."""
gateway_url = get_gateway_url(membership_name, location)
core_v1_api = configure_kubernetes_client(gateway_url)
namespace = get_default_namespace(core_v1_api)
print(f"\nDefault Namespace:\n{namespace}")
# [END connectgateway_get_namespace]
return namespace
if __name__ == "__main__":
MEMBERSHIP_NAME = os.environ.get('MEMBERSHIP_NAME')
MEMBERSHIP_LOCATION = os.environ.get("MEMBERSHIP_LOCATION")
namespace = get_namespace(MEMBERSHIP_NAME, MEMBERSHIP_LOCATION)