Skip to content
This repository was archived by the owner on Jan 18, 2023. It is now read-only.

Commit 86da4da

Browse files
DamenusSzymon Scharmach
authored and
Szymon Scharmach
committed
Added test for uninstall cmk on kubernetes 1.7 (#175)
1 parent e2a665f commit 86da4da

File tree

4 files changed

+134
-48
lines changed

4 files changed

+134
-48
lines changed

intel/custom_resource.py

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,17 @@ def __init__(self, api, group, name, short_names,
8282
"spec": self.spec
8383
}
8484

85+
self.resource_path_crd = \
86+
'/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/'
87+
88+
self.resource_path_crd_type = \
89+
self.resource_path_crd + self.plural_name + "." + self.group
90+
8591
def save(self):
8692
"""Create custom resource definition spec"""
8793
try:
88-
resource_path = \
89-
'/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions'
9094
self.api.api_client.call_api(
91-
resource_path,
95+
self.resource_path_crd,
9296
'POST',
9397
self.header_params,
9498
body=self.body,
@@ -106,17 +110,9 @@ def save(self):
106110

107111
def exists(self, namespace="default"):
108112
"""Check if custom resource definition exists"""
109-
resource_path = "/".join([
110-
"/apis",
111-
self.group,
112-
"v1",
113-
"namespaces", namespace,
114-
self.plural_name
115-
])
116-
117113
try:
118114
self.api.api_client.call_api(
119-
resource_path,
115+
self.resource_path_crd_type,
120116
'GET',
121117
self.header_params,
122118
auth_settings=self.auth_settings)
@@ -136,23 +132,20 @@ def create(self, name, namespace="default"):
136132
def remove(self):
137133
"""Remove custom resource definitions"""
138134
if self.exists():
139-
resource_path = "/apis/apiextensions.k8s.io/" \
140-
+ "v1beta1/customresourcedefinitions/" \
141-
+ self.plural_name + "." + self.group
142135

143136
self.api.api_client.call_api(
144-
resource_path,
137+
self.resource_path_crd_type,
145138
'DELETE',
146139
self.header_params,
147140
auth_settings=self.auth_settings)
148141

149142

150143
class CustomResourceDefinition:
151144
def __init__(self, api, resource_type, namespace, name):
152-
assert (api is not None)
153-
assert (resource_type is not None)
154-
assert (name is not None)
155-
assert (namespace is not None)
145+
assert api is not None
146+
assert resource_type is not None
147+
assert name is not None
148+
assert namespace is not None
156149

157150
self.api = api
158151
self.resource_type = resource_type
@@ -216,13 +209,3 @@ def save(self):
216209
raise e
217210

218211
self.create()
219-
220-
def remove_all(self):
221-
"""Remove all object custom resource"""
222-
resource_path = self.resource_path
223-
224-
self.api.api_client.call_api(
225-
resource_path,
226-
'DELETE',
227-
self.resource_type.header_params,
228-
auth_settings=self.resource_type.auth_settings)

intel/uninstall.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,29 +79,20 @@ def remove_all_report():
7979
remove_report_tpr("Reconcilereport")
8080

8181

82-
def remove_report_crd(report_type, short_name):
82+
def remove_report_crd(report_type, short_names):
8383
logging.info(
8484
"Removing \"{}\" from Kubernetes API server for node \"{}\".".format(
8585
report_type, os.getenv("NODE_NAME")))
8686
node_report_type = custom_resource.CustomResourceDefinitionType(
8787
k8s.extensions_client_from_config(None),
8888
"intel.com",
8989
report_type,
90-
short_name
90+
short_names
9191
)
9292
node_report = node_report_type.create(os.getenv("NODE_NAME"))
9393

9494
try:
95-
node_report.remove_all()
96-
except K8sApiException as err:
97-
if json.loads(err.body)["reason"] != "NotFound":
98-
logging.error(
99-
"Aborting uninstall: Exception when removing custom"
100-
" resource definition \"{}\": {}".format(report_type, err))
101-
sys.exit(1)
102-
103-
logging.warning("\"{}\" for node \"{}\" does not exist.".format(
104-
report_type, os.getenv("NODE_NAME")))
95+
node_report.remove()
10596
except K8sApiException as err:
10697
if json.loads(err.body)["reason"] != "NotFound":
10798
logging.error(

intel/util.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ def cmk_root():
2525
def ldh_convert_check(name):
2626
name_con = re.sub(r'[^-a-z0-9]', '-', name.lower())
2727
logging.info("Converted \"{}\" to \"{}\" for"
28-
" TPR name".format(name, name_con))
28+
" TPR/CRD name".format(name, name_con))
2929
if not re.fullmatch('[a-z0-9]([-a-z0-9]*[a-z0-9])?', name_con):
30-
logging.error("Cant create valid TPR name using "
30+
logging.error("Cant create valid TPR/CRD name using "
3131
"\"{}\" - must match regex "
3232
"[a-z0-9]([-a-z0-9]*[a-z0-9])?".format(name_con))
3333
exit(1)

tests/unit/test_uninstall.py

Lines changed: 116 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414

1515
from .. import helpers
16-
from intel import proc, uninstall, third_party
16+
from intel import custom_resource, proc, uninstall, third_party
1717
from kubernetes.client.rest import ApiException as K8sApiException
1818
import os
1919
import pytest
@@ -62,7 +62,50 @@ def test_uninstall_remove_node_cmk_oir_failure(caplog):
6262
assert caplog_tuple[-1][2] == exp_log_err
6363

6464

65-
def test_remove_report_success(caplog):
65+
def test_remove_all_report_tpr_success(caplog):
66+
mock = MagicMock()
67+
mock.remove.return_value = 0
68+
69+
with patch('kubernetes.config.load_incluster_config',
70+
MagicMock(return_value=0)), \
71+
patch('kubernetes.client.ExtensionsV1beta1Api',
72+
MagicMock(return_value=0)), \
73+
patch('intel.k8s.get_kubelet_version',
74+
MagicMock(return_value=(1, 6))), \
75+
patch.object(third_party.ThirdPartyResourceType,
76+
'create',
77+
MagicMock(return_value=mock)):
78+
uninstall.remove_all_report()
79+
caplog_tuple = caplog.record_tuples
80+
assert caplog_tuple[-1][2] == "\"Reconcilereport\" for node \"{}\" " \
81+
"removed.".format(os.getenv("NODE_NAME"))
82+
assert caplog_tuple[-3][2] == "\"Nodereport\" for node \"{}\" " \
83+
"removed.".format(os.getenv("NODE_NAME"))
84+
85+
86+
def test_remove_all_report_crd_success(caplog):
87+
mock = MagicMock()
88+
mock.remove.return_value = 0
89+
90+
with patch('kubernetes.config.load_incluster_config',
91+
MagicMock(return_value=0)), \
92+
patch('kubernetes.client.ExtensionsV1beta1Api',
93+
MagicMock(return_value=0)), \
94+
patch('intel.k8s.get_kubelet_version',
95+
MagicMock(return_value=(1, 7))), \
96+
patch.object(custom_resource.CustomResourceDefinitionType,
97+
'create',
98+
MagicMock(return_value=mock)):
99+
uninstall.remove_all_report()
100+
caplog_tuple = caplog.record_tuples
101+
assert caplog_tuple[-1][2] == "\"cmk-reconcilereport\" for node " \
102+
"\"{}\" removed."\
103+
.format(os.getenv("NODE_NAME"))
104+
assert caplog_tuple[-3][2] == "\"cmk-nodereport\" for node \"{}\" " \
105+
"removed.".format(os.getenv("NODE_NAME"))
106+
107+
108+
def test_remove_report_tpr_success(caplog):
66109
fake_tpr_report = MagicMock()
67110
fake_tpr_report.remove.return_value = 0
68111

@@ -79,7 +122,7 @@ def test_remove_report_success(caplog):
79122

80123

81124
# Remove success due to not existing report
82-
def test_remove_report_success2(caplog):
125+
def test_remove_report_tpr_success2(caplog):
83126
fake_http_resp = FakeHTTPResponse(500, "{\"message\":\"fake message\"}",
84127
"{\"reason\":\"NotFound\"}")
85128
fake_api_exception = K8sApiException(http_resp=fake_http_resp)
@@ -104,7 +147,7 @@ def test_remove_report_success2(caplog):
104147
"removed.".format(os.getenv("NODE_NAME"))
105148

106149

107-
def test_remove_report_failure(caplog):
150+
def test_remove_report_tpr_failure(caplog):
108151
fake_http_resp = FakeHTTPResponse(500, "{\"message\":\"fake message\"}",
109152
"{\"reason\":\"WrongReason\"}")
110153
fake_api_exception = K8sApiException(http_resp=fake_http_resp)
@@ -127,6 +170,75 @@ def test_remove_report_failure(caplog):
127170
assert caplog_tuple[-1][2] == exp_log_err
128171

129172

173+
def test_remove_report_crd_success(caplog):
174+
fake_crd_report = MagicMock()
175+
fake_crd_report.remove.return_value = 0
176+
177+
with patch('kubernetes.config.load_incluster_config',
178+
MagicMock(return_value=0)),\
179+
patch('kubernetes.client.ExtensionsV1beta1Api',
180+
MagicMock(return_value=0)), \
181+
patch.object(custom_resource.CustomResourceDefinitionType,
182+
'create',
183+
MagicMock(return_value=fake_crd_report)):
184+
uninstall.remove_report_crd("cmk-nodereport", ["cmk-nr"])
185+
caplog_tuple = caplog.record_tuples
186+
assert caplog_tuple[-1][2] == "\"cmk-nodereport\" for node \"{}\" " \
187+
"removed.".format(os.getenv("NODE_NAME"))
188+
189+
190+
# Remove success due to not existing report
191+
def test_remove_report_crd_success2(caplog):
192+
fake_http_resp = FakeHTTPResponse(500, "{\"message\":\"fake message\"}",
193+
"{\"reason\":\"NotFound\"}")
194+
fake_api_exception = K8sApiException(http_resp=fake_http_resp)
195+
196+
fake_crd_report = MagicMock()
197+
fake_crd_report.remove.side_effect = fake_api_exception
198+
199+
with patch('kubernetes.config.load_incluster_config',
200+
MagicMock(return_value=0)),\
201+
patch('kubernetes.client.ExtensionsV1beta1Api',
202+
MagicMock(return_value=0)), \
203+
patch.object(custom_resource.CustomResourceDefinitionType,
204+
'create',
205+
MagicMock(return_value=fake_crd_report)):
206+
207+
uninstall.remove_report_crd("cmk-nodereport", ["cmk-nr"])
208+
caplog_tuple = caplog.record_tuples
209+
assert \
210+
caplog_tuple[-2][2] == "\"cmk-nodereport\" for node \"{}\" does "\
211+
"not exist.".format(os.getenv("NODE_NAME"))
212+
assert \
213+
caplog_tuple[-1][2] == "\"cmk-nodereport\" for node \"{}\" " \
214+
"removed.".format(os.getenv("NODE_NAME"))
215+
216+
217+
def test_remove_report_crd_failure(caplog):
218+
fake_http_resp = FakeHTTPResponse(500, "{\"message\":\"fake message\"}",
219+
"{\"reason\":\"WrongReason\"}")
220+
fake_api_exception = K8sApiException(http_resp=fake_http_resp)
221+
222+
fake_crd_report = MagicMock()
223+
fake_crd_report.remove.side_effect = fake_api_exception
224+
225+
with patch('kubernetes.config.load_incluster_config',
226+
MagicMock(return_value=0)),\
227+
patch('kubernetes.client.ExtensionsV1beta1Api',
228+
MagicMock(return_value=0)), \
229+
patch.object(custom_resource.CustomResourceDefinitionType,
230+
'create',
231+
MagicMock(return_value=fake_crd_report)):
232+
with pytest.raises(SystemExit):
233+
uninstall.remove_report_crd("cmk-nodereport", ["cmk-nr"])
234+
caplog_tuple = caplog.record_tuples
235+
exp_err = "Aborting uninstall: " \
236+
"Exception when removing custom resource definition " \
237+
"\"cmk-nodereport\""
238+
exp_log_err = get_expected_log_error(exp_err, fake_http_resp)
239+
assert caplog_tuple[-1][2] == exp_log_err
240+
241+
130242
def test_uninstall_remove_node_taint_failure1(caplog):
131243
fake_http_resp = FakeHTTPResponse(500, "fake reason", "fake body")
132244
fake_api_exception = K8sApiException(http_resp=fake_http_resp)

0 commit comments

Comments
 (0)