Merge "Switch to kubernetes upstream python client"

This commit is contained in:
Jenkins 2017-07-01 12:53:58 +00:00 committed by Gerrit Code Review
commit 0550fe2f89
3 changed files with 71 additions and 60 deletions

View File

@ -17,10 +17,12 @@ import random
import string import string
import time import time
import k8sclient.client as k8s_client
from oslo_config import cfg from oslo_config import cfg
from k8sclient.client.rest import ApiException from kubernetes import client as k8s_config
from kubernetes.client import api_client
from kubernetes.client.apis import core_v1_api
from kubernetes.client.rest import ApiException
from rally.common import utils as common_utils from rally.common import utils as common_utils
from rally import exceptions from rally import exceptions
from rally.plugins.openstack import scenario from rally.plugins.openstack import scenario
@ -159,12 +161,13 @@ class MagnumScenario(scenario.OpenStackScenario):
cert_file = os.path.join(dir, cert_file) cert_file = os.path.join(dir, cert_file)
ca_certs = cluster_uuid + "_ca.crt" ca_certs = cluster_uuid + "_ca.crt"
ca_certs = os.path.join(dir, ca_certs) ca_certs = os.path.join(dir, ca_certs)
client = k8s_client.api_client.ApiClient( config = k8s_config.ConfigurationObject()
cluster.api_address, config.host = cluster.api_address
key_file=key_file, config.ssl_ca_cert = ca_certs
cert_file=cert_file, config.cert_file = cert_file
ca_certs=ca_certs) config.key_file = key_file
return k8s_client.apis.apiv_api.ApivApi(client) client = api_client.ApiClient(config=config)
return core_v1_api.CoreV1Api(client)
@atomic.action_timer("magnum.k8s_list_v1pods") @atomic.action_timer("magnum.k8s_list_v1pods")
def _list_v1pods(self): def _list_v1pods(self):
@ -172,7 +175,7 @@ class MagnumScenario(scenario.OpenStackScenario):
""" """
k8s_api = self._get_k8s_api_client() k8s_api = self._get_k8s_api_client()
return k8s_api.list_namespaced_pod(namespace="default") return k8s_api.list_node(namespace="default")
@atomic.action_timer("magnum.k8s_create_v1pod") @atomic.action_timer("magnum.k8s_create_v1pod")
def _create_v1pod(self, manifest): def _create_v1pod(self, manifest):
@ -207,8 +210,7 @@ class MagnumScenario(scenario.OpenStackScenario):
condition.status.lower() == "true": condition.status.lower() == "true":
return resp return resp
if (time.time() - start if (time.time() - start > CONF.benchmark.k8s_pod_create_timeout):
> CONF.benchmark.k8s_pod_create_timeout):
raise exceptions.TimeoutException( raise exceptions.TimeoutException(
desired_status="Ready", desired_status="Ready",
resource_name=podname, resource_name=podname,

View File

@ -51,4 +51,4 @@ python-swiftclient>=3.2.0,<=3.3.0 # Apache Software License
python-troveclient>=2.2.0,<=2.9.0 # Apache Software License python-troveclient>=2.2.0,<=2.9.0 # Apache Software License
python-watcherclient>=0.23.0,<=1.1.0 # Apache Software License python-watcherclient>=0.23.0,<=1.1.0 # Apache Software License
python-zaqarclient>=1.0.0,<=1.5.0 # Apache Software License python-zaqarclient>=1.0.0,<=1.5.0 # Apache Software License
python-k8sclient>=0.2.0 # Apache Software License kubernetes>=1.0.0b1 # Apache License, Version 2.0

View File

@ -14,10 +14,10 @@
import os import os
import k8sclient.client as k8s_client
import mock import mock
from k8sclient.client.rest import ApiException from kubernetes.client import api_client
from kubernetes.client.rest import ApiException
from rally import exceptions from rally import exceptions
from rally.plugins.openstack.scenarios.magnum import utils from rally.plugins.openstack.scenarios.magnum import utils
from tests.unit import test from tests.unit import test
@ -133,10 +133,11 @@ class MagnumScenarioTestCase(test.ScenarioTestCase):
self._test_atomic_action_timer( self._test_atomic_action_timer(
self.scenario.atomic_actions(), "magnum.create_ca_certificate") self.scenario.atomic_actions(), "magnum.create_ca_certificate")
@mock.patch("k8sclient.client.apis.apiv_api.ApivApi") @mock.patch("kubernetes.client.api_client.ApiClient")
@mock.patch("k8sclient.client.api_client.ApiClient") @mock.patch("kubernetes.client.apis.core_v1_api.CoreV1Api")
def test_get_k8s_api_client_using_tls(self, mock_api_client, @mock.patch("kubernetes.client.ConfigurationObject")
mock_apiv_api): def test_get_k8s_api_client_using_tls(self, mock_configuration_object,
mock_core_v1_api, mock_api_client):
self.context.update({ self.context.update({
"ca_certs_directory": "/home/stack", "ca_certs_directory": "/home/stack",
"tenant": { "tenant": {
@ -155,19 +156,22 @@ class MagnumScenarioTestCase(test.ScenarioTestCase):
key_file = os.path.join(dir, cluster_uuid.__add__(".key")) key_file = os.path.join(dir, cluster_uuid.__add__(".key"))
cert_file = os.path.join(dir, cluster_uuid.__add__(".crt")) cert_file = os.path.join(dir, cluster_uuid.__add__(".crt"))
ca_certs = os.path.join(dir, cluster_uuid.__add__("_ca.crt")) ca_certs = os.path.join(dir, cluster_uuid.__add__("_ca.crt"))
k8s_client = mock_api_client.return_value config = mock_configuration_object.return_value
config.host = cluster.api_address
config.ssl_ca_cert = ca_certs
config.cert_file = cert_file
config.key_file = key_file
_api_client = mock_api_client.return_value
self.scenario._get_k8s_api_client() self.scenario._get_k8s_api_client()
mock_api_client.assert_called_once_with( mock_configuration_object.assert_called_once_with()
cluster.api_address, mock_api_client.assert_called_once_with(config=config)
key_file=key_file, mock_core_v1_api.assert_called_once_with(_api_client)
cert_file=cert_file,
ca_certs=ca_certs)
mock_apiv_api.assert_called_once_with(k8s_client)
@mock.patch("k8sclient.client.apis.apiv_api.ApivApi") @mock.patch("kubernetes.client.api_client.ApiClient")
@mock.patch("k8sclient.client.api_client.ApiClient") @mock.patch("kubernetes.client.apis.core_v1_api.CoreV1Api")
def test_get_k8s_api_client(self, mock_api_client, @mock.patch("kubernetes.client.ConfigurationObject")
mock_apiv_api): def test_get_k8s_api_client(self, mock_configuration_object,
mock_core_v1_api, mock_api_client):
self.context.update({ self.context.update({
"tenant": { "tenant": {
"id": "rally_tenant_id", "id": "rally_tenant_id",
@ -181,17 +185,22 @@ class MagnumScenarioTestCase(test.ScenarioTestCase):
cluster = self.scenario._get_cluster(cluster_uuid) cluster = self.scenario._get_cluster(cluster_uuid)
self.cluster_template.tls_disabled = True self.cluster_template.tls_disabled = True
client.cluster_templates.get.return_value = self.cluster_template client.cluster_templates.get.return_value = self.cluster_template
k8s_client = mock_api_client.return_value config = mock_configuration_object.return_value
config.host = cluster.api_address
config.ssl_ca_cert = None
config.cert_file = None
config.key_file = None
_api_client = mock_api_client.return_value
self.scenario._get_k8s_api_client() self.scenario._get_k8s_api_client()
mock_api_client.assert_called_once_with( mock_configuration_object.assert_called_once_with()
cluster.api_address, key_file=None, cert_file=None, ca_certs=None) mock_api_client.assert_called_once_with(config=config)
mock_apiv_api.assert_called_once_with(k8s_client) mock_core_v1_api.assert_called_once_with(_api_client)
@mock.patch(MAGNUM_UTILS + ".MagnumScenario._get_k8s_api_client") @mock.patch(MAGNUM_UTILS + ".MagnumScenario._get_k8s_api_client")
def test_list_v1pods(self, mock__get_k8s_api_client): def test_list_v1pods(self, mock__get_k8s_api_client):
k8s_api = mock__get_k8s_api_client.return_value k8s_api = mock__get_k8s_api_client.return_value
self.scenario._list_v1pods() self.scenario._list_v1pods()
k8s_api.list_namespaced_pod.assert_called_once_with( k8s_api.list_node.assert_called_once_with(
namespace="default") namespace="default")
self._test_atomic_action_timer( self._test_atomic_action_timer(
self.scenario.atomic_actions(), "magnum.k8s_list_v1pods") self.scenario.atomic_actions(), "magnum.k8s_list_v1pods")
@ -209,24 +218,24 @@ class MagnumScenarioTestCase(test.ScenarioTestCase):
podname = podname + mock_random_choice.return_value podname = podname + mock_random_choice.return_value
k8s_api.create_namespaced_pod = mock.MagicMock( k8s_api.create_namespaced_pod = mock.MagicMock(
side_effect=[ApiException(status=403), self.pod]) side_effect=[ApiException(status=403), self.pod])
not_ready_pod = k8s_client.models.V1Pod() not_ready_pod = api_client.models.V1Pod()
not_ready_status = k8s_client.models.V1PodStatus() not_ready_status = api_client.models.V1PodStatus()
not_ready_status.phase = "not_ready" not_ready_status.phase = "not_ready"
not_ready_pod.status = not_ready_status not_ready_pod.status = not_ready_status
almost_ready_pod = k8s_client.models.V1Pod() almost_ready_pod = api_client.models.V1Pod()
almost_ready_status = k8s_client.models.V1PodStatus() almost_ready_status = api_client.models.V1PodStatus()
almost_ready_status.phase = "almost_ready" almost_ready_status.phase = "almost_ready"
almost_ready_pod.status = almost_ready_status almost_ready_pod.status = almost_ready_status
ready_pod = k8s_client.models.V1Pod() ready_pod = api_client.models.V1Pod()
ready_condition = k8s_client.models.V1PodCondition() ready_condition = api_client.models.V1PodCondition()
ready_condition.status = "True" ready_condition.status = "True"
ready_condition.type = "Ready" ready_condition.type = "Ready"
ready_status = k8s_client.models.V1PodStatus() ready_status = api_client.models.V1PodStatus()
ready_status.phase = "Running" ready_status.phase = "Running"
ready_status.conditions = [ready_condition] ready_status.conditions = [ready_condition]
ready_pod_metadata = k8s_client.models.V1ObjectMeta() ready_pod_metadata = api_client.models.V1ObjectMeta()
ready_pod_metadata.uid = "123456789" ready_pod_metadata.uid = "123456789"
ready_pod_spec = k8s_client.models.V1PodSpec() ready_pod_spec = api_client.models.V1PodSpec()
ready_pod_spec.node_name = "host_abc" ready_pod_spec.node_name = "host_abc"
ready_pod.status = ready_status ready_pod.status = ready_status
ready_pod.metadata = ready_pod_metadata ready_pod.metadata = ready_pod_metadata
@ -252,10 +261,10 @@ class MagnumScenarioTestCase(test.ScenarioTestCase):
"metadata": {"name": "nginx"}}) "metadata": {"name": "nginx"}})
k8s_api.create_namespaced_pod.return_value = self.pod k8s_api.create_namespaced_pod.return_value = self.pod
mock_time.side_effect = [1, 2, 3, 4, 5, 900, 901] mock_time.side_effect = [1, 2, 3, 4, 5, 900, 901]
not_ready_pod = k8s_client.models.V1Pod() not_ready_pod = api_client.models.V1Pod()
not_ready_status = k8s_client.models.V1PodStatus() not_ready_status = api_client.models.V1PodStatus()
not_ready_status.phase = "not_ready" not_ready_status.phase = "not_ready"
not_ready_pod_metadata = k8s_client.models.V1ObjectMeta() not_ready_pod_metadata = api_client.models.V1ObjectMeta()
not_ready_pod_metadata.uid = "123456789" not_ready_pod_metadata.uid = "123456789"
not_ready_pod.status = not_ready_status not_ready_pod.status = not_ready_status
not_ready_pod.metadata = not_ready_pod_metadata not_ready_pod.metadata = not_ready_pod_metadata
@ -294,19 +303,19 @@ class MagnumScenarioTestCase(test.ScenarioTestCase):
for i in range(5): for i in range(5):
suffix = suffix + mock_random_choice.return_value suffix = suffix + mock_random_choice.return_value
rcname = manifest["metadata"]["name"] + suffix rcname = manifest["metadata"]["name"] + suffix
rc = k8s_client.models.V1ReplicationController() rc = api_client.models.V1ReplicationController()
rc.spec = k8s_client.models.V1ReplicationControllerSpec() rc.spec = api_client.models.V1ReplicationControllerSpec()
rc.spec.replicas = manifest["spec"]["replicas"] rc.spec.replicas = manifest["spec"]["replicas"]
k8s_api.create_namespaced_replication_controller.return_value = rc k8s_api.create_namespaced_replication_controller.return_value = rc
not_ready_rc = k8s_client.models.V1ReplicationController() not_ready_rc = api_client.models.V1ReplicationController()
not_ready_rc_status = ( not_ready_rc_status = (
k8s_client.models.V1ReplicationControllerStatus()) api_client.models.V1ReplicationControllerStatus())
not_ready_rc_status.replicas = None not_ready_rc_status.replicas = 0
not_ready_rc.status = not_ready_rc_status not_ready_rc.status = not_ready_rc_status
ready_rc = k8s_client.models.V1ReplicationController() ready_rc = api_client.models.V1ReplicationController()
ready_rc_status = k8s_client.models.V1ReplicationControllerStatus() ready_rc_status = api_client.models.V1ReplicationControllerStatus()
ready_rc_status.replicas = manifest["spec"]["replicas"] ready_rc_status.replicas = manifest["spec"]["replicas"]
ready_rc_metadata = k8s_client.models.V1ObjectMeta() ready_rc_metadata = api_client.models.V1ObjectMeta()
ready_rc_metadata.uid = "123456789" ready_rc_metadata.uid = "123456789"
ready_rc_metadata.name = rcname ready_rc_metadata.name = rcname
ready_rc.status = ready_rc_status ready_rc.status = ready_rc_status
@ -336,16 +345,16 @@ class MagnumScenarioTestCase(test.ScenarioTestCase):
"template": {"metadata": "template": {"metadata":
{"labels": {"labels":
{"name": "nginx"}}}}}) {"name": "nginx"}}}}})
rc = k8s_client.models.V1ReplicationController() rc = api_client.models.V1ReplicationController()
rc.spec = k8s_client.models.V1ReplicationControllerSpec() rc.spec = api_client.models.V1ReplicationControllerSpec()
rc.spec.replicas = manifest["spec"]["replicas"] rc.spec.replicas = manifest["spec"]["replicas"]
mock_time.side_effect = [1, 2, 3, 4, 5, 900, 901] mock_time.side_effect = [1, 2, 3, 4, 5, 900, 901]
k8s_api.create_namespaced_replication_controller.return_value = rc k8s_api.create_namespaced_replication_controller.return_value = rc
not_ready_rc = k8s_client.models.V1ReplicationController() not_ready_rc = api_client.models.V1ReplicationController()
not_ready_rc_status = ( not_ready_rc_status = (
k8s_client.models.V1ReplicationControllerStatus()) api_client.models.V1ReplicationControllerStatus())
not_ready_rc_status.replicas = None not_ready_rc_status.replicas = 0
not_ready_rc_metadata = k8s_client.models.V1ObjectMeta() not_ready_rc_metadata = api_client.models.V1ObjectMeta()
not_ready_rc_metadata.uid = "123456789" not_ready_rc_metadata.uid = "123456789"
not_ready_rc.status = not_ready_rc_status not_ready_rc.status = not_ready_rc_status
not_ready_rc.metadata = not_ready_rc_metadata not_ready_rc.metadata = not_ready_rc_metadata