Skip to content

Commit 8260f68

Browse files
committed
refactor ContainerShell.connectShell
1 parent 7f13e46 commit 8260f68

File tree

7 files changed

+195
-311
lines changed

7 files changed

+195
-311
lines changed

qDup/src/main/java/io/hyperfoil/tools/qdup/Host.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,20 @@ public class Host {
2424
public static final List<String> DOCKER_LOGIN = Arrays.asList("docker login -u ${{host.username}} -p ${{host.password}} ${{target}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
2525
public static final List<String> PODMAN_CHECK_STATUS = Arrays.asList("podman inspect --format=\"{{.State.Status}}\" ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).toList();
2626
public static final List<String> DOCKER_CHECK_STATUS = Arrays.asList("docker inspect --format=\"{{.State.Status}}\" ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).toList();
27-
public static final List<String> PODMAN_START_CONTAINER = Arrays.asList("podman run --detach --cidfile ${{cidfile}} --env PS1=\"${{"+ HostDefinition.QDUP_PROMPT_VARIABLE +"}}\" ${{image}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
28-
public static final List<String> DOCKER_START_CONTAINER = Arrays.asList("docker run --detach --cidfile ${{cidfile}} --env PS1=\"${{"+ HostDefinition.QDUP_PROMPT_VARIABLE +"}}\" ${{image}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
27+
public static final List<String> PODMAN_CREATE_CONTAINER = Arrays.asList("podman run --detach --cidfile ${{cidfile}} --env PS1=\"${{"+ HostDefinition.QDUP_PROMPT_VARIABLE +"}}\" ${{image}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
28+
public static final List<String> DOCKER_CREATE_CONTAINER = Arrays.asList("docker run --detach --cidfile ${{cidfile}} --env PS1=\"${{"+ HostDefinition.QDUP_PROMPT_VARIABLE +"}}\" ${{image}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
2929
//adding prompt to
3030
public static final List<String> PODMAN_CREATE_CONNECTED_CONTAINER = Arrays.asList("podman run --interactive --tty --cidfile ${{cidfile}} --env PS1=\"${{"+ HostDefinition.QDUP_PROMPT_VARIABLE +"}}\" ${{image}} /bin/bash").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
3131
public static final List<String> DOCKER_CREATE_CONNECTED_CONTAINER = Arrays.asList("docker run --interactive --tty --cidfile ${{cidfile}} --env PS1=\"${{"+ HostDefinition.QDUP_PROMPT_VARIABLE +"}}\" ${{image}} /bin/bash").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
32+
public static final List<String> PODMAN_RESTART_CONNECTED_CONTAINER = Arrays.asList("podman start --interactive --attach ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
33+
public static final List<String> DOCKER_RESTART_CONNECTED_CONTAINER = Arrays.asList("docker start --interactive --attach ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
34+
3235
public static final List<String> PODMAN_STOP_CONTAINER = Arrays.asList("podman stop ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
3336
public static final List<String> DOCKER_STOP_CONTAINER = Arrays.asList("docker stop ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
3437
public static final List<String> PODMAN_REMOVE_CONTAINER = Arrays.asList("podman rm ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
3538
public static final List<String> DOCKER_REMOVE_CONTAINER = Arrays.asList("docker rm ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
3639
public static final List<String> PODMAN_CONNECT_SHELL = Arrays.asList("podman exec --interactive --tty --env PS1=\"${{"+ HostDefinition.QDUP_PROMPT_VARIABLE +"}}\" ${{container}} /bin/bash").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
3740
public static final List<String> DOCKER_CONNECT_SHELL = Arrays.asList("docker exec --interactive --tty --env PS1=\"${{"+ HostDefinition.QDUP_PROMPT_VARIABLE +"}}\" ${{container}} /bin/bash").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
38-
public static final List<String> PODMAN_START_CONNECTED_CONTAINER = Arrays.asList("podman start --interactive --attach ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
39-
public static final List<String> DOCKER_START_CONNECTED_CONTAINER = Arrays.asList("docker start --interactive --attach ${{containerId}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
40-
public static final List<String> DOCKER_OLD_START_CONNECTED_CONTAINER = Arrays.asList("docker run --interactive --tty ${{image}} /bin/bash").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
4141
public static final List<String> PODMAN_EXEC = Arrays.asList("podman exec ${{container}} ${{command}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
4242
public static final List<String> DOCKER_EXEC = Arrays.asList("docker exec ${{container}} ${{command}}").stream().filter(v->v!=null && !v.isBlank()).collect(Collectors.toUnmodifiableList());
4343
public static final List<String> PODMAN_CHECK_CONTAINER_ID = Arrays.asList("podman ps --filter id=${{container}} --format=\"{{.ID}}\"");
@@ -267,8 +267,8 @@ public Host(String userName,String hostName,String password,int port,String prom
267267
this.checkContainerName=PODMAN_CHECK_CONTAINER_NAME;
268268
this.checkContainerStatus =PODMAN_CHECK_STATUS;
269269
this.createConnectedContainer=PODMAN_CREATE_CONNECTED_CONTAINER;
270-
this.startContainer=PODMAN_START_CONTAINER;
271-
this.startConnectedContainer=PODMAN_START_CONNECTED_CONTAINER;
270+
this.startContainer= PODMAN_CREATE_CONTAINER;
271+
this.startConnectedContainer= PODMAN_RESTART_CONNECTED_CONTAINER;
272272
this.stopContainer=PODMAN_STOP_CONTAINER;
273273
this.connectShell=PODMAN_CONNECT_SHELL;
274274
this.removeContainer=PODMAN_REMOVE_CONTAINER;
@@ -282,8 +282,8 @@ public Host(String userName,String hostName,String password,int port,String prom
282282
this.checkContainerName=DOCKER_CHECK_CONTAINER_NAME;
283283
this.checkContainerStatus =DOCKER_CHECK_STATUS;
284284
this.createConnectedContainer=DOCKER_CREATE_CONNECTED_CONTAINER;
285-
this.startContainer=DOCKER_START_CONTAINER;
286-
this.startConnectedContainer=DOCKER_START_CONNECTED_CONTAINER;
285+
this.startContainer= DOCKER_CREATE_CONTAINER;
286+
this.startConnectedContainer= DOCKER_RESTART_CONNECTED_CONTAINER;
287287
this.stopContainer=DOCKER_STOP_CONTAINER;
288288
this.connectShell=DOCKER_CONNECT_SHELL;
289289
this.removeContainer=DOCKER_REMOVE_CONTAINER;
@@ -382,12 +382,12 @@ public boolean isValid(List<String> errors){
382382
if(!hasCheckContainerId() && !hasCheckContainerName()){
383383
rtrn = addError(errors,"containerized host needs either "+HostDefinition.CHECK_CONTAINER_ID+" or "+HostDefinition.CHECK_CONTAINER_NAME);
384384
}
385-
if(Host.isImageName(getDefinedContainer()) && !(hasStartContainer() || hasStartConnectedContainer())){
386-
rtrn = addError(errors,"containerized host of image "+getDefinedContainer()+" needs a "+HostDefinition.START_CONTAINER+" or "+HostDefinition.START_CONNECTED_CONTAINER+" command");
385+
if(Host.isImageName(getDefinedContainer()) && !(hasStartContainer() || hasRestartConnectedContainer())){
386+
rtrn = addError(errors,"containerized host of image "+getDefinedContainer()+" needs a "+HostDefinition.CREATE_CONTAINER +" or "+HostDefinition.RESTART_CONNECTED_CONTAINER +" command");
387387
}
388388
}
389-
if((isContainer() || isLocal()) && ! (hasConnectShell() || hasStartConnectedContainer())){
390-
rtrn = addError(errors,"host cannot connect without a "+HostDefinition.CONNECT_SHELL+" or "+HostDefinition.START_CONNECTED_CONTAINER+"command "+this);
389+
if((isContainer() || isLocal()) && ! (hasConnectShell() || hasRestartConnectedContainer())){
390+
rtrn = addError(errors,"host cannot connect without a "+HostDefinition.CONNECT_SHELL+" or "+HostDefinition.RESTART_CONNECTED_CONTAINER +"command "+this);
391391
}
392392

393393

@@ -464,8 +464,8 @@ public List<String> getCreateConnectedContainer(){
464464
public void setCreateConnectedContainer(List<String> createConnectedContainer){
465465
this.createConnectedContainer = createConnectedContainer;
466466
}
467-
public boolean hasStartConnectedContainer(){return hasProcessArgs(startConnectedContainer);}
468-
public List<String> getStartConnectedContainer(){return startConnectedContainer;}
467+
public boolean hasRestartConnectedContainer(){return hasProcessArgs(startConnectedContainer);}
468+
public List<String> getRestartConnectedContainer(){return startConnectedContainer;}
469469
public void setStartConnectedContainer(List<String> startConnectedContainer){
470470
this.startConnectedContainer = startConnectedContainer;
471471
}

qDup/src/main/java/io/hyperfoil/tools/qdup/Local.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -530,14 +530,14 @@ public static List<List<String>> splitShellCommand(String command){
530530
}else if (targetChar == ' ' && (i == 0 || command.charAt(i-1) != '\\') ){//
531531
String argument = command.substring(flushed,i);
532532
if(!argument.isBlank()) {
533-
current.add(argument);
533+
current.add(StringUtil.removeQuotes(argument));
534534
}
535535
flushed = i+1;//avoid the current space, we dont need it
536536
}else if (targetChar == '|' && (i == 0 || command.charAt(i-1) != '\\') ){
537537
if(flushed<i){
538538
String argument = command.substring(flushed,i);
539539
if(!argument.isBlank()) {
540-
current.add(argument);
540+
current.add(StringUtil.removeQuotes(argument));
541541
}
542542
}
543543
flushed = i+1;//avoid the current character, we dont' need the pipe
@@ -549,7 +549,7 @@ public static List<List<String>> splitShellCommand(String command){
549549
if(flushed < command.length()) {
550550
String argument = command.substring(flushed, command.length());
551551
if (!argument.isBlank()) {
552-
current.add(argument);
552+
current.add(StringUtil.removeQuotes(argument));
553553
}
554554
}
555555
rtrn.removeIf(Collection::isEmpty);
@@ -589,9 +589,6 @@ public static List<List<String>> splitPipelines(List<String> args){
589589
//ProcessBuilder builder = new ProcessBuilder();
590590
List<ProcessBuilder> processes = new ArrayList<>();
591591
List<List<String>> splitCommand = splitPipelines(cmd);
592-
System.out.println(AsciiArt.ANSI_GREEN+"runSyncProcess\n "+cmd.stream().collect(Collectors.joining("\n "))+"\n"+AsciiArt.ANSI_LIGHT_GREY+
593-
splitCommand.stream().map(l->l.stream().collect(Collectors.joining("\n "))).collect(Collectors.joining("\n"))
594-
+AsciiArt.ANSI_RESET);
595592
for(int i=0; i<splitCommand.size(); i++){
596593
List<String> args = splitCommand.get(i);
597594
ProcessBuilder pipe = new ProcessBuilder();

qDup/src/main/java/io/hyperfoil/tools/qdup/config/yaml/HostDefinition.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import io.hyperfoil.tools.qdup.Host;
44
import io.hyperfoil.tools.qdup.State;
55
import io.hyperfoil.tools.qdup.cmd.Cmd;
6-
import io.hyperfoil.tools.yaup.AsciiArt;
76
import io.hyperfoil.tools.yaup.json.Json;
87

98
import java.util.*;
@@ -24,9 +23,9 @@ public class HostDefinition {
2423
public static final String CHECK_CONTAINER_ID = "check-container-id";
2524
public static final String CHECK_CONTAINER_NAME = "check-container-name";
2625
public static final String CHECK_CONTAINER_STATUS = "check-container-status";
27-
public static final String START_CONTAINER = "start-container";
26+
public static final String CREATE_CONTAINER = "create-container";
2827
public static final String CREATE_CONNECTED_CONTAINER = "create-connected-container";//TODO drop and start-container must start connected
29-
public static final String START_CONNECTED_CONTAINER = "start-connected-container";//TODO rename restart-container
28+
public static final String RESTART_CONNECTED_CONTAINER = "restart-connected-container";//TODO rename restart-container
3029
public static final String STOP_CONTAINER = "stop-container";
3130
public static final String CONNECT_SHELL = "connect-shell";
3231
public static final String PLATFORM_LOGIN = "platform-login";
@@ -40,7 +39,7 @@ public class HostDefinition {
4039

4140
public static final List<String> KEYS = Arrays.asList(
4241
USERNAME,HOSTNAME,PASSWORD,PORT,PROMPT,LOCAL,PLATFORM,CONTAINER,CHECK_CONTAINER_ID,CHECK_CONTAINER_NAME,
43-
START_CONTAINER,CREATE_CONNECTED_CONTAINER,START_CONNECTED_CONTAINER,STOP_CONTAINER,CONNECT_SHELL,PLATFORM_LOGIN,EXEC,UPLOAD,DOWNLOAD, IS_SHELL,IDENTITY
42+
CREATE_CONTAINER,CREATE_CONNECTED_CONTAINER, RESTART_CONNECTED_CONTAINER,STOP_CONTAINER,CONNECT_SHELL,PLATFORM_LOGIN,EXEC,UPLOAD,DOWNLOAD, IS_SHELL,IDENTITY
4443
);
4544

4645
public static List<String> unknownKeys(Collection<String> keys){
@@ -112,11 +111,11 @@ public Host toHost(State state){
112111
rtrn.setCheckContainerStatus(toList(mapping.get(CHECK_CONTAINER_STATUS)));
113112
}
114113

115-
if(mapping.has(START_CONTAINER)){
116-
rtrn.setStartContainer(toList(mapping.get(START_CONTAINER)));
114+
if(mapping.has(CREATE_CONTAINER)){
115+
rtrn.setStartContainer(toList(mapping.get(CREATE_CONTAINER)));
117116
}
118-
if(mapping.has(START_CONNECTED_CONTAINER)){
119-
rtrn.setStartConnectedContainer(toList(mapping.get(START_CONNECTED_CONTAINER)));
117+
if(mapping.has(RESTART_CONNECTED_CONTAINER)){
118+
rtrn.setStartConnectedContainer(toList(mapping.get(RESTART_CONNECTED_CONTAINER)));
120119
}
121120
if(mapping.has(CREATE_CONNECTED_CONTAINER)){
122121
rtrn.setCreateConnectedContainer(toList(mapping.get(CREATE_CONNECTED_CONTAINER)));

qDup/src/main/java/io/hyperfoil/tools/qdup/shell/AbstractShell.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,15 @@ public SyncResponse shSync(String command, Map<String, String> prompt,int second
338338
removeShObserver(SH_BLOCK_CALLBACK);
339339
}
340340
assert blockingSemaphore.availablePermits() == 0;
341-
System.out.println(AsciiArt.ANSI_GREEN+"shSync "+command+"\n"+AsciiArt.ANSI_LIGHT_GREY+blockingResponse.toString()+AsciiArt.ANSI_RESET);
342341
//adding peek output to see what was written before the timeout
342+
if(!acquired) {
343+
//TODO does this need to reset the shellLock in
344+
int availale = shellLock.availablePermits(); //TODO reset to 1
345+
if(availale == 0){
346+
shellLock.release();
347+
}
348+
String peeked = peekOutput();
349+
}
343350
return new SyncResponse(blockingResponse.toString()+(!acquired?peekOutput():""),!acquired);
344351
}
345352
public void sh(String command) {
@@ -504,7 +511,6 @@ public SyncResponse execSync(String command,int seconds){
504511
}
505512
Thread.currentThread().interrupt();
506513
}
507-
System.out.println(AsciiArt.ANSI_CYAN+getClass().getSimpleName()+".execSync "+command+"\n"+AsciiArt.ANSI_LIGHT_GREY+sb.toString()+AsciiArt.ANSI_RESET);
508514
return new SyncResponse(sb.toString(),!acquired);
509515
}
510516
public void exec(String command) {

0 commit comments

Comments
 (0)