embulk-output-sftp 0.1.10 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -3
- data/CHANGELOG.md +3 -0
- data/README.md +3 -0
- data/build.gradle +6 -5
- data/src/main/java/org/embulk/output/sftp/SftpFileOutputPlugin.java +20 -3
- data/src/main/java/org/embulk/output/sftp/SftpLocalFileOutput.java +223 -0
- data/src/main/java/org/embulk/output/sftp/SftpRemoteFileOutput.java +120 -0
- data/src/main/java/org/embulk/output/sftp/SftpUtils.java +146 -123
- data/src/main/java/org/embulk/output/sftp/utils/DefaultRetry.java +55 -0
- data/src/main/java/org/embulk/output/sftp/utils/TimedCallable.java +27 -0
- data/src/main/java/org/embulk/output/sftp/utils/TimeoutCloser.java +42 -0
- data/src/test/java/org/embulk/output/sftp/TestSftpFileOutputPlugin.java +377 -8
- data/src/test/java/org/embulk/output/sftp/utils/TestTimedCallable.java +36 -0
- data/src/test/java/org/embulk/output/sftp/utils/TestTimeoutCloser.java +45 -0
- metadata +11 -5
- data/src/main/java/org/embulk/output/sftp/SftpFileOutput.java +0 -140
@@ -0,0 +1,36 @@
|
|
1
|
+
package org.embulk.output.sftp.utils;
|
2
|
+
|
3
|
+
import org.embulk.EmbulkTestRuntime;
|
4
|
+
import org.junit.Rule;
|
5
|
+
import org.junit.Test;
|
6
|
+
|
7
|
+
import java.util.concurrent.TimeUnit;
|
8
|
+
import java.util.concurrent.TimeoutException;
|
9
|
+
|
10
|
+
import static org.hamcrest.CoreMatchers.instanceOf;
|
11
|
+
import static org.hamcrest.MatcherAssert.assertThat;
|
12
|
+
|
13
|
+
public class TestTimedCallable
|
14
|
+
{
|
15
|
+
@Rule
|
16
|
+
public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
|
17
|
+
|
18
|
+
@Test
|
19
|
+
public void testCallTimeout()
|
20
|
+
{
|
21
|
+
try {
|
22
|
+
new TimedCallable<Void>()
|
23
|
+
{
|
24
|
+
@Override
|
25
|
+
public Void call() throws Exception
|
26
|
+
{
|
27
|
+
Thread.sleep(200);
|
28
|
+
return null;
|
29
|
+
}
|
30
|
+
}.call(100, TimeUnit.MILLISECONDS);
|
31
|
+
}
|
32
|
+
catch (Exception e) {
|
33
|
+
assertThat(e, instanceOf(TimeoutException.class));
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
package org.embulk.output.sftp.utils;
|
2
|
+
|
3
|
+
import org.embulk.EmbulkTestRuntime;
|
4
|
+
import org.junit.Rule;
|
5
|
+
import org.junit.Test;
|
6
|
+
|
7
|
+
import java.io.Closeable;
|
8
|
+
import java.util.concurrent.TimeoutException;
|
9
|
+
|
10
|
+
import static junit.framework.TestCase.fail;
|
11
|
+
import static org.hamcrest.CoreMatchers.instanceOf;
|
12
|
+
import static org.hamcrest.MatcherAssert.assertThat;
|
13
|
+
|
14
|
+
public class TestTimeoutCloser
|
15
|
+
{
|
16
|
+
@Rule
|
17
|
+
public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
|
18
|
+
|
19
|
+
@Test
|
20
|
+
public void testTimeoutAndAbort()
|
21
|
+
{
|
22
|
+
TimeoutCloser closer = new TimeoutCloser(new Closeable()
|
23
|
+
{
|
24
|
+
@Override
|
25
|
+
public void close()
|
26
|
+
{
|
27
|
+
try {
|
28
|
+
Thread.sleep(5000);
|
29
|
+
}
|
30
|
+
catch (InterruptedException e) {
|
31
|
+
fail("Failed to sleep");
|
32
|
+
}
|
33
|
+
}
|
34
|
+
});
|
35
|
+
closer.timeout = 1;
|
36
|
+
try {
|
37
|
+
closer.close();
|
38
|
+
fail("Should not finish");
|
39
|
+
}
|
40
|
+
catch (Exception e) {
|
41
|
+
assertThat(e, instanceOf(RuntimeException.class));
|
42
|
+
assertThat(e.getCause(), instanceOf(TimeoutException.class));
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-output-sftp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Civitaspo
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-08-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -64,21 +64,27 @@ files:
|
|
64
64
|
- gradlew.bat
|
65
65
|
- lib/embulk/output/sftp.rb
|
66
66
|
- src/main/java/org/embulk/output/sftp/ProxyTask.java
|
67
|
-
- src/main/java/org/embulk/output/sftp/SftpFileOutput.java
|
68
67
|
- src/main/java/org/embulk/output/sftp/SftpFileOutputPlugin.java
|
68
|
+
- src/main/java/org/embulk/output/sftp/SftpLocalFileOutput.java
|
69
|
+
- src/main/java/org/embulk/output/sftp/SftpRemoteFileOutput.java
|
69
70
|
- src/main/java/org/embulk/output/sftp/SftpUtils.java
|
70
71
|
- src/main/java/org/embulk/output/sftp/provider/sftp/SftpFileObject.java
|
71
72
|
- src/main/java/org/embulk/output/sftp/provider/sftp/SftpFileProvider.java
|
72
73
|
- src/main/java/org/embulk/output/sftp/provider/sftp/SftpFileSystem.java
|
73
74
|
- src/main/java/org/embulk/output/sftp/provider/sftp/package.html
|
75
|
+
- src/main/java/org/embulk/output/sftp/utils/DefaultRetry.java
|
76
|
+
- src/main/java/org/embulk/output/sftp/utils/TimedCallable.java
|
77
|
+
- src/main/java/org/embulk/output/sftp/utils/TimeoutCloser.java
|
74
78
|
- src/main/resources/providers.xml
|
75
79
|
- src/test/java/org/embulk/output/sftp/TestSftpFileOutputPlugin.java
|
80
|
+
- src/test/java/org/embulk/output/sftp/utils/TestTimedCallable.java
|
81
|
+
- src/test/java/org/embulk/output/sftp/utils/TestTimeoutCloser.java
|
76
82
|
- src/test/resources/id_rsa
|
77
83
|
- src/test/resources/id_rsa.pub
|
78
|
-
- classpath/commons-io-2.6.jar
|
79
84
|
- classpath/commons-logging-1.2.jar
|
80
85
|
- classpath/commons-vfs2-2.2.jar
|
81
|
-
- classpath/embulk-output-sftp-0.1.
|
86
|
+
- classpath/embulk-output-sftp-0.1.11.jar
|
87
|
+
- classpath/commons-io-2.6.jar
|
82
88
|
- classpath/jsch-0.1.54.jar
|
83
89
|
homepage: https://github.com/embulk/embulk-output-sftp
|
84
90
|
licenses:
|
@@ -1,140 +0,0 @@
|
|
1
|
-
package org.embulk.output.sftp;
|
2
|
-
|
3
|
-
import com.google.common.base.Throwables;
|
4
|
-
import org.embulk.config.TaskReport;
|
5
|
-
import org.embulk.spi.Buffer;
|
6
|
-
import org.embulk.spi.Exec;
|
7
|
-
import org.embulk.spi.FileOutput;
|
8
|
-
import org.embulk.spi.TransactionalFileOutput;
|
9
|
-
import org.slf4j.Logger;
|
10
|
-
|
11
|
-
import java.io.BufferedOutputStream;
|
12
|
-
import java.io.File;
|
13
|
-
import java.io.FileNotFoundException;
|
14
|
-
import java.io.FileOutputStream;
|
15
|
-
import java.io.IOException;
|
16
|
-
import java.util.ArrayList;
|
17
|
-
import java.util.HashMap;
|
18
|
-
import java.util.List;
|
19
|
-
import java.util.Map;
|
20
|
-
|
21
|
-
import static org.embulk.output.sftp.SftpFileOutputPlugin.PluginTask;
|
22
|
-
|
23
|
-
/**
|
24
|
-
* Created by takahiro.nakayama on 10/20/15.
|
25
|
-
*/
|
26
|
-
public class SftpFileOutput
|
27
|
-
implements FileOutput, TransactionalFileOutput
|
28
|
-
{
|
29
|
-
private final Logger logger = Exec.getLogger(SftpFileOutput.class);
|
30
|
-
private final String pathPrefix;
|
31
|
-
private final String sequenceFormat;
|
32
|
-
private final String fileNameExtension;
|
33
|
-
private final boolean renameFileAfterUpload;
|
34
|
-
|
35
|
-
private final int taskIndex;
|
36
|
-
private final SftpUtils sftpUtils;
|
37
|
-
private int fileIndex = 0;
|
38
|
-
private File tempFile;
|
39
|
-
private BufferedOutputStream localOutput = null;
|
40
|
-
private List<Map<String, String>> fileList = new ArrayList<>();
|
41
|
-
|
42
|
-
private final String temporaryFileSuffix = ".tmp";
|
43
|
-
|
44
|
-
SftpFileOutput(PluginTask task, int taskIndex)
|
45
|
-
{
|
46
|
-
this.pathPrefix = task.getPathPrefix();
|
47
|
-
this.sequenceFormat = task.getSequenceFormat();
|
48
|
-
this.fileNameExtension = task.getFileNameExtension();
|
49
|
-
this.renameFileAfterUpload = task.getRenameFileAfterUpload();
|
50
|
-
this.taskIndex = taskIndex;
|
51
|
-
this.sftpUtils = new SftpUtils(task);
|
52
|
-
}
|
53
|
-
|
54
|
-
@Override
|
55
|
-
public void nextFile()
|
56
|
-
{
|
57
|
-
closeCurrentFile();
|
58
|
-
|
59
|
-
try {
|
60
|
-
tempFile = Exec.getTempFileSpace().createTempFile();
|
61
|
-
localOutput = new BufferedOutputStream(new FileOutputStream(tempFile));
|
62
|
-
}
|
63
|
-
catch (FileNotFoundException e) {
|
64
|
-
logger.error(e.getMessage());
|
65
|
-
Throwables.propagate(e);
|
66
|
-
}
|
67
|
-
}
|
68
|
-
|
69
|
-
@Override
|
70
|
-
public void add(final Buffer buffer)
|
71
|
-
{
|
72
|
-
try {
|
73
|
-
localOutput.write(buffer.array(), buffer.offset(), buffer.limit());
|
74
|
-
}
|
75
|
-
catch (IOException ex) {
|
76
|
-
throw Throwables.propagate(ex);
|
77
|
-
}
|
78
|
-
finally {
|
79
|
-
buffer.release();
|
80
|
-
}
|
81
|
-
}
|
82
|
-
|
83
|
-
@Override
|
84
|
-
public void finish()
|
85
|
-
{
|
86
|
-
closeCurrentFile();
|
87
|
-
String fileName = getOutputFilePath();
|
88
|
-
String temporaryFileName = fileName + temporaryFileSuffix;
|
89
|
-
if (renameFileAfterUpload) {
|
90
|
-
sftpUtils.uploadFile(tempFile, temporaryFileName);
|
91
|
-
}
|
92
|
-
else {
|
93
|
-
sftpUtils.uploadFile(tempFile, fileName);
|
94
|
-
}
|
95
|
-
|
96
|
-
Map<String, String> executedFiles = new HashMap<>();
|
97
|
-
executedFiles.put("temporary_filename", temporaryFileName);
|
98
|
-
executedFiles.put("real_filename", fileName);
|
99
|
-
fileList.add(executedFiles);
|
100
|
-
fileIndex++;
|
101
|
-
}
|
102
|
-
|
103
|
-
@Override
|
104
|
-
public void close()
|
105
|
-
{
|
106
|
-
closeCurrentFile();
|
107
|
-
// TODO
|
108
|
-
sftpUtils.close();
|
109
|
-
}
|
110
|
-
|
111
|
-
@Override
|
112
|
-
public void abort()
|
113
|
-
{
|
114
|
-
}
|
115
|
-
|
116
|
-
@Override
|
117
|
-
public TaskReport commit()
|
118
|
-
{
|
119
|
-
TaskReport report = Exec.newTaskReport();
|
120
|
-
report.set("file_list", fileList);
|
121
|
-
return report;
|
122
|
-
}
|
123
|
-
|
124
|
-
private void closeCurrentFile()
|
125
|
-
{
|
126
|
-
if (localOutput != null) {
|
127
|
-
try {
|
128
|
-
localOutput.close();
|
129
|
-
}
|
130
|
-
catch (IOException ex) {
|
131
|
-
throw Throwables.propagate(ex);
|
132
|
-
}
|
133
|
-
}
|
134
|
-
}
|
135
|
-
|
136
|
-
private String getOutputFilePath()
|
137
|
-
{
|
138
|
-
return pathPrefix + String.format(sequenceFormat, taskIndex, fileIndex) + fileNameExtension;
|
139
|
-
}
|
140
|
-
}
|