Skip to content

Commit 809a09b

Browse files
committed
Update base code to support http return status.
1 parent 6d58e80 commit 809a09b

File tree

4 files changed

+165
-157
lines changed

4 files changed

+165
-157
lines changed

actions/lib/action.py

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@
22
from st2common.runners.base_action import Action
33

44

5-
__all__ = [
6-
"NetboxBaseAction"
7-
]
5+
__all__ = ["NetboxBaseAction"]
86

97

108
class NetboxBaseAction(Action):
11-
"""Base Action for all Netbox API based actions
12-
"""
9+
"""Base Action for all Netbox API based actions"""
1310

1411
def __init__(self, config):
1512
super(NetboxBaseAction, self).__init__(config)
1613

1714
def make_request(self, endpoint_uri, http_action, **kwargs):
18-
"""Logic to make all types of requests
19-
"""
15+
"""Logic to make all types of requests"""
2016

2117
if self.config["use_https"]:
2218
url = "https://"
@@ -38,7 +34,7 @@ def make_request(self, endpoint_uri, http_action, **kwargs):
3834

3935
# transform `tags` if present
4036
if kwargs.get("tags"):
41-
if http_action in ['post', 'put', 'patch']:
37+
if http_action in ["post", "put", "patch"]:
4238
kwargs["tags"] = [{"slug": x} for x in kwargs["tags"]]
4339
else:
4440
kwargs["tags"] = ",".join(kwargs["tags"])
@@ -51,31 +47,25 @@ def make_request(self, endpoint_uri, http_action, **kwargs):
5147
self.logger.debug("Calling base {} with kwargs: {}".format(http_action, kwargs))
5248
verify = self.config["ssl_verify"]
5349

54-
r = None
55-
5650
if http_action == "get":
5751
r = requests.get(url, verify=verify, headers=headers, params=kwargs)
58-
5952
elif http_action == "post":
6053
r = requests.post(url, verify=verify, headers=headers, json=kwargs)
61-
6254
elif http_action == "put":
6355
r = requests.put(url, verify=verify, headers=headers, json=kwargs)
64-
6556
elif http_action == "patch":
6657
r = requests.patch(url, verify=verify, headers=headers, json=kwargs)
67-
6858
elif http_action == "delete":
6959
r = requests.delete(url, verify=verify, headers=headers)
70-
self.logger.info("Delete of ID {} returned status code {}".format(
71-
kwargs["id"],
72-
r.status_code)
60+
self.logger.info(
61+
"Delete of ID {} returned status code {}".format(kwargs["id"], r.status_code)
7362
)
63+
else:
64+
raise ValueError(f"Unsupported http verb '{http_action}'")
65+
66+
try:
67+
raw = r.json()
68+
except ValueError:
69+
raw = r.text
7470

75-
if r:
76-
try:
77-
raw = r.json()
78-
except ValueError:
79-
raw = r.text
80-
return {"raw": raw, "status": r.status_code}
81-
return {"raw": {}, "status": 404}
71+
return {"raw": raw, "status": r.status_code}

actions/run.py

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,54 @@
66

77

88
class NetboxHTTPAction(NetboxBaseAction):
9-
"""Base run action"""
9+
"""
10+
Action to call netbox api and return response.
11+
"""
1012

11-
def run(self, endpoint_uri, http_verb, get_detail_route_eligible, **kwargs):
12-
"""Base run action
13+
def run(self, endpoint_uri, http_verb, get_detail_route_eligible, fail_non_2xx, **kwargs):
1314
"""
14-
15-
if http_verb == 'get':
16-
if kwargs.get('id', False) and get_detail_route_eligible:
15+
StackStorm action entry point.
16+
"""
17+
if http_verb == "get":
18+
if kwargs.get("id", False) and get_detail_route_eligible:
1719
# modify the `endpoint_uri` to use the detail route
18-
endpoint_uri = '{}{}/'.format(endpoint_uri, str(kwargs.pop('id')))
20+
endpoint_uri = "{}{}/".format(endpoint_uri, str(kwargs.pop("id")))
1921
self.logger.debug(
20-
'endpoint_uri transformed to {} because id was passed'.format(endpoint_uri)
22+
"endpoint_uri transformed to {} because id was passed".format(endpoint_uri)
2123
)
2224

23-
if kwargs.get('save_in_key_store') and not kwargs.get('save_in_key_store_key_name'):
24-
return (False, 'save_in_key_store_key_name MUST be used with save_in_key_store!')
25+
if kwargs.get("save_in_key_store") and not kwargs.get("save_in_key_store_key_name"):
26+
return (False, "save_in_key_store_key_name MUST be used with save_in_key_store!")
2527

2628
result = self.make_request(endpoint_uri, http_verb, **kwargs)
2729

28-
if kwargs['save_in_key_store']:
30+
if fail_non_2xx:
31+
# Return error rather than storing it in the keystone.
32+
if result["status"] not in range(200, 300):
33+
return (False, result)
34+
35+
if kwargs["save_in_key_store"]:
2936
# save the result in the st2 keystore
30-
client = Client(base_url='http://localhost')
31-
key_name = kwargs['save_in_key_store_key_name']
32-
client.keys.update(KeyValuePair(name=key_name, value=json.dumps(result),
33-
ttl=kwargs['save_in_key_store_ttl']))
37+
client = Client(base_url="http://localhost")
38+
key_name = kwargs["save_in_key_store_key_name"]
39+
client.keys.update(
40+
KeyValuePair(
41+
name=key_name, value=json.dumps(result), ttl=kwargs["save_in_key_store_ttl"]
42+
)
43+
)
3444

3545
return (True, "Result stored in st2 key {}".format(key_name))
3646

3747
else:
3848
result = self.make_request(endpoint_uri, http_verb, **kwargs)
3949

40-
return result
50+
# To maintain backward compatibility, this action always returns True (success) event
51+
# when the netbox http return status is not OK. action_succeeded is set to True and
52+
# will only be set to False if the `fail_non_2xx` argument is set to True _and_ netbox
53+
# http return code is not 2xx.
54+
action_succeeded = True
55+
56+
if fail_non_2xx:
57+
action_succeeded = result.get("status") in range(200, 300)
58+
59+
return (action_succeeded, result)

bin/action-template.jinja2

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ parameters:
1717
default: {{ get_detail_route_eligible | lower }}
1818
immutable: true
1919
type: boolean
20+
fail_non_2xx:
21+
default: false
22+
type: boolean
23+
description: Set action as failed when http return reponse status isn't 2xx.
2024
{%- for parameter in parameters %}
2125
{{ parameter.name }}:
2226
required: {{ parameter.required | lower }}

0 commit comments

Comments
 (0)