Skip to content

Commit 9ca8780

Browse files
authored
Merge pull request #1079 from fabianvf/fix-py3-hang-10
cherry-pick of #1073 to release-10.0: Fix python3 hang
2 parents df6fdd2 + 629c747 commit 9ca8780

17 files changed

+131
-101
lines changed

examples/create_deployment.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ def main():
2727

2828
with open(path.join(path.dirname(__file__), "nginx-deployment.yaml")) as f:
2929
dep = yaml.safe_load(f)
30-
k8s_beta = client.ExtensionsV1beta1Api()
31-
resp = k8s_beta.create_namespaced_deployment(
30+
k8s_apps_v1 = client.AppsV1Api()
31+
resp = k8s_apps_v1.create_namespaced_deployment(
3232
body=dep, namespace="default")
3333
print("Deployment created. status='%s'" % str(resp.status))
3434

examples/create_deployment_from_yaml.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def main():
2424
config.load_kube_config()
2525
k8s_client = client.ApiClient()
2626
utils.create_from_yaml(k8s_client, "nginx-deployment.yaml")
27-
k8s_api = client.ExtensionsV1beta1Api(k8s_client)
27+
k8s_api = client.AppsV1Api(k8s_client)
2828
deps = k8s_api.read_namespaced_deployment("nginx-deployment", "default")
2929
print("Deployment {0} created".format(deps.metadata.name))
3030

examples/deployment_examples.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,19 @@ def create_deployment_object():
2525
# Configureate Pod template container
2626
container = client.V1Container(
2727
name="nginx",
28-
image="nginx:1.7.9",
28+
image="nginx:1.15.4",
2929
ports=[client.V1ContainerPort(container_port=80)])
3030
# Create and configurate a spec section
3131
template = client.V1PodTemplateSpec(
3232
metadata=client.V1ObjectMeta(labels={"app": "nginx"}),
3333
spec=client.V1PodSpec(containers=[container]))
3434
# Create the specification of deployment
35-
spec = client.ExtensionsV1beta1DeploymentSpec(
35+
spec = client.AppsV1beta1DeploymentSpec(
3636
replicas=3,
3737
template=template)
3838
# Instantiate the deployment object
39-
deployment = client.ExtensionsV1beta1Deployment(
40-
api_version="extensions/v1beta1",
39+
deployment = client.AppsV1beta1Deployment(
40+
api_version="apps/v1beta1",
4141
kind="Deployment",
4242
metadata=client.V1ObjectMeta(name=DEPLOYMENT_NAME),
4343
spec=spec)
@@ -55,7 +55,7 @@ def create_deployment(api_instance, deployment):
5555

5656
def update_deployment(api_instance, deployment):
5757
# Update container image
58-
deployment.spec.template.spec.containers[0].image = "nginx:1.9.1"
58+
deployment.spec.template.spec.containers[0].image = "nginx:1.16.0"
5959
# Update the deployment
6060
api_response = api_instance.patch_namespaced_deployment(
6161
name=DEPLOYMENT_NAME,
@@ -80,16 +80,16 @@ def main():
8080
# utility. If no argument provided, the config will be loaded from
8181
# default location.
8282
config.load_kube_config()
83-
extensions_v1beta1 = client.ExtensionsV1beta1Api()
83+
apps_v1beta1 = client.AppsV1beta1Api()
8484
# Create a deployment object with client-python API. The deployment we
8585
# created is same as the `nginx-deployment.yaml` in the /examples folder.
8686
deployment = create_deployment_object()
8787

88-
create_deployment(extensions_v1beta1, deployment)
88+
create_deployment(apps_v1beta1, deployment)
8989

90-
update_deployment(extensions_v1beta1, deployment)
90+
update_deployment(apps_v1beta1, deployment)
9191

92-
delete_deployment(extensions_v1beta1)
92+
delete_deployment(apps_v1beta1)
9393

9494

9595
if __name__ == '__main__':

examples/nginx-deployment.yaml

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
apiVersion: extensions/v1beta1
1+
apiVersion: apps/v1
22
kind: Deployment
33
metadata:
44
name: nginx-deployment
5+
labels:
6+
app: nginx
57
spec:
68
replicas: 3
9+
selector:
10+
matchLabels:
11+
app: nginx
712
template:
813
metadata:
914
labels:
1015
app: nginx
1116
spec:
1217
containers:
1318
- name: nginx
14-
image: nginx:1.7.9
19+
image: nginx:1.15.4
1520
ports:
1621
- containerPort: 80
17-

examples/notebooks/create_deployment.ipynb

+9-9
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"outputs": [],
4848
"source": [
4949
"config.load_kube_config()\n",
50-
"extension = client.ExtensionsV1beta1Api()"
50+
"apps_api = client.AppsV1beta1Api()"
5151
]
5252
},
5353
{
@@ -70,7 +70,7 @@
7070
},
7171
"outputs": [],
7272
"source": [
73-
"deployment = client.ExtensionsV1beta1Deployment()"
73+
"deployment = client.AppsV1beta1Deployment()"
7474
]
7575
},
7676
{
@@ -93,7 +93,7 @@
9393
},
9494
"outputs": [],
9595
"source": [
96-
"deployment.api_version = \"extensions/v1beta1\"\n",
96+
"deployment.api_version = \"apps/v1beta1\"\n",
9797
"deployment.kind = \"Deployment\"\n",
9898
"deployment.metadata = client.V1ObjectMeta(name=\"nginx-deployment\")"
9999
]
@@ -118,7 +118,7 @@
118118
},
119119
"outputs": [],
120120
"source": [
121-
"spec = client.ExtensionsV1beta1DeploymentSpec()\n",
121+
"spec = client.AppsV1beta1DeploymentSpec()\n",
122122
"spec.replicas = 3"
123123
]
124124
},
@@ -207,7 +207,7 @@
207207
},
208208
"outputs": [],
209209
"source": [
210-
"extension.create_namespaced_deployment(namespace=\"default\", body=deployment)"
210+
"apps_api.create_namespaced_deployment(namespace=\"default\", body=deployment)"
211211
]
212212
},
213213
{
@@ -253,7 +253,7 @@
253253
},
254254
"outputs": [],
255255
"source": [
256-
"extension.replace_namespaced_deployment(name=\"nginx-deployment\", namespace=\"default\", body=deployment)"
256+
"apps_api.replace_namespaced_deployment(name=\"nginx-deployment\", namespace=\"default\", body=deployment)"
257257
]
258258
},
259259
{
@@ -277,10 +277,10 @@
277277
},
278278
"outputs": [],
279279
"source": [
280-
"rollback = client.ExtensionsV1beta1DeploymentRollback()\n",
281-
"rollback.api_version = \"extensions/v1beta1\"\n",
280+
"rollback = client.AppsV1beta1DeploymentRollback()\n",
281+
"rollback.api_version = \"apps/v1beta1\"\n",
282282
"rollback.kind = \"DeploymentRollback\"\n",
283-
"rollback.rollback_to = client.ExtensionsV1beta1RollbackConfig()\n",
283+
"rollback.rollback_to = client.AppsV1beta1RollbackConfig()\n",
284284
"rollback.rollback_to.revision = 0\n",
285285
"rollback.name = \"nginx-deployment\""
286286
]

examples/notebooks/intro_notebook.ipynb

+3-3
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@
8989
},
9090
"outputs": [],
9191
"source": [
92-
"api_instance = client.ExtensionsV1beta1Api()\n",
93-
"dep = client.ExtensionsV1beta1Deployment()\n",
94-
"spec = client.ExtensionsV1beta1DeploymentSpec()"
92+
"api_instance = client.AppsV1beta1Api()\n",
93+
"dep = client.AppsV1beta1Deployment()\n",
94+
"spec = client.AppsV1beta1DeploymentSpec()"
9595
]
9696
},
9797
{

kubernetes/client/api_client.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import os
1515
import re
1616
import json
17+
import atexit
1718
import mimetypes
1819
import tempfile
1920
from multiprocessing.pool import ThreadPool
@@ -74,19 +75,28 @@ def __init__(self, configuration=None, header_name=None, header_value=None,
7475
self.cookie = cookie
7576
# Set default User-Agent.
7677
self.user_agent = 'Swagger-Codegen/10.0.1/python'
77-
78-
def __del__(self):
78+
79+
def __enter__(self):
80+
return self
81+
82+
def __exit__(self, exc_type, exc_value, traceback):
83+
self.close()
84+
85+
def close(self):
7986
if self._pool:
8087
self._pool.close()
8188
self._pool.join()
8289
self._pool = None
90+
if hasattr(atexit, 'unregister'):
91+
atexit.unregister(self.close)
8392

8493
@property
8594
def pool(self):
8695
"""Create thread pool on first request
8796
avoids instantiating unused threadpool for blocking clients.
8897
"""
8998
if self._pool is None:
99+
atexit.register(self.close)
90100
self._pool = ThreadPool(self.pool_threads)
91101
return self._pool
92102

kubernetes/e2e_test/test_extensions.py kubernetes/e2e_test/test_apps.py

+15-9
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,38 @@
1717
import yaml
1818

1919
from kubernetes.client import api_client
20-
from kubernetes.client.apis import extensions_v1beta1_api
20+
from kubernetes.client.apis import apps_v1_api
2121
from kubernetes.client.models import v1_delete_options
2222
from kubernetes.e2e_test import base
2323

2424

25-
class TestClientExtensions(unittest.TestCase):
25+
class TestClientApps(unittest.TestCase):
2626

2727
@classmethod
2828
def setUpClass(cls):
2929
cls.config = base.get_e2e_configuration()
3030

3131
def test_create_deployment(self):
3232
client = api_client.ApiClient(configuration=self.config)
33-
api = extensions_v1beta1_api.ExtensionsV1beta1Api(client)
33+
api = apps_v1_api.AppsV1Api(client)
3434
name = 'nginx-deployment-' + str(uuid.uuid4())
35-
deployment = '''apiVersion: extensions/v1beta1
35+
deployment = '''apiVersion: apps/v1
3636
kind: Deployment
3737
metadata:
3838
name: %s
3939
spec:
4040
replicas: 3
41+
selector:
42+
matchLabels:
43+
app: nginx
4144
template:
4245
metadata:
4346
labels:
4447
app: nginx
4548
spec:
4649
containers:
4750
- name: nginx
48-
image: nginx:1.7.9
51+
image: nginx:1.15.4
4952
ports:
5053
- containerPort: 80
5154
'''
@@ -60,24 +63,27 @@ def test_create_deployment(self):
6063

6164
def test_create_daemonset(self):
6265
client = api_client.ApiClient(configuration=self.config)
63-
api = extensions_v1beta1_api.ExtensionsV1beta1Api(client)
66+
api = apps_v1_api.AppsV1Api(client)
6467
name = 'nginx-app-' + str(uuid.uuid4())
6568
daemonset = {
66-
'apiVersion': 'extensions/v1beta1',
69+
'apiVersion': 'apps/v1',
6770
'kind': 'DaemonSet',
6871
'metadata': {
6972
'labels': {'app': 'nginx'},
7073
'name': '%s' % name,
7174
},
7275
'spec': {
76+
'selector': {
77+
'matchLabels': {'app': 'nginx'},
78+
},
7379
'template': {
7480
'metadata': {
7581
'labels': {'app': 'nginx'},
7682
'name': name},
7783
'spec': {
7884
'containers': [
7985
{'name': 'nginx-app',
80-
'image': 'nginx:1.10'},
86+
'image': 'nginx:1.15.4'},
8187
],
8288
},
8389
},
@@ -91,4 +97,4 @@ def test_create_daemonset(self):
9197
self.assertIsNotNone(resp)
9298

9399
options = v1_delete_options.V1DeleteOptions()
94-
resp = api.delete_namespaced_daemon_set(name, 'default', body=options)
100+
resp = api.delete_namespaced_daemon_set(name, 'default', body=options)

0 commit comments

Comments
 (0)