def prune_machines_for( provider_id, print_logs=False, dry_run=False, forced_removal=False): """ Look at the list of machines (as seen by the AccountProvider) if a machine cannot be found in the list, remove it. NOTE: BEFORE CALLING THIS TASK you should ensure that the AccountProvider can see ALL images. Failure to do so will result in any image unseen by the admin to be prematurely end-dated and removed from the API/UI. """ provider = Provider.objects.get(id=provider_id) now = timezone.now() if print_logs: import logging import sys consolehandler = logging.StreamHandler(sys.stdout) consolehandler.setLevel(logging.DEBUG) celery_logger.addHandler(consolehandler) celery_logger.info("Starting prune_machines for Provider %s @ %s" % (provider, now)) if provider.is_active(): account_driver = get_account_driver(provider) db_machines = ProviderMachine.objects.filter( only_current_source(), instance_source__provider=provider) cloud_machines = account_driver.list_all_images() else: db_machines = ProviderMachine.objects.filter( source_in_range(), # like 'only_current..' w/o active_provider instance_source__provider=provider) cloud_machines = [] # Don't do anything if cloud machines == [None,[]] if not cloud_machines and not forced_removal: return # Loop 1 - End-date All machines in the DB that # can NOT be found in the cloud. mach_count = _end_date_missing_database_machines( db_machines, cloud_machines, now=now, dry_run=dry_run) # Loop 2 and 3 - Capture all (still-active) versions without machines, # and all applications without versions. # These are 'outliers' and mainly here for safety-check purposes. ver_count = _remove_versions_without_machines(now=now) app_count = _remove_applications_without_versions(now=now) # Loop 4 - All 'Application' DB objects require # >=1 Version with >=1 ProviderMachine (ACTIVE!) # Apps that don't meet this criteria should be end-dated. app_count += _update_improperly_enddated_applications(now) celery_logger.info( "prune_machines completed for Provider %s : " "%s Applications, %s versions and %s machines pruned." % (provider, app_count, ver_count, mach_count)) if print_logs: celery_logger.removeHandler(consolehandler)
def prune_machines_for(provider_id, print_logs=False, dry_run=False, forced_removal=False): """ Look at the list of machines (as seen by the AccountProvider) if a machine cannot be found in the list, remove it. NOTE: BEFORE CALLING THIS TASK you should ensure that the AccountProvider can see ALL images. Failure to do so will result in any image unseen by the admin to be prematurely end-dated and removed from the API/UI. """ provider = Provider.objects.get(id=provider_id) now = timezone.now() if print_logs: console_handler = _init_stdout_logging() celery_logger.info("Starting prune_machines for Provider %s @ %s" % (provider, now)) if provider.is_active(): account_driver = get_account_driver(provider) db_machines = ProviderMachine.objects.filter( only_current_source(), instance_source__provider=provider) cloud_machines = account_driver.list_all_images() else: db_machines = ProviderMachine.objects.filter( source_in_range(), # like 'only_current..' w/o active_provider instance_source__provider=provider) cloud_machines = [] # Don't do anything if cloud machines == [None,[]] if not cloud_machines and not forced_removal: return # Loop 1 - End-date All machines in the DB that # can NOT be found in the cloud. mach_count = _end_date_missing_database_machines(db_machines, cloud_machines, now=now, dry_run=dry_run) # Loop 2 and 3 - Capture all (still-active) versions without machines, # and all applications without versions. # These are 'outliers' and mainly here for safety-check purposes. ver_count = _remove_versions_without_machines(now=now) app_count = _remove_applications_without_versions(now=now) # Loop 4 - All 'Application' DB objects require # >=1 Version with >=1 ProviderMachine (ACTIVE!) # Apps that don't meet this criteria should be end-dated. app_count += _update_improperly_enddated_applications(now) celery_logger.info("prune_machines completed for Provider %s : " "%s Applications, %s versions and %s machines pruned." % (provider, app_count, ver_count, mach_count)) if print_logs: _exit_stdout_logging(console_handler)
def prune_machines_for(provider_id, print_logs=False, dry_run=False, forced_removal=False): """ Look at the list of machines (as seen by the AccountProvider) if a machine cannot be found in the list, remove it. NOTE: BEFORE CALLING THIS TASK you should ensure that the AccountProvider can see ALL images. Failure to do so will result in any unseen image to be prematurely end-dated and removed from the API/UI. """ provider = Provider.objects.get(id=provider_id) if print_logs: import logging import sys consolehandler = logging.StreamHandler(sys.stdout) consolehandler.setLevel(logging.DEBUG) celery_logger.addHandler(consolehandler) if provider.is_active(): account_driver = get_account_driver(provider) db_machines = ProviderMachine.objects.filter( only_current_source(), instance_source__provider=provider) all_projects_map = tenant_id_to_name_map(account_driver) cloud_machines = account_driver.list_all_images() else: db_machines = ProviderMachine.objects.filter( source_in_range(), instance_source__provider=provider) cloud_machines = [] # Don't do anything if cloud machines == [None,[]] if not cloud_machines and not forced_removal: return # Loop1 - End-date All machines in the DB that can NOT be found in the cloud. cloud_machine_ids = [mach.id for mach in cloud_machines] for machine in db_machines: cloud_match = [ mach for mach in cloud_machine_ids if mach == machine.identifier ] if not cloud_match: remove_machine(machine, dry_run=dry_run) if print_logs: celery_logger.removeHandler(consolehandler)
def prune_machines_for( provider_id, print_logs=False, dry_run=False, forced_removal=False, validate=True ): """ Look at the list of machines (as seen by the AccountProvider) if a machine cannot be found in the list, remove it. NOTE: BEFORE CALLING THIS TASK you should ensure that the AccountProvider can see ALL images. Failure to do so will result in any image unseen by the admin to be prematurely end-dated and removed from the API/UI. """ provider = Provider.objects.get(id=provider_id) now = timezone.now() if print_logs: console_handler = _init_stdout_logging() celery_logger.info( "Starting prune_machines for Provider %s @ %s" % (provider, now) ) if provider.is_active(): account_driver = get_account_driver(provider) db_machines = ProviderMachine.objects.filter( only_current_source(), instance_source__provider=provider ) cloud_machines = account_driver.list_all_images() else: db_machines = ProviderMachine.objects.filter( source_in_range(), # like 'only_current..' w/o active_provider instance_source__provider=provider ) cloud_machines = [] machine_validator = MachineValidationPluginManager.get_validator( account_driver ) cloud_machines = [ cloud_machine for cloud_machine in cloud_machines if not validate or machine_validator.machine_is_valid(cloud_machine) ] # Don't do anything if cloud machines == [None,[]] if not cloud_machines and not forced_removal: return # Loop 1 - End-date All machines in the DB that # can NOT be found in the cloud. mach_count = _end_date_missing_database_machines( db_machines, cloud_machines, now=now, dry_run=dry_run ) # Loop 2 and 3 - Capture all (still-active) versions without machines, # and all applications without versions. # These are 'outliers' and mainly here for safety-check purposes. ver_count = _remove_versions_without_machines(now=now) app_count = _remove_applications_without_versions(now=now) # Loop 4 - All 'Application' DB objects require # >=1 Version with >=1 ProviderMachine (ACTIVE!) # Apps that don't meet this criteria should be end-dated. app_count += _update_improperly_enddated_applications(now) # Clear out application, provider machine, and version memberships # if the result is >128. # Additionally, remove all users who are not in the machine request (if one exists). _clean_memberships(db_machines, account_driver) celery_logger.info( "prune_machines completed for Provider %s : " "%s Applications, %s versions and %s machines pruned." % (provider, app_count, ver_count, mach_count) ) if print_logs: _exit_stdout_logging(console_handler)