#!/usr/bin/python # # Copyright 2013 Google Inc. All Rights Reserved. """ Response handlers for offline task queues. TaskCleanUp: Purge a given Google Apps customer instance. """ __author__ = 'richieforeman@google.com (Richie Foreman)' import httplib2 import time import logging from app import BaseHandler from app import WSGIApplication from constants import ResellerPlanName from constants import ResellerSKU from constants import ResellerRenewalType from constants import ResellerProduct from constants import ResellerDeletionType from google.appengine.api import memcache import settings from apiclient.discovery import build from apiclient.http import BatchHttpRequest from oauth2client.client import SignedJwtAssertionCredentials from utils import get_credentials import webapp2 class TaskCleanup(BaseHandler): def post(self): domain = self.request.get("domain") logging.info("Execing cleanup task for domain (%s)" % domain) http = httplib2.Http() credentials = get_credentials(settings.RESELLER_ADMIN) credentials.authorize(http) service = build("reseller", settings.RESELLER_API_VERSION, http=http) response = service.customers().get( customerId=domain).execute(num_retries=5) def delete_sub_callback(request_id, response, exception): # just log the exception. logging.exception(exception) pass if not response.get("alternateEmail"): logging.info("Skipping cleanup, customer not resold..") exit() response = service.subscriptions().list( customerId=domain, maxResults=100).execute(num_retries=5) # resort the subscriptions and bump GAFB subs to the bottom all_subscriptions = response['subscriptions'] batch = BatchHttpRequest(callback=delete_sub_callback) logging.info("Purging %d subs" % len(all_subscriptions)) apps_subscription = None for subscription in all_subscriptions: if subscription['status'] in [ResellerDeletionType.Cancel, ResellerDeletionType.Suspend, ResellerDeletionType.Downgrade]: logging.info("Skipping subscription, in deleted state") continue # GAfB cannot be deleted in the batch request with the others. if subscription['skuId'] == ResellerSKU.GoogleApps: apps_subscription = subscription continue # Google-Drive-storage / Google-Vault must be cancelled. request = service.subscriptions().delete( customerId=domain, subscriptionId=subscription['subscriptionId'], deletionType=ResellerDeletionType.Cancel) batch.add(request) batch.execute(http=http) # Delete if apps_subscription: service.subscriptions().delete( customerId=domain, subscriptionId=apps_subscription['subscriptionId'], deletionType=ResellerDeletionType.Suspend ).execute(num_retries=5) app = WSGIApplication(routes=[ (r'/tasks/cleanup', TaskCleanup), ], config=settings.WEBAPP2_CONFIG)