Add connectivity test for service UDP

This patch includes the following changes:
1. Deletion of previous UDP service test (unsupported protocol),
this test should be changed to protocol=SCTP whenever we"ll run
Kubernetes version that supports SCTP.

2. New test to check connectivity of UDP service
from the host.

Follow up patches will check connectivity from pods, and
for LoadBalancer UDP service.

Depends-On: I712e088e21774d85033025996e31fda510c239a7

Change-Id: I8f38f2c657d6412de71f20e51c9f2ff2e13093f2
This commit is contained in:
Yossi Boaron 2018-10-23 11:41:21 +03:00
parent 6e23790eec
commit fc679d4946
3 changed files with 33 additions and 15 deletions

View File

@ -56,5 +56,7 @@ kuryr_k8s_opts = [
help='Whether or not A/P HA of kuryr-controller is enabled'),
cfg.StrOpt("controller_deployment_name", default="kuryr-controller",
help="Name of Kubernetes Deployment running kuryr-controller "
"Pods")
"Pods"),
cfg.BoolOpt("test_udp_services", default=False,
help="Whether or not service UDP tests will be running"),
]

View File

@ -362,7 +362,8 @@ class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
return True
def verify_udp(dest_ip, port, udp_client_sock):
udp_client_sock.sendto("Hi Server, howRU?", (dest_ip, port))
udp_client_sock.sendto("Hi Server, howRU?".encode(),
(dest_ip, port))
try:
udp_client_sock.recvfrom(512)
except socket.timeout:
@ -374,7 +375,7 @@ class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
iter_func = partial(verify_tcp, session=session)
elif protocol == "UDP":
udp_client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_client_sock.settimeout(2.0)
udp_client_sock.settimeout(5.0)
iter_func = partial(verify_udp, udp_client_sock=udp_client_sock)
else:
LOG.warning("Unsupported protocol %s, returning", protocol)
@ -408,19 +409,21 @@ class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
subset = ep.subsets[0]
subset_ports = subset.ports[0]
for subset_address in subset.addresses:
num_of_be += 1
LOG.info('Verifying connectivity for EP backend: %s:%d; '
'prot=%s', subset_address.ip, subset_ports.port,
subset_ports.protocol)
if cls._verify_connectivity(subset_address.ip, timeout_period,
subset_ports.protocol,
subset_ports.port):
num_of_be += 1
LOG.info('EP member %s responding...', subset_address.ip)
else:
LOG.error("Can't connect to EP member %s",
subset_address.ip)
raise lib_exc.ServerFault()
except Exception:
LOG.error("wait_ep_members_status: failed to retrieve "
"members details EP=%s", ep)
return 0
return num_of_be
@ -450,10 +453,12 @@ class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
cls.wait_service_status(cls.service_ip,
CONF.kuryr_kubernetes.lb_build_timeout,
protocol, port)
if pod_num != cls.wait_ep_members_status(
cls.service_name, namespace,
CONF.kuryr_kubernetes.lb_build_timeout):
LOG.error("Actual EP backend num != pod_num")
actual_be = cls.wait_ep_members_status(
cls.service_name, namespace,
CONF.kuryr_kubernetes.lb_build_timeout)
if pod_num != actual_be:
LOG.error("Actual EP backend num(%d) != pod_num(%d)",
actual_be, pod_num)
raise lib_exc.ServerFault()
cls.addClassResourceCleanup(cls.delete_service, service_name,
@ -545,7 +550,7 @@ class BaseKuryrScenarioTest(manager.NetworkScenarioTest):
# a new socket (new local UDP port) is allocated per request.
udp_client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_client_sock.settimeout(3.0)
udp_client_sock.sendto("Hi Server, howRU?",
udp_client_sock.sendto("Hi Server, howRU?".encode(),
(server_ip, server_port))
try:
data, addr = udp_client_sock.recvfrom(1024)

View File

@ -90,9 +90,20 @@ class TestLoadBalancerServiceScenario(base.BaseKuryrScenarioTest):
self.create_setup_for_service_test(spec_type="NodePort", get_ip=False)
self.check_controller_pod_status_for_time_period()
@decorators.idempotent_id('bddf5441-1244-449d-a125-b5fdbfc1b2a8')
def test_unsupported_service_protocol(self):
# Testing that kuryr controller didn't crash for 20*5 seconds since
# creation of service with unsupported protocol
self.create_setup_for_service_test(protocol="UDP", get_ip=False)
self.check_controller_pod_status_for_time_period()
class TestUdpServiceScenario(base.BaseKuryrScenarioTest):
@classmethod
def skip_checks(cls):
super(TestUdpServiceScenario, cls).skip_checks()
if not CONF.kuryr_kubernetes.service_tests_enabled:
raise cls.skipException("Service tests are not enabled")
if not CONF.kuryr_kubernetes.test_udp_services:
raise cls.skipException("Service UDP tests are not enabled")
@decorators.idempotent_id('bddf5441-1244-449d-a125-b5fda1670781')
def test_service_udp_ping(self):
self.create_setup_for_service_test(protocol="UDP", port=90,
target_port=9090)
self.assert_backend_amount(self.service_ip, self.pod_num,
server_port=90, protocol="UDP")