forked from demisto/content
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstance_notifier.py
More file actions
171 lines (138 loc) · 7.15 KB
/
instance_notifier.py
File metadata and controls
171 lines (138 loc) · 7.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import argparse
import json
import logging
import os
import demisto_client
from slack import WebClient as SlackClient
from Tests.configure_and_test_integration_instances import update_content_on_demisto_instance
from Tests.scripts.utils.log_util import install_logging
from Tests.test_integration import __create_integration_instance, __delete_integrations_instances
from demisto_sdk.commands.common.tools import str2bool
SERVER_URL = "https://{}"
ARTIFACTS_FOLDER = os.getenv('ARTIFACTS_FOLDER')
def options_handler():
parser = argparse.ArgumentParser(description='Parser for slack_notifier args')
parser.add_argument('-t', '--instance_tests', type=str2bool, help='is instance test build?', required=True)
parser.add_argument('-s', '--slack', help='The token for slack', required=True)
parser.add_argument('-e', '--secret', help='Path to secret conf file', required=True)
parser.add_argument('-u', '--user', help='The username for the login', required=True)
parser.add_argument('-p', '--password', help='The password for the login', required=True)
parser.add_argument('-b', '--buildUrl', help='The url for the build', required=True)
parser.add_argument('-n', '--buildNumber', help='The build number', required=True)
options = parser.parse_args()
return options
def install_new_content(client, server):
update_content_on_demisto_instance(client, server, 'Server Master')
def get_integrations(secret_conf_path):
with open(secret_conf_path) as data_file:
secret_conf = json.load(data_file)
secret_params = secret_conf['integrations'] if secret_conf else []
return secret_params
def test_instances(secret_conf_path, server, username, password):
integrations = get_integrations(secret_conf_path)
instance_ids = []
failed_integrations = []
integrations_counter = 0
content_installation_client = demisto_client.configure(base_url=server, username=username, password=password,
verify_ssl=False)
install_new_content(content_installation_client, server)
for integration in integrations:
c = demisto_client.configure(base_url=server, username=username, password=password, verify_ssl=False)
integrations_counter += 1
integration_name = integration.get('name')
integration_instance_name = integration.get('instance_name', '')
integration_params = integration.get('params')
devops_comments = integration.get('devops_comments')
product_description = integration.get('product_description', '')
is_byoi = integration.get('byoi', True)
has_integration = integration.get('has_integration', True)
validate_test = integration.get('validate_test', True)
if has_integration:
try:
instance_id, failure_message = __create_integration_instance(
server, username, password, integration_name, integration_instance_name,
integration_params, is_byoi, validate_test=validate_test)
except Exception:
logging.exception(f'Failed to configure integration with name {integration_name}')
failed_integrations.append(
f"{integration_name} {product_description} - devops comments: {devops_comments}")
continue
if failure_message == 'No configuration':
logging.warning(
f"skipping {integration_name} as it exists in content-test-conf conf.json but not in content repo")
continue
if not instance_id:
logging.error(
f'Failed to create instance of {integration_name} with message: {failure_message}')
failed_integrations.append("{} {} - devops comments: {}".format(
integration_name, product_description, devops_comments))
else:
instance_ids.append(instance_id)
logging.success(f'Create integration {integration_name} succeed')
__delete_integrations_instances(c, instance_ids)
return failed_integrations, integrations_counter
def create_failed_integrations_file(failed_instances):
with open(f"{ARTIFACTS_FOLDER}/failed_instances.txt", "w") as failed_instances_file:
failed_instances_file.write('\n'.join(failed_instances))
def get_attachments(secret_conf_path, server, user, password, build_url):
failed_integration, integrations_counter = test_instances(secret_conf_path, server, user, password)
create_failed_integrations_file(failed_integration)
fields = []
if failed_integration:
field_failed_tests = {
"title": "Found {0} Problematic Instances. See CircleCI for errors.".format(len(failed_integration)),
"value": '\n'.join(failed_integration),
"short": False
}
fields.append(field_failed_tests)
color = 'danger' if failed_integration else 'good'
title = 'There are no problematic instances' if not failed_integration else 'Encountered problems with instances'
attachment = [{
'fallback': title,
'color': color,
'title': title,
'fields': fields,
'title_link': build_url
}]
return attachment, integrations_counter
def slack_notifier(slack_token, secret_conf_path, server, user, password, build_url, build_number):
logging.info("Starting Slack notifications about instances")
attachments, integrations_counter = get_attachments(secret_conf_path, server, user, password, build_url)
sc = SlackClient(slack_token)
# Failing instances list
sc.api_call(
"chat.postMessage",
json={
'channel': 'dmst-content-lab',
'username': 'Instances nightly report',
'as_user': 'False',
'attachments': attachments,
'text': "You have {0} instances configurations".format(integrations_counter)
}
)
# Failing instances file
sc.api_call(
"chat.postMessage",
json={
'channel': 'dmst-content-lab',
'username': 'Instances nightly report',
'as_user': 'False',
'text': "Detailed list of failing instances could be found in the following link:\n"
"https://{}-60525392-gh.circle-artifacts.com/0/artifacts/failed_instances.txt".format(build_number)
}
)
if __name__ == "__main__":
install_logging('Instance-Test.log')
options = options_handler()
if options.instance_tests:
env_results_path = os.path.join(os.getenv('ARTIFACTS_FOLDER', './artifacts'), 'env_results.json')
with open(env_results_path, 'r') as json_file:
env_results = json.load(json_file)
server = f'https://localhost:{env_results[0]["TunnelPort"]}'
slack_notifier(options.slack, options.secret, server, options.user, options.password, options.buildUrl,
options.buildNumber)
# create this file for destroy_instances script
with open("./Tests/is_build_passed_{}.txt".format(env_results[0]["Role"].replace(' ', '')), 'a'):
pass
else:
logging.error("Not instance tests build, stopping Slack Notifications about instances")