From 108c009be032f53c1cf9139b808da32e826e7783 Mon Sep 17 00:00:00 2001 From: Anton Putra Date: Wed, 24 Apr 2024 12:41:52 +0500 Subject: [PATCH] How to debug Kubernetes? (Deployments, Services & Ingress) (#226) --- README.md | 4 +- assets/192.png | Bin 82268 -> 0 bytes assets/193.png | Bin 0 -> 73773 bytes docs/contents.md | 1 + lessons/193/1-example/0-deployment.yaml | 22 ++ lessons/193/1-example/1-service.yaml | 12 + lessons/193/1-example/2-ingress.yaml | 16 + lessons/193/10-example/0-pod.yaml | 11 + lessons/193/10-example/1-pod.yaml | 11 + lessons/193/10-example/2-pod.yaml | 11 + lessons/193/11-example/0-deployment.yaml | 29 ++ lessons/193/11-example/1-configmap.yaml | 9 + lessons/193/12-example/0-deployment.yaml | 31 ++ lessons/193/13-example/0-deployment.yaml | 28 ++ lessons/193/14-example/0-deployment.yaml | 22 ++ lessons/193/14-example/1-service.yaml | 12 + lessons/193/14-example/2-ingress.yaml | 16 + lessons/193/2-example/0-deployment.yaml | 22 ++ lessons/193/2-example/1-service.yaml | 12 + lessons/193/3-example/0-deployment.yaml | 24 ++ lessons/193/3-example/1-service.yaml | 13 + lessons/193/4-example/0-deployment.yaml | 24 ++ lessons/193/4-example/1-service.yaml | 12 + lessons/193/5-example/0-deployment.yaml | 23 ++ lessons/193/5-example/1-service.yaml | 12 + lessons/193/6-example/0-deployment.yaml | 20 ++ lessons/193/6-example/1-service.yaml | 12 + lessons/193/6-example/2-deployment.yaml | 20 ++ lessons/193/7-example/0-deployment.yaml | 22 ++ lessons/193/7-example/1-service.yaml | 12 + lessons/193/7-example/2-ingress.yaml | 16 + lessons/193/8-example/0-deployment.yaml | 23 ++ lessons/193/8-example/1-service.yaml | 15 + lessons/193/8-example/2-service-monitor.yaml | 11 + lessons/193/9-example/0-deployment.yaml | 22 ++ lessons/193/9-example/1-service.yaml | 12 + lessons/193/9-example/2-ingress.yaml | 17 + lessons/193/README.md | 3 + lessons/193/myapp/.dockerignore | 5 + lessons/193/myapp/.gitignore | 43 +++ lessons/193/myapp/.idea/misc.xml | 6 + lessons/193/myapp/.idea/vcs.xml | 6 + lessons/193/myapp/.mvn/wrapper/.gitignore | 1 + .../.mvn/wrapper/MavenWrapperDownloader.java | 98 ++++++ .../.mvn/wrapper/maven-wrapper.properties | 18 + lessons/193/myapp/README.md | 56 ++++ lessons/193/myapp/mvnw | 308 ++++++++++++++++++ lessons/193/myapp/mvnw.cmd | 205 ++++++++++++ lessons/193/myapp/pom.xml | 129 ++++++++ .../193/myapp/src/main/docker/Dockerfile.jvm | 97 ++++++ .../src/main/docker/Dockerfile.legacy-jar | 93 ++++++ .../myapp/src/main/docker/Dockerfile.native | 27 ++ .../src/main/docker/Dockerfile.native-micro | 30 ++ .../src/main/java/com/antonputra/Device.java | 17 + .../java/com/antonputra/DeviceResource.java | 26 ++ .../src/main/resources/application.properties | 0 56 files changed, 1745 insertions(+), 2 deletions(-) delete mode 100644 assets/192.png create mode 100644 assets/193.png create mode 100644 lessons/193/1-example/0-deployment.yaml create mode 100644 lessons/193/1-example/1-service.yaml create mode 100644 lessons/193/1-example/2-ingress.yaml create mode 100644 lessons/193/10-example/0-pod.yaml create mode 100644 lessons/193/10-example/1-pod.yaml create mode 100644 lessons/193/10-example/2-pod.yaml create mode 100644 lessons/193/11-example/0-deployment.yaml create mode 100644 lessons/193/11-example/1-configmap.yaml create mode 100644 lessons/193/12-example/0-deployment.yaml create mode 100644 lessons/193/13-example/0-deployment.yaml create mode 100644 lessons/193/14-example/0-deployment.yaml create mode 100644 lessons/193/14-example/1-service.yaml create mode 100644 lessons/193/14-example/2-ingress.yaml create mode 100644 lessons/193/2-example/0-deployment.yaml create mode 100644 lessons/193/2-example/1-service.yaml create mode 100644 lessons/193/3-example/0-deployment.yaml create mode 100644 lessons/193/3-example/1-service.yaml create mode 100644 lessons/193/4-example/0-deployment.yaml create mode 100644 lessons/193/4-example/1-service.yaml create mode 100644 lessons/193/5-example/0-deployment.yaml create mode 100644 lessons/193/5-example/1-service.yaml create mode 100644 lessons/193/6-example/0-deployment.yaml create mode 100644 lessons/193/6-example/1-service.yaml create mode 100644 lessons/193/6-example/2-deployment.yaml create mode 100644 lessons/193/7-example/0-deployment.yaml create mode 100644 lessons/193/7-example/1-service.yaml create mode 100644 lessons/193/7-example/2-ingress.yaml create mode 100644 lessons/193/8-example/0-deployment.yaml create mode 100644 lessons/193/8-example/1-service.yaml create mode 100644 lessons/193/8-example/2-service-monitor.yaml create mode 100644 lessons/193/9-example/0-deployment.yaml create mode 100644 lessons/193/9-example/1-service.yaml create mode 100644 lessons/193/9-example/2-ingress.yaml create mode 100644 lessons/193/README.md create mode 100644 lessons/193/myapp/.dockerignore create mode 100644 lessons/193/myapp/.gitignore create mode 100644 lessons/193/myapp/.idea/misc.xml create mode 100644 lessons/193/myapp/.idea/vcs.xml create mode 100644 lessons/193/myapp/.mvn/wrapper/.gitignore create mode 100644 lessons/193/myapp/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 lessons/193/myapp/.mvn/wrapper/maven-wrapper.properties create mode 100644 lessons/193/myapp/README.md create mode 100755 lessons/193/myapp/mvnw create mode 100644 lessons/193/myapp/mvnw.cmd create mode 100644 lessons/193/myapp/pom.xml create mode 100644 lessons/193/myapp/src/main/docker/Dockerfile.jvm create mode 100644 lessons/193/myapp/src/main/docker/Dockerfile.legacy-jar create mode 100644 lessons/193/myapp/src/main/docker/Dockerfile.native create mode 100644 lessons/193/myapp/src/main/docker/Dockerfile.native-micro create mode 100644 lessons/193/myapp/src/main/java/com/antonputra/Device.java create mode 100644 lessons/193/myapp/src/main/java/com/antonputra/DeviceResource.java create mode 100644 lessons/193/myapp/src/main/resources/application.properties diff --git a/README.md b/README.md index 37a01047..062b8a86 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# New Video - https://youtu.be/iE9Qb8dHqWI +# New Video - https://youtu.be/hixs2GIGrUw -[](https://youtu.be/iE9Qb8dHqWI) +[](https://youtu.be/hixs2GIGrUw) # Playlists diff --git a/assets/192.png b/assets/192.png deleted file mode 100644 index 937f82d7b4f456c18974cd1c1d3721a07beb9ee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82268 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 z 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 Bc+mg= literal 0 HcmV?d00001 diff --git a/docs/contents.md b/docs/contents.md index 7eed5a75..ba5cece1 100644 --- a/docs/contents.md +++ b/docs/contents.md @@ -121,3 +121,4 @@ - [190 - What is a Reverse Proxy? (vs. Forward Proxy)](../lessons/190) - [191 - Types of Load Balancing Algorithms](../lessons/191) - [192 - Kubernetes RBAC Explained](../lessons/192) +- [193 - How to debug Kubernetes? (Deployments, Services & Ingress)](../lessons/193) diff --git a/lessons/193/1-example/0-deployment.yaml b/lessons/193/1-example/0-deployment.yaml new file mode 100644 index 00000000..79f1c35e --- /dev/null +++ b/lessons/193/1-example/0-deployment.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 diff --git a/lessons/193/1-example/1-service.yaml b/lessons/193/1-example/1-service.yaml new file mode 100644 index 00000000..9a06fc11 --- /dev/null +++ b/lessons/193/1-example/1-service.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + type: ClusterIP + ports: + - port: 7070 + targetPort: 8080 + selector: + app: my-app diff --git a/lessons/193/1-example/2-ingress.yaml b/lessons/193/1-example/2-ingress.yaml new file mode 100644 index 00000000..bf6b62cd --- /dev/null +++ b/lessons/193/1-example/2-ingress.yaml @@ -0,0 +1,16 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: my-ingress +spec: + rules: + - http: + paths: + - pathType: Prefix + path: / + backend: + service: + name: my-service + port: + number: 7070 diff --git a/lessons/193/10-example/0-pod.yaml b/lessons/193/10-example/0-pod.yaml new file mode 100644 index 00000000..63da994b --- /dev/null +++ b/lessons/193/10-example/0-pod.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: myapp-1 +spec: + containers: + - name: myapp + image: aputra/myapp-193:v16 + ports: + - containerPort: 8080 diff --git a/lessons/193/10-example/1-pod.yaml b/lessons/193/10-example/1-pod.yaml new file mode 100644 index 00000000..b23baac2 --- /dev/null +++ b/lessons/193/10-example/1-pod.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: myapp-2 +spec: + containers: + - name: myapp + image: ubuntu:latest + command: ["/bin/bash", "-c", "--"] + args: ["sleep 2; echo 'System error: failed to write to Kafka'; exit 1;"] diff --git a/lessons/193/10-example/2-pod.yaml b/lessons/193/10-example/2-pod.yaml new file mode 100644 index 00000000..ba7eb4d9 --- /dev/null +++ b/lessons/193/10-example/2-pod.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: myapp-3 +spec: + containers: + - name: myapp + image: aputra/myapp-193:v6 + ports: + - containerPort: 8080 diff --git a/lessons/193/11-example/0-deployment.yaml b/lessons/193/11-example/0-deployment.yaml new file mode 100644 index 00000000..dcf9b8cd --- /dev/null +++ b/lessons/193/11-example/0-deployment.yaml @@ -0,0 +1,29 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 + volumeMounts: + - name: config-volume + mountPath: /etc/config + volumes: + - name: config-volume + configMap: + name: config diff --git a/lessons/193/11-example/1-configmap.yaml b/lessons/193/11-example/1-configmap.yaml new file mode 100644 index 00000000..3f4aefca --- /dev/null +++ b/lessons/193/11-example/1-configmap.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: my-config +data: + properties: | + level=hard + lives=3 diff --git a/lessons/193/12-example/0-deployment.yaml b/lessons/193/12-example/0-deployment.yaml new file mode 100644 index 00000000..4940db94 --- /dev/null +++ b/lessons/193/12-example/0-deployment.yaml @@ -0,0 +1,31 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: role + operator: In + values: + - spot diff --git a/lessons/193/13-example/0-deployment.yaml b/lessons/193/13-example/0-deployment.yaml new file mode 100644 index 00000000..d7705ccd --- /dev/null +++ b/lessons/193/13-example/0-deployment.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 + readinessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 3 + periodSeconds: 5 diff --git a/lessons/193/14-example/0-deployment.yaml b/lessons/193/14-example/0-deployment.yaml new file mode 100644 index 00000000..9cab2386 --- /dev/null +++ b/lessons/193/14-example/0-deployment.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 2 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 diff --git a/lessons/193/14-example/1-service.yaml b/lessons/193/14-example/1-service.yaml new file mode 100644 index 00000000..9a06fc11 --- /dev/null +++ b/lessons/193/14-example/1-service.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + type: ClusterIP + ports: + - port: 7070 + targetPort: 8080 + selector: + app: my-app diff --git a/lessons/193/14-example/2-ingress.yaml b/lessons/193/14-example/2-ingress.yaml new file mode 100644 index 00000000..bf6b62cd --- /dev/null +++ b/lessons/193/14-example/2-ingress.yaml @@ -0,0 +1,16 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: my-ingress +spec: + rules: + - http: + paths: + - pathType: Prefix + path: / + backend: + service: + name: my-service + port: + number: 7070 diff --git a/lessons/193/2-example/0-deployment.yaml b/lessons/193/2-example/0-deployment.yaml new file mode 100644 index 00000000..79f1c35e --- /dev/null +++ b/lessons/193/2-example/0-deployment.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 diff --git a/lessons/193/2-example/1-service.yaml b/lessons/193/2-example/1-service.yaml new file mode 100644 index 00000000..9a06fc11 --- /dev/null +++ b/lessons/193/2-example/1-service.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + type: ClusterIP + ports: + - port: 7070 + targetPort: 8080 + selector: + app: my-app diff --git a/lessons/193/3-example/0-deployment.yaml b/lessons/193/3-example/0-deployment.yaml new file mode 100644 index 00000000..cff32612 --- /dev/null +++ b/lessons/193/3-example/0-deployment.yaml @@ -0,0 +1,24 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-blue-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + deployment: blue + template: + metadata: + labels: + app: my-app + deployment: blue + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 diff --git a/lessons/193/3-example/1-service.yaml b/lessons/193/3-example/1-service.yaml new file mode 100644 index 00000000..17f1839b --- /dev/null +++ b/lessons/193/3-example/1-service.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-blue-service +spec: + type: ClusterIP + ports: + - port: 7070 + targetPort: 8080 + selector: + app: my-app + deployment: blue diff --git a/lessons/193/4-example/0-deployment.yaml b/lessons/193/4-example/0-deployment.yaml new file mode 100644 index 00000000..cff32612 --- /dev/null +++ b/lessons/193/4-example/0-deployment.yaml @@ -0,0 +1,24 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-blue-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + deployment: blue + template: + metadata: + labels: + app: my-app + deployment: blue + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 diff --git a/lessons/193/4-example/1-service.yaml b/lessons/193/4-example/1-service.yaml new file mode 100644 index 00000000..13315fb5 --- /dev/null +++ b/lessons/193/4-example/1-service.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-blue-service +spec: + type: ClusterIP + ports: + - port: 8080 + selector: + app: my-app + deployment: blue diff --git a/lessons/193/5-example/0-deployment.yaml b/lessons/193/5-example/0-deployment.yaml new file mode 100644 index 00000000..432996d1 --- /dev/null +++ b/lessons/193/5-example/0-deployment.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - name: web + containerPort: 8080 diff --git a/lessons/193/5-example/1-service.yaml b/lessons/193/5-example/1-service.yaml new file mode 100644 index 00000000..5e53773e --- /dev/null +++ b/lessons/193/5-example/1-service.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + type: ClusterIP + ports: + - port: 8080 + targetPort: web + selector: + app: my-app diff --git a/lessons/193/6-example/0-deployment.yaml b/lessons/193/6-example/0-deployment.yaml new file mode 100644 index 00000000..2c539067 --- /dev/null +++ b/lessons/193/6-example/0-deployment.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: dep1 +spec: + replicas: 2 + selector: + matchLabels: + app: my-app1 + template: + metadata: + labels: + app: my-app1 + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 diff --git a/lessons/193/6-example/1-service.yaml b/lessons/193/6-example/1-service.yaml new file mode 100644 index 00000000..8fe15c9e --- /dev/null +++ b/lessons/193/6-example/1-service.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + type: ClusterIP + ports: + - port: 7070 + targetPort: 8080 + selector: + app: my-app1 diff --git a/lessons/193/6-example/2-deployment.yaml b/lessons/193/6-example/2-deployment.yaml new file mode 100644 index 00000000..0996a2e5 --- /dev/null +++ b/lessons/193/6-example/2-deployment.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: dep2 +spec: + replicas: 2 + selector: + matchLabels: + app: my-app2 + template: + metadata: + labels: + app: my-app2 + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 diff --git a/lessons/193/7-example/0-deployment.yaml b/lessons/193/7-example/0-deployment.yaml new file mode 100644 index 00000000..79f1c35e --- /dev/null +++ b/lessons/193/7-example/0-deployment.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 diff --git a/lessons/193/7-example/1-service.yaml b/lessons/193/7-example/1-service.yaml new file mode 100644 index 00000000..9a06fc11 --- /dev/null +++ b/lessons/193/7-example/1-service.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + type: ClusterIP + ports: + - port: 7070 + targetPort: 8080 + selector: + app: my-app diff --git a/lessons/193/7-example/2-ingress.yaml b/lessons/193/7-example/2-ingress.yaml new file mode 100644 index 00000000..bf6b62cd --- /dev/null +++ b/lessons/193/7-example/2-ingress.yaml @@ -0,0 +1,16 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: my-ingress +spec: + rules: + - http: + paths: + - pathType: Prefix + path: / + backend: + service: + name: my-service + port: + number: 7070 diff --git a/lessons/193/8-example/0-deployment.yaml b/lessons/193/8-example/0-deployment.yaml new file mode 100644 index 00000000..432996d1 --- /dev/null +++ b/lessons/193/8-example/0-deployment.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - name: web + containerPort: 8080 diff --git a/lessons/193/8-example/1-service.yaml b/lessons/193/8-example/1-service.yaml new file mode 100644 index 00000000..d579d10f --- /dev/null +++ b/lessons/193/8-example/1-service.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service + labels: + app: my-app-service +spec: + type: ClusterIP + ports: + - name: http + port: 7070 + targetPort: web + selector: + app: my-app diff --git a/lessons/193/8-example/2-service-monitor.yaml b/lessons/193/8-example/2-service-monitor.yaml new file mode 100644 index 00000000..544a06ba --- /dev/null +++ b/lessons/193/8-example/2-service-monitor.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: my-app +spec: + endpoints: + - port: http + selector: + matchLabels: + app: my-app-service diff --git a/lessons/193/9-example/0-deployment.yaml b/lessons/193/9-example/0-deployment.yaml new file mode 100644 index 00000000..79f1c35e --- /dev/null +++ b/lessons/193/9-example/0-deployment.yaml @@ -0,0 +1,22 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: my-deployment + labels: + team: dev1 +spec: + replicas: 1 + selector: + matchLabels: + app: my-app + template: + metadata: + labels: + app: my-app + spec: + containers: + - image: aputra/myapp-193:v6 + name: my-container-1 + ports: + - containerPort: 8080 diff --git a/lessons/193/9-example/1-service.yaml b/lessons/193/9-example/1-service.yaml new file mode 100644 index 00000000..9a06fc11 --- /dev/null +++ b/lessons/193/9-example/1-service.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: my-service +spec: + type: ClusterIP + ports: + - port: 7070 + targetPort: 8080 + selector: + app: my-app diff --git a/lessons/193/9-example/2-ingress.yaml b/lessons/193/9-example/2-ingress.yaml new file mode 100644 index 00000000..ab195279 --- /dev/null +++ b/lessons/193/9-example/2-ingress.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: my-ingress +spec: + rules: + - host: api.example.pvt + http: + paths: + - pathType: Prefix + path: / + backend: + service: + name: my-service + port: + number: 7070 diff --git a/lessons/193/README.md b/lessons/193/README.md new file mode 100644 index 00000000..6e0b65a5 --- /dev/null +++ b/lessons/193/README.md @@ -0,0 +1,3 @@ +# How to debug Kubernetes? (Deployments, Services & Ingress) + +You can find tutorial [here](https://youtu.be/hixs2GIGrUw). diff --git a/lessons/193/myapp/.dockerignore b/lessons/193/myapp/.dockerignore new file mode 100644 index 00000000..94810d00 --- /dev/null +++ b/lessons/193/myapp/.dockerignore @@ -0,0 +1,5 @@ +* +!target/*-runner +!target/*-runner.jar +!target/lib/* +!target/quarkus-app/* \ No newline at end of file diff --git a/lessons/193/myapp/.gitignore b/lessons/193/myapp/.gitignore new file mode 100644 index 00000000..8c7863e7 --- /dev/null +++ b/lessons/193/myapp/.gitignore @@ -0,0 +1,43 @@ +#Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +release.properties +.flattened-pom.xml + +# Eclipse +.project +.classpath +.settings/ +bin/ + +# IntelliJ +.idea +*.ipr +*.iml +*.iws + +# NetBeans +nb-configuration.xml + +# Visual Studio Code +.vscode +.factorypath + +# OSX +.DS_Store + +# Vim +*.swp +*.swo + +# patch +*.orig +*.rej + +# Local environment +.env + +# Plugin directory +/.quarkus/cli/plugins/ diff --git a/lessons/193/myapp/.idea/misc.xml b/lessons/193/myapp/.idea/misc.xml new file mode 100644 index 00000000..2f6f633c --- /dev/null +++ b/lessons/193/myapp/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lessons/193/myapp/.idea/vcs.xml b/lessons/193/myapp/.idea/vcs.xml new file mode 100644 index 00000000..c2365ab1 --- /dev/null +++ b/lessons/193/myapp/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lessons/193/myapp/.mvn/wrapper/.gitignore b/lessons/193/myapp/.mvn/wrapper/.gitignore new file mode 100644 index 00000000..e72f5e8b --- /dev/null +++ b/lessons/193/myapp/.mvn/wrapper/.gitignore @@ -0,0 +1 @@ +maven-wrapper.jar diff --git a/lessons/193/myapp/.mvn/wrapper/MavenWrapperDownloader.java b/lessons/193/myapp/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 00000000..84d1e60d --- /dev/null +++ b/lessons/193/myapp/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,98 @@ +/* + * 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. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +public final class MavenWrapperDownloader +{ + private static final String WRAPPER_VERSION = "3.2.0"; + + private static final boolean VERBOSE = Boolean.parseBoolean( System.getenv( "MVNW_VERBOSE" ) ); + + public static void main( String[] args ) + { + log( "Apache Maven Wrapper Downloader " + WRAPPER_VERSION ); + + if ( args.length != 2 ) + { + System.err.println( " - ERROR wrapperUrl or wrapperJarPath parameter missing" ); + System.exit( 1 ); + } + + try + { + log( " - Downloader started" ); + final URL wrapperUrl = new URL( args[0] ); + final String jarPath = args[1].replace( "..", "" ); // Sanitize path + final Path wrapperJarPath = Paths.get( jarPath ).toAbsolutePath().normalize(); + downloadFileFromURL( wrapperUrl, wrapperJarPath ); + log( "Done" ); + } + catch ( IOException e ) + { + System.err.println( "- Error downloading: " + e.getMessage() ); + if ( VERBOSE ) + { + e.printStackTrace(); + } + System.exit( 1 ); + } + } + + private static void downloadFileFromURL( URL wrapperUrl, Path wrapperJarPath ) + throws IOException + { + log( " - Downloading to: " + wrapperJarPath ); + if ( System.getenv( "MVNW_USERNAME" ) != null && System.getenv( "MVNW_PASSWORD" ) != null ) + { + final String username = System.getenv( "MVNW_USERNAME" ); + final char[] password = System.getenv( "MVNW_PASSWORD" ).toCharArray(); + Authenticator.setDefault( new Authenticator() + { + @Override + protected PasswordAuthentication getPasswordAuthentication() + { + return new PasswordAuthentication( username, password ); + } + } ); + } + try ( InputStream inStream = wrapperUrl.openStream() ) + { + Files.copy( inStream, wrapperJarPath, StandardCopyOption.REPLACE_EXISTING ); + } + log( " - Downloader complete" ); + } + + private static void log( String msg ) + { + if ( VERBOSE ) + { + System.out.println( msg ); + } + } + +} diff --git a/lessons/193/myapp/.mvn/wrapper/maven-wrapper.properties b/lessons/193/myapp/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..346d645f --- /dev/null +++ b/lessons/193/myapp/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# 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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/lessons/193/myapp/README.md b/lessons/193/myapp/README.md new file mode 100644 index 00000000..ea0ae719 --- /dev/null +++ b/lessons/193/myapp/README.md @@ -0,0 +1,56 @@ +# myapp + +This project uses Quarkus, the Supersonic Subatomic Java Framework. + +If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ . + +## Running the application in dev mode + +You can run your application in dev mode that enables live coding using: +```shell script +./mvnw compile quarkus:dev +``` + +> **_NOTE:_** Quarkus now ships with a Dev UI, which is available in dev mode only at http://localhost:8080/q/dev/. + +## Packaging and running the application + +The application can be packaged using: +```shell script +./mvnw package +``` +It produces the `quarkus-run.jar` file in the `target/quarkus-app/` directory. +Be aware that it’s not an _über-jar_ as the dependencies are copied into the `target/quarkus-app/lib/` directory. + +The application is now runnable using `java -jar target/quarkus-app/quarkus-run.jar`. + +If you want to build an _über-jar_, execute the following command: +```shell script +./mvnw package -Dquarkus.package.type=uber-jar +``` + +The application, packaged as an _über-jar_, is now runnable using `java -jar target/*-runner.jar`. + +## Creating a native executable + +You can create a native executable using: +```shell script +./mvnw package -Dnative +``` + +Or, if you don't have GraalVM installed, you can run the native executable build in a container using: +```shell script +./mvnw package -Dnative -Dquarkus.native.container-build=true +``` + +You can then execute your native executable with: `./target/myapp-0.1.0-runner` + +If you want to learn more about building native executables, please consult https://quarkus.io/guides/maven-tooling. + +## Provided Code + +### REST + +Easily start your REST Web Services + +[Related guide section...](https://quarkus.io/guides/getting-started-reactive#reactive-jax-rs-resources) diff --git a/lessons/193/myapp/mvnw b/lessons/193/myapp/mvnw new file mode 100755 index 00000000..8d937f4c --- /dev/null +++ b/lessons/193/myapp/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/lessons/193/myapp/mvnw.cmd b/lessons/193/myapp/mvnw.cmd new file mode 100644 index 00000000..c4586b56 --- /dev/null +++ b/lessons/193/myapp/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/lessons/193/myapp/pom.xml b/lessons/193/myapp/pom.xml new file mode 100644 index 00000000..30946174 --- /dev/null +++ b/lessons/193/myapp/pom.xml @@ -0,0 +1,129 @@ + + + 4.0.0 + com.antonputra + myapp + 0.1.0 + + + 3.12.1 + 21 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.9.3 + true + 3.2.5 + + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + + + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-rest + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + io.quarkus + quarkus-rest-jackson + + + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + -parameters + + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + native + + + native + + + + false + native + + + + diff --git a/lessons/193/myapp/src/main/docker/Dockerfile.jvm b/lessons/193/myapp/src/main/docker/Dockerfile.jvm new file mode 100644 index 00000000..958774bf --- /dev/null +++ b/lessons/193/myapp/src/main/docker/Dockerfile.jvm @@ -0,0 +1,97 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/myapp-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/myapp-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/myapp-jvm +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-21:1.18 + +ENV LANGUAGE='en_US:en' + + +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 target/quarkus-app/*.jar /deployments/ +COPY --chown=185 target/quarkus-app/app/ /deployments/app/ +COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] + diff --git a/lessons/193/myapp/src/main/docker/Dockerfile.legacy-jar b/lessons/193/myapp/src/main/docker/Dockerfile.legacy-jar new file mode 100644 index 00000000..de0e0bec --- /dev/null +++ b/lessons/193/myapp/src/main/docker/Dockerfile.legacy-jar @@ -0,0 +1,93 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package -Dquarkus.package.type=legacy-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/myapp-legacy-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/myapp-legacy-jar +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/myapp-legacy-jar +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-21:1.18 + +ENV LANGUAGE='en_US:en' + + +COPY target/lib/* /deployments/lib/ +COPY target/*-runner.jar /deployments/quarkus-run.jar + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] diff --git a/lessons/193/myapp/src/main/docker/Dockerfile.native b/lessons/193/myapp/src/main/docker/Dockerfile.native new file mode 100644 index 00000000..1b3f4348 --- /dev/null +++ b/lessons/193/myapp/src/main/docker/Dockerfile.native @@ -0,0 +1,27 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# +# Before building the container image run: +# +# ./mvnw package -Dnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/myapp . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/myapp +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.9 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/lessons/193/myapp/src/main/docker/Dockerfile.native-micro b/lessons/193/myapp/src/main/docker/Dockerfile.native-micro new file mode 100644 index 00000000..f4c7387a --- /dev/null +++ b/lessons/193/myapp/src/main/docker/Dockerfile.native-micro @@ -0,0 +1,30 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# It uses a micro base image, tuned for Quarkus native executables. +# It reduces the size of the resulting container image. +# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. +# +# Before building the container image run: +# +# ./mvnw package -Dnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/myapp . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/myapp +# +### +FROM quay.io/quarkus/quarkus-micro-image:2.0 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/lessons/193/myapp/src/main/java/com/antonputra/Device.java b/lessons/193/myapp/src/main/java/com/antonputra/Device.java new file mode 100644 index 00000000..57c7d6a9 --- /dev/null +++ b/lessons/193/myapp/src/main/java/com/antonputra/Device.java @@ -0,0 +1,17 @@ +package com.antonputra; + +public class Device { + + public String uuid; + public String mac; + public String firmware; + + public Device() { + } + + public Device(String uuid, String mac, String firmware) { + this.uuid = uuid; + this.mac = mac; + this.firmware = firmware; + } +} diff --git a/lessons/193/myapp/src/main/java/com/antonputra/DeviceResource.java b/lessons/193/myapp/src/main/java/com/antonputra/DeviceResource.java new file mode 100644 index 00000000..afbb4709 --- /dev/null +++ b/lessons/193/myapp/src/main/java/com/antonputra/DeviceResource.java @@ -0,0 +1,26 @@ +package com.antonputra; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Set; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("/api/devices") +public class DeviceResource { + + private Set devices = Collections.newSetFromMap(Collections.synchronizedMap(new LinkedHashMap<>())); + + public DeviceResource() { + devices.add(new Device("b0e42fe7-31a5-4894-a441-007e5256afea", "5F-33-CC-1F-43-82", "2.1.6")); + devices.add(new Device("0c3242f5-ae1f-4e0c-a31b-5ec93825b3e7", "EF-2B-C4-F5-D6-34", "2.1.5")); + } + + @GET + public Set list() { + return devices; + } +} diff --git a/lessons/193/myapp/src/main/resources/application.properties b/lessons/193/myapp/src/main/resources/application.properties new file mode 100644 index 00000000..e69de29b