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

apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
  namespace: default
  name: session-cluster-1
spec:
  image: flink:1.20
  flinkVersion: v1_20
  ingress:
    template: "/{{namespace}}/{{name}}(/|$)(.*)"
    className: "nginx"
    annotations:
      nginx.ingress.kubernetes.io/rewrite-target: "/$2"
  flinkConfiguration:
    taskmanager.numberOfTaskSlots: 2
    high-availability:
      type: kubernetes
      storageDir: file:///opt/flink/volume/flink-ha
    state:
      checkpoints.dir: file:///opt/flink/volume/flink-cp
      savepoints.dir: file:///opt/flink/volume/flink-sp
  serviceAccount: flink
  podTemplate:
    spec:
      containers:
        # Do not change the main container name
        - name: flink-main-container
          resources:
            requests:
              ephemeral-storage: 2048Mi
            limits:
              ephemeral-storage: 2048Mi
          volumeMounts:
            - mountPath: /opt/flink/volume
              name: flink-volume
      volumes:
        - name: flink-volume
          persistentVolumeClaim:
            claimName: session-cluster-1-pvc
  jobManager:
    resource:
      memory: "1024m"
      cpu: 0.25
  taskManager:
    resource:
      memory: "1024m"
      cpu: 0.25
  mode: native

---
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
  namespace: flink
  name: session-cluster-1
spec:
  image: flink:1.20
  flinkVersion: v1_20
  ingress:
    template: "/{{namespace}}/{{name}}(/|$)(.*)"
    className: "nginx"
    annotations:
      nginx.ingress.kubernetes.io/rewrite-target: "/$2"
  flinkConfiguration:
    taskmanager.numberOfTaskSlots: "2"
    high-availability.type: kubernetes
    high-availability.storageDir: file:///opt/flink/volume/flink-ha
    state.checkpoints.dir: file:///opt/flink/volume/flink-cp
    state.savepoints.dir: file:///opt/flink/volume/flink-sp
  serviceAccount: flink
  podTemplate:
    spec:
      containers:
        # Do not change the main container name
        - name: flink-main-container
          resources:
            requests:
              ephemeral-storage: 2048Mi
            limits:
              ephemeral-storage: 2048Mi
          volumeMounts:
            - mountPath: /opt/flink/volume
              name: flink-volume
      volumes:
        - name: flink-volume
          persistentVolumeClaim:
            claimName: session-cluster-1-pvc
  jobManager:
    resource:
      memory: "1024m"
      cpu: 0.25
  taskManager:
    resource:
      memory: "1024m"
      cpu: 0.25
  mode: native

---
apiVersion: flink.apache.org/v1beta1
kind: FlinkSessionJob
metadata:
  namespace: default
  name: flink-example-statemachine
spec:
  deploymentName: session-cluster-1
  job:
    jarURI: STREAMING_EXAMPLES_JAR_URL
    parallelism: 2
    upgradeMode: savepoint
    entryClass: org.apache.flink.streaming.examples.statemachine.StateMachineExample

---
apiVersion: flink.apache.org/v1beta1
kind: FlinkSessionJob
metadata:
  namespace: flink
  name: flink-example-statemachine
spec:
  deploymentName: session-cluster-1
  job:
    jarURI: STREAMING_EXAMPLES_JAR_URL
    parallelism: 2
    upgradeMode: savepoint
    entryClass: org.apache.flink.streaming.examples.statemachine.StateMachineExample

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: session-cluster-1-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: session-cluster-1-pvc
  namespace: flink
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi

---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
  labels:
    app.kubernetes.io/component: controller
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
