Skip to content

Commit de10af4

Browse files
Adityashankar KiniAdityashankar Kini
authored andcommitted
Teams/User managament.
1 parent e917a6c commit de10af4

File tree

2 files changed

+252
-5
lines changed

2 files changed

+252
-5
lines changed

examples/user_team_mgmt.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/usr/bin/env python
2+
#
3+
# This example shows the different aspects of user/team management
4+
#
5+
6+
import os
7+
import sys
8+
import logging
9+
10+
from sdcclient import SdcClient
11+
#
12+
# Parse arguments
13+
#
14+
if len(sys.argv) != 4:
15+
print 'usage: %s <sysdig-token> team-name user-name' % sys.argv[0]
16+
print 'You can find your token at https://app.sysdigcloud.com/#/settings/user'
17+
sys.exit(1)
18+
19+
sdc_token = sys.argv[1]
20+
21+
#
22+
# Instantiate the SDC client
23+
#
24+
sdclient = SdcClient(sdc_token, sdc_url='https://app-staging.sysdigcloud.com')
25+
26+
team_name = sys.argv[2]
27+
user_name = sys.argv[3]
28+
29+
print 'Trying to invite a user ', user_name
30+
res = sdclient.create_user_invite(user_name)
31+
if res[0] == False:
32+
print 'User creation failed: ', res[1]
33+
else:
34+
print 'User creation succeeded'
35+
36+
print 'Now trying to create a team with name ', team_name
37+
res = sdclient.create_team(team_name)
38+
if res[0] == False:
39+
print 'Team creation failed: ', res[1]
40+
else:
41+
print 'Team creation succeeded.', res[1]
42+
43+
print 'Now trying to find team with name ', team_name
44+
res = sdclient.get_team(team_name)
45+
if res[0] == False:
46+
print 'Could not get team info'
47+
else:
48+
print 'Team fetch succeeded'
49+
50+
print 'Now trying to edit team ', team_name
51+
res = sdclient.edit_team(team_name, description='Nextgen2', users=['[email protected]', '[email protected]'])
52+
if res[0] == False:
53+
print 'Could not edit team ', res[1]
54+
else:
55+
print 'Edited team to change description and add users'
56+
57+
print 'Now trying to edit user ', user_name
58+
res = sdclient.edit_user(user_name, firstName='Just', lastName='Edited3', teams=[team_name], roles=['ROLE_CUSTOMER', 'ROLE_USER'])
59+
if res[0] == False:
60+
print 'Could not edit user: ', res[1]
61+
else:
62+
print 'Edit user succeeded'
63+
64+
print 'Now trying to delete the team ', team_name
65+
res = sdclient.delete_team(team_name)
66+
if res[0] == False:
67+
print 'Could not delete team: ', res[1]
68+
else:
69+
print 'Delete team succeeded'
70+
71+
sys.exit(0)

sdcclient/_client.py

Lines changed: 181 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def __checkResponse(self, res):
4242
return False
4343
return True
4444

45+
4546
def get_user_info(self):
4647
if self.userinfo is None:
4748
res = requests.get(self.url + '/api/user/me', headers=self.hdrs)
@@ -102,14 +103,12 @@ def update_notification_resolution(self, notification, resolved):
102103
return [False, self.lasterr]
103104
return [True, res.json()]
104105

105-
def get_notification_ids(self, channels):
106+
def get_notification_channel_ids(self, channels):
106107
res = requests.get(self.url + '/api/notificationChannels', headers=self.hdrs)
107-
108+
ids = []
108109
if not self.__checkResponse(res):
109110
return [False, self.lasterr]
110-
111111
# Should try and improve this M * N lookup
112-
ids = []
113112
for ch in res.json()["notificationChannels"]:
114113
for c in channels:
115114
if c['type'] == ch['type']:
@@ -130,9 +129,10 @@ def get_notification_ids(self, channels):
130129
opt = ch['options']
131130
if opt['channel'] == c['channel']:
132131
ids.append(ch['id'])
133-
132+
print ids
134133
return [True, ids]
135134

135+
136136
def create_alert(self, name, description, severity, for_atleast_s, condition, segmentby=[],
137137
segment_condition='ANY', user_filter='', notify=None, enabled=True, annotations={}):
138138
#
@@ -435,8 +435,16 @@ def add_dashboard_panel(self, dashboard, name, panel_type, metrics, scope=None,
435435
# Convert list of metrics to format used by Sysdig Cloud
436436
#
437437
property_names = {}
438+
k_count = 0
439+
v_count = 0
438440
for i, metric in enumerate(metrics):
439441
property_name = 'v' if 'aggregations' in metric else 'k'
442+
if property_name == 'k':
443+
i = k_count
444+
k_count += 1
445+
else:
446+
i = v_count
447+
v_count += 1
440448
property_names[metric['id']] = property_name + str(i)
441449

442450
panel_configuration['metrics'].append({
@@ -869,3 +877,171 @@ def create_sysdig_capture(self, hostname, capture_name, duration, capture_filter
869877
if not self.__checkResponse(res):
870878
return [False, self.lasterr]
871879
return [True, res.json()]
880+
881+
def create_user_invite(self, user_email):
882+
# Look up the list of users to see if this exists, do not create if one exists
883+
res = requests.get(self.url + '/api/users', headers=self.hdrs)
884+
if not self.__checkResponse(res):
885+
return [False, self.lasterr]
886+
data = res.json()
887+
for user in data['users']:
888+
if user['username'] == user_email:
889+
return [False, 'user ' + user_email + ' already exists']
890+
891+
# Create the user
892+
user_json = {'username' : user_email}
893+
res = requests.post(self.url + '/api/users', headers=self.hdrs, data=json.dumps(user_json))
894+
if not self.__checkResponse(res):
895+
return [False, self.lasterr]
896+
return [True, res.json()]
897+
898+
def delete_user(self, user_email):
899+
res = self.get_user_ids([user_email])
900+
if res[0] == False:
901+
return res
902+
userid = res[1][0]
903+
res = requests.delete(self.url + '/api/users' + str(userid), headers=self.hdrs)
904+
if not self.__checkResponse(res):
905+
return [False, self.lasterr]
906+
return [True, None]
907+
908+
def get_user(self, user_email):
909+
res = requests.get(self.url + '/api/users', headers=self.hdrs)
910+
if not self.__checkResponse(res):
911+
return [False, self.lasterr]
912+
for u in res.json()['users']:
913+
if u['username'] == user_email:
914+
return [True, u]
915+
return [False, 'User not found']
916+
917+
def edit_user(self, user_email, firstName=None, lastName=None, roles=None, teams=None):
918+
res = self.get_user(user_email)
919+
if res[0] == False:
920+
return res
921+
user = res[1]
922+
reqbody = {
923+
'agentInstallParams': user['agentInstallParams'],
924+
'roles': roles if roles else user['roles'],
925+
'username': user_email,
926+
'version': user['version']
927+
}
928+
929+
if teams == None:
930+
reqbody['teams'] = user['teams']
931+
else:
932+
t = self.get_team_ids(teams)
933+
if t[0] == False:
934+
return [False, 'Could not get team IDs']
935+
reqbody['teams'] = t[1]
936+
937+
if firstName == None:
938+
reqbody['firstName'] = user['firstName'] if 'firstName' in user.keys() else ''
939+
else:
940+
reqbody['firstName'] = firstName
941+
942+
if lastName == None:
943+
reqbody['lastName'] = user['lastName'] if 'lastName' in user.keys() else ''
944+
else:
945+
reqbody['lastName'] = lastName
946+
print reqbody
947+
res = requests.put(self.url + '/api/users/' + str(user['id']), headers=self.hdrs, data=json.dumps(reqbody))
948+
if not self.__checkResponse(res):
949+
return [False, self.lasterr]
950+
return [True, 'Successfully edited user']
951+
952+
def get_teams(self, team_filter=''):
953+
res = requests.get(self.url + '/api/teams', headers=self.hdrs)
954+
if not self.__checkResponse(res):
955+
return [False, self.lasterr]
956+
ret = filter(lambda t: team_filter in t['name'],res.json()['teams'])
957+
return [True, ret]
958+
959+
def get_team(self, name):
960+
res = self.get_teams(name)
961+
if res[0] == False:
962+
return res
963+
for t in res[1]:
964+
if t['name'] == name:
965+
return [True, t]
966+
return [False, 'Could not find team']
967+
968+
def get_team_ids(self, teams):
969+
res = requests.get(self.url + '/api/teams', headers=self.hdrs)
970+
if not self.__checkResponse(res):
971+
return [False, self.lasterr]
972+
u = filter(lambda x: x['name'] in teams, res.json()['teams'])
973+
return [True, map(lambda x: x['id'], u)]
974+
975+
def get_user_ids(self, users):
976+
res = requests.get(self.url + '/api/users', headers=self.hdrs)
977+
if not self.__checkResponse(res):
978+
return [False, self.lasterr]
979+
u = filter(lambda x: x['username'] in users, res.json()['users'])
980+
return [True, map(lambda x: x['id'], u)]
981+
982+
def create_team(self, name, users=[], filter='', description='', show='host', theme='#7BB0B2'):
983+
reqbody = {
984+
'name': name,
985+
'description': description,
986+
'theme': theme,
987+
'show': show,
988+
'users': users
989+
}
990+
if filter != '':
991+
reqbody['filter'] = filter
992+
993+
res = requests.post(self.url + '/api/teams', headers=self.hdrs, data=json.dumps(reqbody))
994+
if not self.__checkResponse(res):
995+
return [False, self.lasterr]
996+
return [True, res.json()]
997+
998+
999+
def edit_team(self, name, users=None, filter=None, description=None, show=None, theme=None):
1000+
res = self.get_team(name)
1001+
if res[0] == False:
1002+
return res
1003+
1004+
t = res[1]
1005+
reqbody = {
1006+
'name': name,
1007+
'description': description if description else t['description'],
1008+
'theme': theme if theme else t['theme'],
1009+
'show': show if show else t['show'],
1010+
'id': t['id'],
1011+
'version': t['version']
1012+
}
1013+
1014+
# Handling for users to map user-names to IDs
1015+
if users != None:
1016+
res = self.get_user_ids(users)
1017+
if res[0] == False:
1018+
return [False, 'Could not convert user names to IDs']
1019+
reqbody['users'] = res[1]
1020+
elif 'users' in t.keys():
1021+
reqbody['users'] = t['users']
1022+
else:
1023+
reqbody['users'] = []
1024+
1025+
# Special handling for filters since we don't support blank filters
1026+
if filter != None:
1027+
reqbody['filter'] = filter
1028+
elif 'filter' in t.keys():
1029+
reqbody['filter'] = t['filter']
1030+
1031+
res = requests.put(self.url + '/api/teams/' + str(t['id']), headers=self.hdrs, data=json.dumps(reqbody))
1032+
if not self.__checkResponse(res):
1033+
return [False, self.lasterr]
1034+
return [True, res.json()]
1035+
1036+
def delete_team(self, name):
1037+
res = self.get_team(name)
1038+
if res[0] == False:
1039+
return res
1040+
1041+
t = res[1]
1042+
res = requests.delete(self.url + '/api/teams/' + str(t['id']), headers=self.hdrs)
1043+
if not self.__checkResponse(res):
1044+
return [False, self.lasterr]
1045+
return [True, None]
1046+
1047+

0 commit comments

Comments
 (0)