From fbcc9846afa60089db011162434079338648a7f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ne=C4=8Das?= Date: Tue, 5 Apr 2022 19:25:33 +0200 Subject: [PATCH 1/6] Ansible-runner: list artifacts one by one AnsibleRunnerHttpClient was listing all new artifacts in artifacts dir becuase ansible-runner does not create the artifacts one by one. When we are logging we need to wait for the proper artifacts to be generated and then we can log it. --- .../ansible/AnsibleRunnerHttpClient.java | 48 +++++++------------ 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java index e1f2d4937fa..7933a45810b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -88,6 +89,7 @@ public AnsibleReturnValue artifactHandler(UUID uuid, int lastEventID, int timeou } lastEventID = processEvents(uuid.toString(), lastEventID, fn, "", Paths.get("")); iteration += POLL_INTERVAL / 1000; + Thread.sleep(POLL_INTERVAL); } returnValue.setAnsibleReturnCode(AnsibleReturnCode.OK); return returnValue; @@ -98,27 +100,19 @@ public void setReturnValue(UUID uuid) { returnValue.setLogFile(runnerLogger.getLogFile()); } - public List getSortedEvents(String playUuid, int lastEventId) throws InterruptedException { - Boolean artifactsIsPopulated = false; - List sortedEvents = new ArrayList<>(); - - while (!artifactsIsPopulated) { - Thread.sleep(1500); - - // ignoring incompleted json files, add to list only events that haven't been handles yet. - String jobEvents = getJobEventsDir(playUuid); - if (Files.exists(Paths.get(jobEvents))) { - sortedEvents = Stream.of(new File(jobEvents).listFiles()) - .map(File::getName) - .filter(item -> !item.contains("partial")) - .filter(item -> !item.endsWith(".tmp")) - .filter(item -> (Integer.valueOf(item.split("-")[0])) > lastEventId) - .sorted() - .collect(Collectors.toList()); - artifactsIsPopulated = true; - } + public String getNextEvent(String playUuid, int lastEventId) { + Optional nextEvent = Optional.empty(); + // ignoring incompleted json files, add to list only events that haven't been handles yet. + String jobEvents = getJobEventsDir(playUuid); + if (Files.exists(Paths.get(jobEvents))) { + nextEvent = Stream.of(new File(jobEvents).listFiles()) + .map(File::getName) + .filter(item -> !item.contains("partial")) + .filter(item -> !item.endsWith(".tmp")) + .filter(item -> item.startsWith((lastEventId + 1) + "-")) + .findFirst(); } - return sortedEvents; + return nextEvent.isPresent() ? nextEvent.get() : null; } public int getLastEventId() { @@ -134,17 +128,9 @@ public int processEvents(String playUuid, BiConsumer fn, String msg, Path logFile) { - List sortedEvents = new ArrayList<>(); - try { - sortedEvents = getSortedEvents(playUuid, lastEventId); - } catch (InterruptedException ex) { - throw new AnsibleRunnerCallException( - "Failed to get list of events for play: %1$s", - playUuid); - } - String jobEvents = getJobEventsDir(playUuid); - for (String event : sortedEvents) { + String event = getNextEvent(playUuid, lastEventId); + while(event != null){ JsonNode currentNode = getEvent(jobEvents + event); String stdout = RunnerJsonNode.getStdout(currentNode); @@ -205,6 +191,8 @@ public int processEvents(String playUuid, } lastEvent = event; returnValue.setLastEventId(getLastEventId()); + lastEventId++; + event = getNextEvent(playUuid, lastEventId); } return lastEvent.isEmpty() ? lastEventId : getLastEventId(); } From 41ec3120fc060ae1c135c0e770218e743c6b825d Mon Sep 17 00:00:00 2001 From: Arik Hadas Date: Tue, 26 Apr 2022 21:00:36 +0300 Subject: [PATCH 2/6] ansible-runner: remove misleading comments Signed-off-by: Arik Hadas --- .../core/common/utils/ansible/AnsibleRunnerHttpClient.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java index 7933a45810b..0657e307a1f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java @@ -76,8 +76,7 @@ public AnsibleReturnValue artifactHandler(UUID uuid, int lastEventID, int timeou int iteration = 0; setArtifactsDir(uuid); setReturnValue(uuid); - // retrieve timeout from engine constants. - while (!playHasEnded(uuid)) { //return -1 incase of an error) + while (!playHasEnded(uuid)) { if (lastEventID == -1) { return returnValue; } From 208a07aa7a31e4718dbb94c0c596556df4f4ae36 Mon Sep 17 00:00:00 2001 From: Arik Hadas Date: Tue, 26 Apr 2022 21:02:32 +0300 Subject: [PATCH 3/6] ansible-runner: avoid redundant thread sleeping --- .../core/common/utils/ansible/AnsibleRunnerHttpClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java index 0657e307a1f..c2d5028872e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java @@ -77,17 +77,17 @@ public AnsibleReturnValue artifactHandler(UUID uuid, int lastEventID, int timeou setArtifactsDir(uuid); setReturnValue(uuid); while (!playHasEnded(uuid)) { + lastEventID = processEvents(uuid.toString(), lastEventID, fn, "", Paths.get("")); if (lastEventID == -1) { return returnValue; } + iteration += POLL_INTERVAL / 1000; if (iteration > timeout * 60) { // Cancel playbook, and raise exception in case timeout occur: cancelPlaybook(uuid, timeout); throw new TimeoutException( "Play execution has reached timeout"); } - lastEventID = processEvents(uuid.toString(), lastEventID, fn, "", Paths.get("")); - iteration += POLL_INTERVAL / 1000; Thread.sleep(POLL_INTERVAL); } returnValue.setAnsibleReturnCode(AnsibleReturnCode.OK); From b1ff85500240e2932ce4a0b0f884ba498770182f Mon Sep 17 00:00:00 2001 From: Arik Hadas Date: Tue, 26 Apr 2022 21:04:02 +0300 Subject: [PATCH 4/6] ansible-runner: rename iteration to executionTime --- .../core/common/utils/ansible/AnsibleRunnerHttpClient.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java index c2d5028872e..0bc9f8eaf9b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java @@ -73,7 +73,7 @@ private void setArtifactsDir(UUID uuid) { public AnsibleReturnValue artifactHandler(UUID uuid, int lastEventID, int timeout, BiConsumer fn) throws Exception { - int iteration = 0; + int executionTime = 0; setArtifactsDir(uuid); setReturnValue(uuid); while (!playHasEnded(uuid)) { @@ -81,8 +81,8 @@ public AnsibleReturnValue artifactHandler(UUID uuid, int lastEventID, int timeou if (lastEventID == -1) { return returnValue; } - iteration += POLL_INTERVAL / 1000; - if (iteration > timeout * 60) { + executionTime += POLL_INTERVAL / 1000; + if (executionTime > timeout * 60) { // Cancel playbook, and raise exception in case timeout occur: cancelPlaybook(uuid, timeout); throw new TimeoutException( From 7036e88bc58525c7ae98d5672e35c280041997b3 Mon Sep 17 00:00:00 2001 From: Arik Hadas Date: Tue, 26 Apr 2022 21:33:10 +0300 Subject: [PATCH 5/6] ansible-runner: simplify AnsibleRunnerHttpClient#processEvents Signed-off-by: Arik Hadas --- .../common/utils/ansible/AnsibleRunnerHttpClient.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java index 0bc9f8eaf9b..83bba490446 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java @@ -128,8 +128,12 @@ public int processEvents(String playUuid, String msg, Path logFile) { String jobEvents = getJobEventsDir(playUuid); - String event = getNextEvent(playUuid, lastEventId); - while(event != null){ + while(true){ + String event = getNextEvent(playUuid, lastEventId); + if (event == null) { + break; + } + JsonNode currentNode = getEvent(jobEvents + event); String stdout = RunnerJsonNode.getStdout(currentNode); @@ -191,7 +195,6 @@ public int processEvents(String playUuid, lastEvent = event; returnValue.setLastEventId(getLastEventId()); lastEventId++; - event = getNextEvent(playUuid, lastEventId); } return lastEvent.isEmpty() ? lastEventId : getLastEventId(); } From a90bddbbbbb80e1fd6e09315b914bdf44c2650dc Mon Sep 17 00:00:00 2001 From: Arik Hadas Date: Tue, 26 Apr 2022 21:41:18 +0300 Subject: [PATCH 6/6] ansible-runner: simplify AnsibleRunnerHttpClient#getNextEvent Signed-off-by: Arik Hadas --- .../ansible/AnsibleRunnerHttpClient.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java index 83bba490446..ccf4bc8c3ae 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/common/utils/ansible/AnsibleRunnerHttpClient.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -100,18 +99,18 @@ public void setReturnValue(UUID uuid) { } public String getNextEvent(String playUuid, int lastEventId) { - Optional nextEvent = Optional.empty(); - // ignoring incompleted json files, add to list only events that haven't been handles yet. String jobEvents = getJobEventsDir(playUuid); - if (Files.exists(Paths.get(jobEvents))) { - nextEvent = Stream.of(new File(jobEvents).listFiles()) - .map(File::getName) - .filter(item -> !item.contains("partial")) - .filter(item -> !item.endsWith(".tmp")) - .filter(item -> item.startsWith((lastEventId + 1) + "-")) - .findFirst(); + if (!Files.exists(Paths.get(jobEvents))) { + return null; } - return nextEvent.isPresent() ? nextEvent.get() : null; + // ignoring incompleted json files, add to list only events that haven't been handles yet. + return Stream.of(new File(jobEvents).listFiles()) + .map(File::getName) + .filter(item -> !item.contains("partial")) + .filter(item -> !item.endsWith(".tmp")) + .filter(item -> item.startsWith((lastEventId + 1) + "-")) + .findFirst() + .orElse(null); } public int getLastEventId() {