diff --git a/src/gam/gapi/cloudidentity/devices.py b/src/gam/gapi/cloudidentity/devices.py index e9dbec59..ef6f8afd 100644 --- a/src/gam/gapi/cloudidentity/devices.py +++ b/src/gam/gapi/cloudidentity/devices.py @@ -253,13 +253,6 @@ def update_state(): def print_(): - # This function is rather messy thanks to - # https://github.com/GAM-team/GAM/issues/1534 - # I'd prefer to keep it all in this function for now but if: - # - we find other list() operations that also hit this bug OR - # - it looks like this issue is going to exist on Google's side - # for a long time. - # I'll enterain some cleanup here to "functionalize" (yuck) all of this. ci = gapi_cloudidentity.build_dwd() customer = _get_device_customerid() parent = 'devices/-' @@ -267,8 +260,6 @@ def print_(): get_device_users = True view = None orderByList = [] - # default sort order needed by our 1 hour bug workaround - orderBy = 'create_time' titles = [] csvRows = [] todrive = False @@ -328,97 +319,26 @@ def print_(): } if orderByList: orderBy = ','.join(orderByList) - custom_device_filter = bool(device_filter) - # we store the devices in a dict keyed by name which is a unique ID. - # that way when we get duplicate devices we just overwrite the name - # with the latest copy we saw. - devices = {} + else: + orderBy = None + devices = [] page_message = gapi.got_total_items_msg(view_name_map[view], '...\n') - pageToken = None - newest_device_date = '' - total_items = 0 - while True: - try: - a_page = gapi.call(ci.devices(), - 'list', - customer=customer, - pageSize=100, - pageToken=pageToken, - filter=device_filter, - view=view, - orderBy=orderBy, - throw_reasons=[gapi_errors.ErrorReason.FOUR_O_O]) - except googleapiclient.errors.HttpError: - sys.stderr.write('WARNING: GAM hit Google internal bug 237397223. Please file a Google Support ticket stating that you are encountering this bug.\n') - if orderBy != 'create_time' or custom_device_filter: - controlflow.system_error_exit(5, 'GAM workaround for this issue only works if filter and orderby arguments are not used.\n') - sys.stderr.write(f' attempting to work around the bug by filtering for devices created on or after the newest we\'ve seen ({newest_device_date})...') - device_filter = f'register:{newest_device_date}..' - pageToken = None - continue - for dev in a_page.get('devices', []): - total_items += 1 - devices[dev['name']] = dev - dev_date = dev.get('createTime', '') - # remove the Z - dev_date = dev_date[:-1] - # remove microseconds - dev_date = dev_date.split('.')[0] - if dev_date > newest_device_date: - newest_device_date = dev_date - pageToken = a_page.get('nextPageToken') - if not pageToken: - break - sys.stderr.write(page_message.replace('%%total_items%%', str(total_items))) + devices += gapi.get_all_pages(ci.devices(), 'list', 'devices', + customer=customer, page_message=page_message, + pageSize=100, filter=device_filter, view=view, orderBy=orderBy) if get_device_users: page_message = gapi.got_total_items_msg('Device Users', '...\n') - pageToken = None - newest_deviceuser_date = '' - total_items = 0 - device_users = {} - if not custom_device_filter: - device_filter = None - while True: - try: - a_page = gapi.call(ci.devices().deviceUsers(), - 'list', - customer=customer, - parent=parent, - pageSize=20, - orderBy=orderBy, - filter=device_filter, - pageToken=pageToken, - throw_reasons=[gapi_errors.ErrorReason.FOUR_O_O]) - except googleapiclient.errors.HttpError: - sys.stderr.write('WARNING: GAM hit Google internal bug 237397223. Please file a Google Support ticket stating that you are encountering this bug.\n') - if orderBy != 'create_time' or custom_device_filter: - controlflow.system_error_exit(5, 'GAM workaround for this issue only works if filter and orderby arguments are not used.\n') - sys.stderr.write(f' attempting to work around the bug by filtering for device users created on or after the newest we\'ve seen ({newest_deviceuser_date})...') - device_filter = f'register:{newest_deviceuser_date}..' - pageToken = None - continue - for device_user in a_page.get('deviceUsers', []): - total_items += 1 - dev_date = device_user.get('createTime', '') - # remove the Z - dev_date = dev_date[:-1] - # remove microseconds - dev_date = dev_date.split('.')[0] - if dev_date > newest_deviceuser_date: - newest_deviceuser_date = dev_date - deviceuser_name = device_user['name'] - device_users[deviceuser_name] = device_user - pageToken = a_page.get('nextPageToken') - if not pageToken: - break - sys.stderr.write(page_message.replace('%%total_items%%', str(total_items))) - for deviceuser_name, device_user in device_users.items(): - device_id = deviceuser_name.split('/')[1] - device_name = f'devices/{device_id}' - if 'users' not in devices[device_name]: - devices[device_name]['users'] = [] - devices[device_name]['users'].append(device_user) - for device in devices.values(): + device_users = gapi.get_all_pages(ci.devices().deviceUsers(), 'list', + 'deviceUsers', customer=customer, parent=parent, + page_message=page_message, pageSize=1, filter=device_filter) + for device_user in device_users: + for device in devices: + if device_user.get('name').startswith(device.get('name')): + if 'users' not in device: + device['users'] = [] + device['users'].append(device_user) + break + for device in devices: device = utils.flatten_json(device) for a_key in device: if a_key not in titles: