;; 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.

{:dbs  [:hadoop :zookeeper :kafka :flink-standalone-session]
 :jobs [{:job-jar    "/jepsen/bin/flink-state-machine-kafka-1.0-SNAPSHOT.jar"
         :job-args   "--parallelism 1 --checkpointInterval 5000 --numKeys 1000 --topic kafka-test-topic --sleep 200 --semantic exactly-once --bootstrap.servers localhost:9092 --transaction.timeout.ms 600000 --checkpointDir hdfs:///flink-checkpoints"
         :main-class "com.dataartisans.flink.example.eventpattern.DataGeneratorJob"}

        {:job-jar    "/jepsen/bin/flink-state-machine-kafka-1.0-SNAPSHOT.jar"
         :job-args   "--parallelism 1 --checkpointInterval 5000 --input-topic kafka-test-topic --bootstrap.servers localhost:9092 --checkpointDir hdfs:///flink-checkpoints --auto.offset.reset earliest"
         :main-class "com.dataartisans.flink.example.eventpattern.StateMachineJob"}]}
