|
1 | | -// Copyright 2025 Google LLC |
| 1 | +// Copyright 2026 Google LLC |
2 | 2 | // |
3 | 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | 4 | // you may not use this file except in compliance with the License. |
@@ -94,6 +94,10 @@ message Step { |
94 | 94 | // A CloudSQLInstanceInfo is populated with starting instance information. |
95 | 95 | START_FROM_CLOUD_SQL_INSTANCE = 22; |
96 | 96 |
|
| 97 | + // Initial state: packet originating from a Google Kubernetes Engine Pod. |
| 98 | + // A GkePodInfo is populated with starting Pod information. |
| 99 | + START_FROM_GKE_POD = 39; |
| 100 | + |
97 | 101 | // Initial state: packet originating from a Redis instance. |
98 | 102 | // A RedisInstanceInfo is populated with starting instance information. |
99 | 103 | START_FROM_REDIS_INSTANCE = 32; |
@@ -188,6 +192,10 @@ message Step { |
188 | 192 | // with the translation information. |
189 | 193 | NAT = 14; |
190 | 194 |
|
| 195 | + // Transition state: GKE Pod IP masquerading is skipped. The |
| 196 | + // `ip_masquerading_skipped` field is populated with the reason. |
| 197 | + SKIP_GKE_POD_IP_MASQUERADING = 40; |
| 198 | + |
191 | 199 | // Transition state: original connection is terminated and a new proxied |
192 | 200 | // connection is initiated. |
193 | 201 | PROXY_CONNECTION = 15; |
@@ -292,6 +300,13 @@ message Step { |
292 | 300 | // Display information of a Google Kubernetes Engine cluster master. |
293 | 301 | GKEMasterInfo gke_master = 18; |
294 | 302 |
|
| 303 | + // Display information of a Google Kubernetes Engine Pod. |
| 304 | + GkePodInfo gke_pod = 37; |
| 305 | + |
| 306 | + // Display information of the reason why GKE Pod IP masquerading was |
| 307 | + // skipped. |
| 308 | + IpMasqueradingSkippedInfo ip_masquerading_skipped = 38; |
| 309 | + |
295 | 310 | // Display information of a Cloud SQL instance. |
296 | 311 | CloudSQLInstanceInfo cloud_sql_instance = 19; |
297 | 312 |
|
@@ -425,16 +440,22 @@ message FirewallInfo { |
425 | 440 | // rules](https://cloud.google.com/functions/docs/networking/connecting-vpc#restrict-access). |
426 | 441 | SERVERLESS_VPC_ACCESS_MANAGED_FIREWALL_RULE = 4; |
427 | 442 |
|
428 | | - // Global network firewall policy rule. |
| 443 | + // User-defined global network firewall policy rule. |
429 | 444 | // For details, see [Network firewall |
430 | 445 | // policies](https://cloud.google.com/vpc/docs/network-firewall-policies). |
431 | 446 | NETWORK_FIREWALL_POLICY_RULE = 5; |
432 | 447 |
|
433 | | - // Regional network firewall policy rule. |
| 448 | + // User-defined regional network firewall policy rule. |
434 | 449 | // For details, see [Regional network firewall |
435 | 450 | // policies](https://cloud.google.com/firewall/docs/regional-firewall-policies). |
436 | 451 | NETWORK_REGIONAL_FIREWALL_POLICY_RULE = 6; |
437 | 452 |
|
| 453 | + // System-defined global network firewall policy rule. |
| 454 | + SYSTEM_NETWORK_FIREWALL_POLICY_RULE = 7; |
| 455 | + |
| 456 | + // System-defined regional network firewall policy rule. |
| 457 | + SYSTEM_REGIONAL_NETWORK_FIREWALL_POLICY_RULE = 8; |
| 458 | + |
438 | 459 | // Firewall policy rule containing attributes not yet supported in |
439 | 460 | // Connectivity tests. Firewall analysis is skipped if such a rule can |
440 | 461 | // potentially be matched. Please see the [list of unsupported |
@@ -1098,6 +1119,9 @@ message DeliverInfo { |
1098 | 1119 |
|
1099 | 1120 | // Target is a Redis Cluster. |
1100 | 1121 | REDIS_CLUSTER = 17; |
| 1122 | + |
| 1123 | + // Target is a GKE Pod. |
| 1124 | + GKE_POD = 19; |
1101 | 1125 | } |
1102 | 1126 |
|
1103 | 1127 | // Recognized type of a Google Service. |
@@ -1265,10 +1289,23 @@ message AbortInfo { |
1265 | 1289 | // required to run the test. |
1266 | 1290 | PERMISSION_DENIED_NO_CLOUD_ROUTER_CONFIGS = 36; |
1267 | 1291 |
|
1268 | | - // Aborted because no valid source or destination endpoint is derived from |
1269 | | - // the input test request. |
| 1292 | + // Aborted because no valid source or destination endpoint can be derived |
| 1293 | + // from the test request. |
1270 | 1294 | NO_SOURCE_LOCATION = 5; |
1271 | 1295 |
|
| 1296 | + // Aborted because the source IP address is not contained within the subnet |
| 1297 | + // ranges of the provided VPC network. |
| 1298 | + NO_SOURCE_GCP_NETWORK_LOCATION = 42; |
| 1299 | + |
| 1300 | + // Aborted because the source IP address is not contained within the |
| 1301 | + // destination ranges of the routes towards non-GCP networks in the provided |
| 1302 | + // VPC network. |
| 1303 | + NO_SOURCE_NON_GCP_NETWORK_LOCATION = 43; |
| 1304 | + |
| 1305 | + // Aborted because the source IP address can't be resolved as an Internet |
| 1306 | + // IP address. |
| 1307 | + NO_SOURCE_INTERNET_LOCATION = 44; |
| 1308 | + |
1272 | 1309 | // Aborted because the source or destination endpoint specified in |
1273 | 1310 | // the request is invalid. Some examples: |
1274 | 1311 | // - The request might contain malformed resource URI, project ID, or IP |
@@ -1324,6 +1361,11 @@ message AbortInfo { |
1324 | 1361 | // not supported. |
1325 | 1362 | SOURCE_PSC_CLOUD_SQL_UNSUPPORTED = 20; |
1326 | 1363 |
|
| 1364 | + // Aborted because tests with the external database as a source are not |
| 1365 | + // supported. In such replication scenarios, the connection is initiated by |
| 1366 | + // the Cloud SQL replica instance. |
| 1367 | + SOURCE_EXTERNAL_CLOUD_SQL_UNSUPPORTED = 45; |
| 1368 | + |
1327 | 1369 | // Aborted because tests with a Redis Cluster as a source are not supported. |
1328 | 1370 | SOURCE_REDIS_CLUSTER_UNSUPPORTED = 34; |
1329 | 1371 |
|
@@ -1353,6 +1395,11 @@ message AbortInfo { |
1353 | 1395 | // Aborted because the used protocol is not supported for the used IP |
1354 | 1396 | // version. |
1355 | 1397 | IP_VERSION_PROTOCOL_MISMATCH = 40; |
| 1398 | + |
| 1399 | + // Aborted because selected GKE Pod endpoint location is unknown. This is |
| 1400 | + // often the case for "Pending" Pods, which don't have assigned IP addresses |
| 1401 | + // yet. |
| 1402 | + GKE_POD_UNKNOWN_ENDPOINT_LOCATION = 41; |
1356 | 1403 | } |
1357 | 1404 |
|
1358 | 1405 | // Causes that the analysis is aborted. |
@@ -1423,10 +1470,12 @@ message DropInfo { |
1423 | 1470 | // rule of the internal passthrough load balancer). |
1424 | 1471 | ROUTE_NEXT_HOP_FORWARDING_RULE_TYPE_INVALID = 53; |
1425 | 1472 |
|
1426 | | - // Packet is sent from the Internet or Google service to the private IPv6 |
1427 | | - // address. |
| 1473 | + // Packet is sent from the Internet to the private IPv6 address. |
1428 | 1474 | NO_ROUTE_FROM_INTERNET_TO_PRIVATE_IPV6_ADDRESS = 44; |
1429 | 1475 |
|
| 1476 | + // Packet is sent from the Internet to the private IPv4 address. |
| 1477 | + NO_ROUTE_FROM_INTERNET_TO_PRIVATE_IPV4_ADDRESS = 109; |
| 1478 | + |
1430 | 1479 | // Packet is sent from the external IPv6 source address of an instance to |
1431 | 1480 | // the private IPv6 address of an instance. |
1432 | 1481 | NO_ROUTE_FROM_EXTERNAL_IPV6_SOURCE_TO_PRIVATE_IPV6_ADDRESS = 98; |
@@ -1484,6 +1533,9 @@ message DropInfo { |
1484 | 1533 | // Packet sent from or to a GKE cluster that is not in running state. |
1485 | 1534 | GKE_CLUSTER_NOT_RUNNING = 27; |
1486 | 1535 |
|
| 1536 | + // Packet sent from or to a GKE Pod that is not in running state. |
| 1537 | + GKE_POD_NOT_RUNNING = 103; |
| 1538 | + |
1487 | 1539 | // Packet sent from or to a Cloud SQL instance that is not in running state. |
1488 | 1540 | CLOUD_SQL_INSTANCE_NOT_RUNNING = 28; |
1489 | 1541 |
|
@@ -1735,6 +1787,10 @@ message DropInfo { |
1735 | 1787 | // dropped due to no matching NAT gateway in the subnet. |
1736 | 1788 | NO_MATCHING_NAT64_GATEWAY = 90; |
1737 | 1789 |
|
| 1790 | + // Packet is dropped due to matching a Private NAT64 gateway with no rules |
| 1791 | + // for source IPv6 addresses. |
| 1792 | + NO_CONFIGURED_PRIVATE_NAT64_RULE = 107; |
| 1793 | + |
1738 | 1794 | // Packet is dropped due to being sent to a backend of a passthrough load |
1739 | 1795 | // balancer that doesn't use the same IP version as the frontend. |
1740 | 1796 | LOAD_BALANCER_BACKEND_IP_VERSION_MISMATCH = 96; |
@@ -1767,6 +1823,10 @@ message DropInfo { |
1767 | 1823 | // from the region of the next hop of the route matched within this hybrid |
1768 | 1824 | // subnet. |
1769 | 1825 | HYBRID_SUBNET_REGION_MISMATCH = 105; |
| 1826 | + |
| 1827 | + // Packet is dropped because no matching route was found in the hybrid |
| 1828 | + // subnet. |
| 1829 | + HYBRID_SUBNET_NO_ROUTE = 106; |
1770 | 1830 | } |
1771 | 1831 |
|
1772 | 1832 | // Cause that the packet is dropped. |
@@ -1810,6 +1870,67 @@ message GKEMasterInfo { |
1810 | 1870 | string dns_endpoint = 7; |
1811 | 1871 | } |
1812 | 1872 |
|
| 1873 | +// For display only. Metadata associated with a Google Kubernetes Engine (GKE) |
| 1874 | +// Pod. |
| 1875 | +message GkePodInfo { |
| 1876 | + // URI of a GKE Pod. |
| 1877 | + // For Pods in regional Clusters, the URI format is: |
| 1878 | + // `projects/{project}/locations/{location}/clusters/{cluster}/k8s/namespaces/{namespace}/pods/{pod}` |
| 1879 | + // For Pods in zonal Clusters, the URI format is: |
| 1880 | + // `projects/{project}/zones/{zone}/clusters/{cluster}/k8s/namespaces/{namespace}/pods/{pod}` |
| 1881 | + string pod_uri = 1; |
| 1882 | + |
| 1883 | + // IP address of a GKE Pod. If the Pod is dual-stack, this is the IP address |
| 1884 | + // relevant to the trace. |
| 1885 | + string ip_address = 2 [(google.api.field_info).format = IPV4_OR_IPV6]; |
| 1886 | + |
| 1887 | + // URI of the network containing the GKE Pod. |
| 1888 | + string network_uri = 3; |
| 1889 | +} |
| 1890 | + |
| 1891 | +// For display only. Contains information about why IP masquerading was skipped |
| 1892 | +// for the packet. |
| 1893 | +message IpMasqueradingSkippedInfo { |
| 1894 | + // Reason why IP masquerading was skipped. |
| 1895 | + enum Reason { |
| 1896 | + // Unused default value. |
| 1897 | + REASON_UNSPECIFIED = 0; |
| 1898 | + |
| 1899 | + // Masquerading not applied because destination IP is in one of configured |
| 1900 | + // non-masquerade ranges. |
| 1901 | + DESTINATION_IP_IN_CONFIGURED_NON_MASQUERADE_RANGE = 1; |
| 1902 | + |
| 1903 | + // Masquerading not applied because destination IP is in one of default |
| 1904 | + // non-masquerade ranges. |
| 1905 | + DESTINATION_IP_IN_DEFAULT_NON_MASQUERADE_RANGE = 2; |
| 1906 | + |
| 1907 | + // Masquerading not applied because destination is on the same Node. |
| 1908 | + DESTINATION_ON_SAME_NODE = 3; |
| 1909 | + |
| 1910 | + // Masquerading not applied because ip-masq-agent doesn't exist and default |
| 1911 | + // SNAT is disabled. |
| 1912 | + DEFAULT_SNAT_DISABLED = 4; |
| 1913 | + |
| 1914 | + // Masquerading not applied because the packet's IP version is IPv6. |
| 1915 | + NO_MASQUERADING_FOR_IPV6 = 5; |
| 1916 | + |
| 1917 | + // Masquerading not applied because the source Pod uses the host Node's |
| 1918 | + // network namespace, including the Node's IP address. |
| 1919 | + POD_USES_NODE_NETWORK_NAMESPACE = 6; |
| 1920 | + |
| 1921 | + // Masquerading not applied because the packet is a return packet. |
| 1922 | + NO_MASQUERADING_FOR_RETURN_PACKET = 7; |
| 1923 | + } |
| 1924 | + |
| 1925 | + // Reason why IP masquerading was not applied. |
| 1926 | + Reason reason = 1; |
| 1927 | + |
| 1928 | + // The matched non-masquerade IP range. Only set if reason is |
| 1929 | + // DESTINATION_IP_IN_CONFIGURED_NON_MASQUERADE_RANGE or |
| 1930 | + // DESTINATION_IP_IN_DEFAULT_NON_MASQUERADE_RANGE. |
| 1931 | + string non_masquerade_range = 2; |
| 1932 | +} |
| 1933 | + |
1813 | 1934 | // For display only. Metadata associated with a Cloud SQL instance. |
1814 | 1935 | message CloudSQLInstanceInfo { |
1815 | 1936 | // Name of a Cloud SQL instance. |
@@ -1986,6 +2107,27 @@ message NatInfo { |
1986 | 2107 | GKE_POD_IP_MASQUERADING = 5; |
1987 | 2108 | } |
1988 | 2109 |
|
| 2110 | + // Types of Cloud NAT gateway. |
| 2111 | + enum CloudNatGatewayType { |
| 2112 | + // Type is unspecified. |
| 2113 | + CLOUD_NAT_GATEWAY_TYPE_UNSPECIFIED = 0; |
| 2114 | + |
| 2115 | + // Public NAT gateway. |
| 2116 | + PUBLIC_NAT44 = 1; |
| 2117 | + |
| 2118 | + // Public NAT64 gateway. |
| 2119 | + PUBLIC_NAT64 = 2; |
| 2120 | + |
| 2121 | + // Private NAT gateway for NCC. |
| 2122 | + PRIVATE_NAT_NCC = 3; |
| 2123 | + |
| 2124 | + // Private NAT gateway for hybrid connectivity. |
| 2125 | + PRIVATE_NAT_HYBRID = 4; |
| 2126 | + |
| 2127 | + // Private NAT64 gateway. |
| 2128 | + PRIVATE_NAT64 = 5; |
| 2129 | + } |
| 2130 | + |
1989 | 2131 | // Type of NAT. |
1990 | 2132 | Type type = 1; |
1991 | 2133 |
|
@@ -2026,6 +2168,9 @@ message NatInfo { |
2026 | 2168 |
|
2027 | 2169 | // The name of Cloud NAT Gateway. Only valid when type is CLOUD_NAT. |
2028 | 2170 | string nat_gateway_name = 13; |
| 2171 | + |
| 2172 | + // Type of Cloud NAT gateway. Only valid when `type` is CLOUD_NAT. |
| 2173 | + CloudNatGatewayType cloud_nat_gateway_type = 14; |
2029 | 2174 | } |
2030 | 2175 |
|
2031 | 2176 | // For display only. Metadata associated with ProxyConnection. |
|
0 commit comments