def get( src, dest, add_deploy_dir=True, create_local_dir=False, force=False, ): """ Download a file from the remote system. + src: the remote filename to download + dest: the local filename to download the file to + add_deploy_dir: dest is relative to the deploy directory + create_local_dir: create the local directory if it doesn't exist + force: always download the file, even if the local copy matches Note: This operation is not suitable for large files as it may involve copying the remote file before downloading it. **Example:** .. code:: python files.get( name="Download a file from a remote", src="/etc/centos-release", dest="/tmp/whocares", ) """ if add_deploy_dir and state.cwd: dest = os.path.join(state.cwd, dest) if create_local_dir: local_pathname = os.path.dirname(dest) if not os.path.exists(local_pathname): os.makedirs(local_pathname) remote_file = host.get_fact(File, path=src) # No remote file, so assume exists and download it "blind" if not remote_file or force: yield FileDownloadCommand( src, dest, remote_temp_filename=state.get_temp_filename(dest)) # No local file, so always download elif not os.path.exists(dest): yield FileDownloadCommand( src, dest, remote_temp_filename=state.get_temp_filename(dest)) # Remote file exists - check if it matches our local else: local_sum = get_file_sha1(dest) remote_sum = host.get_fact(Sha1File, path=src) # Check sha1sum, upload if needed if local_sum != remote_sum: yield FileDownloadCommand( src, dest, remote_temp_filename=state.get_temp_filename(dest))
def get( src, dest, add_deploy_dir=True, create_local_dir=False, force=False, state=None, host=None, ): ''' Download a file from the remote system. + src: the remote filename to download + dest: the local filename to download the file to + add_deploy_dir: dest is relative to the deploy directory + create_local_dir: create the local directory if it doesn't exist + force: always download the file, even if the local copy matches Note: This operation is not suitable for large files as it may involve copying the remote file before downloading it. Example: .. code:: python files.get( name='Download a file from a remote', src='/etc/centos-release', dest='/tmp/whocares', ) ''' src = escape_unix_path(src) if add_deploy_dir and state.deploy_dir: dest = os_path.join(state.deploy_dir, dest) if create_local_dir: local_pathname = os_path.dirname(dest) if not os_path.exists(local_pathname): makedirs(local_pathname) remote_file = host.fact.file(src) # No remote file, so assume exists and download it "blind" if not remote_file or force: yield FileDownloadCommand(src, dest) # No local file, so always download elif not os_path.exists(dest): yield FileDownloadCommand(src, dest) # Remote file exists - check if it matches our local else: local_sum = get_file_sha1(dest) remote_sum = host.fact.sha1_file(src) # Check sha1sum, upload if needed if local_sum != remote_sum: yield FileDownloadCommand(src, dest)
def test_file_download_op(self): inventory = make_inventory() state = State(inventory, Config()) connect_all(state) with patch('pyinfra.operations.files.os_path.isfile', lambda *args, **kwargs: True): add_op( state, files.get, name='First op name', src='/home/vagrant/file.txt', dest='files/file.txt', ) op_order = state.get_op_order() assert len(op_order) == 1 first_op_hash = op_order[0] assert state.op_meta[first_op_hash]['names'] == {'First op name'} somehost = inventory.get_host('somehost') anotherhost = inventory.get_host('anotherhost') # Ensure first op has the right (upload) command assert state.ops[somehost][first_op_hash]['commands'] == [ FileDownloadCommand('/home/vagrant/file.txt', 'files/file.txt'), ] with patch('pyinfra.api.util.open', mock_open(read_data='test!'), create=True): run_ops(state) assert state.results[somehost]['success_ops'] == 1 assert state.results[somehost]['ops'] == 1 assert state.results[anotherhost]['success_ops'] == 1 assert state.results[anotherhost]['ops'] == 1 assert state.results[somehost]['error_ops'] == 0 assert state.results[anotherhost]['error_ops'] == 0
def test_file_download_op(self): inventory = make_inventory() state = State(inventory, Config()) connect_all(state) with patch("pyinfra.operations.files.os.path.isfile", lambda *args, **kwargs: True): add_op( state, files.get, name="First op name", src="/home/vagrant/file.txt", dest="files/file.txt", ) op_order = state.get_op_order() assert len(op_order) == 1 first_op_hash = op_order[0] assert state.op_meta[first_op_hash]["names"] == {"First op name"} somehost = inventory.get_host("somehost") anotherhost = inventory.get_host("anotherhost") # Ensure first op has the right (upload) command assert state.ops[somehost][first_op_hash]["commands"] == [ FileDownloadCommand("/home/vagrant/file.txt", "files/file.txt"), ] with patch("pyinfra.api.util.open", mock_open(read_data="test!"), create=True): run_ops(state) assert state.results[somehost]["success_ops"] == 1 assert state.results[somehost]["ops"] == 1 assert state.results[anotherhost]["success_ops"] == 1 assert state.results[anotherhost]["ops"] == 1 assert state.results[somehost]["error_ops"] == 0 assert state.results[anotherhost]["error_ops"] == 0
def test_file_download_command_repr(self): cmd = FileDownloadCommand("src", "dest") assert repr(cmd) == "FileDownloadCommand(src, dest)"
def test_file_download_command_repr(self): cmd = FileDownloadCommand('src', 'dest') assert repr(cmd) == 'FileDownloadCommand(src, dest)'