Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 8 additions & 18 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,11 @@
services:
mysql:
image: mysql:9.1
redis:
image: redis:7.2
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=
- MYSQL_ALLOW_EMPTY_PASSWORD=true
- MYSQL_USER=petclinic
- MYSQL_PASSWORD=petclinic
- MYSQL_DATABASE=petclinic
- "6379:6379"
volumes:
- "./conf.d:/etc/mysql/conf.d:ro"
postgres:
image: postgres:17.0
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=petclinic
- POSTGRES_USER=petclinic
- POSTGRES_DB=petclinic
- redis-data:/data
command: redis-server --appendonly yes

volumes:
redis-data:
50 changes: 19 additions & 31 deletions k8s/db.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,12 @@ apiVersion: v1
kind: Secret
metadata:
name: demo-db
type: servicebinding.io/postgresql
type: servicebinding.io/redis
stringData:
type: "postgresql"
provider: "postgresql"
type: "redis"
provider: "redis"
host: "demo-db"
port: "5432"
database: "petclinic"
username: "user"
password: "pass"
port: "6379"

---
apiVersion: v1
Expand All @@ -20,7 +17,7 @@ metadata:
name: demo-db
spec:
ports:
- port: 5432
- port: 6379
selector:
app: demo-db

Expand All @@ -41,33 +38,24 @@ spec:
app: demo-db
spec:
containers:
- image: postgres:17
name: postgresql
env:
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: demo-db
key: username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: demo-db
key: password
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: demo-db
key: database
- image: redis:7.2
name: redis
args: ["--appendonly", "yes"]
ports:
- containerPort: 5432
name: postgresql
- containerPort: 6379
name: redis
livenessProbe:
tcpSocket:
port: postgresql
port: redis
readinessProbe:
tcpSocket:
port: postgresql
port: redis
startupProbe:
tcpSocket:
port: postgresql
port: redis
volumeMounts:
- name: redis-data
mountPath: /data
volumes:
- name: redis-data
emptyDir: {}
2 changes: 1 addition & 1 deletion k8s/petclinic.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ spec:
image: dsyer/petclinic
env:
- name: SPRING_PROFILES_ACTIVE
value: postgres
value: default
- name: SERVICE_BINDING_ROOT
value: /bindings
- name: SPRING_APPLICATION_JSON
Expand Down
21 changes: 5 additions & 16 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
Expand All @@ -77,21 +73,14 @@
<artifactId>reactor-core</artifactId>
</dependency>

<!-- Databases - Uses H2 by default -->
<!-- Redis Database -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>

<!-- Caching -->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.springframework.samples.petclinic.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
* Redis configuration for the application.
*/
@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
package org.springframework.samples.petclinic.config;

import java.time.LocalDate;
import java.util.Arrays;

import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.samples.petclinic.owner.Owner;
import org.springframework.samples.petclinic.owner.Pet;
import org.springframework.samples.petclinic.owner.PetType;
import org.springframework.samples.petclinic.owner.RedisOwnerRepository;
import org.springframework.samples.petclinic.owner.Visit;
import org.springframework.samples.petclinic.vet.RedisVetRepository;
import org.springframework.samples.petclinic.vet.Specialty;
import org.springframework.samples.petclinic.vet.Vet;
import org.springframework.data.redis.core.RedisTemplate;

/**
* Initialize Redis with sample data.
*/
@Configuration
public class RedisDataInitializer {

@Bean
public CommandLineRunner initData(RedisOwnerRepository ownerRepository, RedisVetRepository vetRepository,
RedisTemplate<String, Object> redisTemplate) {
return args -> {
// Clear existing data
redisTemplate.delete("owners");
redisTemplate.delete("vets");
redisTemplate.delete("pet_types");
redisTemplate.delete("owner_id_sequence");
redisTemplate.delete("vet_id_sequence");

// Create pet types
PetType dog = new PetType();
dog.setName("dog");

PetType cat = new PetType();
cat.setName("cat");

PetType bird = new PetType();
bird.setName("bird");

PetType lizard = new PetType();
lizard.setName("lizard");

PetType snake = new PetType();
snake.setName("snake");

PetType hamster = new PetType();
hamster.setName("hamster");

// Save pet types to Redis
redisTemplate.opsForSet().add("pet_types", dog, cat, bird, lizard, snake, hamster);

// Create specialties
Specialty radiology = new Specialty();
radiology.setName("radiology");

Specialty surgery = new Specialty();
surgery.setName("surgery");

Specialty dentistry = new Specialty();
dentistry.setName("dentistry");

// Create vets
Vet vet1 = new Vet();
vet1.setFirstName("James");
vet1.setLastName("Carter");
vetRepository.save(vet1);

Vet vet2 = new Vet();
vet2.setFirstName("Helen");
vet2.setLastName("Leary");
vet2.addSpecialty(radiology);
vetRepository.save(vet2);

Vet vet3 = new Vet();
vet3.setFirstName("Linda");
vet3.setLastName("Douglas");
vet3.addSpecialty(surgery);
vet3.addSpecialty(dentistry);
vetRepository.save(vet3);

Vet vet4 = new Vet();
vet4.setFirstName("Rafael");
vet4.setLastName("Ortega");
vet4.addSpecialty(surgery);
vetRepository.save(vet4);

Vet vet5 = new Vet();
vet5.setFirstName("Henry");
vet5.setLastName("Stevens");
vet5.addSpecialty(radiology);
vetRepository.save(vet5);

Vet vet6 = new Vet();
vet6.setFirstName("Sharon");
vet6.setLastName("Jenkins");
vetRepository.save(vet6);

// Create owners, pets, and visits
Owner owner1 = new Owner();
owner1.setFirstName("George");
owner1.setLastName("Franklin");
owner1.setAddress("110 W. Liberty St.");
owner1.setCity("Madison");
owner1.setTelephone("6085551023");

Pet pet1 = new Pet();
pet1.setName("Leo");
pet1.setBirthDate(LocalDate.now().minusYears(2));
pet1.setType(cat);
owner1.addPet(pet1);

ownerRepository.save(owner1);

Owner owner2 = new Owner();
owner2.setFirstName("Betty");
owner2.setLastName("Davis");
owner2.setAddress("638 Cardinal Ave.");
owner2.setCity("Sun Prairie");
owner2.setTelephone("6085551749");

Pet pet2 = new Pet();
pet2.setName("Basil");
pet2.setBirthDate(LocalDate.now().minusYears(1));
pet2.setType(hamster);
owner2.addPet(pet2);

ownerRepository.save(owner2);

Owner owner3 = new Owner();
owner3.setFirstName("Eduardo");
owner3.setLastName("Rodriquez");
owner3.setAddress("2693 Commerce St.");
owner3.setCity("McFarland");
owner3.setTelephone("6085558763");

Pet pet3 = new Pet();
pet3.setName("Rosy");
pet3.setBirthDate(LocalDate.now().minusYears(3));
pet3.setType(dog);
owner3.addPet(pet3);

ownerRepository.save(owner3);

Owner owner4 = new Owner();
owner4.setFirstName("Harold");
owner4.setLastName("Davis");
owner4.setAddress("563 Friendly St.");
owner4.setCity("Windsor");
owner4.setTelephone("6085553198");

Pet pet4 = new Pet();
pet4.setName("Jewel");
pet4.setBirthDate(LocalDate.now().minusYears(1));
pet4.setType(dog);
owner4.addPet(pet4);

ownerRepository.save(owner4);

Owner owner5 = new Owner();
owner5.setFirstName("Peter");
owner5.setLastName("McTavish");
owner5.setAddress("2387 S. Fair Way");
owner5.setCity("Madison");
owner5.setTelephone("6085552765");

Pet pet5 = new Pet();
pet5.setName("George");
pet5.setBirthDate(LocalDate.now().minusYears(4));
pet5.setType(snake);
owner5.addPet(pet5);

ownerRepository.save(owner5);

Owner owner6 = new Owner();
owner6.setFirstName("Jean");
owner6.setLastName("Coleman");
owner6.setAddress("105 N. Lake St.");
owner6.setCity("Monona");
owner6.setTelephone("6085552654");

Pet pet6 = new Pet();
pet6.setName("Max");
pet6.setBirthDate(LocalDate.now().minusYears(2));
pet6.setType(cat);
owner6.addPet(pet6);

Pet pet7 = new Pet();
pet7.setName("Samantha");
pet7.setBirthDate(LocalDate.now().minusYears(1));
pet7.setType(cat);
owner6.addPet(pet7);

ownerRepository.save(owner6);

// Add visits
Visit visit1 = new Visit();
visit1.setDate(LocalDate.now().minusDays(5));
visit1.setDescription("Sneezing");
pet7.addVisit(visit1);

ownerRepository.save(owner6);
};
}
}
Loading
Loading