def _execute_provider_action(identity, user, instance, action_name): driver = get_cached_driver(identity=identity) try: if not action_name: logger.debug("No 'action_name' provided") return elif action_name == 'Suspend': suspend_instance(driver, instance, identity.provider.uuid, identity.uuid, user) elif action_name == 'Stop': stop_instance(driver, instance, identity.provider.uuid, identity.uuid, user) elif action_name == 'Shelve': shelve_instance(driver, instance, identity.provider.uuid, identity.uuid, user) elif action_name == 'Shelve Offload': offload_instance(driver, instance, identity.provider.uuid, identity.uuid, user) elif action_name == 'Terminate': destroy_instance(identity.uuid, instance) else: raise Exception("Encountered Unknown Action Named %s" % action) except ObjectDoesNotExist: # This may be unreachable when null,blank = True logger.debug("Provider %s - 'Do Nothing' for Over Allocation" % provider) return
def _execute_provider_action(identity, user, instance, action_name): driver = get_cached_driver(identity=identity) # NOTE: This if statement is a HACK! It will be removed when IP management is enabled in an upcoming version. -SG reclaim_ip = True if identity.provider.location != 'iPlant Cloud - Tucson' else False # ENDNOTE # NOTE: This metadata statement is a HACK! It should be removed when all instances matching this metadata key have been removed. instance_has_home_mount = instance.extra['metadata'].get('atmosphere_ephemeral_home_mount', 'false').lower() if instance_has_home_mount == 'true' and action_name == 'Shelve': logger.info("Instance %s will be suspended instead of shelved, because the ephemeral storage is in /home" % instance.id) action_name = 'Suspend' logger.info("User %s has gone over their allocation on Instance %s - Enforcement Choice: %s" % (user, instance, action_name)) try: if not action_name: logger.debug("No 'action_name' provided") return elif action_name == 'Suspend': suspend_instance( driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Stop': stop_instance( driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Shelve': shelve_instance( driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Shelve Offload': offload_instance( driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Terminate': destroy_instance(user, identity.uuid, instance.id) else: raise Exception("Encountered Unknown Action Named %s" % action_name) except ObjectDoesNotExist: # This may be unreachable when null,blank = True logger.debug("Provider %s - 'Do Nothing' for Over Allocation" % identity.provider) return
def _execute_provider_action(identity, user, instance, action_name): driver = get_cached_driver(identity=identity) # NOTE: This if statement is a HACK! It will be removed when IP management is enabled in an upcoming version. -SG reclaim_ip = True if identity.provider.location != 'iPlant Cloud - Tucson' else False # ENDNOTE # NOTE: This metadata statement is a HACK! It should be removed when all instances matching this metadata key have been removed. instance_has_home_mount = instance.extra['metadata'].get( 'atmosphere_ephemeral_home_mount', 'false').lower() if instance_has_home_mount == 'true' and action_name == 'Shelve': logger.info( "Instance %s will be suspended instead of shelved, because the ephemeral storage is in /home" % instance.id) action_name = 'Suspend' logger.info( "User %s has gone over their allocation on Instance %s - Enforcement Choice: %s" % (user, instance, action_name)) try: if not action_name: logger.debug("No 'action_name' provided") return elif action_name == 'Suspend': suspend_instance(driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Stop': stop_instance(driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Shelve': shelve_instance(driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Shelve Offload': offload_instance(driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Terminate': destroy_instance(user, identity.uuid, instance.id) else: raise Exception("Encountered Unknown Action Named %s" % action_name) except ObjectDoesNotExist: # This may be unreachable when null,blank = True logger.debug("Provider %s - 'Do Nothing' for Over Allocation" % identity.provider) return
def _execute_provider_action(identity, user, instance, action_name): driver = get_cached_driver(identity=identity) try: if not action_name: logger.debug("No 'action_name' provided") return elif action_name == 'Suspend': suspend_instance( driver, instance, identity.provider.uuid, identity.uuid, user) elif action_name == 'Stop': stop_instance( driver, instance, identity.provider.uuid, identity.uuid, user) elif action_name == 'Shelve': shelve_instance( driver, instance, identity.provider.uuid, identity.uuid, user) elif action_name == 'Shelve Offload': offload_instance( driver, instance, identity.provider.uuid, identity.uuid, user) elif action_name == 'Terminate': destroy_instance(user, identity.uuid, instance) else: raise Exception("Encountered Unknown Action Named %s" % action) except ObjectDoesNotExist: # This may be unreachable when null,blank = True logger.debug( "Provider %s - 'Do Nothing' for Over Allocation" % provider) return
def _execute_provider_action(identity, user, instance, action_name): driver = get_cached_driver(identity=identity) # NOTE: This if statement is a HACK! It will be removed when IP management is enabled in an upcoming version. -SG reclaim_ip = True if identity.provider.location != 'iPlant Cloud - Tucson' else False # ENDNOTE logger.info( "User %s has gone over their allocation on Instance %s - Enforcement Choice: %s" % (user, instance, action_name)) try: if not action_name: logger.debug("No 'action_name' provided") return elif action_name == 'Suspend': suspend_instance(driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Stop': stop_instance(driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Shelve': shelve_instance(driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Shelve Offload': offload_instance(driver, instance, identity.provider.uuid, identity.uuid, user, reclaim_ip) elif action_name == 'Terminate': destroy_instance(user, identity.uuid, instance.id) else: raise Exception("Encountered Unknown Action Named %s" % action_name) except ObjectDoesNotExist: # This may be unreachable when null,blank = True logger.debug("Provider %s - 'Do Nothing' for Over Allocation" % identity.provider) return
def post(self, request, provider_uuid, identity_uuid, instance_id): """Authentication Required, Attempt a specific instance action, including necessary parameters. """ # Service-specific call to action action_params = request.DATA if not action_params.get('action', None): return failure_response( status.HTTP_400_BAD_REQUEST, 'POST request to /action require a BODY with \'action\'.') result_obj = None user = request.user esh_driver = prepare_driver(request, provider_uuid, identity_uuid) if not esh_driver: return invalid_creds(provider_uuid, identity_uuid) try: esh_instance = esh_driver.get_instance(instance_id) except (socket_error, ConnectionFailure): return connection_failure(provider_uuid, identity_uuid) except InvalidCredsError: return invalid_creds(provider_uuid, identity_uuid) except Exception as exc: logger.exception("Encountered a generic exception. " "Returning 409-CONFLICT") return failure_response(status.HTTP_409_CONFLICT, str(exc.message)) if not esh_instance: return failure_response( status.HTTP_400_BAD_REQUEST, 'Instance %s no longer exists' % (instance_id,)) action = action_params['action'] try: if 'volume' in action: volume_id = action_params.get('volume_id') mount_location = action_params.get('mount_location', None) device = action_params.get('device', None) if 'attach_volume' == action: if mount_location == 'null' or mount_location == 'None': mount_location = None if device == 'null' or device == 'None': device = None future_mount_location =\ task.attach_volume_task(esh_driver, esh_instance.alias, volume_id, device, mount_location) elif 'mount_volume' == action: future_mount_location =\ task.mount_volume_task(esh_driver, esh_instance.alias, volume_id, device, mount_location) elif 'unmount_volume' == action: (result, error_msg) =\ task.unmount_volume_task(esh_driver, esh_instance.alias, volume_id, device, mount_location) elif 'detach_volume' == action: (result, error_msg) =\ task.detach_volume_task(esh_driver, esh_instance.alias, volume_id) if not result and error_msg: # Return reason for failed detachment return failure_response( status.HTTP_400_BAD_REQUEST, error_msg) # Task complete, convert the volume and return the object esh_volume = esh_driver.get_volume(volume_id) core_volume = convert_esh_volume(esh_volume, provider_uuid, identity_uuid, user) result_obj =\ VolumeSerializer(core_volume, context={"request": request}).data elif 'resize' == action: size_alias = action_params.get('size', '') if type(size_alias) == int: size_alias = str(size_alias) resize_instance(esh_driver, esh_instance, size_alias, provider_uuid, identity_uuid, user) elif 'confirm_resize' == action: confirm_resize(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'revert_resize' == action: esh_driver.revert_resize_instance(esh_instance) elif 'redeploy' == action: redeploy_init(esh_driver, esh_instance, countdown=None) elif 'resume' == action: result_obj = resume_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'suspend' == action: result_obj = suspend_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'shelve' == action: result_obj = shelve_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'unshelve' == action: result_obj = unshelve_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'shelve_offload' == action: result_obj = offload_instance(esh_driver, esh_instance) elif 'start' == action: start_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'stop' == action: stop_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'reset_network' == action: esh_driver.reset_network(esh_instance) elif 'console' == action: result_obj = esh_driver._connection\ .ex_vnc_console(esh_instance) elif 'reboot' == action: reboot_type = action_params.get('reboot_type', 'SOFT') reboot_instance(esh_driver, esh_instance, identity_uuid, user, reboot_type) elif 'rebuild' == action: machine_alias = action_params.get('machine_alias', '') machine = esh_driver.get_machine(machine_alias) esh_driver.rebuild_instance(esh_instance, machine) else: return failure_response( status.HTTP_400_BAD_REQUEST, 'Unable to to perform action %s.' % (action)) api_response = { 'result': 'success', 'message': 'The requested action <%s> was run successfully' % action_params['action'], 'object': result_obj, } response = Response(api_response, status=status.HTTP_200_OK) return response except HypervisorCapacityError, hce: return over_capacity(hce)
def post(self, request, provider_uuid, identity_uuid, instance_id): """Authentication Required, Attempt a specific instance action, including necessary parameters. """ # Service-specific call to action action_params = request.DATA if not action_params.get('action', None): return failure_response( status.HTTP_400_BAD_REQUEST, 'POST request to /action require a BODY with \'action\'.') result_obj = None user = request.user esh_driver = prepare_driver(request, provider_uuid, identity_uuid) if not esh_driver: return invalid_creds(provider_uuid, identity_uuid) try: esh_instance = esh_driver.get_instance(instance_id) except (socket_error, ConnectionFailure): return connection_failure(provider_uuid, identity_uuid) except InvalidCredsError: return invalid_creds(provider_uuid, identity_uuid) except Exception as exc: logger.exception("Encountered a generic exception. " "Returning 409-CONFLICT") return failure_response(status.HTTP_409_CONFLICT, str(exc.message)) if not esh_instance: return failure_response( status.HTTP_400_BAD_REQUEST, 'Instance %s no longer exists' % (instance_id,)) action = action_params['action'] try: if 'volume' in action: volume_id = action_params.get('volume_id') mount_location = action_params.get('mount_location', None) device = action_params.get('device', None) if 'attach_volume' == action: if mount_location == 'null' or mount_location == 'None': mount_location = None if device == 'null' or device == 'None': device = None task.attach_volume_task(esh_driver, esh_instance.alias, volume_id, device, mount_location) elif 'mount_volume' == action: task.mount_volume_task(esh_driver, esh_instance.alias, volume_id, device, mount_location) elif 'unmount_volume' == action: (result, error_msg) =\ task.unmount_volume_task(esh_driver, esh_instance.alias, volume_id, device, mount_location) elif 'detach_volume' == action: (result, error_msg) =\ task.detach_volume_task(esh_driver, esh_instance.alias, volume_id) if not result and error_msg: # Return reason for failed detachment return failure_response( status.HTTP_400_BAD_REQUEST, error_msg) # Task complete, convert the volume and return the object esh_volume = esh_driver.get_volume(volume_id) core_volume = convert_esh_volume(esh_volume, provider_uuid, identity_uuid, user) result_obj =\ VolumeSerializer(core_volume, context={"request": request}).data elif 'resize' == action: size_alias = action_params.get('size', '') if isinstance(size_alias, int): size_alias = str(size_alias) resize_instance(esh_driver, esh_instance, size_alias, provider_uuid, identity_uuid, user) elif 'confirm_resize' == action: confirm_resize(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'revert_resize' == action: esh_driver.revert_resize_instance(esh_instance) elif 'redeploy' == action: redeploy_init(esh_driver, esh_instance) elif 'resume' == action: result_obj = resume_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'suspend' == action: result_obj = suspend_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'shelve' == action: result_obj = shelve_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'unshelve' == action: result_obj = unshelve_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'shelve_offload' == action: result_obj = offload_instance(esh_driver, esh_instance) elif 'start' == action: start_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'stop' == action: stop_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'reset_network' == action: esh_driver.reset_network(esh_instance) elif 'console' == action: result_obj = esh_driver._connection\ .ex_vnc_console(esh_instance) elif 'reboot' == action: reboot_type = action_params.get('reboot_type', 'SOFT') reboot_instance(esh_driver, esh_instance, identity_uuid, user, reboot_type) elif 'rebuild' == action: machine_alias = action_params.get('machine_alias', '') machine = esh_driver.get_machine(machine_alias) esh_driver.rebuild_instance(esh_instance, machine) else: return failure_response( status.HTTP_400_BAD_REQUEST, 'Unable to to perform action %s.' % (action)) api_response = { 'result': 'success', 'message': 'The requested action <%s> was run successfully' % action_params['action'], 'object': result_obj, } response = Response(api_response, status=status.HTTP_200_OK) return response except HypervisorCapacityError as hce: return over_capacity(hce) except OverQuotaError as oqe: return over_quota(oqe) except OverAllocationError as oae: return over_quota(oae) except SizeNotAvailable as snae: return size_not_availabe(snae) except (socket_error, ConnectionFailure): return connection_failure(provider_uuid, identity_uuid) except InvalidCredsError: return invalid_creds(provider_uuid, identity_uuid) except VolumeMountConflict as vmc: return mount_failed(vmc) except NotImplemented: return failure_response( status.HTTP_409_CONFLICT, "The requested action %s is not available on this provider." % action_params['action']) except ActionNotAllowed: return failure_response( status.HTTP_409_CONFLICT, "The requested action %s has been explicitly " "disabled on this provider." % action_params['action']) except Exception as exc: logger.exception("Exception occurred processing InstanceAction") message = exc.message if message.startswith('409 Conflict'): return failure_response( status.HTTP_409_CONFLICT, message) return failure_response( status.HTTP_404_FORBIDDEN, "The requested action %s encountered " "an irrecoverable exception: %s" % (action_params['action'], message))
def post(self, request, provider_uuid, identity_uuid, instance_id): """Authentication Required, Attempt a specific instance action, including necessary parameters. """ # Service-specific call to action action_params = request.DATA if not action_params.get('action', None): return failure_response( status.HTTP_400_BAD_REQUEST, 'POST request to /action require a BODY with \'action\'.') result_obj = None user = request.user esh_driver = prepare_driver(request, provider_uuid, identity_uuid) if not esh_driver: return invalid_creds(provider_uuid, identity_uuid) try: esh_instance = esh_driver.get_instance(instance_id) except ConnectionFailure: return connection_failure(provider_uuid, identity_uuid) except InvalidCredsError: return invalid_creds(provider_uuid, identity_uuid) except Exception as exc: logger.exception("Encountered a generic exception. " "Returning 409-CONFLICT") return failure_response(status.HTTP_409_CONFLICT, str(exc.message)) if not esh_instance: return failure_response( status.HTTP_400_BAD_REQUEST, 'Instance %s no longer exists' % (instance_id,)) action = action_params['action'] try: if 'volume' in action: volume_id = action_params.get('volume_id') mount_location = action_params.get('mount_location', None) device = action_params.get('device', None) if 'attach_volume' == action: if mount_location == 'null' or mount_location == 'None': mount_location = None if device == 'null' or device == 'None': device = None future_mount_location =\ task.attach_volume_task(esh_driver, esh_instance.alias, volume_id, device, mount_location) elif 'mount_volume' == action: future_mount_location =\ task.mount_volume_task(esh_driver, esh_instance.alias, volume_id, device, mount_location) elif 'unmount_volume' == action: (result, error_msg) =\ task.unmount_volume_task(esh_driver, esh_instance.alias, volume_id, device, mount_location) elif 'detach_volume' == action: (result, error_msg) =\ task.detach_volume_task(esh_driver, esh_instance.alias, volume_id) if not result and error_msg: # Return reason for failed detachment return failure_response( status.HTTP_400_BAD_REQUEST, error_msg) # Task complete, convert the volume and return the object esh_volume = esh_driver.get_volume(volume_id) core_volume = convert_esh_volume(esh_volume, provider_uuid, identity_uuid, user) result_obj =\ VolumeSerializer(core_volume, context={"request": request}).data elif 'resize' == action: size_alias = action_params.get('size', '') if type(size_alias) == int: size_alias = str(size_alias) resize_instance(esh_driver, esh_instance, size_alias, provider_uuid, identity_uuid, user) elif 'confirm_resize' == action: confirm_resize(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'revert_resize' == action: esh_driver.revert_resize_instance(esh_instance) elif 'redeploy' == action: redeploy_init(esh_driver, esh_instance, countdown=None) elif 'resume' == action: result_obj = resume_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'suspend' == action: result_obj = suspend_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'shelve' == action: result_obj = shelve_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'unshelve' == action: result_obj = unshelve_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'shelve_offload' == action: result_obj = offload_instance(esh_driver, esh_instance) elif 'start' == action: start_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'stop' == action: stop_instance(esh_driver, esh_instance, provider_uuid, identity_uuid, user) elif 'reset_network' == action: esh_driver.reset_network(esh_instance) elif 'console' == action: result_obj = esh_driver._connection\ .ex_vnc_console(esh_instance) elif 'reboot' == action: reboot_type = action_params.get('reboot_type', 'SOFT') reboot_instance(esh_driver, esh_instance, identity_uuid, user, reboot_type) elif 'rebuild' == action: machine_alias = action_params.get('machine_alias', '') machine = esh_driver.get_machine(machine_alias) esh_driver.rebuild_instance(esh_instance, machine) else: return failure_response( status.HTTP_400_BAD_REQUEST, 'Unable to to perform action %s.' % (action)) api_response = { 'result': 'success', 'message': 'The requested action <%s> was run successfully' % action_params['action'], 'object': result_obj, } response = Response(api_response, status=status.HTTP_200_OK) return response except HypervisorCapacityError, hce: return over_capacity(hce)