litmus core/db/mock packages
Signed-off-by: chandresh pancholi <chandresh.pancholi@navi.com>
This commit is contained in:
16
.gitignore
vendored
16
.gitignore
vendored
@@ -8,4 +8,18 @@ litmus-model/litmus-model.iml
|
||||
litmus-model/target
|
||||
|
||||
litmus-client/litmus-client.iml
|
||||
litmus-client/target
|
||||
litmus-client/target
|
||||
|
||||
litmus-db/litmus-db.iml
|
||||
litmus-db/target
|
||||
|
||||
litmus-mock/litmus-mock.iml
|
||||
litmus-mock/target
|
||||
|
||||
litmus-liquibase/litmus-liquibase.iml
|
||||
litmus-liquibase/target
|
||||
|
||||
litmus-cache/litmus-cache.iml
|
||||
litmus-cache/target
|
||||
|
||||
target
|
||||
23
litmus-cache/pom.xml
Normal file
23
litmus-cache/pom.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?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>
|
||||
<artifactId>litmus</artifactId>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>litmus-cache</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<name>litmus-cache</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson</artifactId>
|
||||
<version>3.16.3</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
32
litmus-cache/src/main/java/com/navi/medici/cache/RedisCache.java
vendored
Normal file
32
litmus-cache/src/main/java/com/navi/medici/cache/RedisCache.java
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
package com.navi.medici.cache;
|
||||
|
||||
import com.navi.medici.command.CacheCommands;
|
||||
import com.navi.medici.config.RedisConfiguration;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.redisson.api.RBloomFilter;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class RedisCache implements CacheCommands {
|
||||
|
||||
private final RedissonClient redissonClient;
|
||||
private final RedisConfiguration redisConfiguration;
|
||||
|
||||
@Override
|
||||
public Boolean reserveBF(String name) {
|
||||
RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter(name);
|
||||
return bloomFilter.tryInit(redisConfiguration.getExpectedInsertions(), redisConfiguration.getFalseProbability());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean add(RBloomFilter<String> bf, String key) {
|
||||
return bf.add(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean contains(RBloomFilter<String> bf, String key) {
|
||||
return bf.contains(key);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.navi.medici.command;
|
||||
|
||||
import org.redisson.api.RBloomFilter;
|
||||
|
||||
public interface CacheCommands {
|
||||
Boolean reserveBF(String name);
|
||||
|
||||
Boolean add(RBloomFilter<String> bf, String key);
|
||||
|
||||
Boolean contains(RBloomFilter<String> bf, String key);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.navi.medici.config;
|
||||
|
||||
import lombok.Data;
|
||||
import org.redisson.config.Config;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
@Data
|
||||
public class RedisConfiguration {
|
||||
@Value("${redis.host}")
|
||||
String redisHost;
|
||||
|
||||
@Value("${redis.port}")
|
||||
Integer redisPort;
|
||||
|
||||
@Value("${redis.expected.insertions}")
|
||||
Long expectedInsertions;
|
||||
|
||||
@Value("${redis.false.probability}")
|
||||
Double falseProbability;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.navi.medici.container;
|
||||
|
||||
import com.navi.medici.config.RedisConfiguration;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.redisson.Redisson;
|
||||
import org.redisson.api.RBloomFilter;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.redisson.config.Config;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class RedisContainer {
|
||||
private final RedisConfiguration redisConfiguration;
|
||||
|
||||
@Bean
|
||||
public RedissonClient redissonClient(Config config) {
|
||||
Config c = new Config();
|
||||
c.useSingleServer()
|
||||
.setAddress(String.format("redis://%s:%s", redisConfiguration.getRedisHost(), redisConfiguration.getRedisPort()));
|
||||
|
||||
return Redisson.create(config);
|
||||
}
|
||||
|
||||
|
||||
@Bean
|
||||
public RBloomFilter<String> bloomFilter(RedissonClient client) {
|
||||
RBloomFilter<String> bloomFilter = client.getBloomFilter("sample");
|
||||
bloomFilter.tryInit(55000000L, 0.03);
|
||||
|
||||
return bloomFilter;
|
||||
}
|
||||
}
|
||||
20
litmus-cache/src/test/java/com/navi/medici/AppTest.java
Normal file
20
litmus-cache/src/test/java/com/navi/medici/AppTest.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package com.navi.medici;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class AppTest
|
||||
{
|
||||
/**
|
||||
* Rigorous Test :-)
|
||||
*/
|
||||
@Test
|
||||
public void shouldAnswerWithTrue()
|
||||
{
|
||||
assertTrue( true );
|
||||
}
|
||||
}
|
||||
@@ -40,11 +40,11 @@
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.navi.medici.utils</groupId>
|
||||
<artifactId>event-bus-client</artifactId>
|
||||
<version>0.1.3-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.navi.medici.utils</groupId>-->
|
||||
<!-- <artifactId>event-bus-client</artifactId>-->
|
||||
<!-- <version>0.1.3-SNAPSHOT</version>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
<dependency>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
@@ -65,11 +65,17 @@
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.11</version>
|
||||
<scope>test</scope>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-core</artifactId>
|
||||
<version>2.14.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.8.8</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
@@ -31,7 +31,7 @@ public class HttpExperimentFetcher implements ExperimentFetcher {
|
||||
.build();
|
||||
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
if (response.code() > 300) {
|
||||
if (response.code() < 300) {
|
||||
var responseBody = response.body();
|
||||
assert responseBody != null;
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ public class LitmusExperimentRepository implements ExperimentRepository {
|
||||
ready = true;
|
||||
}
|
||||
} catch (LitmusException e) {
|
||||
log.error("litmus exception failed.");
|
||||
log.error("litmus exception failed.", e);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -5,7 +5,11 @@ import com.navi.medici.util.StrategyUtils;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Supplier;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Log4j2
|
||||
public class FlexibleRolloutStrategy implements Strategy {
|
||||
|
||||
protected static final String PERCENTAGE = "rollout";
|
||||
@@ -17,9 +21,6 @@ public class FlexibleRolloutStrategy implements Strategy {
|
||||
this.randomGenerator = () -> Math.random() * 100 + "";
|
||||
}
|
||||
|
||||
public FlexibleRolloutStrategy(Supplier<String> randomGenerator) {
|
||||
this.randomGenerator = randomGenerator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
|
||||
@@ -11,7 +11,7 @@ public class LitmusURLs {
|
||||
public LitmusURLs(URI litmusAPI) {
|
||||
try {
|
||||
String litmusAPIstr = litmusAPI.toString();
|
||||
fetchExperimentsURL = URI.create(litmusAPIstr + "/client/experiments").normalize().toURL();
|
||||
fetchExperimentsURL = URI.create(litmusAPIstr + "/experiments").normalize().toURL();
|
||||
|
||||
} catch (MalformedURLException ex) {
|
||||
throw new IllegalArgumentException("Litmus API is not a valid URL: " + litmusAPI);
|
||||
|
||||
@@ -25,7 +25,44 @@
|
||||
<url>${nexus.host}/repository/maven-snapshots</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
<artifactId>litmus-model</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
<artifactId>litmus-db</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
<artifactId>litmus-cache</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-webflux</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>javax.servlet-api</artifactId>
|
||||
<version>4.0.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>software.amazon.awssdk</groupId>
|
||||
<artifactId>s3</artifactId>
|
||||
<version>2.17.51</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.navi.medici.utils</groupId>
|
||||
<artifactId>event-bus-client</artifactId>
|
||||
@@ -35,7 +72,7 @@
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.11</version>
|
||||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.navi.medici;
|
||||
|
||||
/**
|
||||
* Hello world!
|
||||
*/
|
||||
public class App {
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Hello World!");
|
||||
}
|
||||
}
|
||||
12
litmus-core/src/main/java/com/navi/medici/LitmusApp.java
Normal file
12
litmus-core/src/main/java/com/navi/medici/LitmusApp.java
Normal file
@@ -0,0 +1,12 @@
|
||||
package com.navi.medici;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class LitmusApp {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(LitmusApp.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.navi.medici.container;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.stereotype.Component;
|
||||
import software.amazon.awssdk.regions.Region;
|
||||
import software.amazon.awssdk.services.s3.S3Client;
|
||||
|
||||
@Component
|
||||
public class S3Container {
|
||||
@Bean
|
||||
public S3Client amazonS3(@Value("${report.s3.region}") String region) {
|
||||
return S3Client.builder()
|
||||
.region(Region.AP_SOUTH_1)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.navi.medici.controller.v1;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/v1/experiments")
|
||||
public class ExperimentController {
|
||||
|
||||
@PostMapping(value = "/create", consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||
public void createExperiment() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@GetMapping
|
||||
public String fetchExperiments() {
|
||||
String result = "{\"features\":[{\"name\":\"test-offer\",\"enabled\":true,\"strategies\":[{\"name\":\"flexibleRollout\","
|
||||
+ "\"parameters\":{\"rollout\":\"24\",\"stickiness\":\"random\",\"groupId\":\"test-offer\"},\"constraints\":[]}],\"variants\":[]},{\"name\":\"test-v1\",\"enabled\":true,\"strategies\":[{\"name\":\"default\",\"parameters\":{}}],\"variants\":[]}],\"version\":1}";
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.navi.medici.controller.v1;
|
||||
|
||||
import com.navi.medici.request.v1.SegmentRequest;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/v1/bucket")
|
||||
public class SegmentController {
|
||||
|
||||
|
||||
@PostMapping(value = "/create")
|
||||
public void createSegment(@RequestParam("file") MultipartFile file,
|
||||
@RequestParam("segment") SegmentRequest segmentRequest) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
18
litmus-core/src/main/resources/application.properties
Normal file
18
litmus-core/src/main/resources/application.properties
Normal file
@@ -0,0 +1,18 @@
|
||||
spring.datasource.hikari.maximum-pool-size=${DB_POOL_MAX_SIZE:2}
|
||||
spring.datasource.hikari.minimum-idle=${DB_POOL_MIN_IDLE:1}
|
||||
spring.datasource.hikari.idle-timeout=${DB_POOL_IDLE_TIMEOUT_IN_MS:30000}
|
||||
spring.datasource.url=${DATASOURCE_URL:jdbc:postgresql://localhost:5432/santa}?stringtype=unspecified
|
||||
spring.datasource.username=${DATASOURCE_USERNAME:postgres}
|
||||
spring.datasource.password=${DATASOURCE_PASSWORD:admin}
|
||||
spring.datasource.initialization-mode=${DATA_INITIALIZATION_MODE:never}
|
||||
spring.jpa.hibernate.ddl-auto=none
|
||||
#spring.jpa.properties.hibernate.generate_statistics]=true
|
||||
#spring.jpa.properties.hibernate.show_sql=true
|
||||
#spring.jpa.properties.hibernate.use_sql_comments=true
|
||||
#spring.jpa.properties.hibernate.format_sql=true
|
||||
|
||||
|
||||
kafka.servers=${KAFKA_SERVER:localhost:9092}
|
||||
audit.kafka.servers=${AUDIT_KAFKA_SERVER:localhost:9092}
|
||||
kafka.auditlog.topic=${AUDIT_LOG_TOPIC:audit-logs}
|
||||
kms.base-url=${KMS_BASE_URL:http://google.com}
|
||||
11
litmus-core/src/main/resources/log4j2.properties
Normal file
11
litmus-core/src/main/resources/log4j2.properties
Normal file
@@ -0,0 +1,11 @@
|
||||
appenders=console
|
||||
appender.console.type=Console
|
||||
appender.console.name=STDOUT
|
||||
appender.console.layout.type=EcsLayout
|
||||
appender.console.layout.serviceName=litmus
|
||||
appender.console.layout.topLevelLabels=correlationId,customerId
|
||||
|
||||
rootLogger.level=info
|
||||
rootLogger.appenderRef.stdout.ref=STDOUT
|
||||
logger.medici.name=com.navi.medici
|
||||
logger.medici.level=info
|
||||
36
litmus-db/pom.xml
Normal file
36
litmus-db/pom.xml
Normal file
@@ -0,0 +1,36 @@
|
||||
<?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>
|
||||
<artifactId>litmus</artifactId>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>litmus-db</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<name>litmus-db</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>42.2.20</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.11</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
</project>
|
||||
13
litmus-db/src/main/java/com/navi/medici/App.java
Normal file
13
litmus-db/src/main/java/com/navi/medici/App.java
Normal file
@@ -0,0 +1,13 @@
|
||||
package com.navi.medici;
|
||||
|
||||
/**
|
||||
* Hello world!
|
||||
*
|
||||
*/
|
||||
public class App
|
||||
{
|
||||
public static void main( String[] args )
|
||||
{
|
||||
System.out.println( "Hello World!" );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.navi.medici.entity;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.Version;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.FieldDefaults;
|
||||
import org.hibernate.annotations.CreationTimestamp;
|
||||
import org.hibernate.annotations.UpdateTimestamp;
|
||||
|
||||
@Entity
|
||||
@Table(name = "experiments")
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@FieldDefaults(level = AccessLevel.PRIVATE)
|
||||
public class ExperimentEntity {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
Long id;
|
||||
|
||||
@Column(name = "experiment_id")
|
||||
String experimentId;
|
||||
|
||||
@Column(name = "name")
|
||||
String name;
|
||||
|
||||
@Column(name = "enabled")
|
||||
Boolean enabled;
|
||||
|
||||
@Column(name = "description")
|
||||
String description;
|
||||
|
||||
@Column(name = "archived")
|
||||
Boolean archived;
|
||||
|
||||
@Column(name = "strategies")
|
||||
String strategies;
|
||||
|
||||
@Column(name = "variants")
|
||||
String variants;
|
||||
|
||||
@Column(name = "type")
|
||||
String type;
|
||||
|
||||
@Column(name = "start_time")
|
||||
LocalDateTime startTime;
|
||||
|
||||
@Column(name = "end_time")
|
||||
LocalDateTime endTime;
|
||||
|
||||
@Version
|
||||
private Integer version;
|
||||
|
||||
@Column(name = "created_at")
|
||||
@CreationTimestamp
|
||||
LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "updated_at")
|
||||
@UpdateTimestamp
|
||||
LocalDateTime updatedAt;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.navi.medici.entity;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.Version;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.FieldDefaults;
|
||||
import org.hibernate.annotations.CreationTimestamp;
|
||||
import org.hibernate.annotations.UpdateTimestamp;
|
||||
|
||||
@Entity
|
||||
@Table(name = "segments")
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@FieldDefaults(level = AccessLevel.PRIVATE)
|
||||
public class SegmentEntity {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(name = "segment_id")
|
||||
String segmentId;
|
||||
|
||||
@Column(name = "name")
|
||||
String segmentName;
|
||||
|
||||
@Column(name = "description")
|
||||
String segmentDescription;
|
||||
|
||||
@Column(name = "bucket")
|
||||
String destinationBucket;
|
||||
|
||||
@Version
|
||||
private Integer version;
|
||||
|
||||
@Column(name = "created_at")
|
||||
@CreationTimestamp
|
||||
LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "updated_at")
|
||||
@UpdateTimestamp
|
||||
LocalDateTime updatedAt;
|
||||
}
|
||||
20
litmus-db/src/test/java/com/navi/medici/AppTest.java
Normal file
20
litmus-db/src/test/java/com/navi/medici/AppTest.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package com.navi.medici;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class AppTest
|
||||
{
|
||||
/**
|
||||
* Rigorous Test :-)
|
||||
*/
|
||||
@Test
|
||||
public void shouldAnswerWithTrue()
|
||||
{
|
||||
assertTrue( true );
|
||||
}
|
||||
}
|
||||
25
litmus-liquibase/pom.xml
Normal file
25
litmus-liquibase/pom.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<?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>
|
||||
<artifactId>litmus</artifactId>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>litmus-liquibase</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<name>litmus-liquibase</name>
|
||||
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.11</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
13
litmus-liquibase/src/main/java/com/navi/medici/App.java
Normal file
13
litmus-liquibase/src/main/java/com/navi/medici/App.java
Normal file
@@ -0,0 +1,13 @@
|
||||
package com.navi.medici;
|
||||
|
||||
/**
|
||||
* Hello world!
|
||||
*
|
||||
*/
|
||||
public class App
|
||||
{
|
||||
public static void main( String[] args )
|
||||
{
|
||||
System.out.println( "Hello World!" );
|
||||
}
|
||||
}
|
||||
20
litmus-liquibase/src/test/java/com/navi/medici/AppTest.java
Normal file
20
litmus-liquibase/src/test/java/com/navi/medici/AppTest.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package com.navi.medici;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class AppTest
|
||||
{
|
||||
/**
|
||||
* Rigorous Test :-)
|
||||
*/
|
||||
@Test
|
||||
public void shouldAnswerWithTrue()
|
||||
{
|
||||
assertTrue( true );
|
||||
}
|
||||
}
|
||||
53
litmus-mock/pom.xml
Normal file
53
litmus-mock/pom.xml
Normal file
@@ -0,0 +1,53 @@
|
||||
<?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>
|
||||
<artifactId>litmus</artifactId>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>litmus-mock</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<name>litmus-mock</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
<artifactId>litmus-model</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.navi.medici</groupId>
|
||||
<artifactId>litmus-client</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-webflux</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>javax.servlet-api</artifactId>
|
||||
<version>4.0.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.11</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
13
litmus-mock/src/main/java/com/navi/medici/App.java
Normal file
13
litmus-mock/src/main/java/com/navi/medici/App.java
Normal file
@@ -0,0 +1,13 @@
|
||||
package com.navi.medici;
|
||||
|
||||
/**
|
||||
* Hello world!
|
||||
*
|
||||
*/
|
||||
public class App
|
||||
{
|
||||
public static void main( String[] args )
|
||||
{
|
||||
System.out.println( "Hello World!" );
|
||||
}
|
||||
}
|
||||
12
litmus-mock/src/main/java/com/navi/medici/LitmusMockApp.java
Normal file
12
litmus-mock/src/main/java/com/navi/medici/LitmusMockApp.java
Normal file
@@ -0,0 +1,12 @@
|
||||
package com.navi.medici;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class LitmusMockApp {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(LitmusMockApp.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.navi.medici.container;
|
||||
|
||||
import com.navi.medici.config.LitmusConfig;
|
||||
import com.navi.medici.litmus.DefaultLitmus;
|
||||
import com.navi.medici.litmus.Litmus;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class MockContainer {
|
||||
|
||||
@Bean
|
||||
public Litmus litmus() {
|
||||
var litmusConfig = LitmusConfig.builder()
|
||||
.litmusAPI("http://localhost:8080/v1")
|
||||
.appName("litmus-mock")
|
||||
.instanceId("test-instance")
|
||||
.build();
|
||||
|
||||
Litmus unleash = new DefaultLitmus(litmusConfig);
|
||||
|
||||
return unleash;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.navi.medici.controller;
|
||||
|
||||
import com.navi.medici.litmus.Litmus;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/v1")
|
||||
@RequiredArgsConstructor
|
||||
@Log4j2
|
||||
public class MockController {
|
||||
private final Litmus litmus;
|
||||
|
||||
@GetMapping("/mock")
|
||||
public String test() {
|
||||
var result = litmus.isEnabled("test-offer");
|
||||
log.info("result ----> {}", result);
|
||||
|
||||
return "result ==> " + result;
|
||||
}
|
||||
}
|
||||
1
litmus-mock/src/main/resources/application.properties
Normal file
1
litmus-mock/src/main/resources/application.properties
Normal file
@@ -0,0 +1 @@
|
||||
server.port=11000
|
||||
20
litmus-mock/src/test/java/com/navi/medici/AppTest.java
Normal file
20
litmus-mock/src/test/java/com/navi/medici/AppTest.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package com.navi.medici;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class AppTest
|
||||
{
|
||||
/**
|
||||
* Rigorous Test :-)
|
||||
*/
|
||||
@Test
|
||||
public void shouldAnswerWithTrue()
|
||||
{
|
||||
assertTrue( true );
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.navi.medici;
|
||||
|
||||
/**
|
||||
* Hello world!
|
||||
*/
|
||||
public class App {
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Hello World!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.navi.medici.request.v1;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import java.time.LocalDateTime;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.FieldDefaults;
|
||||
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
@Getter
|
||||
@Setter
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@FieldDefaults(level = AccessLevel.PRIVATE)
|
||||
public class ExperimentRequest {
|
||||
@JsonProperty("name")
|
||||
String name;
|
||||
|
||||
@JsonProperty("enabled")
|
||||
Boolean enabled;
|
||||
|
||||
@JsonProperty("description")
|
||||
String description;
|
||||
|
||||
@JsonProperty("archived")
|
||||
Boolean archived;
|
||||
|
||||
@JsonProperty("strategies")
|
||||
String strategies;
|
||||
|
||||
@JsonProperty("variants")
|
||||
String variants;
|
||||
|
||||
@JsonProperty("type")
|
||||
String type;
|
||||
|
||||
@JsonProperty("start_time")
|
||||
LocalDateTime startTime;
|
||||
|
||||
@JsonProperty("end_time")
|
||||
LocalDateTime endTime;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.navi.medici.request.v1;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.FieldDefaults;
|
||||
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
@Getter
|
||||
@Setter
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@FieldDefaults(level = AccessLevel.PRIVATE)
|
||||
public class SegmentRequest {
|
||||
String name;
|
||||
|
||||
String description;
|
||||
|
||||
|
||||
|
||||
}
|
||||
3
local.env
Normal file
3
local.env
Normal file
@@ -0,0 +1,3 @@
|
||||
DATASOURCE_URL=jdbc:postgresql://dev-db-service-db.np.navi-tech.in:5432/santa
|
||||
DATASOURCE_USERNAME=service_user
|
||||
DATASOURCE_PASSWORD=JRCFCMXUXBJHGZVTPBNTXHYCCFVMWN
|
||||
38
pom.xml
38
pom.xml
@@ -1,26 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<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">
|
||||
<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>
|
||||
|
||||
<groupId>com.navi.medici</groupId>
|
||||
|
||||
<artifactId>litmus</artifactId>
|
||||
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>litmus</name>
|
||||
|
||||
<modules>
|
||||
<module>litmus-core</module>
|
||||
<module>litmus-model</module>
|
||||
<module>litmus-client</module>
|
||||
<module>litmus-db</module>
|
||||
<module>litmus-mock</module>
|
||||
<module>litmus-liquibase</module>
|
||||
<module>litmus-cache</module>
|
||||
</modules>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.5.5</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-autoconfigure</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
@@ -31,7 +41,7 @@
|
||||
<dependency>
|
||||
<groupId>co.elastic.logging</groupId>
|
||||
<artifactId>log4j2-ecs-layout</artifactId>
|
||||
<version>1.0.1</version>
|
||||
<version>1.1.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -41,13 +51,13 @@
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.11</version>
|
||||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
@@ -59,10 +69,20 @@
|
||||
<configuration>
|
||||
<source>11</source>
|
||||
<target>11</target>
|
||||
<annotationProcessorPaths>
|
||||
<path>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.20</version>
|
||||
</path>
|
||||
</annotationProcessorPaths>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
|
||||
</build>
|
||||
|
||||
|
||||
|
||||
</project>
|
||||
|
||||
Reference in New Issue
Block a user