Skip to content

Commit

Permalink
Dualstack interop test
Browse files Browse the repository at this point in the history
  • Loading branch information
larry-safran committed Jul 30, 2024
1 parent 00199ac commit 4f726ce
Show file tree
Hide file tree
Showing 17 changed files with 283 additions and 26 deletions.
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @grpc/grpc-psm-interop
52 changes: 50 additions & 2 deletions .kokoro/psm_interop_kokoro_lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,50 @@ psm::security::run_test() {
psm::tools::run_verbose python -m "tests.${test_name}" "${PSM_TEST_FLAGS[@]}"
}

# --- DualStack TESTS ------------------

#######################################
# DualStack Test Suite setup.
# Outputs:
# Prints activated cluster names.
#######################################
psm::dualstack::setup() {
activate_gke_cluster GKE_CLUSTER_DUALSTACK
}

#######################################
# Prepares the list of tests in DualStack test suite.
# Globals:
# TESTS: Populated with tests in PSM DualStack test suite.
#######################################
psm::dualstack::get_tests() {
TESTS=(
"dualstack_test"
)
}

#######################################
# Executes DualStack test case
# Globals:
# PSM_TEST_FLAGS: The array with flags for the test
# GRPC_LANGUAGE: The name of gRPC languages under test
# Arguments:
# Test case name
# Outputs:
# Writes the output of test execution to stdout, stderr
# Test xUnit report to ${TEST_XML_OUTPUT_DIR}/${test_name}/sponge_log.xml
#######################################
psm::dualstack::run_test() {
local test_name="${1:?${FUNCNAME[0]} missing the test name argument}"

PSM_TEST_FLAGS+=(
"--flagfile=config/common-dualstack.cfg"
)

psm::run::finalize_test_flags "${test_name}"
psm::tools::run_verbose python -m "tests.${test_name}" "${PSM_TEST_FLAGS[@]}"
}

# --- URL Map TESTS ------------------

#######################################
Expand Down Expand Up @@ -257,7 +301,7 @@ psm::csm::run_test() {
# BUILD_SCRIPT_DIR: Absolute path to the directory with lang-specific buildscript
# in the source repo.
# Arguments:
# Test suite name, one of (lb, security, url_map, csm)
# Test suite name, one of (lb, security, dualstack, url_map, csm)
# Outputs:
# Writes the output of test execution to stdout, stderr
#######################################
Expand All @@ -272,7 +316,7 @@ psm::run() {
psm::setup::docker_image_names "${GRPC_LANGUAGE}" "${test_suite}"

case "${test_suite}" in
lb | security | url_map | csm)
lb | security | dualstack | url_map | csm)
psm::setup::generic_test_suite "${test_suite}"
;;
*)
Expand Down Expand Up @@ -694,6 +738,10 @@ activate_gke_cluster() {
GKE_CLUSTER_NAME="interop-test-psm-basic"
GKE_CLUSTER_ZONE="us-central1-c"
;;
GKE_CLUSTER_DUALSTACK)
GKE_CLUSTER_NAME="psm-interop-dualstack"
GKE_CLUSTER_ZONE="us-central1-a"
;;
*)
psm::tools::log "Unknown GKE cluster: ${1}"
exit 1
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ do this, navigate to this directory and run `./bin/freeze.sh`.

There are many arguments to be passed into the test run. You can save the
arguments to a config file ("flagfile") for your development environment.
Use [`config/local-dev.cfg.example`](https://github.com/grpc/grpc/blob/master/tools/run_tests/xds_k8s_test_driver/config/local-dev.cfg.example)
Use [`config/local-dev.cfg.example`](https://github.com/grpc/psm-interop/blob/main/config/local-dev.cfg.example)
as a starting point:

```shell
Expand All @@ -268,7 +268,7 @@ Learn more about flagfiles in [abseil documentation](https://abseil.io/docs/pyth

## Test suites

See the full list of available test suites in the [`tests/`](https://github.com/grpc/grpc/tree/master/tools/run_tests/xds_k8s_test_driver/tests) folder.
See the full list of available test suites in the [`tests/`](https://github.com/grpc/psm-interop/blob/main/tests) folder.

### xDS Baseline Tests

Expand Down Expand Up @@ -304,7 +304,7 @@ python -m tests.security_test --flagfile="config/local-dev.cfg"
```

## Helper scripts
You can use interop xds-k8s [`bin/`](https://github.com/grpc/grpc/tree/master/tools/run_tests/xds_k8s_test_driver/bin)
You can use interop xds-k8s [`bin/`](https://github.com/grpc/psm-interop/blob/main/bin)
scripts to configure TD, start k8s instances step-by-step, and keep them alive
for as long as you need.

Expand Down
6 changes: 6 additions & 0 deletions config/common-dualstack.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Common config file for PSM DualStack tests.
--resource_prefix=psm-ds
--enable_dualstack
--noenable_workload_identity
--compute_api_version=v1beta
--network=dualstack
2 changes: 1 addition & 1 deletion config/common.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
--resource_prefix=psm-interop
--td_bootstrap_image=us-docker.pkg.dev/grpc-testing/trafficdirector/td-grpc-bootstrap:2bf1b5ed00f852ffea8d24759c6fa673acc9ef10
--td_bootstrap_image=us-docker.pkg.dev/grpc-testing/trafficdirector/td-grpc-bootstrap:4ba99d77963c72d4973486ef2a3055913fdc2392

# The canonical implementation of the xDS test server.
# Can be used in tests where language-specific xDS test server does not exist,
Expand Down
5 changes: 4 additions & 1 deletion framework/test_app/runners/k8s/gamma_server_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ def __init__(
deployment_name: str,
image_name: str,
td_bootstrap_image: str,
app_label: str = "",
network: str = "default",
xds_server_uri: Optional[str] = None,
gcp_api_manager: gcp.api.GcpApiManager,
Expand All @@ -88,6 +89,7 @@ def __init__(
deployment_name=deployment_name,
image_name=image_name,
td_bootstrap_image=td_bootstrap_image,
app_label=app_label,
network=network,
xds_server_uri=xds_server_uri,
gcp_api_manager=gcp_api_manager,
Expand Down Expand Up @@ -154,7 +156,7 @@ def run( # pylint: disable=arguments-differ
self.service_template,
service_name=self.service_name,
namespace_name=self.k8s_namespace.name,
deployment_name=self.deployment_name,
app_label=self.app_label,
neg_name=self.gcp_neg_name,
test_port=test_port,
)
Expand Down Expand Up @@ -199,6 +201,7 @@ def run( # pylint: disable=arguments-differ
deployment_name=self.deployment_name,
image_name=self.image_name,
namespace_name=self.k8s_namespace.name,
app_label=self.app_label,
service_account_name=self.service_account_name,
td_bootstrap_image=self.td_bootstrap_image,
xds_server_uri=self.xds_server_uri,
Expand Down
8 changes: 4 additions & 4 deletions framework/test_app/runners/k8s/k8s_base_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class KubernetesBaseRunner(base_runner.BaseRunner, metaclass=ABCMeta):
# Required fields.
k8s_namespace: k8s.KubernetesNamespace
deployment_name: str
app_label: str
image_name: str
gcp_project: str
gcp_service_account: str
Expand Down Expand Up @@ -141,6 +142,7 @@ def __init__(
gcp_project: str,
gcp_service_account: str,
gcp_ui_url: str,
app_label: str = "",
namespace_template: Optional[str] = "namespace.yaml",
reuse_namespace: bool = False,
):
Expand All @@ -150,6 +152,7 @@ def __init__(
self.deployment_name = deployment_name
self.image_name = image_name
self.gcp_project = gcp_project
self.app_label = app_label or deployment_name
# Maps GCP service account to Kubernetes service account
self.gcp_service_account = gcp_service_account
self.gcp_ui_url = gcp_ui_url
Expand Down Expand Up @@ -999,10 +1002,7 @@ def _wait_pod_started(self, name, **kwargs) -> k8s.V1Pod:
self.k8s_namespace.wait_for_pod_started(name, **kwargs)
pod = self.k8s_namespace.get_pod(name)

if hasattr(pod.status, "pod_ip_s"): # if running with dualstack support
pod_ips = pod.status.pod_ip_s
else:
pod_ips = pod.status.pod_ip
pod_ips = pod.status.pod_i_ps or pod.status.pod_ip
logger.info("Pod %s ready, IP: %s", pod.metadata.name, pod_ips)
return pod

Expand Down
3 changes: 3 additions & 0 deletions framework/test_app/runners/k8s/k8s_xds_client_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ def __init__( # pylint: disable=too-many-locals
deployment_name: str,
image_name: str,
td_bootstrap_image: str,
app_label: str = "",
network="default",
xds_server_uri: Optional[str] = None,
gcp_api_manager: gcp.api.GcpApiManager,
Expand All @@ -84,6 +85,7 @@ def __init__( # pylint: disable=too-many-locals
deployment_name=deployment_name,
image_name=image_name,
gcp_project=gcp_project,
app_label=app_label,
gcp_service_account=gcp_service_account,
gcp_ui_url=gcp_api_manager.gcp_ui_url,
namespace_template=namespace_template,
Expand Down Expand Up @@ -173,6 +175,7 @@ def run( # pylint: disable=arguments-differ
deployment_name=self.deployment_name,
image_name=self.image_name,
namespace_name=self.k8s_namespace.name,
app_label=self.app_label,
service_account_name=self.service_account_name,
td_bootstrap_image=self.td_bootstrap_image,
xds_server_uri=self.xds_server_uri,
Expand Down
7 changes: 6 additions & 1 deletion framework/test_app/runners/k8s/k8s_xds_server_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ def __init__( # pylint: disable=too-many-locals
deployment_name: str,
image_name: str,
td_bootstrap_image: str,
app_label: str = "",
network: str = "default",
xds_server_uri: Optional[str] = None,
gcp_api_manager: gcp.api.GcpApiManager,
Expand All @@ -115,6 +116,7 @@ def __init__( # pylint: disable=too-many-locals
deployment_name=deployment_name,
image_name=image_name,
gcp_project=gcp_project,
app_label=app_label,
gcp_service_account=gcp_service_account,
gcp_ui_url=gcp_api_manager.gcp_ui_url,
namespace_template=namespace_template,
Expand Down Expand Up @@ -170,6 +172,7 @@ def run( # pylint: disable=arguments-differ,too-many-branches
test_port: int = DEFAULT_TEST_PORT,
maintenance_port: Optional[int] = None,
secure_mode: bool = False,
address_type: str = "",
replica_count: int = 1,
log_to_stdout: bool = False,
bootstrap_version: Optional[str] = None,
Expand Down Expand Up @@ -222,7 +225,7 @@ def run( # pylint: disable=arguments-differ,too-many-branches
self.service_template,
service_name=self.service_name,
namespace_name=self.k8s_namespace.name,
deployment_name=self.deployment_name,
app_label=self.app_label,
neg_name=self.gcp_neg_name,
test_port=test_port,
enable_dualstack=self.enable_dualstack,
Expand Down Expand Up @@ -252,6 +255,7 @@ def run( # pylint: disable=arguments-differ,too-many-branches
deployment_name=self.deployment_name,
image_name=self.image_name,
namespace_name=self.k8s_namespace.name,
app_label=self.app_label,
service_account_name=self.service_account_name,
td_bootstrap_image=self.td_bootstrap_image,
xds_server_uri=self.xds_server_uri,
Expand All @@ -260,6 +264,7 @@ def run( # pylint: disable=arguments-differ,too-many-branches
test_port=test_port,
maintenance_port=maintenance_port,
secure_mode=secure_mode,
address_type=address_type,
bootstrap_version=bootstrap_version,
**self.deployment_args.as_dict(),
)
Expand Down
3 changes: 3 additions & 0 deletions framework/test_app/server_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ def __init__(
self.xds_host, self.xds_port = xds_host, xds_port
self.monitoring_port = monitoring_port

def __repr__(self):
return f"XdsTestServer(ip={self.ip}, hostname={self.hostname})"

@property
@functools.lru_cache(None)
def channelz(self) -> _ChannelzServiceClient:
Expand Down
6 changes: 3 additions & 3 deletions kubernetes-manifests/client-secure.deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@ metadata:
name: ${deployment_name}
namespace: ${namespace_name}
labels:
app: ${deployment_name}
app: ${app_label}
deployment_id: ${deployment_id}
owner: xds-k8s-interop-test
spec:
replicas: 1
selector:
matchLabels:
app: ${deployment_name}
app: ${app_label}
deployment_id: ${deployment_id}
template:
metadata:
labels:
app: ${deployment_name}
app: ${app_label}
deployment_id: ${deployment_id}
owner: xds-k8s-interop-test
annotations:
Expand Down
6 changes: 3 additions & 3 deletions kubernetes-manifests/client.deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@ metadata:
name: ${deployment_name}
namespace: ${namespace_name}
labels:
app: ${deployment_name}
app: ${app_label}
deployment_id: ${deployment_id}
owner: xds-k8s-interop-test
spec:
replicas: 1
selector:
matchLabels:
app: ${deployment_name}
app: ${app_label}
deployment_id: ${deployment_id}
template:
metadata:
labels:
app: ${deployment_name}
app: ${app_label}
deployment_id: ${deployment_id}
owner: xds-k8s-interop-test
spec:
Expand Down
2 changes: 1 addition & 1 deletion kubernetes-manifests/gamma/service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ metadata:
spec:
type: ClusterIP
selector:
app: ${deployment_name}
app: ${app_label}
ports:
- port: ${test_port}
protocol: TCP
Expand Down
6 changes: 3 additions & 3 deletions kubernetes-manifests/server-secure.deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ metadata:
name: ${deployment_name}
namespace: ${namespace_name}
labels:
app: ${deployment_name}
app: ${app_label}
deployment_id: ${deployment_id}
owner: xds-k8s-interop-test
spec:
replicas: ${replica_count}
selector:
matchLabels:
app: ${deployment_name}
app: ${app_label}
deployment_id: ${deployment_id}
template:
metadata:
annotations:
security.cloud.google.com/use-workload-certificates: ""
labels:
app: ${deployment_name}
app: ${app_label}
deployment_id: ${deployment_id}
owner: xds-k8s-interop-test
spec:
Expand Down
Loading

0 comments on commit 4f726ce

Please sign in to comment.