Skip to content

Commit 6d7fd41

Browse files
chore: java web-service example (#233)
Signed-off-by: campionfellin <campionfellin@gmail.com> *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent d872de0 commit 6d7fd41

9 files changed

Lines changed: 276 additions & 8 deletions

File tree

examples/java/hello/cdk8s.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
language: java
2-
app: mvn exec:java -Dexec.mainClass="com.mycompany.app.HelloKube"
2+
app: mvn exec:java -Dexec.mainClass="com.mycompany.app.HelloKube"
33
imports:
4-
- k8s
4+
- k8s

examples/java/hello/pom.xml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<dependency>
1212
<groupId>org.cdk8s</groupId>
1313
<artifactId>cdk8s</artifactId>
14-
<version>0.24.0</version>
14+
<version>0.25.0</version>
1515
</dependency>
1616
<dependency>
1717
<groupId>software.constructs</groupId>
@@ -22,11 +22,6 @@
2222
<groupId>com.google.guava</groupId>
2323
<artifactId>guava</artifactId>
2424
<version>29.0-jre</version>
25-
</dependency>
26-
<dependency>
27-
<groupId>software.amazon.jsii</groupId>
28-
<artifactId>jsii-runtime</artifactId>
29-
<version>1.5.0</version>
3025
</dependency>
3126
</dependencies>
3227
<properties>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
nodes_modules/
2+
.settings/
3+
imports/
4+
target/
5+
.classpath
6+
.project
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
language: java
2+
app: mvn exec:java -Dexec.mainClass="com.mycompany.app.HelloKube"
3+
imports:
4+
- k8s
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"name": "web-service-java",
3+
"version": "0.0.0",
4+
"license": "Apache-2.0",
5+
"private": true,
6+
"scripts": {
7+
"build": "cdk8s import --language java",
8+
"synth": "mvn install && mvn compile && cdk8s synth",
9+
"test": "echo 'no test for java yet.'"
10+
},
11+
"dependencies": {
12+
"cdk8s": "0.0.0",
13+
"constructs": "^2.0.2"
14+
},
15+
"devDependencies": {
16+
"cdk8s-cli": "0.0.0"
17+
}
18+
}

examples/java/web-service/pom.xml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>com.mycompany.app</groupId>
5+
<artifactId>my-app</artifactId>
6+
<packaging>jar</packaging>
7+
<version>1.0-SNAPSHOT</version>
8+
<name>my-app</name>
9+
<url>http://maven.apache.org</url>
10+
<dependencies>
11+
<dependency>
12+
<groupId>org.cdk8s</groupId>
13+
<artifactId>cdk8s</artifactId>
14+
<version>0.25.0</version>
15+
</dependency>
16+
<dependency>
17+
<groupId>software.constructs</groupId>
18+
<artifactId>constructs</artifactId>
19+
<version>2.0.2</version>
20+
</dependency>
21+
<dependency>
22+
<groupId>com.google.guava</groupId>
23+
<artifactId>guava</artifactId>
24+
<version>29.0-jre</version>
25+
</dependency>
26+
</dependencies>
27+
<properties>
28+
<maven.compiler.source>1.8</maven.compiler.source>
29+
<maven.compiler.target>1.8</maven.compiler.target>
30+
</properties>
31+
<build>
32+
<sourceDirectory>src/main/java</sourceDirectory>
33+
<testSourceDirectory>src/test/java</testSourceDirectory>
34+
</build>
35+
</project>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.mycompany.app;
2+
3+
import software.constructs.Construct;
4+
5+
import org.cdk8s.App;
6+
import org.cdk8s.Chart;
7+
import org.cdk8s.ChartOptions;
8+
9+
/**
10+
* Hello world!
11+
*/
12+
public class HelloKube extends Chart
13+
{
14+
15+
public HelloKube(final Construct scope, final String id) {
16+
this(scope, id, null);
17+
}
18+
19+
public HelloKube(final Construct scope, final String id, final ChartOptions options) {
20+
super(scope, id, options);
21+
22+
final WebServiceOptions helloOptions = new WebServiceOptions.Builder()
23+
.image("paulbouwer/hello-kubernetes:1.7")
24+
.replicas(2)
25+
.build();
26+
27+
new WebService(this, "hello", helloOptions);
28+
29+
final WebServiceOptions ghostOptions = new WebServiceOptions.Builder()
30+
.image("ghost")
31+
.containerPort(2368)
32+
.build();
33+
34+
new WebService(this, "ghost", ghostOptions);
35+
}
36+
37+
public static void main(String[] args) {
38+
final App app = new App();
39+
new HelloKube(app, "web-service-java");
40+
app.synth();
41+
}
42+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package com.mycompany.app;
2+
3+
import software.constructs.Construct;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
import java.util.Optional;
10+
11+
import org.cdk8s.App;
12+
import org.cdk8s.Chart;
13+
import org.cdk8s.ChartOptions;
14+
15+
import imports.k8s.IntOrString;
16+
import imports.k8s.LabelSelector;
17+
import imports.k8s.ObjectMeta;
18+
import imports.k8s.PodTemplateSpec;
19+
import imports.k8s.Service;
20+
import imports.k8s.ServiceOptions;
21+
import imports.k8s.ServicePort;
22+
import imports.k8s.ServiceSpec;
23+
import imports.k8s.DeploymentSpec;
24+
import imports.k8s.PodSpec;
25+
import imports.k8s.Container;
26+
import imports.k8s.ContainerPort;
27+
import imports.k8s.Deployment;
28+
import imports.k8s.DeploymentOptions;
29+
30+
/**
31+
* Hello world!
32+
*/
33+
public class WebService extends Construct
34+
{
35+
36+
public WebService(final Construct scope, final String id) {
37+
this(scope, id, null);
38+
}
39+
40+
public WebService(final Construct scope, final String id, final WebServiceOptions options) {
41+
super(scope, id);
42+
43+
final int portNumber = Optional.of(options.getPort()).orElse(80);
44+
final int containerPortNumber = Optional.of(options.getContainerPort()).orElse(8080);
45+
final int replicas = Optional.of(options.getReplicas()).orElse(1);
46+
final String image = options.getImage();
47+
48+
// Defining a LoadBalancer Service
49+
final String serviceType = "LoadBalancer";
50+
final Map<String, String> selector = new HashMap<>();
51+
selector.put("app", "hello-k8s");
52+
final List<ServicePort> servicePorts = new ArrayList<>();
53+
final ServicePort servicePort = new ServicePort.Builder()
54+
.port(portNumber)
55+
.targetPort(IntOrString.fromNumber(containerPortNumber))
56+
.build();
57+
servicePorts.add(servicePort);
58+
final ServiceSpec serviceSpec = new ServiceSpec.Builder()
59+
.type(serviceType)
60+
.selector(selector)
61+
.ports(servicePorts)
62+
.build();
63+
final ServiceOptions serviceOptions = new ServiceOptions.Builder()
64+
.spec(serviceSpec)
65+
.build();
66+
67+
new Service(this, "service", serviceOptions);
68+
69+
// Defining a Deployment
70+
final LabelSelector labelSelector = new LabelSelector.Builder().matchLabels(selector).build();
71+
final ObjectMeta objectMeta = new ObjectMeta.Builder().labels(selector).build();
72+
final List<ContainerPort> containerPorts = new ArrayList<>();
73+
final ContainerPort containerPort = new ContainerPort.Builder()
74+
.containerPort(containerPortNumber)
75+
.build();
76+
containerPorts.add(containerPort);
77+
final List<Container> containers = new ArrayList<>();
78+
final Container container = new Container.Builder()
79+
.name("web")
80+
.image(image)
81+
.ports(containerPorts)
82+
.build();
83+
containers.add(container);
84+
final PodSpec podSpec = new PodSpec.Builder()
85+
.containers(containers)
86+
.build();
87+
final PodTemplateSpec podTemplateSpec = new PodTemplateSpec.Builder()
88+
.metadata(objectMeta)
89+
.spec(podSpec)
90+
.build();
91+
final DeploymentSpec deploymentSpec = new DeploymentSpec.Builder()
92+
.replicas(1)
93+
.selector(labelSelector)
94+
.template(podTemplateSpec)
95+
.build();
96+
final DeploymentOptions deploymentOptions = new DeploymentOptions.Builder()
97+
.spec(deploymentSpec)
98+
.build();
99+
100+
new Deployment(this, "deployment", deploymentOptions);
101+
102+
}
103+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.mycompany.app;
2+
3+
import software.constructs.Construct;
4+
5+
public class WebServiceOptions
6+
{
7+
private String image;
8+
private int replicas;
9+
private int port;
10+
private int containerPort;
11+
12+
public WebServiceOptions(final String image, final int replicas, final int port, final int containerPort) {
13+
this.image = image;
14+
this.replicas = replicas;
15+
this.port = port;
16+
this.containerPort = containerPort;
17+
}
18+
19+
public String getImage() {
20+
return this.image;
21+
}
22+
23+
public int getReplicas() {
24+
return this.replicas;
25+
}
26+
27+
public int getPort() {
28+
return this.port;
29+
}
30+
31+
public int getContainerPort() {
32+
return this.containerPort;
33+
}
34+
35+
public static final class Builder {
36+
private String image;
37+
private int replicas = 1;
38+
private int port = 80;
39+
private int containerPort = 8080;
40+
41+
public Builder image(String image) {
42+
this.image = image;
43+
return this;
44+
}
45+
46+
public Builder replicas(int replicas) {
47+
this.replicas = replicas;
48+
return this;
49+
}
50+
51+
public Builder port(int port) {
52+
this.port = port;
53+
return this;
54+
}
55+
56+
public Builder containerPort(int containerPort) {
57+
this.containerPort = containerPort;
58+
return this;
59+
}
60+
61+
public WebServiceOptions build() {
62+
return new WebServiceOptions(image, replicas, port, containerPort);
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)