Skip to content

Commit 485ab15

Browse files
Merge pull request #21 from userlocalhost/upgrade/acos_client_to_v2.6_or_later
Update acos_client version that is compatible with ACOS version up to v5.2.1
2 parents 4c37f7d + eaef8cf commit 485ab15

File tree

8 files changed

+309
-6
lines changed

8 files changed

+309
-6
lines changed

CHANGES.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## v1.1.0
4+
5+
* Update acos_client, which this pack depends on, version from v1.4.6 to v2.6.0
6+
or later to be able to compatible with ACOS version up to v5.2.1 (#20)
7+
38
## v1.0.0
49

510
* Drop Python 2.7 support.

pack.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ keywords:
77
- load balancer
88
- ADC
99
- network
10-
version: 1.0.0
10+
version: 1.1.0
1111
author: Hiroyasu OHYAMA
1212
1313
python_versions:

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
acos-client==1.4.6
1+
acos-client>=2.6.0,<3.0.0

tests/acos_base_action_test_case.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import mock
23
import yaml
34

45
from st2tests.base import BaseActionTestCase
@@ -31,3 +32,52 @@ def reset(self):
3132
'error': [],
3233
'critical': [],
3334
}
35+
36+
def get_mock_session(self, resp_data):
37+
"""This returns mock instance of request.Session to inspect
38+
whether sending requests from each test have expected destination endpoint
39+
and expected parameters.
40+
"""
41+
ACOS_API_AUTH_PATH = [
42+
'/services/rest/v2.1/?format=json&method=authenticate',
43+
'/axapi/v3/auth'
44+
]
45+
self._sending_requests = []
46+
47+
def _save_sending_request(api_url, method, params):
48+
self._sending_requests.append({
49+
'url': api_url,
50+
'method': method,
51+
'params': params,
52+
})
53+
54+
def _mock_sending_request(api_url, method, params):
55+
mock_resp = mock.Mock()
56+
if method == 'POST' and any([x in api_url for x in ACOS_API_AUTH_PATH]):
57+
mock_resp.json.return_value = {
58+
'authresponse': {'signature': 'token'}, # This is mock value for ACOS v3.0
59+
'session_id': 'token', # This is mock value for ACOS v2.1
60+
}
61+
else:
62+
mock_resp.json.return_value = resp_data
63+
64+
# This saves what kind of request was send
65+
_save_sending_request(api_url, method, params)
66+
67+
return mock_resp
68+
69+
def get_side_effect(api_url, **kwargs):
70+
return _mock_sending_request(api_url, 'GET', kwargs)
71+
72+
def post_side_effect(api_url, **kwargs):
73+
return _mock_sending_request(api_url, 'POST', kwargs)
74+
75+
def delete_side_effect(api_url, **kwargs):
76+
return _mock_sending_request(api_url, 'DELETE', kwargs)
77+
78+
mock_session = mock.Mock()
79+
mock_session.get.side_effect = get_side_effect
80+
mock_session.post.side_effect = post_side_effect
81+
mock_session.delete.side_effect = delete_side_effect
82+
83+
return mock_session

tests/fixtures/full.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
---
22
appliance:
33
-
4-
target: appliance_hostname1
4+
target: appliance_acos_v2.1
55
userid: admin
66
passwd: hoge
77
api_version: v2.1
88
-
9-
target: appliance_hostname2
9+
target: appliance_acos_v3.0
1010
userid: admin
1111
passwd: fuga
1212
api_version: v3.0

tests/test_get_slb_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def test_get_slb_server(self, mock_client):
2828
'action': 'get',
2929
'name': 'hoge',
3030
'one_target': True,
31-
'appliance': 'appliance_hostname1',
31+
'appliance': 'appliance_acos_v2.1',
3232
}
3333
result = self.action.run(**params)
3434

tests/test_list_slb_servers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def test_list_slb_specific_server(self, mock_client):
5050
'action': 'get',
5151
'name': 'hoge',
5252
'one_target': False,
53-
'appliance': 'appliance_hostname1',
53+
'appliance': 'appliance_acos_v2.1',
5454
}
5555
result = self.action.run(**params)
5656

tests/test_slb_service_group.py

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
import json
2+
import mock
3+
4+
from acos_base_action_test_case import ACOSBaseActionTestCase
5+
from ax_action_runner import AXActionRunner
6+
from urllib.parse import urlparse
7+
8+
RESP_SUCCESS = {'response': {'status': 'success'}}
9+
10+
11+
class TestSLBServiceGroup_v2_1(ACOSBaseActionTestCase):
12+
__test__ = True
13+
action_cls = AXActionRunner
14+
15+
def setUp(self):
16+
super(TestSLBServiceGroup_v2_1, self).setUp()
17+
18+
self.action = self.get_action_instance(self._full_config)
19+
self.action.logger.addHandler(self._log_handler)
20+
21+
@mock.patch('acos_client.v21.axapi_http.Session')
22+
def test_list_slb_service_group_for_acos(self, mock_session):
23+
mock_session.return_value = self.get_mock_session(resp_data=RESP_SUCCESS)
24+
25+
params = {
26+
'action': 'get',
27+
'object_path': 'slb.service_group',
28+
'one_target': True,
29+
'name': '',
30+
'appliance': 'appliance_acos_v2.1',
31+
}
32+
result = self.action.run(**params)
33+
34+
# check action results
35+
self.assertEqual(result, (True, RESP_SUCCESS))
36+
37+
# check sending request contents that acos_client,
38+
# which stackstorm-acos depends on, sends.
39+
self.assertEqual(len(self._sending_requests), 1)
40+
41+
urlobj = urlparse(self._sending_requests[0]['url'])
42+
self.assertEqual(urlobj.hostname, 'appliance_acos_v2.1')
43+
self.assertIn('method=slb.service_group.search', urlobj.query)
44+
self.assertEqual(self._sending_requests[0]['method'], 'POST')
45+
46+
@mock.patch('acos_client.v21.axapi_http.Session')
47+
def test_get_slb_service_group_for_acos(self, mock_session):
48+
mock_session.return_value = self.get_mock_session(resp_data=RESP_SUCCESS)
49+
50+
params = {
51+
'action': 'get',
52+
'object_path': 'slb.service_group',
53+
'one_target': True,
54+
'name': 'test-slb-service-group',
55+
'appliance': 'appliance_acos_v2.1',
56+
}
57+
result = self.action.run(**params)
58+
59+
# check action results
60+
self.assertEqual(result, (True, RESP_SUCCESS))
61+
62+
# check sending request contents that acos_client,
63+
# which stackstorm-acos depends on, sends.
64+
self.assertEqual(len(self._sending_requests), 1)
65+
66+
urlobj = urlparse(self._sending_requests[0]['url'])
67+
self.assertEqual(urlobj.hostname, 'appliance_acos_v2.1')
68+
self.assertIn('method=slb.service_group.search', urlobj.query)
69+
self.assertEqual(self._sending_requests[0]['params']['data'], json.dumps({
70+
"name": "test-slb-service-group"
71+
}))
72+
self.assertEqual(self._sending_requests[0]['method'], 'POST')
73+
74+
@mock.patch('acos_client.v21.axapi_http.Session')
75+
def test_delete_slb_service_group_for_acos(self, mock_session):
76+
mock_session.return_value = self.get_mock_session(resp_data=RESP_SUCCESS)
77+
78+
params = {
79+
'action': 'delete',
80+
'object_path': 'slb.service_group',
81+
'one_target': True,
82+
'name': 'test-slb-service-group',
83+
'appliance': 'appliance_acos_v2.1',
84+
}
85+
result = self.action.run(**params)
86+
87+
# check action results
88+
self.assertEqual(result, (True, RESP_SUCCESS))
89+
90+
# check sending request contents that acos_client,
91+
# which stackstorm-acos depends on, sends.
92+
urlobj = urlparse(self._sending_requests[0]['url'])
93+
self.assertEqual(urlobj.hostname, 'appliance_acos_v2.1')
94+
self.assertIn('method=slb.service_group.delete', urlobj.query)
95+
self.assertEqual(self._sending_requests[0]['params']['data'], json.dumps({
96+
"name": "test-slb-service-group"
97+
}))
98+
self.assertEqual(self._sending_requests[0]['method'], 'POST')
99+
100+
@mock.patch('acos_client.v21.axapi_http.Session')
101+
def test_create_slb_service_group_for_acos(self, mock_session):
102+
mock_session.return_value = self.get_mock_session(resp_data=RESP_SUCCESS)
103+
104+
params = {
105+
'action': 'create',
106+
'object_path': 'slb.service_group',
107+
'one_target': True,
108+
'name': 'test-slb-service-group',
109+
'protocol': 'tcp',
110+
'lb_method': 'round-robin',
111+
'appliance': 'appliance_acos_v2.1',
112+
}
113+
result = self.action.run(**params)
114+
115+
# check action results
116+
self.assertEqual(result, (True, RESP_SUCCESS))
117+
118+
# check sending request contents that acos_client,
119+
# which stackstorm-acos depends on, sends.
120+
urlobj = urlparse(self._sending_requests[0]['url'])
121+
self.assertEqual(urlobj.hostname, 'appliance_acos_v2.1')
122+
self.assertIn('method=slb.service_group.create', urlobj.query)
123+
self.assertEqual(self._sending_requests[0]['params']['data'], json.dumps({
124+
"service_group": {
125+
"name": "test-slb-service-group",
126+
"protocol": "tcp",
127+
"lb_method": "round-robin"
128+
}
129+
}))
130+
self.assertEqual(self._sending_requests[0]['method'], 'POST')
131+
132+
133+
class TestSLBServiceGroup_v3_0(ACOSBaseActionTestCase):
134+
__test__ = True
135+
action_cls = AXActionRunner
136+
137+
def setUp(self):
138+
super(TestSLBServiceGroup_v3_0, self).setUp()
139+
140+
self.action = self.get_action_instance(self._full_config)
141+
self.action.logger.addHandler(self._log_handler)
142+
143+
@mock.patch('acos_client.v30.axapi_http.Session')
144+
def test_list_slb_service_group_for_acos(self, mock_session):
145+
mock_session.return_value = self.get_mock_session(resp_data=RESP_SUCCESS)
146+
147+
params = {
148+
'action': 'get',
149+
'object_path': 'slb.service_group',
150+
'one_target': True,
151+
'name': '',
152+
'appliance': 'appliance_acos_v3.0',
153+
}
154+
result = self.action.run(**params)
155+
156+
# check action results
157+
self.assertEqual(result, (True, RESP_SUCCESS))
158+
159+
# check sending request contents that acos_client,
160+
# which stackstorm-acos depends on, sends.
161+
self.assertEqual(len(self._sending_requests), 1)
162+
163+
urlobj = urlparse(self._sending_requests[0]['url'])
164+
self.assertEqual(urlobj.hostname, 'appliance_acos_v3.0')
165+
self.assertEqual(urlobj.path, '/axapi/v3/slb/service-group/')
166+
self.assertEqual(self._sending_requests[0]['method'], 'GET')
167+
168+
@mock.patch('acos_client.v30.axapi_http.Session')
169+
def test_get_slb_service_group_for_acos(self, mock_session):
170+
mock_session.return_value = self.get_mock_session(resp_data=RESP_SUCCESS)
171+
172+
params = {
173+
'action': 'get',
174+
'object_path': 'slb.service_group',
175+
'one_target': True,
176+
'name': 'test-slb-service-group',
177+
'appliance': 'appliance_acos_v3.0',
178+
}
179+
result = self.action.run(**params)
180+
181+
# check action results
182+
self.assertEqual(result, (True, RESP_SUCCESS))
183+
184+
# check sending request contents that acos_client,
185+
# which stackstorm-acos depends on, sends.
186+
self.assertEqual(len(self._sending_requests), 1)
187+
188+
urlobj = urlparse(self._sending_requests[0]['url'])
189+
self.assertEqual(urlobj.hostname, 'appliance_acos_v3.0')
190+
self.assertEqual(urlobj.path, '/axapi/v3/slb/service-group/test-slb-service-group')
191+
self.assertEqual(self._sending_requests[0]['method'], 'GET')
192+
193+
@mock.patch('acos_client.v30.axapi_http.Session')
194+
def test_delete_slb_service_group_for_acos(self, mock_session):
195+
mock_session.return_value = self.get_mock_session(resp_data=RESP_SUCCESS)
196+
197+
params = {
198+
'action': 'delete',
199+
'object_path': 'slb.service_group',
200+
'one_target': True,
201+
'name': 'test-slb-service-group',
202+
'appliance': 'appliance_acos_v3.0',
203+
}
204+
result = self.action.run(**params)
205+
206+
# check action results
207+
self.assertEqual(result, (True, RESP_SUCCESS))
208+
209+
# check sending request contents that acos_client,
210+
# which stackstorm-acos depends on, sends.
211+
urlobj = urlparse(self._sending_requests[0]['url'])
212+
self.assertEqual(urlobj.hostname, 'appliance_acos_v3.0')
213+
self.assertEqual(urlobj.path, '/axapi/v3/slb/service-group/test-slb-service-group')
214+
self.assertEqual(self._sending_requests[0]['method'], 'DELETE')
215+
216+
@mock.patch('acos_client.v30.axapi_http.Session')
217+
def test_create_slb_service_group_for_acos(self, mock_session):
218+
mock_session.return_value = self.get_mock_session(resp_data=RESP_SUCCESS)
219+
220+
params = {
221+
'action': 'create',
222+
'object_path': 'slb.service_group',
223+
'one_target': True,
224+
'name': 'test-slb-service-group',
225+
'protocol': 'tcp',
226+
'lb_method': 'round-robin',
227+
'appliance': 'appliance_acos_v3.0',
228+
}
229+
result = self.action.run(**params)
230+
231+
# check action results
232+
self.assertEqual(result, (True, RESP_SUCCESS))
233+
234+
# check sending request contents that acos_client,
235+
# which stackstorm-acos depends on, sends.
236+
urlobj = urlparse(self._sending_requests[0]['url'])
237+
self.assertEqual(urlobj.hostname, 'appliance_acos_v3.0')
238+
self.assertEqual(urlobj.path, '/axapi/v3/slb/service-group/')
239+
self.assertEqual(self._sending_requests[0]['params']['data'], json.dumps({
240+
"service-group": {
241+
"name": "test-slb-service-group",
242+
"protocol": "tcp",
243+
"health-check-disable": 0,
244+
"lb-method": "round-robin",
245+
"stateless-auto-switch": 0
246+
}
247+
}))
248+
self.assertEqual(self._sending_requests[0]['method'], 'POST')

0 commit comments

Comments
 (0)