class BaseSalesforcePushTask(BaseSalesforceApiTask): completed_statuses = ['Succeeded', 'Failed', 'Canceled'] api_version = '38.0' def _init_task(self): super(BaseSalesforcePushTask, self)._init_task() self.push = SalesforcePushApi(self.sf, self.logger) def _parse_version(self, version): # Parse the version number string major = None minor = None patch = None build = None state = 'Released' version_parts = version.split('.') if len(version_parts) >= 1: major = version_parts[0] if len(version_parts) == 2: minor = version_parts[1] if minor.find('Beta') != -1: state = 'Beta' minor, build = minor.replace( ' (Beta ', ',', ).replace(')', '').split(',') if len(version_parts) > 2: minor = version_parts[1] patch = version_parts[2] if patch.find('Beta') != -1: state = 'Beta' patch, build = minor.replace( ' (Beta ', ',', ).replace(')', '').split(',') return { 'major': major, 'minor': minor, 'patch': patch, 'build': build, 'state': state, } def _get_version(self, package, version): version_info = self._parse_version(version) version_where = ( "ReleaseState = '{}'".format(version_info['state']) + " AND MajorVersion = {}".format(version_info['major']) + " AND MinorVersion = {}".format(version_info['minor'])) if version_info.get('patch'): version_where += " AND PatchVersion = {}".format( version_info['patch']) if version_info['state'] == 'Beta' and version_info.get('build'): version_where += " AND BuildNumber = {}".format( version_info['build']) version = package.get_package_version_objs(version_where, limit=1) if not version: raise PushApiObjectNotFound( 'PackageVersion not found.' + ' Namespace = {}, Version Info = {}'.format( package.namespace, version_info, )) return version[0] def _get_package(self, namespace): package = self.push.get_package_objs( "NamespacePrefix = '{}'".format(namespace), limit=1) if not package: raise PushApiObjectNotFound( 'The package with namespace {} was not found'.format( namespace)) return package[0] def _load_orgs_file(self, path): orgs = [] with open(path, 'r') as f: for line in f: if line.isspace(): continue orgs.append(line.split()[0]) return orgs def _report_push_status(self, request_id): default_where = {'PackagePushRequest': "Id = '{}'".format(request_id)} # Create a new PushAPI instance with different settings than self.push self.push_report = SalesforcePushApi( self.sf, self.logger, lazy=['subscribers', 'jobs'], default_where=default_where, ) # Get the push request push_request = self.push_report.get_push_request_objs( "Id = '{}'".format(request_id), limit=1, ) if not push_request: raise PushApiObjectNotFound( 'Push Request {} was not found'.format(push_request)) push_request = push_request[0] # Check if the request is complete interval = 10 if push_request.status not in self.completed_statuses: self.logger.info( 'Push request is not yet complete.' + ' Polling for status every {} seconds until completion'.format( interval)) # Loop waiting for request completion i = 0 while push_request.status not in self.completed_statuses: if i == 10: self.logger.info( 'This is taking a while! Polling every 60 seconds') interval = 60 time.sleep(interval) # Clear the method level cache on get_push_requests and # get_push_request_objs self.push_report.get_push_requests.cache.clear() self.push_report.get_push_request_objs.cache.clear() # Get the push_request again push_request = self.push_report.get_push_request_objs( "Id = '{}'".format(request_id), limit=1, )[0] self.logger.info(push_request.status) i += 1 failed_jobs = [] success_jobs = [] canceled_jobs = [] jobs = push_request.get_push_job_objs() for job in jobs: if job.status == 'Failed': failed_jobs.append(job) elif job.status == 'Succeeded': success_jobs.append(job) elif job.status == 'Canceled': canceled_jobs.append(job) self.logger.info( "Push complete: {} succeeded, {} failed, {} canceled".format( len(success_jobs), len(failed_jobs), len(canceled_jobs), )) failed_by_error = {} for job in failed_jobs: errors = job.get_push_error_objs() for error in errors: error_key = ( error.error_type, error.title, error.message, error.details, ) if error_key not in failed_by_error: failed_by_error[error_key] = [] failed_by_error[error_key].append(error) if failed_jobs: self.logger.info("-----------------------------------") self.logger.info("Failures by error type") self.logger.info("-----------------------------------") for key, errors in failed_by_error.items(): self.logger.info(" ") self.logger.info("{} failed with...".format(len(errors))) self.logger.info(" Error Type = {}".format(key[0])) self.logger.info(" Title = {}".format(key[1])) self.logger.info(" Message = {}".format(key[2])) self.logger.info(" Details = {}".format(key[3]))
class BaseSalesforcePushTask(BaseSalesforceApiTask): completed_statuses = ["Succeeded", "Failed", "Canceled"] api_version = "38.0" def _init_task(self): super(BaseSalesforcePushTask, self)._init_task() self.push = SalesforcePushApi(self.sf, self.logger) def _parse_version(self, version): # Parse the version number string major = None minor = None patch = None build = None state = "Released" version_parts = version.split(".") if len(version_parts) >= 1: major = version_parts[0] if len(version_parts) == 2: minor = version_parts[1] if minor.find("Beta") != -1: state = "Beta" minor, build = minor.replace(" (Beta ", ",").replace(")", "").split(",") if len(version_parts) > 2: minor = version_parts[1] patch = version_parts[2] if patch.find("Beta") != -1: state = "Beta" patch, build = minor.replace(" (Beta ", ",").replace(")", "").split(",") return { "major": major, "minor": minor, "patch": patch, "build": build, "state": state, } def _get_version(self, package, version): version_info = self._parse_version(version) version_where = ( "ReleaseState = '{}'".format(version_info["state"]) + " AND MajorVersion = {}".format(version_info["major"]) + " AND MinorVersion = {}".format(version_info["minor"]) ) if version_info.get("patch"): version_where += " AND PatchVersion = {}".format(version_info["patch"]) if version_info["state"] == "Beta" and version_info.get("build"): version_where += " AND BuildNumber = {}".format(version_info["build"]) version = package.get_package_version_objs(version_where, limit=1) if not version: raise PushApiObjectNotFound( "PackageVersion not found." + " Namespace = {}, Version Info = {}".format( package.namespace, version_info ) ) return version[0] def _get_package(self, namespace): package = self.push.get_package_objs( "NamespacePrefix = '{}'".format(namespace), limit=1 ) if not package: raise PushApiObjectNotFound( "The package with namespace {} was not found".format(namespace) ) return package[0] def _load_orgs_file(self, path): orgs = [] with open(path, "r") as f: for line in f: if line.isspace(): continue orgs.append(line.split()[0]) return orgs def _get_push_request_query(self, request_id): default_where = {"PackagePushRequest": "Id = '{}'".format(request_id)} # Create a new PushAPI instance with different settings than self.push self.push_report = SalesforcePushApi( self.sf, self.logger, lazy=["subscribers", "jobs"], default_where=default_where, ) # Get the push request self.push_request = self.push_report.get_push_request_objs( "Id = '{}'".format(request_id), limit=1 ) if not self.push_request: raise PushApiObjectNotFound( "Push Request {} was not found".format(self.push_request) ) self.push_request = self.push_request[0] def _get_push_request_job_results(self): failed_jobs = [] success_jobs = [] canceled_jobs = [] jobs = self.push_request.get_push_job_objs() for job in jobs: if job.status == "Failed": failed_jobs.append(job) elif job.status == "Succeeded": success_jobs.append(job) elif job.status == "Canceled": canceled_jobs.append(job) self.logger.info( "Push complete: {} succeeded, {} failed, {} canceled".format( len(success_jobs), len(failed_jobs), len(canceled_jobs) ) ) failed_by_error = {} for job in failed_jobs: errors = job.get_push_error_objs() for error in errors: error_key = ( error.error_type, error.title, error.message, error.details, ) if error_key not in failed_by_error: failed_by_error[error_key] = [] failed_by_error[error_key].append(error) if failed_jobs: self.logger.info("-----------------------------------") self.logger.info("Failures by error type") self.logger.info("-----------------------------------") for key, errors in failed_by_error.items(): self.logger.info(" ") self.logger.info("{} failed with...".format(len(errors))) self.logger.info(" Error Type = {}".format(key[0])) self.logger.info(" Title = {}".format(key[1])) self.logger.info(" Message = {}".format(key[2])) self.logger.info(" Details = {}".format(key[3])) def _report_push_status(self, request_id): self._get_push_request_query(request_id) # Check if the request is complete interval = 10 if self.push_request.status not in self.completed_statuses: self.logger.info( "Push request is not yet complete." + " Polling for status every {} seconds until completion".format( interval ) ) # Loop waiting for request completion i = 0 while self.push_request.status not in self.completed_statuses: if i == 10: self.logger.info("This is taking a while! Polling every 60 seconds") interval = 60 time.sleep(interval) # Clear the method level cache on get_push_requests and # get_push_request_objs self.push_report.get_push_requests.cache.clear() self.push_report.get_push_request_objs.cache.clear() # Get the push_request again self.push_request = self.push_report.get_push_request_objs( "Id = '{}'".format(request_id), limit=1 )[0] self.logger.info(self.push_request.status) i += 1 self._get_push_request_job_results()
class BaseSalesforcePushTask(BaseSalesforceApiTask): completed_statuses = ["Succeeded", "Failed", "Canceled"] api_version = "38.0" def _init_task(self): super(BaseSalesforcePushTask, self)._init_task() self.push = SalesforcePushApi(self.sf, self.logger) def _parse_version(self, version): # Parse the version number string major = None minor = None patch = None build = None state = "Released" version_parts = version.split(".") if len(version_parts) >= 1: major = version_parts[0] if len(version_parts) == 2: minor = version_parts[1] if minor.find("Beta") != -1: state = "Beta" minor, build = minor.replace(" (Beta ", ",").replace(")", "").split(",") if len(version_parts) > 2: minor = version_parts[1] patch = version_parts[2] if patch.find("Beta") != -1: state = "Beta" patch, build = minor.replace(" (Beta ", ",").replace(")", "").split(",") return { "major": major, "minor": minor, "patch": patch, "build": build, "state": state, } def _get_version(self, package, version): version_info = self._parse_version(version) version_where = ( "ReleaseState = '{}'".format(version_info["state"]) + " AND MajorVersion = {}".format(version_info["major"]) + " AND MinorVersion = {}".format(version_info["minor"]) ) if version_info.get("patch"): version_where += " AND PatchVersion = {}".format(version_info["patch"]) if version_info["state"] == "Beta" and version_info.get("build"): version_where += " AND BuildNumber = {}".format(version_info["build"]) version = package.get_package_version_objs(version_where, limit=1) if not version: raise PushApiObjectNotFound( "PackageVersion not found." + " Namespace = {}, Version Info = {}".format( package.namespace, version_info ) ) return version[0] def _get_package(self, namespace): package = self.push.get_package_objs( "NamespacePrefix = '{}'".format(namespace), limit=1 ) if not package: raise PushApiObjectNotFound( "The package with namespace {} was not found".format(namespace) ) return package[0] def _load_orgs_file(self, path): orgs = [] with open(path, "r") as f: for line in f: if line.isspace(): continue orgs.append(line.split()[0]) return orgs def _report_push_status(self, request_id): default_where = {"PackagePushRequest": "Id = '{}'".format(request_id)} # Create a new PushAPI instance with different settings than self.push self.push_report = SalesforcePushApi( self.sf, self.logger, lazy=["subscribers", "jobs"], default_where=default_where, ) # Get the push request push_request = self.push_report.get_push_request_objs( "Id = '{}'".format(request_id), limit=1 ) if not push_request: raise PushApiObjectNotFound( "Push Request {} was not found".format(push_request) ) push_request = push_request[0] # Check if the request is complete interval = 10 if push_request.status not in self.completed_statuses: self.logger.info( "Push request is not yet complete." + " Polling for status every {} seconds until completion".format( interval ) ) # Loop waiting for request completion i = 0 while push_request.status not in self.completed_statuses: if i == 10: self.logger.info("This is taking a while! Polling every 60 seconds") interval = 60 time.sleep(interval) # Clear the method level cache on get_push_requests and # get_push_request_objs self.push_report.get_push_requests.cache.clear() self.push_report.get_push_request_objs.cache.clear() # Get the push_request again push_request = self.push_report.get_push_request_objs( "Id = '{}'".format(request_id), limit=1 )[0] self.logger.info(push_request.status) i += 1 failed_jobs = [] success_jobs = [] canceled_jobs = [] jobs = push_request.get_push_job_objs() for job in jobs: if job.status == "Failed": failed_jobs.append(job) elif job.status == "Succeeded": success_jobs.append(job) elif job.status == "Canceled": canceled_jobs.append(job) self.logger.info( "Push complete: {} succeeded, {} failed, {} canceled".format( len(success_jobs), len(failed_jobs), len(canceled_jobs) ) ) failed_by_error = {} for job in failed_jobs: errors = job.get_push_error_objs() for error in errors: error_key = ( error.error_type, error.title, error.message, error.details, ) if error_key not in failed_by_error: failed_by_error[error_key] = [] failed_by_error[error_key].append(error) if failed_jobs: self.logger.info("-----------------------------------") self.logger.info("Failures by error type") self.logger.info("-----------------------------------") for key, errors in failed_by_error.items(): self.logger.info(" ") self.logger.info("{} failed with...".format(len(errors))) self.logger.info(" Error Type = {}".format(key[0])) self.logger.info(" Title = {}".format(key[1])) self.logger.info(" Message = {}".format(key[2])) self.logger.info(" Details = {}".format(key[3]))
class BaseSalesforcePushTask(BaseSalesforceApiTask): completed_statuses = ['Succeeded','Failed','Cancelled'] def _init_task(self): super(BaseSalesforcePushTask, self)._init_task() self.push = SalesforcePushApi(self.sf, self.logger) def _parse_version(self, version): # Parse the version number string major = None minor = None patch = None build = None state = 'Released' version_parts = version.split('.') if len(version_parts) >= 1: major = version_parts[0] if len(version_parts) == 2: minor = version_parts[1] if minor.find('Beta') != -1: state = 'Beta' minor, build = minor.replace(' (Beta ',',').replace(')','').split(',') if len(version_parts) > 2: minor = version_parts[1] patch = version_parts[2] if patch.find('Beta') != -1: state = 'Beta' patch, build = minor.replace(' (Beta ',',').replace(')','').split(',') return { 'major': major, 'minor': minor, 'patch': patch, 'build': build, 'state': state, } def _get_version(self, package, version): version_info = self._parse_version(version) version_where = "ReleaseState = '{}' AND MajorVersion = {} AND MinorVersion = {}".format( version_info['state'], version_info['major'], version_info['minor'], ) if version_info.get('patch'): version_where += " AND PatchVersion = {}".format(version_info['patch']) if version_info['state'] == 'Beta' and version_info.get('build'): version_where += " AND BuildNumber = {}".format(version_info['build']) version = package.get_package_version_objs(version_where, limit=1) if not version: raise PushApiObjectNotFound('PackageVersion not found. Namespace = {}, Version Info = {}'.format(package.namespace, version_info)) return version[0] def _get_package(self, namespace): package = self.push.get_package_objs( "NamespacePrefix = '{}'".format(namespace), limit=1 ) if not package: raise PushApiObjectNotFound('The package with namespace {} was not found'.format(namespace)) return package[0] def _load_orgs_file(self, path): f_orgs = open(path, 'r') orgs = [] for org in f_orgs: orgs.append(org.strip()) return orgs def _report_push_status(self, request_id): default_where = {'PackagePushRequest': "Id = '{}'".format(request_id)} # Create a new PushAPI instance with different settings than self.push self.push_report = SalesforcePushApi( self.sf, self.logger, lazy = ['subscribers','jobs'], default_where = default_where, ) # Get the push request push_request = self.push_report.get_push_request_objs("Id = '{}'".format(request_id), limit=1) if not push_request: raise PushApiObjectNotFound('Push Request {} was not found'.format(push_request)) push_request = push_request[0] # Check if the request is complete interval = 10 if push_request.status not in self.completed_statuses: self.logger.info( 'Push request is not yet complete. Polling for status every {} seconds until completion...'.format(interval) ) # Loop waiting for request completion i = 0 while push_request.status not in self.completed_statuses: if i == 10: self.logger.info('This is taking a while! Polling every 60 seconds...') interval = 60 time.sleep(interval) # Clear the method level cache on get_push_requests and get_push_request_objs self.push_report.get_push_requests.cache.clear() self.push_report.get_push_request_objs.cache.clear() # Get the push_request again push_request = self.push_report.get_push_request_objs("Id = '{}'".format(request_id), limit=1)[0] self.logger.info(push_request.status) i += 1 failed_jobs = [] success_jobs = [] cancelled_jobs = [] jobs = push_request.get_push_job_objs() for job in jobs: if job.status == 'Failed': failed_jobs.append(job) elif job.status == 'Succeeded': success_jobs.append(job) elif job.status == 'Cancelled': cancelled_jobs.append(job) self.logger.info( "Push complete: {} succeeded, {} failed, {} cancelled".format( len(success_jobs), len(failed_jobs), len(cancelled_jobs), ) ) failed_by_error = {} for job in failed_jobs: errors = job.get_push_error_objs() for error in errors: error_key = (error.error_type, error.title, error.message, error.details) if error_key not in failed_by_error: failed_by_error[error_key] = [] failed_by_error[error_key].append(error) if failed_jobs: self.logger.info("-----------------------------------") self.logger.info("Failures by error type") self.logger.info("-----------------------------------") for key, errors in failed_by_error.items(): self.logger.info(" ") self.logger.info("{} failed with...".format(len(errors))) self.logger.info(" Error Type = {}".format(key[0])) self.logger.info(" Title = {}".format(key[1])) self.logger.info(" Message = {}".format(key[2])) self.logger.info(" Details = {}".format(key[3]))