def resume(self, transaction_id): """Resume.request -- user request to resume transaction""" request = create_request_from_type(RequestType.RESUME_REQUEST, transaction_id=transaction_id) machine = self._machines.get(transaction_id, None) if machine is None: raise InvalidTransaction(transaction_id) else: machine.update_state(event=Event.RECEIVED_RESUME_REQUEST, request=request)
def suspend(self, transaction_id): """Suspend.request -- user request to suspend transaction""" request = create_request_from_type(RequestType.SUSPEND_REQUEST, transaction_id=transaction_id) machine = self._machines.get(transaction_id, None) if machine is None: raise InvalidTransaction(transaction_id) else: machine.update_state(event=Event.RECEIVED_SUSPEND_REQUEST, request=request)
def report(self, transaction_id): """Report.request -- user request for status report of transaction""" request = create_request_from_type(RequestType.REPORT_REQUEST, transaction_id=transaction_id) machine = self._machines.get(transaction_id, None) if machine is None: raise InvalidTransaction(transaction_id) else: machine.update_state(event=Event.RECEIVED_REPORT_REQUEST, request=request)
def cancel(self, transaction_id): """Cancel.request -- user request to cancel transaction""" request = create_request_from_type(RequestType.CANCEL_REQUEST, transaction_id=transaction_id) machine = self._machines.get(transaction_id, None) if machine is None: raise InvalidTransaction(transaction_id) else: machine.update_state(event=Event.RECEIVED_CANCEL_REQUEST, request=request)
def put(self, destination_id, source_path, destination_path, transmission_mode=None): """Initiates a Put request by invoking Transaction Start procedures and Copy File procedures Other parameters not yet implemented: - segmentation control - fault handler overrides - flow label - messages to user - filestore requests """ # Do some file checks before starting anything if source_path.startswith('/'): ait.core.log.error('Source path should be a relative path.') return if destination_path.startswith('/'): ait.core.log.error('Destination path should be a relative path.') return # (A) Transaction Start Notification Procedure # 1. Issue Tx ID sequentially transaction_num = self._increment_tx_counter() # (B) Copy File Procedure # Determine transmission mode so we know what kind of machine to make # Use destination id to get the default MIB setting for that entity id if transmission_mode is None: transmission_mode = self.mib.transmission_mode(destination_id) if transmission_mode == TransmissionMode.ACK: # TODO raise invalid transmission mode since we don't support ACK right now pass # Create a `Request` which contains all the parameters for a Put.request # This is passed to the machine to progress the state request = create_request_from_type(RequestType.PUT_REQUEST, destination_id=destination_id, source_path=source_path, destination_path=destination_path, transmission_mode=transmission_mode) # if transmission_mode == TransmissionMode.ACK: # machine = Sender2(self, transaction_num, request=request) # else: machine = Sender1(self, transaction_num) # Send the Put.request `Request` to the newly created machine # This is where the rest of the Put request procedures are done machine.update_state(event=Event.RECEIVED_PUT_REQUEST, request=request) # Add transaction to list, indexed by Tx # self._machines[transaction_num] = machine return transaction_num