From b509e35cd178788aef1e3acea59a171d77bee3bf Mon Sep 17 00:00:00 2001 From: Ross Scroggs Date: Tue, 29 Aug 2023 16:19:16 -0700 Subject: [PATCH] Updated `cigroup` commands to handle the following error: ERROR: 400: invalidArgument - Request contains an invalid argument. --- src/GamUpdate.txt | 7 +++++++ src/gam/__init__.py | 23 ++++++++++++----------- src/gam/gamlib/glgapi.py | 2 +- src/gam/gamlib/glmsgs.py | 1 + 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/GamUpdate.txt b/src/GamUpdate.txt index 6424b30b..d112ae18 100644 --- a/src/GamUpdate.txt +++ b/src/GamUpdate.txt @@ -2,6 +2,13 @@ Merged GAM-Team version +6.63.08 + +Updated `cigroup` commands to handle the following error: +``` +ERROR: 400: invalidArgument - Request contains an invalid argument. +``` + 6.63.07 Fixed bug in `gam append sheetrange` that caused a trap when appending to an empty sheet. diff --git a/src/gam/__init__.py b/src/gam/__init__.py index 99e7c20d..2bfef756 100755 --- a/src/gam/__init__.py +++ b/src/gam/__init__.py @@ -5892,7 +5892,7 @@ def getCIGroupMembershipGraph(ci, member): query=f"member_key_id == '{member}' && 'cloudidentity.googleapis.com/groups.discussion_forum' in labels") return (ci, result.get('response', {})) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, - GAPI.forbidden, GAPI.badRequest, GAPI.invalid, + GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError, GAPI.permissionDenied, GAPI.serviceNotAvailable) as e: action = Act.Get() Act.Set(Act.LOOKUP) @@ -5982,7 +5982,7 @@ def getItemsToModify(entityType, entity, memberRoles=None, isSuspended=None, isA parent=groupName, view='FULL', fields=f'nextPageToken,memberships(name,{CIGROUP_MEMBERKEY}(id),roles(name),type)', pageSize=GC.Values[GC.MEMBER_MAX_RESULTS]) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, - GAPI.forbidden, GAPI.badRequest, GAPI.invalid, + GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError, GAPI.permissionDenied, GAPI.serviceNotAvailable): entityUnknownWarning(Ent.CLOUD_IDENTITY_GROUP, groupEmail) _incrEntityDoesNotExist(Ent.CLOUD_IDENTITY_GROUP) @@ -6154,7 +6154,7 @@ def getItemsToModify(entityType, entity, memberRoles=None, isSuspended=None, isA fields=f'nextPageToken,memberships({CIGROUP_MEMBERKEY}(id),roles(name),type)', pageSize=GC.Values[GC.MEMBER_MAX_RESULTS]) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, - GAPI.forbidden, GAPI.badRequest, GAPI.invalid, + GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError, GAPI.permissionDenied, GAPI.serviceNotAvailable): entityUnknownWarning(Ent.CLOUD_IDENTITY_GROUP, groupEmail) _incrEntityDoesNotExist(Ent.CLOUD_IDENTITY_GROUP) @@ -12055,7 +12055,7 @@ def doProcessSvcAcctKeys(mode=None, iam=None, projectId=None, clientEmail=None, for retry in range(1, maxRetries+1): try: result = callGAPI(iam.projects().serviceAccounts().keys(), 'upload', - throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.PERMISSION_DENIED], + throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.PERMISSION_DENIED, GAPI.FAILED_PRECONDITION], name=name, body={'publicKeyData': publicKeyData}) break except GAPI.notFound as e: @@ -12068,7 +12068,7 @@ def doProcessSvcAcctKeys(mode=None, iam=None, projectId=None, clientEmail=None, entityActionFailedWarning([Ent.PROJECT, projectId, Ent.SVCACCT, clientEmail], Msg.UPDATE_PROJECT_TO_VIEW_MANAGE_SAKEYS) return False waitForCompletion(retry) - except GAPI.badRequest as e: + except (GAPI.badRequest, GAPI.failedPrecondition) as e: entityActionFailedWarning([Ent.PROJECT, projectId, Ent.SVCACCT, clientEmail], str(e)) return False newPrivateKeyId = result['name'].rsplit('/', 1)[-1] @@ -30972,7 +30972,7 @@ def doPrintGroups(): parent=f'customers/{GC.Values[GC.CUSTOMER_ID]}', view='FULL', fields=cifieldsnp, pageSize=500) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, - GAPI.forbidden, GAPI.badRequest, GAPI.invalid, + GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError, GAPI.permissionDenied, GAPI.serviceNotAvailable) as e: accessErrorExitNonDirectory(API.CLOUDIDENTITY_GROUPS, str(e)) for ciGroup in ciGroupList: @@ -32789,7 +32789,7 @@ def doPrintCIGroups(): throwReasons=GAPI.CIGROUP_LIST_THROW_REASONS, retryReasons=GAPI.CIGROUP_RETRY_REASONS, view='FULL', fields=fieldsnp, pageSize=pageSize, **kwargs) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, - GAPI.forbidden, GAPI.badRequest, GAPI.invalid, + GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError, GAPI.permissionDenied, GAPI.serviceNotAvailable) as e: entityActionFailedWarning([Ent.CLOUD_IDENTITY_GROUP, None], str(e)) return @@ -32899,7 +32899,7 @@ def getCIGroupMembersEntityList(ci, entityList, query, subTitle, matchPatterns, parent=parent, view='FULL', fields=f'nextPageToken,groups({",".join(set(fieldsList))})', pageSize=500) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, - GAPI.forbidden, GAPI.badRequest, GAPI.invalid, + GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError, GAPI.permissionDenied, GAPI.serviceNotAvailable) as e: entityActionFailedExit([Ent.CLOUD_IDENTITY_GROUP, parent], str(e)) else: @@ -32913,7 +32913,7 @@ def getCIGroupTransitiveMembers(ci, groupName, membersList, i, count): parent=groupName, fields='nextPageToken,memberships(*)', pageSize=GC.Values[GC.MEMBER_MAX_RESULTS]) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, - GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.systemError, GAPI.serviceNotAvailable): + GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError, GAPI.serviceNotAvailable): entityUnknownWarning(Ent.CLOUD_IDENTITY_GROUP, groupName, i, count) return False except GAPI.permissionDenied as e: @@ -32942,7 +32942,7 @@ def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, co parent=groupName, view='FULL', fields='nextPageToken,memberships(*)', pageSize=GC.Values[GC.MEMBER_MAX_RESULTS]) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, - GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.systemError, + GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError, GAPI.permissionDenied, GAPI.serviceNotAvailable): entityUnknownWarning(Ent.CLOUD_IDENTITY_GROUP, groupName, i, count) return @@ -33205,7 +33205,7 @@ def doShowCIGroupMembers(): for member in membersList: getCIGroupMemberRoleFixType(member) except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, - GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.systemError, + GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError, GAPI.permissionDenied, GAPI.serviceNotAvailable): if depth == 0: entityUnknownWarning(Ent.CLOUD_IDENTITY_GROUP, groupEmail, i, count) @@ -49217,6 +49217,7 @@ def getDriveFileAttribute(myarg, body, parameters, updateCmd): parameters[DFA_REPLACEFILENAME].append((getREPattern(re.IGNORECASE), getString(Cmd.OB_STRING, minLen=0))) elif myarg in {'convert', 'ocr'}: deprecatedArgument(myarg) + stderrWarningMsg(Msg.USE_MIMETYPE_TO_SPECIFY_GOOGLE_FORMAT) elif myarg in DRIVE_LABEL_CHOICE_MAP: myarg = DRIVE_LABEL_CHOICE_MAP[myarg] body[myarg] = getBoolean() diff --git a/src/gam/gamlib/glgapi.py b/src/gam/gamlib/glgapi.py index 0d6e55ce..13832e33 100644 --- a/src/gam/gamlib/glgapi.py +++ b/src/gam/gamlib/glgapi.py @@ -177,7 +177,7 @@ ALERT_THROW_REASONS = [SERVICE_NOT_AVAILABLE, AUTH_ERROR] CALENDAR_THROW_REASONS = [SERVICE_NOT_AVAILABLE, AUTH_ERROR, NOT_A_CALENDAR_USER] CIGROUP_CREATE_THROW_REASONS = [SERVICE_NOT_AVAILABLE, ALREADY_EXISTS, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, INVALID, INVALID_ARGUMENT, PERMISSION_DENIED] CIGROUP_GET_THROW_REASONS = [SERVICE_NOT_AVAILABLE, NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, BAD_REQUEST, INVALID, SYSTEM_ERROR, PERMISSION_DENIED] -CIGROUP_LIST_THROW_REASONS = [SERVICE_NOT_AVAILABLE, RESOURCE_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, BAD_REQUEST, INVALID, SYSTEM_ERROR, PERMISSION_DENIED] +CIGROUP_LIST_THROW_REASONS = [SERVICE_NOT_AVAILABLE, RESOURCE_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, BAD_REQUEST, INVALID, INVALID_ARGUMENT, SYSTEM_ERROR, PERMISSION_DENIED] CIGROUP_LIST_USERKEY_THROW_REASONS = CIGROUP_LIST_THROW_REASONS+[INVALID_ARGUMENT] CIGROUP_UPDATE_THROW_REASONS = [SERVICE_NOT_AVAILABLE, NOT_FOUND, GROUP_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, BAD_REQUEST, INVALID, INVALID_INPUT, INVALID_ARGUMENT, diff --git a/src/gam/gamlib/glmsgs.py b/src/gam/gamlib/glmsgs.py index 47c92f98..a0dad293 100644 --- a/src/gam/gamlib/glmsgs.py +++ b/src/gam/gamlib/glmsgs.py @@ -462,6 +462,7 @@ UPDATE_USER_PASSWORD_CHANGE_NOTIFY_SUBJECT = 'Account #user# password has been c UPLOAD_CSV_FILE_INTERNAL_ERROR = 'Google reported "{0}" but the file was probably uploaded, check that it has {1} rows' UPLOADING_NEW_PUBLIC_CERTIFICATE_TO_GOOGLE = 'Uploading new public certificate to Google...\n' URL_ERROR = 'URL error: {0}' +USE_MIMETYPE_TO_SPECIFY_GOOGLE_FORMAT = 'Use "mimetype " to specify Google file format\n' USED = 'Used' USER_BELONGS_TO_N_GROUPS_THAT_MAP_TO_ORGUNITS = 'User belongs to {0} groups ({1}) that map to OUs' USER_CANCELLED = 'User cancelled'