Added movies microservice for Ch 8 EoC Lab
This commit is contained in:
parent
2aa4b3aa52
commit
fe9006dcad
8 changed files with 371 additions and 0 deletions
140
movies/Jenkinsfile
vendored
Normal file
140
movies/Jenkinsfile
vendored
Normal file
|
|
@ -0,0 +1,140 @@
|
||||||
|
pipeline {
|
||||||
|
options {
|
||||||
|
// set a timeout of 60 minutes for this pipeline
|
||||||
|
timeout(time: 60, unit: 'MINUTES')
|
||||||
|
}
|
||||||
|
agent {
|
||||||
|
node {
|
||||||
|
//TODO: Add label for the Maven jenkins agent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
environment {
|
||||||
|
//TODO: Customize these variables for your environment
|
||||||
|
DEV_PROJECT = "youruser-movies-dev"
|
||||||
|
STAGE_PROJECT = "youruser-movies-stage"
|
||||||
|
APP_GIT_URL = "https://github.com/youruser/DO288-apps"
|
||||||
|
NEXUS_SERVER = "http://nexus-common.apps.cluster.domain.example.com/repository/java"
|
||||||
|
|
||||||
|
// DO NOT CHANGE THE GLOBAL VARS BELOW THIS LINE
|
||||||
|
APP_NAME = "movies"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
stages {
|
||||||
|
|
||||||
|
stage('Compilation Check') {
|
||||||
|
steps {
|
||||||
|
echo '### Checking for compile errors ###'
|
||||||
|
sh '''
|
||||||
|
cd ${APP_NAME}
|
||||||
|
mvn -s settings.xml -B clean compile
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Run Unit Tests') {
|
||||||
|
steps {
|
||||||
|
echo '### Running unit tests ###'
|
||||||
|
sh '''
|
||||||
|
cd ${APP_NAME}
|
||||||
|
mvn -s settings.xml -B clean test
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Static Code Analysis') {
|
||||||
|
steps {
|
||||||
|
echo '### Running pmd on code ###'
|
||||||
|
sh '''
|
||||||
|
cd ${APP_NAME}
|
||||||
|
mvn -s settings.xml -B clean pmd:check
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Create fat JAR') {
|
||||||
|
steps {
|
||||||
|
echo '### Creating fat JAR ###'
|
||||||
|
sh '''
|
||||||
|
cd ${APP_NAME}
|
||||||
|
mvn -s settings.xml -B clean package -DskipTests=true
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Launch new app in DEV env') {
|
||||||
|
steps {
|
||||||
|
echo '### Cleaning existing resources in DEV env ###'
|
||||||
|
sh '''
|
||||||
|
oc delete all -l app=${APP_NAME} -n ${DEV_PROJECT}
|
||||||
|
oc delete all -l build=${APP_NAME} -n ${DEV_PROJECT}
|
||||||
|
sleep 5
|
||||||
|
oc new-build java:8 --name=${APP_NAME} --binary=true -n ${DEV_PROJECT}
|
||||||
|
'''
|
||||||
|
|
||||||
|
echo '### Creating a new app in DEV env ###'
|
||||||
|
script {
|
||||||
|
openshift.withCluster() {
|
||||||
|
openshift.withProject(env.DEV_PROJECT) {
|
||||||
|
openshift.selector("bc", "${APP_NAME}").startBuild("--from-file=${APP_NAME}/target/${APP_NAME}.jar", "--wait=true", "--follow=true")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: Create a new OpenShift application based on the ${APP_NAME}:latest image stream
|
||||||
|
// TODO: Expose the ${APP_NAME} service for external access
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Wait for deployment in DEV env') {
|
||||||
|
//TODO: Watch deployment until pod is in 'Running' state
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Promote to Staging Env') {
|
||||||
|
steps {
|
||||||
|
timeout(time: 60, unit: 'MINUTES') {
|
||||||
|
input message: "Promote to Staging?"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
openshift.withCluster() {
|
||||||
|
// TODO: Tag the ${APP_NAME}:latest image stream in the dev env as ${APP_NAME}:stage in staging
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Deploy to Staging Env') {
|
||||||
|
steps {
|
||||||
|
echo '### Cleaning existing resources in Staging ###'
|
||||||
|
sh '''
|
||||||
|
oc project ${STAGE_PROJECT}
|
||||||
|
oc delete all -l app=${APP_NAME}
|
||||||
|
sleep 5
|
||||||
|
'''
|
||||||
|
|
||||||
|
echo '### Creating a new app in Staging ###'
|
||||||
|
// TODO: Create a new app in staging
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Wait for deployment in Staging') {
|
||||||
|
steps {
|
||||||
|
sh "oc get route ${APP_NAME} -n ${STAGE_PROJECT} -o jsonpath='{ .spec.host }' --loglevel=4 > routehost"
|
||||||
|
|
||||||
|
script {
|
||||||
|
routeHost = readFile('routehost').trim()
|
||||||
|
|
||||||
|
openshift.withCluster() {
|
||||||
|
openshift.withProject( "${STAGE_PROJECT}" ) {
|
||||||
|
def deployment = openshift.selector("dc", "${APP_NAME}").rollout()
|
||||||
|
openshift.selector("dc", "${APP_NAME}").related('pods').untilEach(1) {
|
||||||
|
return (it.object().status.phase == "Running")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo "Deployment to Staging env is complete. Access the API endpoint at the URL http://${routeHost}/movies."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
55
movies/pom.xml
Normal file
55
movies/pom.xml
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>2.1.6.RELEASE</version>
|
||||||
|
<relativePath /> <!-- lookup parent from repository -->
|
||||||
|
</parent>
|
||||||
|
<groupId>com.redhat</groupId>
|
||||||
|
<artifactId>movies</artifactId>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
<name>movies</name>
|
||||||
|
<description>Demo project for Spring Boot</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>movies</finalName>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-pmd-plugin</artifactId>
|
||||||
|
<version>3.12.0</version>
|
||||||
|
<configuration>
|
||||||
|
<rulesets>
|
||||||
|
<ruleset>/category/java/bestpractices.xml</ruleset>
|
||||||
|
</rulesets>
|
||||||
|
<failOnViolation>true</failOnViolation>
|
||||||
|
<printFailingErrors>true</printFailingErrors>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
12
movies/settings.xml
Normal file
12
movies/settings.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<settings>
|
||||||
|
<mirrors>
|
||||||
|
<mirror>
|
||||||
|
<id>internal-repository</id>
|
||||||
|
<name>Maven Repository Manager for classroom</name>
|
||||||
|
<!-- // TODO: Change the url attribute to the nexus proxy server URL for your environment. -->
|
||||||
|
<url>http://nexus-common.apps.cluster.domain.example.com/repository/java</url>
|
||||||
|
<mirrorOf>*</mirrorOf>
|
||||||
|
</mirror>
|
||||||
|
</mirrors>
|
||||||
|
</settings>
|
||||||
43
movies/src/main/java/com/redhat/movies/Movie.java
Normal file
43
movies/src/main/java/com/redhat/movies/Movie.java
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.redhat.movies;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Movie implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -3240337073623122124L;
|
||||||
|
|
||||||
|
private Integer movieId;
|
||||||
|
private String name;
|
||||||
|
private String genre;
|
||||||
|
|
||||||
|
public Movie(Integer movieId, String name, String genre) {
|
||||||
|
this.movieId = movieId;
|
||||||
|
this.name = name;
|
||||||
|
this.genre = genre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getMovieId() {
|
||||||
|
return movieId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMovieId(Integer movieId) {
|
||||||
|
this.movieId = movieId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGenre() {
|
||||||
|
return genre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGenre(String genre) {
|
||||||
|
this.genre = genre;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.redhat.movies;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class MoviesApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(MoviesApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
39
movies/src/main/java/com/redhat/movies/MoviesController.java
Normal file
39
movies/src/main/java/com/redhat/movies/MoviesController.java
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
package com.redhat.movies;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/")
|
||||||
|
public class MoviesController {
|
||||||
|
|
||||||
|
private List<Movie> movies;
|
||||||
|
private String status = "OK";
|
||||||
|
private String flag = "READY";
|
||||||
|
|
||||||
|
@GetMapping("/movies")
|
||||||
|
public List<Movie> getAllMovies() {
|
||||||
|
|
||||||
|
//Generate fake static data
|
||||||
|
movies = new ArrayList<Movie>();
|
||||||
|
movies.add(new Movie(1,"The Godfather","Crime/Thriller"));
|
||||||
|
movies.add(new Movie(2,"Star Wars","Sci-Fi"));
|
||||||
|
movies.add(new Movie(3,"The Mask","Comedy"));
|
||||||
|
movies.add(new Movie(4,"Die Hard","Action"));
|
||||||
|
movies.add(new Movie(5,"The Exorcist","Horror"));
|
||||||
|
movies.add(new Movie(6,"The Silence of the Lambs","Drama"));
|
||||||
|
|
||||||
|
return movies;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/status")
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
1
movies/src/main/resources/application.properties
Normal file
1
movies/src/main/resources/application.properties
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
spring.jackson.serialization.indent_output=true
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
package com.redhat.movies;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||||
|
import org.springframework.boot.web.server.LocalServerPort;
|
||||||
|
import org.springframework.core.ParameterizedTypeReference;
|
||||||
|
import org.springframework.http.HttpEntity;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@SpringBootTest(classes = MoviesApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||||
|
public class MoviesApplicationTests {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TestRestTemplate restTemplate;
|
||||||
|
|
||||||
|
@LocalServerPort
|
||||||
|
private int port;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void contextLoads() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNotNullResponse() {
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
HttpEntity<String> entity = new HttpEntity<String>(null, headers);
|
||||||
|
|
||||||
|
ResponseEntity<String> response = restTemplate.exchange("http://localhost:" + port + "/movies", HttpMethod.GET,
|
||||||
|
entity, String.class);
|
||||||
|
|
||||||
|
Assert.assertNotNull(response.getBody());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAllMovies() {
|
||||||
|
|
||||||
|
ResponseEntity <List<Movie>> response = restTemplate.exchange("http://localhost:" + port + "/movies",
|
||||||
|
HttpMethod.GET, null, new ParameterizedTypeReference <List<Movie>> () {});
|
||||||
|
|
||||||
|
List <Movie> movies = response.getBody();
|
||||||
|
Assert.assertNotNull(movies);
|
||||||
|
Assert.assertEquals(7, movies.size());
|
||||||
|
Assert.assertEquals("The Godfather", movies.get(0).getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetStatus() {
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
HttpEntity<String> entity = new HttpEntity<String>(null, headers);
|
||||||
|
|
||||||
|
ResponseEntity<String> response = restTemplate.exchange("http://localhost:" + port + "/status", HttpMethod.GET,
|
||||||
|
entity, String.class);
|
||||||
|
|
||||||
|
Assert.assertNotNull(response.getBody());
|
||||||
|
Assert.assertEquals("Ready", response.getBody());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue