5
0
mirror of https://github.com/apache/sqoop.git synced 2025-05-06 06:30:37 +08:00

SQOOP-614 Provide client side ability to clone connection or job object

This commit is contained in:
Bilung Lee 2012-10-03 16:57:37 -07:00
parent 13439909f3
commit 31d6f72761
5 changed files with 346 additions and 1 deletions

View File

@ -0,0 +1,63 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sqoop.client.shell;
import org.apache.sqoop.client.core.ClientError;
import org.apache.sqoop.common.SqoopException;
import org.codehaus.groovy.tools.shell.Shell;
import java.util.List;
/**
* Client side cloning of connection and job objects.
*/
public class CloneCommand extends SqoopCommand {
private CloneConnectionFunction connectionFunction;
private CloneJobFunction jobFunction;
public CloneCommand(Shell shell) {
super(shell, "clone", "\\cl",
new String[] {"connection", "job"},
"Clone", "Info");
}
public Object execute(List args) {
if (args.size() == 0) {
io.out.println("Usage: clone " + getUsage());
io.out.println();
return null;
}
String func = (String)args.get(0);
if (func.equals("connection")) {
if (connectionFunction == null) {
connectionFunction = new CloneConnectionFunction(io);
}
return connectionFunction.execute(args);
} else if (func.equals("job")) {
if (jobFunction == null) {
jobFunction = new CloneJobFunction(io);
}
return jobFunction.execute(args);
} else {
String msg = "Usage: clone " + getUsage();
throw new SqoopException(ClientError.CLIENT_0002, msg);
}
}
}

View File

@ -0,0 +1,141 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sqoop.client.shell;
import jline.ConsoleReader;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.OptionBuilder;
import org.apache.sqoop.client.core.ClientError;
import org.apache.sqoop.client.core.Environment;
import org.apache.sqoop.client.request.ConnectionRequest;
import org.apache.sqoop.common.SqoopException;
import org.apache.sqoop.json.ConnectionBean;
import org.apache.sqoop.model.MConnection;
import org.apache.sqoop.model.MPersistableEntity;
import org.apache.sqoop.validation.Status;
import org.codehaus.groovy.tools.shell.IO;
import java.io.IOException;
import java.util.List;
import java.util.ResourceBundle;
import static org.apache.sqoop.client.utils.FormFiller.*;
/**
*
*/
public class CloneConnectionFunction extends SqoopFunction {
private static final String XID = "xid";
private ConnectionRequest connectionRequest;
private IO io;
@SuppressWarnings("static-access")
public CloneConnectionFunction(IO io) {
this.io = io;
this.addOption(OptionBuilder
.withDescription("Connection ID")
.withLongOpt(XID)
.hasArg()
.create(XID.charAt(0))
);
}
public Object execute(List<String> args) {
CommandLine line = parseOptions(this, 1, args);
if (!line.hasOption(XID)) {
io.out.println("Required argument --xid is missing.");
return null;
}
try {
cloneConnection(line.getOptionValue(XID));
} catch (IOException ex) {
throw new SqoopException(ClientError.CLIENT_0005, ex);
}
return null;
}
private void cloneConnection(String connectionId) throws IOException {
io.out.println("Cloning connection with id " + connectionId);
ConsoleReader reader = new ConsoleReader();
ConnectionBean connectionBean = readConnection(connectionId);
// TODO(jarcec): Check that we have expected data
MConnection connection = connectionBean.getConnections().get(0);
ResourceBundle frameworkBundle
= connectionBean.getFrameworkBundle();
ResourceBundle connectorBundle
= connectionBean.getConnectorBundle(connection.getConnectorId());
// Remove persistent id as we're making a clone
connection.setPersistenceId(MPersistableEntity.PERSISTANCE_ID_DEFAULT);
Status status = Status.FINE;
io.out.println("Please update connection metadata:");
do {
if( !status.canProceed() ) {
io.out.println();
io.out.println("@|red There are issues with entered data, please"
+ " revise your input:|@");
}
// Query connector forms
if(!fillForms(io, connection.getConnectorPart().getForms(),
reader, connectorBundle)) {
return;
}
// Query framework forms
if(!fillForms(io, connection.getFrameworkPart().getForms(),
reader, frameworkBundle)) {
return;
}
// Try to create
status = createConnection(connection);
} while(!status.canProceed());
io.out.println("Connection was successfully updated with status "
+ status.name());
}
private Status createConnection(MConnection connection) {
if (connectionRequest == null) {
connectionRequest = new ConnectionRequest();
}
return connectionRequest.create(Environment.getServerUrl(), connection);
}
private ConnectionBean readConnection(String connectionId) {
if (connectionRequest == null) {
connectionRequest = new ConnectionRequest();
}
return connectionRequest.read(Environment.getServerUrl(), connectionId);
}
}

View File

@ -0,0 +1,140 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sqoop.client.shell;
import jline.ConsoleReader;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.OptionBuilder;
import org.apache.sqoop.client.core.ClientError;
import org.apache.sqoop.client.core.Environment;
import org.apache.sqoop.client.request.JobRequest;
import org.apache.sqoop.common.SqoopException;
import org.apache.sqoop.json.JobBean;
import org.apache.sqoop.model.MJob;
import org.apache.sqoop.model.MPersistableEntity;
import org.apache.sqoop.validation.Status;
import org.codehaus.groovy.tools.shell.IO;
import java.io.IOException;
import java.util.List;
import java.util.ResourceBundle;
import static org.apache.sqoop.client.utils.FormFiller.*;
/**
*
*/
public class CloneJobFunction extends SqoopFunction {
private static final String JID = "jid";
private JobRequest jobRequest;
private IO io;
@SuppressWarnings("static-access")
public CloneJobFunction(IO io) {
this.io = io;
this.addOption(OptionBuilder
.withDescription("Job ID")
.withLongOpt(JID)
.hasArg()
.create(JID.charAt(0)));
}
public Object execute(List<String> args) {
CommandLine line = parseOptions(this, 1, args);
if (!line.hasOption(JID)) {
io.out.println("Required argument --jid is missing.");
return null;
}
try {
cloneJob(line.getOptionValue(JID));
} catch (IOException ex) {
throw new SqoopException(ClientError.CLIENT_0005, ex);
}
return null;
}
private void cloneJob(String jobId) throws IOException {
io.out.println("Cloning job with id " + jobId);
ConsoleReader reader = new ConsoleReader();
JobBean jobBean = readJob(jobId);
// TODO(jarcec): Check that we have expected data
MJob job = jobBean.getJobs().get(0);
ResourceBundle frameworkBundle
= jobBean.getFrameworkBundle();
ResourceBundle connectorBundle
= jobBean.getConnectorBundle(job.getConnectorId());
Status status = Status.FINE;
// Remove persistent id as we're making a clone
job.setPersistenceId(MPersistableEntity.PERSISTANCE_ID_DEFAULT);
io.out.println("Please update job metadata:");
do {
if( !status.canProceed() ) {
io.out.println();
io.out.println("@|red There are issues with entered data, please"
+ " revise your input:|@");
}
// Query connector forms
if(!fillForms(io, job.getConnectorPart().getForms(),
reader, connectorBundle)) {
return;
}
// Query framework forms
if(!fillForms(io, job.getFrameworkPart().getForms(),
reader, frameworkBundle)) {
return;
}
// Try to create
status = createJob(job);
} while(!status.canProceed());
io.out.println("Job was successfully updated with status "
+ status.name());
}
private Status createJob(MJob job) {
if (jobRequest == null) {
jobRequest = new JobRequest();
}
return jobRequest.create(Environment.getServerUrl(), job);
}
private JobBean readJob(String jobId) {
if (jobRequest == null) {
jobRequest = new JobRequest();
}
return jobRequest.read(Environment.getServerUrl(), jobId);
}
}

View File

@ -63,6 +63,7 @@ public static void main (String[] args) throws Exception
shell.register(new CreateCommand(shell));
shell.register(new DeleteCommand(shell));
shell.register(new UpdateCommand(shell));
shell.register(new CloneCommand(shell));
if (args.length == 0) {
// Interactive mode:

View File

@ -33,7 +33,7 @@
import java.util.List;
import java.util.ResourceBundle;
import static org.apache.sqoop.client.utils.FormFiller.fillForms;
import static org.apache.sqoop.client.utils.FormFiller.*;
/**
*