Skip to content

Releases: sos-berlin/js7

v2.0.0-alpha.20210722.2

22 Jul 14:25
Compare
Choose a tag to compare
Pre-release
  • FIX: Order.scheduledfor wirkt nun auch, wenn die erste Anweisung nicht Execute ist, also PostNotice, ExpectNotice, Lock, Fail, Fork oder Prompt.
  • Das neue Kommando DeleteNotice löscht eine Notiz.
    Die PostNotice-Anweisung kann jederzeit eine Notiz mit derselben NoticeId erneut erzeugen.

v2.0.0-alpha.20210722

22 Jul 09:32
Compare
Choose a tag to compare
v2.0.0-alpha.20210722 Pre-release
Pre-release
  • Falls schon Boards benutzt worden sind: Das Journal hat sich geändert. Bitte löscht alle state-Verzeichnisse.
  • Umbenennungen für Boards:
    • ExpectNotice ersetzt die Anweisung ReadNotice
    • Board.postOrderToNoticeId ersetzt .toNotice
    • Board.expectOrderToNoticeId ersetzt .readingOrderToNoticeId
  • FIX: Board wird vom Cluster repliziert.
  • FIX: Als gelöscht markierte FileWatchs werden vom Cluster repliziert.
  • Board kann gelöscht werden.
  • JBoard für die Java-Schnittstelle
  • Workflows verlangen, dass die referenzierten Boards bekannt sind.
  • Boards können gelöscht werden.
  • CancelOrders ist überarbeitet.
    • SIGKILL nach SIGTERM funktionierte gelegentlich nicht.
    • CancelOrder während des Prozessstarts funktioniert besser.

v2.0.0-alpha.20210720

20 Jul 13:12
Compare
Choose a tag to compare
v2.0.0-alpha.20210720 Pre-release
Pre-release
  • Java-Schnittstelle für Board erweitert um
    • JBoard
    • JControllerState.pathToBoard
  • sigkillDelay = 0.s führt unmittelbar zu SIGKILL, ohne vorheriges SIGTERM.
  • WorkflowJob.timeout misst die Zeit ab kurz nach dem Start.

v2.0.0-alpha.20210716

16 Jul 11:08
Compare
Choose a tag to compare
v2.0.0-alpha.20210716 Pre-release
Pre-release
  • Board and Notice für Mitteilungen zwischen Aufträgen
  • Ausdrücke Reguläre Ausdrücke zur String-Ersetzung
  • HTTP-Schnittstelle verträgt beliebig große JSON-Objekte
  • Job mit Timeout

Board and Notice

JS7 kennt jetzt benannte schwarze Bretter, an denen Notizen haften.

  • Ein Auftrag kann für einen anderen Auftrag (oder sich selbst) eine Notiz hinterlassen.
  • Eine Notiz hat eine NoticeId, die für das jeweilige schwarze Brett gilt.
  • Ein Auftrag kann eine Notiz an ein schwarzes Brett heften
  • und dabei mit einer Termin versehen, ab dem JS7 die Notiz entfernen kann.
  • Ein Auftrag kann auf eine Notiz mit einer bestimmten NoticeId warten.

Board

Ein Board ist ein UnsignedSimpleItem (nicht signiert, nicht versioniert) und hat die Parameter

  • path: BoardPath
  • toNotice: Expression
    • Ausdruck, der für die Anweisung PostNotice eine NoticeId liefert.
  • endOfLife: Expression
    Ausdruck, der für die Anweisung PostNotice den Zeitpunkt liefert, bis wann die Notiz gelten soll, ausgedrückt als Anzahl Millisekunden seit 1970-01-01, 0 Uhr, UTC. Dann wird JS7 die Notiz löschen.
  • readingOrderToNoticeId
    • Ausdruck, der für die Anweisung ReadNotice eine NoticeId liefert.

Die Ausdrücke haben Zugriff auf den Auftrag ($js7OrderId, Auftragsvariablen) und die Uhr ($epochMilli).

JSON-Beispiel, das die NoticeId aus dem Tagesplantag einer OrderId "#yyyy-mm-dd#..." errechnet:

{
  "TYPE": "Board",
  "path": "MY-BOARD",
  "toNotice": "replaceAll($js7OrderId, '^#([0-9]{4}-[0-9]{2}-[0-9]{2})#.*$', '$1')",
  "endOfLife": "$epochMillis + 24 * 3600 * 1000",
  "readingOrderToNoticeId": "replaceAll($js7OrderId, '^#([0-9]{4}-[0-9]{2}-[0-9]{2})#.*$', '$1')"
}

Anweisung PostNotice

Platziert eine Notiz auf dem genannten schwarzen Brett. Eine vielleicht vorhandene Notiz (mit derselben NoticeId) wird ersetzt.

noticeId und endOfLife der Notiz werden mit den im Board angegebenen Ausdrücken errechnet, sodass bei der Anweisung kein weiterer Parameter erforderlich ist.

JSON

{
  "TYPE": "PostNotice",
  "boardPath": "MY-BOARD"
}

Anweisung ReadNotice

JSON

{
  "TYPE": "ReadNotice",
  "boardPath": "MY-BOARD"
}

Die noticeId der Notiz wird mit den im Board angegebenen Ausdruck errechnet,
so dass bei der Anweisung kein weiterer Parameter erforderlich ist.

Wenn die verlangte Notiz nicht auf dem schwarzen Brett ist, wartet die Anweisung,
bis ein anderer Auftrag die mit postNotice anheftet.

replaceAll

replaceAll(string: String, regex: String, replacement: String)

Analog zu Javas (replaceAll)[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replaceAll-java.lang.String-java.lang.String-].

Zur Angabe von $ und \ in replacement: Wenn Gruppen aus regex in replacement verwendet werden, also etwa $1, dann ist $1 keine Variable der Ausdruckssprache, sondern von replaceAll, wie in replace($myString, 'x', '-->$1<--'). replacement ist also ein String in Apostrophen. replace($myString, 'x', "-->$1<--") dagegen würde $1 der Ausdruckssprache verwenden und nicht das gewünscht Ergebnis liefern (wahrscheinlich wird es scheitern).

HTTP-Schnittstelle verträgt beliebig große JSON-Objekte

Die Web-Services für Events, Cluster-Replikation, Items und neue Aufträge teilen den HTTP-Strom in Chunks auf, die jetzt unabhängig von den Größen der JSON-Objekte sind.

Job timeout

Ein Job kann mit einem Timeout versehen werden.
Wenn nach Verstreichen der Zeit der Job noch läuft, dann bricht JS7 ihn ab
und geht dabei wie bei CancelOrder vor.
sigkillDelay wird beachtet.
Der Auftragsschritt scheitert, was mit try/catch abgefangen werden kann.

WorkflowJob mit einer Frist von 60 Sekunden, in JSON:

{
  "agentPath": "AGENT",
  "executable": {
    ...
  },
  "timeout": 60
}

Outcome in JSON:

{
  "TYPE": "TimedOut",
  "outcome": {
    "TYPE": "Failed",
    "namedValues": {
      "returnCode": 143
    }
  }
}

Die Java-Schnittstelle kennt das neue JOutcome.TimedOut(Outcome).

v2.0.0-alpha.20210706

06 Jul 18:53
Compare
Choose a tag to compare
v2.0.0-alpha.20210706 Pre-release
Pre-release
  • FIX: HTTPS nutzt KeyManagerFactory.getDefaultAlgorithm zur Kompatibilität mit IBM Java (und anderen).
  • FIX: Zweiter Suspend eines Auftrags auf demselben Agenten funktioniert jetzt..
  • FIX: Bessere Fehlermeldung, wenn Agent nicht zum Controller passt
  • FIX: docker stop im Docker-Beispiel führt ordentlich zum Shutdown.
  • FIX: JProxyContext.close schließt den Threadpool.
  • FIX: JSuspensionMode.standard, um einen Auftrag zu suspendieren, ohne den Prozess abzubrechen.
  • Ausdrücke können multiplizieren und dividieren (Division noch nicht ganzzahlig)

v2.0.0-alpha.20210628

28 Jun 14:04
Compare
Choose a tag to compare
v2.0.0-alpha.20210628 Pre-release
Pre-release
  • Das Journal hat sich geändert. Bitte löscht alle Journaldateien.

Parameter-Deklaration und Auftragsvariablen

  • FileWatch-Aufträge werden gegen die Parameter-Deklaration geprüft und erhalten Default-Werte.
  • Default-Werte für Auftragsparameter sind jetzt Ausdrücke.
  • Auftragsvariablen werden jetzt als eine Art Auftragsparameter angesehen. Drei Fälle werden unterschieden:
    • Required (JSON-Feld valueType)
      • Der Parameter muss angegeben werden.
    • Optional (JSON-Felder valueType und default: Expression)
      • Der Parameter kann angegeben werden.
    • Final (JSON-Felder valueType und final: Expression)
      • Der Parameter kann nicht bei addOrder angegeben werden.
        Der Wert kommt nur aus dieser Deklaration im Workflow.
  • JobResource.variables ersetzt .settings.
  • Workflow.orderPreparation ersetzt orderRequirements

Ausschnitt aus einem Workflow-JSON:

"orderPreparation": {
  "parameters": {
    "myRequired": {
     "type": "Boolean"
    },
    "myOptional": {
      "type": "Number",
      "default": "7"
    },
    "myFinal": {
      "final": "'FINAL'"
    }
  },
  "allowUndeclared": true
}

orderPreparation ist optional.
Wenn orderPreparation fehlt, nimmt JS7 allowUndeclared = true an

Die Variablen einer JobResource in einem Ausdruck

  • Neue Funktion jobResourceVariable für variablen Zugriff auf Variablen einer JobResource.
    • jobResourceVariable("JOB-RESOURCE-PATH", "VARIABLE")
  • Neue Funktion jobResourceVariables für Zugriff auf alle Variablen einer JobResource als Objekt.
    • jobResourceVariables("JOB-RESOURCE-PATH")
  • In einer Auftragsparameterdeklaration werden die beiden Funktionen beim Hinzufügen des Auftrags
    ausgewertet. Spätere Änderungen der JobResource wirken sich nicht aus.
  • JobResource:PATH liefert alle Variablen der Job-Ressource als ein Objekt.
  • Der neue Punkt-Operator ermöglicht Zugriff auf Objektfelder: object.field.
  • Neue Syntax für .toNumber und .toBoolean
    • Weil die bisherige Syntax mit dem neuen Punkt-Operator zum Zugriff auf Objektfelder kollidiert,
      sollten die neuen Funktionen genutzt werden:
    • toNumber(EXPR) statt EXPR.toNumber
    • toBoolean(EXPR) statt EXPR.toBoolean.
  • OrderScopesTest klärt, welche Scopes (mit welchen Namen und Funktionen) wo zur Verfügung stehen
    (es ist kompliziert).

Proxy

  • JControllerState.instant liefert Zeitstempel des ControllerState.
  • JControllerState.orderNamedValues liefert alle für den Auftrag sichtbaren Variablen (Auftragsparameter, Job-Ergebnisse).
  • JWorkflow.reachablePosition(Position) liefert die von der gegebenen Position aus erreichbaren Positionen,
    die im ResumeOrder-Kommando angegeben werden können.
  • JControllerApi meldet sich nicht mehr für jede Operation von neuem am Controller an.

ResumeOrder

Wenn eine Position angegeben ist, dann schneidet JS7 die Mini-Historie ab der Position ab,
so dass Position und Mini-Historie zueinander passen.

Außerdem erwartet das Kommando eine Liste von JHistoryOperation statt bisher der kompletten Mini-Historie.
Vier Operationen stehen zur Verfügung:

  • JHistoryOperation.replace(Position, Outcome)
  • JHistoryOperation.insert(before: Position, Position, Outcome)
  • JHistoryOperation.delete(Position)
  • JHistoryOperation.append(Outcome)

JS7 prüft bislang kaum, ob die Operationen plausibel sind.

Weiteres

  • Auftragsparameter haben Vorrang vor Job-Ergebnissen (anders als in JS1).
  • Der Cluster erlaubt das gleichzeitige Herunterfahren beider Knoten.
  • Order.Prompting ist jetzt cancelable

v2.0.0-alpha.20210616

16 Jun 06:54
Compare
Choose a tag to compare
v2.0.0-alpha.20210616 Pre-release
Pre-release
  • Das Journal hat sich geändert. Bitte löscht alle Journaldateien.
  • Der Parameter defaultArguments in der Execute-Anweisung und im Job erwarten jetzt Ausdrücke statt bloßer Werte.
    • Das dürfte viele der vorhandenen Workflows betreffen.
    • In den Ausdrücken können alle Operationen wie in JobResource-Settings abgerufen werden.
  • JobResource-Settings sind in defaultArguments und WorkflowJob.env abrufbar.
    • JobResource:MY-JOB-RESOURCE:MY-SETTING
    • In einem interpolierten String, zum Beispiel: "-->$(JobResource:MY-JOB-RESOURCE:MY-SETTING)<--".
    • Der Auftragsschritt scheitert, wenn die JobResource oder die Setting nicht da ist.
  • Neuer Operator orElse ist anwendbar auf Settings:
    • JobResource:MY-JOB-RESOURCE:MISSING orElse "MY-DEFAULT"
  • Nachträgliche Änderungen zur letzten Freigabe:
    • JSuspensionMode ersetzt JSuspendMode
    • JOrder.removed ersetzt .deleted

v2.0.0-alpha.20210610

10 Jun 15:10
Compare
Choose a tag to compare
v2.0.0-alpha.20210610 Pre-release
Pre-release

JS7 kennt die Abhängigkeiten unter den Items und kann Items löschen

  • JS7 lehnt Items ab, wenn nicht sämtliche benötigten anderen Items vorhanden sind. Es kann also kein Workflow mehr übergeben werden, für den eine AgentRef fehlt.
  • JS7 löscht (endgültig) selbständig obsolete Workflow-Versionen, für die es also keinen Auftrag mehr gibt.
  • JUpdateItemOperation.deleteSimple kann jetzt außer FileWatch auch alle anderen SimpleItems löschen: Lock, JobResource und AgentRef.
  • Items lassen sich nur löschen, wenn sie nicht von anderen Items noch gebraucht werden.
  • Items, die voneinander abhängen, können mit einem Aufruf UpdateItems hinzugefügt und gelöscht werden.

Prompt-Anweisung

  • Die neue Anweisung Prompt hält den Auftrag an. Parameter question ist ein Ausdruck.
  • Der Auftrag ist im Zustand Prompting.
  • Das neue Kommando Kommando AnswerOrderPrompt setzt einen im Prompt stehenden Auftrag fort.
  • Events OrderPrompted und OrderPromptAnswered
{
  "TYPE": "Prompt",
  "question": "\"QUESTION\""
}
{
  "TYPE": "AnswerOrderPrompt",
  "orderId": "ORDER"
}
{
  "TYPE": "OrderPrompted",
  "question": "QUESTION"
}
{
  "TYPE": "OrderPromptAnswered"
}
{
  "TYPE": "Prompting",
  "question": "QUESTION"
}

Inkompatibilitäten

  • Das Journal hat sich geändert. Bitte löscht alle Journaldateien.

Diesmal gibt es einige Umbenennungen, und ein Parameter ist verschoben.

  • parallelism ersetzt taskLimit. parallelism=1 ist voreingestellt. Damit ist der Begriff Task fast getilgt.
  • ShellScriptExecutable ersetzt ScriptExecutable.
  • returnCodeMeaning, bisher im Job, wird jetzt eins tiefer in ShellScriptExecutable erwartet. Kann entfallen für den normalen Fall, dass nur returnCode != 0 zum Abbruch führen soll.

Benennungstandards der SOS sind übernommen. „delete“ meint jetzt vernichten, „remove“ meint verschwinden lassen, aber nicht umbedingt vernichten:

  • VersionedItemRemoved ersetzt VersionedItemDeleted, in allen Varianten, z.B.:
    • RemoveVersioned ersetzt DeleteVersioned
  • OrderDeleted ersetzt OrderRemoved, in allen Varianten, z.B.
    • DeleteOrder ersetzt RemoveOrder
    • JOrder.Deleted ersetzt `JOrder.Removed
    • (JOrder.removed habe ich übersehen)
  • OrderDeletionMarked ersetzt OrderRemoveMarked
  • deleteWhenTerminated ersetzt removeWhenTerminated (Order)
  • markedAsDeleteWhenTerminated ersetzt markedAsRemoveWhenTerminated (JOrderPredicates)

Fehlercodes:

  • VersionedItemRemoved ersetzt VersionedItemDeleted
  • CannotDeleteChildOrder ersetzt CannotRemoveChildOrder
  • CannotDeleteWatchingOrder ersetzt CannotRemoveWatchingOrder

Klassen, die in besserem English benannt sind:

  • OrderKillingMarked ersetzt OrderKillMarked
  • OrderResumptionMarked ersetzt OrderResumeMarked
  • CancellationMode ersetzt CancelMode
  • SuspensionMode ersetzt SuspendMode
  • (JSuspendMode habe ich übersehen)

v2.0.0-alpha.20210526

26 May 11:41
Compare
Choose a tag to compare
v2.0.0-alpha.20210526 Pre-release
Pre-release
  • Das Journal hat sich geändert. Bitte löscht alle Journaldateien.
  • $js7JobExecutionCount: die neue Variable steht für JobResource und Execute zur Verfügung, und zählt die Anzahl der Starts des aktuellen Jobs für diesen Auftrag. Beim ersten Start ist die Zahl 1.

Kommando ResetAgent

ResetAgent setzt einen nicht mehr kooperierenden Agenten zurück, dessen Zustand (Journal) nicht zum Zustand des Controllers passt. Das kann zum Beispiel passieren, wenn der Agent mit einem alten (von einer Datensicherung zurückgeladenen) Journal gestartet wird.

  • Der Controller holt alle Aufträge zurück, die auf dem Agenten sind, oder auf dem Weg dahin oder zurück. Dabei ist dem Controller nicht bekannt, wie weit der Agent die Aufträge ausgeführt hat. Deshalb lässt er die Aufträge mit Failed beenden. Try/catch wirkt nicht.
  • Aufträge im Fork, von denen ein Kindauftrag zurückgeholt wird, sind nicht betroffen, denn im Fork wartende Auftrag ist stets am Controller.
  • Der Controller versucht den Agenten zurückzusetzen, der daraufhin das Journal löscht (!) und erneut startet.
  • Der Controller nutzt den neu gestarteten Agenten für die nächsten Aufträge.
  • Mit dem Kommando kann der Agent nicht entfernt werden (dafür wird es ein anderes Kommando geben).
{
  "TYPE": "ResetAgent",
  "agentPath": "AGENT"
}

v2.0.0-alpha.20210521

21 May 08:06
Compare
Choose a tag to compare
v2.0.0-alpha.20210521 Pre-release
Pre-release
  • Das Journal hat sich geändert. Bitte löscht alle Journaldateien.
  • FIX: Das Kommando RemoveOrdersWhenTerminated wird für Dateiaufträge abgewiesen. JS7 löscht einen Dateiauftrag genau dann, wenn der Auftrag fertig (OrderFinished, OrderFailed oder OrderCancelled) ist und die Datei verschwunden ist.

$`variable`

  • Neue Syntax für Variablen mit komischen Zeichen: $`variable`
    • variable kann jedes Zeichen außer ` und Steuerzeichen (wie Zeilenwechsel) enthalten
    • $`mail.smtp.port` (die Punkte gehörten also zum Variablennamen und sind keine Objekttrenner)
    • $`name with spaces`
  • $.. kann damit mehr als ${...}
    • ${...} wäre damit veraltet, aber man könnte es zukünftig für nette syntaktische Abkürzungen verwenden, etwa wie die Bash das tut.
    • ${`variable`} geht erstmal weiterhin. Besser ist $`variable`.

Agent

  • Den Agent Server (für mehrere Agenten) gibt es nicht mehr. Der gestartete Agent unterstützt genau eine AgentPath. Der Agent schreibt nur noch ein Journal (nicht mehr zwei). Start wie bisher.
  • $js7ControllerId liefert jetzt die tatsächliche ControllerId.

Neue Felder in BlockingInternalJob.Step

  • controllerId: ControllerId
    • controllerId().string() liefert einen String
  • instructionLabel: Optional<Label>
    • instructionLabel().map(o -> o.string()) liefert Optional<String>.

LicenseCheck

  • Der Produktname für den Cluster lautet jetzt ordentlich js7.controller.cluster.
  • Das Interface LicenseCheck hat jetzt die Methode initialize, der ein LicenseCheckContext mit configDirectory übergeben wird.
  • JS7 protokolliert mehr (als debug)