From 6999c138779174947e5421b8816b9a068ef6df52 Mon Sep 17 00:00:00 2001 From: Jay Lee Date: Tue, 6 Apr 2021 16:35:34 -0400 Subject: [PATCH] allow Chrome pinning to relative version like 'stable-1' --- src/gam/gapi/chromehistory.py | 28 ++++++++++++++++++++++++++++ src/gam/gapi/chromepolicy.py | 7 +++++++ 2 files changed, 35 insertions(+) diff --git a/src/gam/gapi/chromehistory.py b/src/gam/gapi/chromehistory.py index 91c65979..2891c8bc 100644 --- a/src/gam/gapi/chromehistory.py +++ b/src/gam/gapi/chromehistory.py @@ -20,6 +20,7 @@ CHROME_HISTORY_ENTITY_CHOICES = { 'versions', 'releases', } + CHROME_PLATFORM_CHOICE_MAP = { 'all': 'all', 'android': 'android', @@ -32,6 +33,7 @@ CHROME_PLATFORM_CHOICE_MAP = { 'win': 'win', 'win64': 'win64', } + CHROME_CHANNEL_CHOICE_MAP = { 'beta': 'beta', 'canary': 'canary', @@ -39,6 +41,7 @@ CHROME_CHANNEL_CHOICE_MAP = { 'dev': 'dev', 'stable': 'stable', } + CHROME_VERSIONHISTORY_ORDERBY_CHOICE_MAP = { 'versions': { 'channel': 'channel', @@ -56,6 +59,7 @@ CHROME_VERSIONHISTORY_ORDERBY_CHOICE_MAP = { 'version': 'version' } } + CHROME_VERSIONHISTORY_TITLES = { 'platforms': ['name', 'platformType'], 'channels': ['name', 'channelType'], @@ -63,6 +67,30 @@ CHROME_VERSIONHISTORY_TITLES = { 'releases': ['name', 'version', 'fraction', 'serving.startTime', 'serving.endTime'] } +def get_relative_milestone(channel='stable', minus=0): + ''' takes a channel and minus_versions like stable and -1. returns current given milestone number ''' + cv = build() + svc = cv.platforms().channels().versions().releases() + 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 printHistory(): cv = build() entityType = sys.argv[3].lower().replace('_', '') diff --git a/src/gam/gapi/chromepolicy.py b/src/gam/gapi/chromepolicy.py index 0e56adc9..6b9e644d 100644 --- a/src/gam/gapi/chromepolicy.py +++ b/src/gam/gapi/chromepolicy.py @@ -9,6 +9,7 @@ from gam.var import GC_CUSTOMER_ID, GC_Values, MY_CUSTOMER from gam import controlflow from gam import gapi from gam.gapi import errors as gapi_errors +from gam.gapi import chromehistory as gapi_chromehistory from gam.gapi.directory import orgunits as gapi_directory_orgunits from gam import utils @@ -298,6 +299,12 @@ def update_policy(): value = f'{prefix}{value}' elif vtype in ['TYPE_LIST']: value = value.split(',') + if myarg == 'chrome.users.chromebrowserupdates' and \ + cased_field == 'targetVersionPrefixSetting': + if value.find('-') != -1: + channel, minus = value.split('-') + milestone = gapi_chromehistory.get_relative_milestone(channel, int(minus)) + value = f'{milestone}.' body['requests'][-1]['policyValue']['value'][cased_field] = value body['requests'][-1]['updateMask'] += f'{cased_field},' i += 2