def test_get_all_pages_uses_default_max_page_size(self): sample_api_id = list(gapi.MAX_RESULTS_API_EXCEPTIONS.keys())[0] sample_api_max_results = gapi.MAX_RESULTS_API_EXCEPTIONS[sample_api_id] self.mock_method.return_value.methodId = sample_api_id self.mock_service._rootDesc = { 'resources': { 'someResource': { 'methods': { 'someMethod': { 'id': sample_api_id, 'parameters': { 'maxResults': { 'maximum': sample_api_max_results } } } } } } } self.mock_method.return_value.execute.return_value = self.empty_items_response gapi.get_all_pages(self.mock_service, self.mock_method_name) request_method_kwargs = self.mock_method.call_args[1] self.assertIn('maxResults', request_method_kwargs) self.assertEqual(request_method_kwargs['maxResults'], gapi.MAX_RESULTS_API_EXCEPTIONS.get(sample_api_id))
def test_get_all_pages_prints_attribute_last_item_in_paging_message(self): self.mock_method.return_value.execute.side_effect = self.simple_3_page_response paging_message = 'Last item in page: %%last_item%%' with patch.object(gapi.sys.stderr, 'write') as mock_write: gapi.get_all_pages(self.mock_service, self.mock_method_name, page_message=paging_message, message_attribute='position') messages_written = [ call_args[0][0] for call_args in mock_write.call_args_list ] page_1_message = paging_message.replace( '%%last_item%%', self.simple_3_page_response[0]['items'][-1]['position']) self.assertIn(page_1_message, messages_written) page_2_message = paging_message.replace( '%%last_item%%', self.simple_3_page_response[1]['items'][-1]['position']) self.assertIn(page_2_message, messages_written) # Assert that the template text is always replaced. for message in messages_written: self.assertNotIn('%%last_item', message)
def test_get_all_pages_prints_attribute_total_items_in_paging_message( self): self.mock_method.return_value.execute.side_effect = self.simple_3_page_response paging_message = 'Total number of items discovered: %%total_items%%' with patch.object(gapi.sys.stderr, 'write') as mock_write: gapi.get_all_pages(self.mock_service, self.mock_method_name, page_message=paging_message) messages_written = [ call_args[0][0] for call_args in mock_write.call_args_list ] page_1_item_count = len(self.simple_3_page_response[0]['items']) page_1_message = paging_message.replace('%%total_items%%', str(page_1_item_count)) self.assertIn(page_1_message, messages_written) page_2_item_count = len(self.simple_3_page_response[1]['items']) page_2_message = paging_message.replace( '%%total_items%%', str(page_1_item_count + page_2_item_count)) self.assertIn(page_2_message, messages_written) page_3_item_count = len(self.simple_3_page_response[2]['items']) page_3_message = paging_message.replace( '%%total_items%%', str(page_1_item_count + page_2_item_count + page_3_item_count)) self.assertIn(page_3_message, messages_written) # Assert that the template text is always replaced. for message in messages_written: self.assertNotIn('%%total_items', message)
def test_get_all_pages_max_page_size_overrided(self): self.mock_method.return_value.execute.return_value = self.empty_items_response gapi.get_all_pages(self.mock_service, self.mock_method_name, pageSize=123456) request_method_kwargs = self.mock_method.call_args[1] self.assertIn('pageSize', request_method_kwargs) self.assertEqual(123456, request_method_kwargs['pageSize'])
def test_get_all_pages_passes_additional_kwargs_to_service_method(self): self.mock_method.return_value.execute.return_value = self.empty_items_response gapi.get_all_pages(self.mock_service, self.mock_method_name, my_param_1=1, my_param_2=2) method_kwargs = self.mock_method.call_args[1] self.assertEqual(method_kwargs.get('my_param_1'), 1) self.assertEqual(method_kwargs.get('my_param_2'), 2)
def test_get_all_pages_passes_throw_and_retry_reasons(self, mock_call): throw_for = MagicMock() retry_for = MagicMock() mock_call.return_value = self.empty_items_response gapi.get_all_pages(self.mock_service, self.mock_method_name, throw_reasons=throw_for, retry_reasons=retry_for) method_kwargs = mock_call.call_args[1] self.assertEqual(method_kwargs.get('throw_reasons'), throw_for) self.assertEqual(method_kwargs.get('retry_reasons'), retry_for)
def test_get_all_pages_includes_next_pagetoken_in_request(self): page_1 = {'items': ['1-1', '1-2', '1-3'], 'nextPageToken': 'someToken'} page_2 = {'items': ['2-1', '2-2', '2-3']} self.mock_method.return_value.execute.side_effect = [page_1, page_2] gapi.get_all_pages(self.mock_service, self.mock_method_name, pageSize=100) self.assertEqual(self.mock_method.call_count, 2) call_2_kwargs = self.mock_method.call_args_list[1][1] self.assertIn('pageToken', call_2_kwargs) self.assertEqual(call_2_kwargs['pageToken'], page_1['nextPageToken'])
def test_get_all_pages_prints_paging_message(self): self.mock_method.return_value.execute.side_effect = self.simple_3_page_response paging_message = 'A simple string displayed during paging' with patch.object(gapi.sys.stderr, 'write') as mock_write: gapi.get_all_pages(self.mock_service, self.mock_method_name, page_message=paging_message) messages_written = [ call_args[0][0] for call_args in mock_write.call_args_list ] self.assertIn(paging_message, messages_written)
def info(): ci = gapi_cloudidentity.build_dwd() customer = _get_device_customerid() name = _get_device_name() device = gapi.call(ci.devices(), 'get', name=name, customer=customer) device_users = gapi.get_all_pages(ci.devices().deviceUsers(), 'list', 'deviceUsers', parent=name, customer=customer) for device_user in device_users: parent = device_user['name'] device_user['client_states'] = gapi.get_all_pages( ci.devices().deviceUsers().clientStates(), 'list', 'clientStates', parent=parent, customer=customer) display.print_json(device) print('Device Users:') display.print_json(device_users)
def print_(): '''gam print userinvitations''' svc = gapi_cloudidentity.build('cloudidentity_beta') customer = _get_customerid() todrive = False titles = [] rows = [] filter_ = None i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'filter': filter_ = sys.argv[i + 1] i += 2 elif myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print userinvitations') invitations = gapi.get_all_pages(svc.customers().userinvitations(), 'list', 'userInvitations', parent=customer, filter=filter_) for invitation in invitations: invitation['name'] = _reduce_name(invitation['name']) row = {} for key, val in invitation.items(): if key not in titles: titles.append(key) row[key] = val rows.append(row) display.write_csv_file(rows, titles, 'User Invitations', todrive)
def print_members(): chat = build() space = None todrive = False i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'space': space = sys.argv[i + 1] if space[:7] != 'spaces/': space = f'spaces/{space}' i += 2 elif myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(myarg, 'gam print chatmembers') if not space: controlflow.system_error_exit(2, 'space <ChatSpace> is required.') try: results = gapi.get_all_pages(chat.spaces().members(), 'list', 'memberships', parent=space) except googleapiclient.errors.HttpError as err: _chat_error_handler(chat, err) members = [] titles = [] for result in results: member = utils.flatten_json(result) for key in member: if key not in titles: titles.append(key) members.append(utils.flatten_json(result)) display.write_csv_file(members, titles, 'Chat Members', todrive)
def test_get_all_pages_ends_paging_message_with_newline(self): self.mock_method.return_value.execute.side_effect = self.simple_3_page_response paging_message = 'A simple string displayed during paging' with patch.object(gapi.sys.stderr, 'write') as mock_write: gapi.get_all_pages(self.mock_service, self.mock_method_name, page_message=paging_message) messages_written = [ call_args[0][0] for call_args in mock_write.call_args_list ] last_page_message_index = len( messages_written) - messages_written[::-1].index(paging_message) last_carriage_return_index = len( messages_written) - messages_written[::-1].index('\r\n') self.assertGreater(last_carriage_return_index, last_page_message_index)
def print_(): cd = gapi_directory.build() todrive = False titles = [ 'roleId', 'roleName', 'roleDescription', 'isSuperAdminRole', 'isSystemRole' ] fields = f'nextPageToken,items({",".join(titles)})' csvRows = [] i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print adminroles') roles = gapi.get_all_pages(cd.roles(), 'list', 'items', customer=GC_Values[GC_CUSTOMER_ID], fields=fields) for role in roles: role_attrib = {} for key, value in list(role.items()): role_attrib[key] = value csvRows.append(role_attrib) display.write_csv_file(csvRows, titles, 'Admin Roles', todrive)
def print_models(): '''gam print printermodels''' cdapi = gapi_directory.build() parent = _get_customerid() filter_ = None todrive = False titles = [] rows = [] i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'filter': filter_ = sys.argv[i+1] i += 2 elif myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print printermodels') models = gapi.get_all_pages(cdapi.customers().chrome().printers(), 'listPrinterModels', items='printerModels', parent=parent, pageSize=10000, filter=filter_) for model in models: row = {} for key, val in model.items(): if key not in titles: titles.append(key) row[key] = val rows.append(row) display.write_csv_file(rows, titles, 'Printer Models', todrive)
def get_relative_milestone(channel='stable', minus=0): ''' takes a channel and minus like stable and -1. returns current given milestone number ''' cv = build() parent = f'chrome/platforms/all/channels/{channel}/versions/all' releases = gapi.get_all_pages(cv.platforms().channels().versions().releases(), 'list', 'releases', parent=parent, fields='releases/version,nextPageToken') milestones = [] # Note that milestones are usually sequential but some numbers # may be skipped. For example, there was no Chrome 82 stable. # Thus we need to do more than find the latest version and subtract. for release in releases: milestone = release.get('version').split('.')[0] if milestone not in milestones: milestones.append(milestone) milestones.sort(reverse=True) try: return milestones[minus] except IndexError: return ''
def print_(): '''gam print printers''' cdapi = gapi_directory.build() parent = _get_customerid() filter_ = None todrive = False titles = [] rows = [] i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'filter': filter_ = sys.argv[i+1] i += 2 elif myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print printermodels') printers = gapi.get_all_pages(cdapi.customers().chrome().printers(), 'list', items='printers', parent=parent, filter=filter_) for printer in printers: if 'orgUnitId' in printer: printer['orgUnitPath'] = gapi_directory_orgunits.orgunit_from_orgunitid( printer['orgUnitId'], cdapi) row = {} for key, val in printer.items(): if key not in titles: titles.append(key) row[key] = val rows.append(row) display.write_csv_file(rows, titles, 'Printers', todrive)
def info(): ci = gapi_cloudidentity.build('cloudidentity_beta') group = gam.normalizeEmailAddressOrUID(sys.argv[3]) getUsers = True showJoinDate = True showUpdateDate = False showMemberTree = False i = 4 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'nousers': getUsers = False i += 1 elif myarg == 'nojoindate': showJoinDate = False i += 1 elif myarg == 'showupdatedate': showUpdateDate = True i += 1 elif myarg == 'membertree': showMemberTree = True i += 1 else: controlflow.invalid_argument_exit(myarg, 'gam info cigroup') name = group_email_to_id(ci, group) basic_info = gapi.call(ci.groups(), 'get', name=name) display.print_json(basic_info) if getUsers and not showMemberTree: if not showJoinDate and not showUpdateDate: view = 'BASIC' pageSize = 1000 else: view = 'FULL' pageSize = 500 members = gapi.get_all_pages(ci.groups().memberships(), 'list', 'memberships', parent=name, fields='*', pageSize=pageSize, view=view) print(' Members:') for member in members: role = get_single_role(member.get('roles', [])).lower() email = member.get('memberKey', {}).get('id') member_type = member.get('type', 'USER').lower() jc_string = '' if showJoinDate: joined = member.get('createTime', 'Unknown') jc_string += f' joined {joined}' if showUpdateDate: updated = member.get('updateTime', 'Unknown') jc_string += f' updated {updated}' print(f' {role}: {email} ({member_type}){jc_string}') print(f'Total {len(members)} users in group') elif showMemberTree: print(' Membership Tree:') cached_group_members = {} print_member_tree(ci, name, cached_group_members, 2, True)
def print_(): cbcm = build() customer_id = _get_customerid() projection = 'BASIC' orgUnitPath = query = None fields = None titles = [] csv_rows = [] todrive = False sort_headers = False i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'query': query = sys.argv[i + 1] i += 2 elif myarg in ['ou', 'org', 'orgunit']: orgUnitPath = gapi_directory_orgunits.getOrgUnitItem( sys.argv[i + 1], pathOnly=True, absolutePath=True) i += 2 elif myarg == 'projection': projection = sys.argv[i + 1].upper() i += 2 elif myarg == 'todrive': todrive = True i += 1 elif myarg == 'sortheaders': sort_headers = True i += 1 elif myarg == 'fields': fields = sys.argv[i + 1].replace(',', ' ').split() i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print browsers') if fields: fields.append('deviceId') fields = f'browsers({",".join(set(fields))}),nextPageToken' page_message = gapi.got_total_items_msg('Browsers', '...\n') browsers = gapi.get_all_pages(cbcm.chromebrowsers(), 'list', 'browsers', page_message=page_message, customer=customer_id, orgUnitPath=orgUnitPath, query=query, projection=projection, fields=fields) for browser in browsers: browser = utils.flatten_json(browser) for a_key in browser: if a_key not in titles: titles.append(a_key) csv_rows.append(browser) if sort_headers: display.sort_csv_titles([ 'deviceId', ], titles) display.write_csv_file(csv_rows, titles, 'Browsers', todrive)
def test_get_all_pages_non_default_items_field_name(self): field_name = 'things' fake_response = {field_name: [{}, {}, {}]} self.mock_method.return_value.execute.return_value = fake_response page = gapi.get_all_pages(self.mock_service, self.mock_method_name, items=field_name) self.assertEqual(page, fake_response[field_name])
def printEvents(): calendarId, cal = buildCalendarDataGAPIObject(sys.argv[2]) if not cal: return q = showDeleted = showHiddenInvitations = timeMin = \ timeMax = timeZone = updatedMin = None toDrive = False titles = [] csvRows = [] i = 4 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'query': q = sys.argv[i + 1] i += 2 elif myarg == 'includedeleted': showDeleted = True i += 1 elif myarg == 'includehidden': showHiddenInvitations = True i += 1 elif myarg == 'after': timeMin = utils.get_time_or_delta_from_now(sys.argv[i + 1]) i += 2 elif myarg == 'before': timeMax = utils.get_time_or_delta_from_now(sys.argv[i + 1]) i += 2 elif myarg == 'timezone': timeZone = sys.argv[i + 1] i += 2 elif myarg == 'updated': updatedMin = utils.get_time_or_delta_from_now(sys.argv[i + 1]) i += 2 elif myarg == 'todrive': toDrive = True i += 1 else: controlflow.invalid_argument_exit( sys.argv[i], 'gam calendar <email> printevents') page_message = gapi.got_total_items_msg(f'Events for {calendarId}', '') results = gapi.get_all_pages(cal.events(), 'list', 'items', page_message=page_message, calendarId=calendarId, q=q, showDeleted=showDeleted, showHiddenInvitations=showHiddenInvitations, timeMin=timeMin, timeMax=timeMax, timeZone=timeZone, updatedMin=updatedMin) for result in results: row = {'calendarId': calendarId} display.add_row_titles_to_csv_file( utils.flatten_json(result, flattened=row), csvRows, titles) display.sort_csv_titles(['calendarId', 'id', 'summary', 'status'], titles) display.write_csv_file(csvRows, titles, 'Calendar Events', toDrive)
def transferSecCals(users): target_user = sys.argv[5] remove_source_user = sendNotifications = True i = 6 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'keepuser': remove_source_user = False i += 1 elif myarg == 'sendnotifications': sendNotifications = gam.getBoolean(sys.argv[i + 1], myarg) i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam <users> transfer seccals') if remove_source_user: target_user, target_cal = buildCalendarGAPIObject(target_user) if not target_cal: return for user in users: user, source_cal = buildCalendarGAPIObject(user) if not source_cal: continue calendars = gapi.get_all_pages(source_cal.calendarList(), 'list', 'items', soft_errors=True, minAccessRole='owner', showHidden=True, fields='items(id),nextPageToken') for calendar in calendars: calendarId = calendar['id'] if calendarId.find('@group.calendar.google.com') != -1: body = { 'role': 'owner', 'scope': { 'type': 'user', 'value': target_user } } gapi.call(source_cal.acl(), 'insert', calendarId=calendarId, body=body, sendNotifications=sendNotifications) if remove_source_user: body = { 'role': 'none', 'scope': { 'type': 'user', 'value': user } } gapi.call(target_cal.acl(), 'insert', calendarId=calendarId, body=body, sendNotifications=sendNotifications)
def printApps(): cm = build() customer = _get_customerid() todrive = False titles = CHROME_APPS_TITLES csvRows = [] orgunit = None pfilter = None orderBy = None i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'todrive': todrive = True i += 1 elif myarg in ['ou', 'org', 'orgunit']: orgunit = _get_orgunit(sys.argv[i + 1]) i += 2 elif myarg == 'filter': pfilter = sys.argv[i + 1] i += 2 elif myarg == 'orderby': orderBy = sys.argv[i + 1].lower().replace('_', '') if orderBy not in CHROME_APPS_ORDERBY_CHOICE_MAP: controlflow.expected_argument_exit( 'orderby', ', '.join(CHROME_APPS_ORDERBY_CHOICE_MAP), orderBy) orderBy = CHROME_APPS_ORDERBY_CHOICE_MAP[orderBy] i += 2 else: msg = f'{myarg} is not a valid argument to "gam print chromeapps"' controlflow.system_error_exit(3, msg) if orgunit: orgUnitPath = gapi_directory_orgunits.orgunit_from_orgunitid( orgunit, None) titles.append('orgUnitPath') else: orgUnitPath = '/' gam.printGettingAllItems('Chrome Installed Applications', pfilter) page_message = gapi.got_total_items_msg('Chrome Installed Applications', '...\n') apps = gapi.get_all_pages(cm.customers().reports(), 'countInstalledApps', 'installedApps', page_message=page_message, customer=customer, orgUnitId=orgunit, filter=pfilter, orderBy=orderBy) for app in apps: if orgunit: app['orgUnitPath'] = orgUnitPath if 'permissions' in app: app['permissions'] = ' '.join(app['permissions']) csvRows.append(app) display.write_csv_file(csvRows, titles, 'Chrome Installed Applications', todrive)
def printExports(): v = buildGAPIObject() todrive = False csvRows = [] initialTitles = ['matterId', 'id', 'name', 'createTime', 'status'] titles = initialTitles[:] matters = [] matterIds = [] i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'todrive': todrive = True i += 1 elif myarg in ['matter', 'matters']: matters = sys.argv[i + 1].split(',') i += 2 else: controlflow.invalid_argument_exit(myarg, 'gam print exports') if not matters: fields = 'matters(matterId),nextPageToken' matters_results = gapi.get_all_pages(v.matters(), 'list', 'matters', view='BASIC', state='OPEN', fields=fields) for matter in matters_results: matterIds.append(matter['matterId']) else: for matter in matters: matterIds.append(getMatterItem(v, matter)) for matterId in matterIds: sys.stderr.write(f'Retrieving exports for matter {matterId}\n') exports = gapi.get_all_pages(v.matters().exports(), 'list', 'exports', matterId=matterId) for export in exports: display.add_row_titles_to_csv_file( utils.flatten_json(export, flattened={'matterId': matterId}), csvRows, titles) display.sort_csv_titles(initialTitles, titles) display.write_csv_file(csvRows, titles, 'Vault Exports', todrive)
def printBuildings(): to_drive = False cd = gapi_directory.build() titles = [] csvRows = [] fieldsList = ['buildingId'] # buildings.list() currently doesn't support paging # but should soon, attempt to use it now so we # won't break when it's turned on. fields = 'nextPageToken,buildings(%s)' possible_fields = {} for pfield in cd._rootDesc['schemas']['Building']['properties']: possible_fields[pfield.lower()] = pfield i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'todrive': to_drive = True i += 1 elif myarg == 'allfields': fields = None i += 1 elif myarg in possible_fields: fieldsList.append(possible_fields[myarg]) i += 1 # Allows shorter arguments like "name" instead of "buildingname" elif 'building' + myarg in possible_fields: fieldsList.append(possible_fields['building' + myarg]) i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print buildings') if fields: fields = fields % ','.join(fieldsList) buildings = gapi.get_all_pages(cd.resources().buildings(), 'list', 'buildings', customer=GC_Values[GC_CUSTOMER_ID], fields=fields) for building in buildings: building.pop('etags', None) building.pop('etag', None) building.pop('kind', None) if 'buildingId' in building: building['buildingId'] = f'id:{building["buildingId"]}' if 'floorNames' in building: building['floorNames'] = ','.join(building['floorNames']) building = utils.flatten_json(building) for item in building: if item not in titles: titles.append(item) csvRows.append(building) display.sort_csv_titles('buildingId', titles) display.write_csv_file(csvRows, titles, 'Buildings', to_drive)
def test_get_all_pages_returns_all_items(self): page_1 = {'items': ['1-1', '1-2', '1-3'], 'nextPageToken': '2'} page_2 = {'items': ['2-1', '2-2', '2-3'], 'nextPageToken': '3'} page_3 = {'items': ['3-1', '3-2', '3-3']} self.mock_method.return_value.execute.side_effect = [ page_1, page_2, page_3 ] response_items = gapi.get_all_pages(self.mock_service, self.mock_method_name) self.assertListEqual( response_items, page_1['items'] + page_2['items'] + page_3['items'])
def _getAllMatterIds(v=None, state='OPEN'): if not v: v = buildGAPIObject() fields = 'matters(matterId),nextPageToken' results = gapi.get_all_pages(v.matters(), 'list', 'matters', view='BASIC', state=state, fields=fields) return [matter['matterId'] for matter in results]
def _get_groups_list(ci=None, member=None, parent=None): if not ci: ci = gapi_cloudidentity.build() if not parent: gapi_directory_customer.setTrueCustomerId() parent = f'customers/{GC_Values[GC_CUSTOMER_ID]}' gam.printGettingAllItems('Groups', member) page_message = gapi.got_total_items_first_last_msg('Groups') if member: fields = 'nextPageToken,memberships(groupKey(id),relationType)' try: groups_to_get = gapi.get_all_pages( ci.groups().memberships(), 'searchTransitiveGroups', 'memberships', throw_reasons=[gapi_errors.ErrorReason.FOUR_O_O], message_attribute=['groupKey', 'id'], page_message=page_message, parent='groups/-', query=member, pageSize=1000, fields=fields) except googleapiclient.errors.HttpError: controlflow.system_error_exit( 2, 'enterprisemember requires Enterprise license') return [ group['groupKey']['id'] for group in groups_to_get if group['relationType'] == 'DIRECT' ] else: groups_to_get = gapi.get_all_pages( ci.groups(), 'list', 'groups', message_attribute=['groupKey', 'id'], page_message=page_message, parent=parent, view='BASIC', pageSize=1000, fields='nextPageToken,groups(groupKey(id))') return [group['groupKey']['id'] for group in groups_to_get]
def info(): ci = gapi_cloudidentity.build_dwd() customer = f'customers/{GC_Values[GC_CUSTOMER_ID]}' name = sys.argv[3] if not name.startswith('devices/'): name = f'devices/{name}' device = gapi.call(ci.devices(), 'get', name=name, customer=customer) device_users = gapi.get_all_pages(ci.devices().deviceUsers(), 'list', 'deviceUsers', parent=name, customer=customer) display.print_json(device) print('Device Users:') display.print_json(device_users)
def test_get_all_pages_prints_paging_message_inline(self): self.mock_method.return_value.execute.side_effect = self.simple_3_page_response paging_message = 'A simple string displayed during paging' with patch.object(gapi.sys.stderr, 'write') as mock_write: gapi.get_all_pages(self.mock_service, self.mock_method_name, page_message=paging_message) messages_written = [ call_args[0][0] for call_args in mock_write.call_args_list ] # Make sure a return carriage was written between two pages paging_message_call_positions = [ i for i, message in enumerate(messages_written) if message == paging_message ] self.assertGreater(len(paging_message_call_positions), 1) printed_between_page_messages = messages_written[ paging_message_call_positions[0]:paging_message_call_positions[1]] self.assertIn('\r', printed_between_page_messages)
def buildRoleIdToNameToIdMap(cd=None): if not cd: cd = gapi_directory.build() result = gapi.get_all_pages(cd.roles(), 'list', 'items', customer=GC_Values[GC_CUSTOMER_ID], fields='nextPageToken,items(roleId,roleName)') GM_Globals[GM_MAP_ROLE_ID_TO_NAME] = {} GM_Globals[GM_MAP_ROLE_NAME_TO_ID] = {} for role in result: GM_Globals[GM_MAP_ROLE_ID_TO_NAME][role['roleId']] = role['roleName'] GM_Globals[GM_MAP_ROLE_NAME_TO_ID][role['roleName']] = role['roleId']