From 23930e53f0275969bcf8983b66ccf43538762288 Mon Sep 17 00:00:00 2001 From: Becky Reamy Date: Tue, 3 Sep 2019 15:46:11 -0400 Subject: [PATCH 1/5] KPMP-1128: Initial implementation of state manager --- bin/default/application.properties | 3 + .../java/org/kpmp/stateManager/State.java | 58 +++++++++++++++++++ .../kpmp/stateManager/StateController.java | 25 ++++++++ .../kpmp/stateManager/StateRepository.java | 10 ++++ .../org/kpmp/stateManager/StateService.java | 21 +++++++ src/main/resources/application.properties | 3 + .../stateManager/StateControllerTest.java | 40 +++++++++++++ .../kpmp/stateManager/StateServiceTest.java | 44 ++++++++++++++ .../java/org/kpmp/stateManager/StateTest.java | 58 +++++++++++++++++++ 9 files changed, 262 insertions(+) create mode 100644 bin/default/application.properties create mode 100644 src/main/java/org/kpmp/stateManager/State.java create mode 100644 src/main/java/org/kpmp/stateManager/StateController.java create mode 100644 src/main/java/org/kpmp/stateManager/StateRepository.java create mode 100644 src/main/java/org/kpmp/stateManager/StateService.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/org/kpmp/stateManager/StateControllerTest.java create mode 100644 src/test/java/org/kpmp/stateManager/StateServiceTest.java create mode 100644 src/test/java/org/kpmp/stateManager/StateTest.java diff --git a/bin/default/application.properties b/bin/default/application.properties new file mode 100644 index 0000000..932d231 --- /dev/null +++ b/bin/default/application.properties @@ -0,0 +1,3 @@ +server.port=3030 + +spring.data.mongodb.uri=mongodb://mongodb:27017/dataLake \ No newline at end of file diff --git a/src/main/java/org/kpmp/stateManager/State.java b/src/main/java/org/kpmp/stateManager/State.java new file mode 100644 index 0000000..c2f9cf2 --- /dev/null +++ b/src/main/java/org/kpmp/stateManager/State.java @@ -0,0 +1,58 @@ +package org.kpmp.stateManager; + +import java.util.Date; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document(collection = "state") +public class State { + + @Id + private String id; + private String packageId; + private String state; + private String codicil; + private Date stateChangeDate; + + public Date getStateChangeDate() { + return stateChangeDate; + } + + public void setStateChangeDate(Date stateChangeDate) { + this.stateChangeDate = stateChangeDate; + } + + public String getCodicil() { + return codicil; + } + + public void setCodicil(String codicil) { + this.codicil = codicil; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getPackageId() { + return packageId; + } + + public void setPackageId(String packageId) { + this.packageId = packageId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + +} diff --git a/src/main/java/org/kpmp/stateManager/StateController.java b/src/main/java/org/kpmp/stateManager/StateController.java new file mode 100644 index 0000000..e3566fc --- /dev/null +++ b/src/main/java/org/kpmp/stateManager/StateController.java @@ -0,0 +1,25 @@ +package org.kpmp.stateManager; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class StateController { + + private StateService stateService; + + @Autowired + public StateController(StateService stateService) { + this.stateService = stateService; + } + + @RequestMapping(value = "/v1/state", method = RequestMethod.PUT) + public @ResponseBody String setState(@RequestBody State state) { + return stateService.setState(state); + } + +} diff --git a/src/main/java/org/kpmp/stateManager/StateRepository.java b/src/main/java/org/kpmp/stateManager/StateRepository.java new file mode 100644 index 0000000..9a8b115 --- /dev/null +++ b/src/main/java/org/kpmp/stateManager/StateRepository.java @@ -0,0 +1,10 @@ +package org.kpmp.stateManager; + +import org.springframework.data.mongodb.repository.MongoRepository; + +public interface StateRepository extends MongoRepository { + + @SuppressWarnings("unchecked") + public State save(State state); + +} diff --git a/src/main/java/org/kpmp/stateManager/StateService.java b/src/main/java/org/kpmp/stateManager/StateService.java new file mode 100644 index 0000000..7de7b50 --- /dev/null +++ b/src/main/java/org/kpmp/stateManager/StateService.java @@ -0,0 +1,21 @@ +package org.kpmp.stateManager; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class StateService { + + private StateRepository stateRepository; + + @Autowired + public StateService(StateRepository stateRepository) { + this.stateRepository = stateRepository; + } + + public String setState(State state) { + State savedState = stateRepository.save(state); + return savedState.getId(); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..932d231 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=3030 + +spring.data.mongodb.uri=mongodb://mongodb:27017/dataLake \ No newline at end of file diff --git a/src/test/java/org/kpmp/stateManager/StateControllerTest.java b/src/test/java/org/kpmp/stateManager/StateControllerTest.java new file mode 100644 index 0000000..7f8f3d9 --- /dev/null +++ b/src/test/java/org/kpmp/stateManager/StateControllerTest.java @@ -0,0 +1,40 @@ +package org.kpmp.stateManager; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class StateControllerTest { + + @Mock + private StateService stateService; + private StateController controller; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + controller = new StateController(stateService); + } + + @After + public void tearDown() throws Exception { + controller = null; + } + + @Test + public void testSetState() { + State state = new State(); + when(stateService.setState(state)).thenReturn("id"); + String stateId = controller.setState(state); + + assertEquals("id", stateId); + verify(stateService).setState(state); + } + +} diff --git a/src/test/java/org/kpmp/stateManager/StateServiceTest.java b/src/test/java/org/kpmp/stateManager/StateServiceTest.java new file mode 100644 index 0000000..e23a591 --- /dev/null +++ b/src/test/java/org/kpmp/stateManager/StateServiceTest.java @@ -0,0 +1,44 @@ +package org.kpmp.stateManager; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class StateServiceTest { + + @Mock + private StateRepository stateRepository; + private StateService service; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + service = new StateService(stateRepository); + } + + @After + public void tearDown() throws Exception { + service = null; + } + + @Test + public void testSetState() { + State state = mock(State.class); + State returnState = mock(State.class); + when(returnState.getId()).thenReturn("id"); + when(stateRepository.save(state)).thenReturn(returnState); + + String stateId = service.setState(state); + + assertEquals("id", stateId); + verify(stateRepository).save(state); + } + +} diff --git a/src/test/java/org/kpmp/stateManager/StateTest.java b/src/test/java/org/kpmp/stateManager/StateTest.java new file mode 100644 index 0000000..1cb7eee --- /dev/null +++ b/src/test/java/org/kpmp/stateManager/StateTest.java @@ -0,0 +1,58 @@ +package org.kpmp.stateManager; + +import static org.junit.Assert.assertEquals; + +import java.util.Date; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class StateTest { + + private State state; + + @Before + public void setUp() throws Exception { + state = new State(); + } + + @After + public void tearDown() throws Exception { + state = null; + } + + @Test + public void testSetStateChangeDate() { + Date stateChangeDate = new Date(); + + state.setStateChangeDate(stateChangeDate); + + assertEquals(stateChangeDate, state.getStateChangeDate()); + } + + @Test + public void testSetCodicil() { + state.setCodicil("codicil"); + assertEquals("codicil", state.getCodicil()); + } + + @Test + public void testSetState() { + state.setState("new state"); + assertEquals("new state", state.getState()); + } + + @Test + public void testSetPackageId() { + state.setPackageId("packageId"); + assertEquals("packageId", state.getPackageId()); + } + + @Test + public void testId() throws Exception { + state.setId("id"); + assertEquals("id", state.getId()); + } + +} From b8abdac4ae1b877ef6897a7f470d7dd91036898a Mon Sep 17 00:00:00 2001 From: Becky Reamy Date: Tue, 3 Sep 2019 16:32:10 -0400 Subject: [PATCH 2/5] KPMP-1128: Updates to the code to save the state correctly --- bin/default/application.properties | 2 +- build.gradle | 2 +- src/main/java/org/kpmp/WebConfig.java | 6 +++++- src/main/java/org/kpmp/stateManager/StateController.java | 9 ++++++++- src/main/resources/application.properties | 2 +- .../java/org/kpmp/stateManager/StateControllerTest.java | 7 ++++++- 6 files changed, 22 insertions(+), 6 deletions(-) diff --git a/bin/default/application.properties b/bin/default/application.properties index 932d231..fb085d6 100644 --- a/bin/default/application.properties +++ b/bin/default/application.properties @@ -1,3 +1,3 @@ -server.port=3030 +server.port=3060 spring.data.mongodb.uri=mongodb://mongodb:27017/dataLake \ No newline at end of file diff --git a/build.gradle b/build.gradle index 805eea3..0a2192a 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ dependencies { compile 'org.springframework.boot:spring-boot-starter-web' compile 'org.apache.commons:commons-compress:1.17' compile 'org.springframework.boot:spring-boot-starter-test' - compile 'org.springframework.data:spring-data-mongodb:2.0.8.RELEASE' + compile 'org.springframework.data:spring-data-mongodb' compile 'org.springframework.boot:spring-boot-starter-data-mongodb' testCompile 'org.springframework.boot:spring-boot-starter-test' testCompile 'org.mockito:mockito-core' diff --git a/src/main/java/org/kpmp/WebConfig.java b/src/main/java/org/kpmp/WebConfig.java index 5b35388..23a5150 100755 --- a/src/main/java/org/kpmp/WebConfig.java +++ b/src/main/java/org/kpmp/WebConfig.java @@ -1,13 +1,17 @@ package org.kpmp; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration -@EnableAutoConfiguration(exclude = {}) +@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, + DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) public class WebConfig implements WebMvcConfigurer { @Override diff --git a/src/main/java/org/kpmp/stateManager/StateController.java b/src/main/java/org/kpmp/stateManager/StateController.java index e3566fc..2e72c15 100644 --- a/src/main/java/org/kpmp/stateManager/StateController.java +++ b/src/main/java/org/kpmp/stateManager/StateController.java @@ -1,5 +1,9 @@ package org.kpmp.stateManager; +import java.util.Date; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; @@ -11,14 +15,17 @@ public class StateController { private StateService stateService; + private static final Log log = LogFactory.getLog(StateController.class); @Autowired public StateController(StateService stateService) { this.stateService = stateService; } - @RequestMapping(value = "/v1/state", method = RequestMethod.PUT) + @RequestMapping(value = "/v1/state", method = RequestMethod.POST) public @ResponseBody String setState(@RequestBody State state) { + log.info("recevied state: " + state.getPackageId()); + state.setStateChangeDate(new Date()); return stateService.setState(state); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 932d231..fb085d6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,3 @@ -server.port=3030 +server.port=3060 spring.data.mongodb.uri=mongodb://mongodb:27017/dataLake \ No newline at end of file diff --git a/src/test/java/org/kpmp/stateManager/StateControllerTest.java b/src/test/java/org/kpmp/stateManager/StateControllerTest.java index 7f8f3d9..6a962f4 100644 --- a/src/test/java/org/kpmp/stateManager/StateControllerTest.java +++ b/src/test/java/org/kpmp/stateManager/StateControllerTest.java @@ -1,9 +1,13 @@ package org.kpmp.stateManager; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.Date; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -29,12 +33,13 @@ public void tearDown() throws Exception { @Test public void testSetState() { - State state = new State(); + State state = mock(State.class); when(stateService.setState(state)).thenReturn("id"); String stateId = controller.setState(state); assertEquals("id", stateId); verify(stateService).setState(state); + verify(state).setStateChangeDate(any(Date.class)); } } From f0486bcc62113be8bc4b11cb50660698fafd3841 Mon Sep 17 00:00:00 2001 From: Becky Reamy Date: Wed, 4 Sep 2019 10:08:45 -0400 Subject: [PATCH 3/5] KPMP-1128: Added additional logging --- src/main/java/org/kpmp/stateManager/StateController.java | 7 +++++-- .../java/org/kpmp/stateManager/StateControllerTest.java | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/kpmp/stateManager/StateController.java b/src/main/java/org/kpmp/stateManager/StateController.java index 2e72c15..8faa822 100644 --- a/src/main/java/org/kpmp/stateManager/StateController.java +++ b/src/main/java/org/kpmp/stateManager/StateController.java @@ -2,6 +2,8 @@ import java.util.Date; +import javax.servlet.http.HttpServletRequest; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -23,8 +25,9 @@ public StateController(StateService stateService) { } @RequestMapping(value = "/v1/state", method = RequestMethod.POST) - public @ResponseBody String setState(@RequestBody State state) { - log.info("recevied state: " + state.getPackageId()); + public @ResponseBody String setState(@RequestBody State state, HttpServletRequest request) { + log.info("URI: " + request.getRequestURI() + " | PKGID: " + state.getPackageId() + " | MSG: Saving new state: " + + state.getState()); state.setStateChangeDate(new Date()); return stateService.setState(state); } diff --git a/src/test/java/org/kpmp/stateManager/StateControllerTest.java b/src/test/java/org/kpmp/stateManager/StateControllerTest.java index 6a962f4..a42f14b 100644 --- a/src/test/java/org/kpmp/stateManager/StateControllerTest.java +++ b/src/test/java/org/kpmp/stateManager/StateControllerTest.java @@ -8,6 +8,8 @@ import java.util.Date; +import javax.servlet.http.HttpServletRequest; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -35,7 +37,7 @@ public void tearDown() throws Exception { public void testSetState() { State state = mock(State.class); when(stateService.setState(state)).thenReturn("id"); - String stateId = controller.setState(state); + String stateId = controller.setState(state, mock(HttpServletRequest.class)); assertEquals("id", stateId); verify(stateService).setState(state); From 8be449f521096fb5f4a742b832177d7175c74369 Mon Sep 17 00:00:00 2001 From: Becky Reamy Date: Wed, 4 Sep 2019 10:32:27 -0400 Subject: [PATCH 4/5] KPMP-1128: Add Dockerfile to build docker image --- .../4.6/fileContent/annotation-processors.bin | Bin 19841 -> 19862 bytes .gradle/4.6/fileContent/fileContent.lock | Bin 17 -> 17 bytes .gradle/4.6/fileHashes/fileHashes.bin | Bin 22197 -> 36097 bytes .gradle/4.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../4.6/fileHashes/resourceHashesCache.bin | Bin 22849 -> 23155 bytes .gradle/4.6/taskHistory/taskHistory.bin | Bin 59414 -> 188901 bytes .gradle/4.6/taskHistory/taskHistory.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 18785 -> 19019 bytes Dockerfile | 9 +++++++++ README.md | 8 ++++++++ build.gradle | 2 +- 12 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 Dockerfile diff --git a/.gradle/4.6/fileContent/annotation-processors.bin b/.gradle/4.6/fileContent/annotation-processors.bin index 024f0d291ed36141ada7d4325d0c16a9fde1be68..f9301a7f643440e33be13c7c6cba108b4bd49af9 100644 GIT binary patch delta 57 zcmZpi%{Xl~;|3E6M#s&j5;GVDo)+z4*lFgJ!vF@pjhl~3Ro3U{=;|3E6Mu*L&5;GV#Kb0(IVHDh`_(Oc70f*3LM-K;90OlVHy#N3J diff --git a/.gradle/4.6/fileContent/fileContent.lock b/.gradle/4.6/fileContent/fileContent.lock index d7b477568f4758bbacbe5a3c0d38fde5d19eed47..c9a712e1531b94650c1cf868b43c04ecdff2515b 100644 GIT binary patch literal 17 UcmZQR(D9hziI|5e0|dAN05LiP>i_@% literal 17 UcmZQR(D9hziI|5e0|Yn$05LZM=l}o! diff --git a/.gradle/4.6/fileHashes/fileHashes.bin b/.gradle/4.6/fileHashes/fileHashes.bin index 01545694137e93bcbe25f9d2cae8ee72c07ff7ac..bebc113e9b057e2454a2b29d74dfd9853b2c72d9 100644 GIT binary patch literal 36097 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 Gb7@KCsqERI*Y7+`j?FtBzUQ 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 xGsRS4*`W04{?1=cUScv{F=DgwFjbuV!neeMZy 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 Zm2X$p)%9}C)?;1yuhi+Lj?S_>{|E3d*joSq delta 252 zcmaEQn0wj<<_YQ>jh~56bl{mRDIu-N`Z8>yty4#MH3JybNBxHari90zX124iLd5;f zOui~%FSvV$(9HWneIS&>nmm0p&Wlw4GlR+v$g zo?T*=n3-mr2r)v$bh7)4gOj%G7uaHU*=EXBzS14eu3Iv_LvL??*w1*8b#q)8v!-Rn zY6gak)r3uB-Ot{YoRe5wT##6j!NkDeH2t9|lgadiBa90s3v3W#JTkd)Tf+8w1;)2b Ko6j|SqyPYb(_dEr diff --git a/.gradle/4.6/taskHistory/taskHistory.lock b/.gradle/4.6/taskHistory/taskHistory.lock index c6837d8a253e6774364d886806447e4230903b13..0cec1c799ecc1eaffb5829a7880fa5ad505eb515 100644 GIT binary patch literal 17 UcmZR++rOAA{k54o0|ZC|05W6)=Kufz literal 17 UcmZR++rOAA{k54o0|f8^05Vqt+5i9m diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 6167c6c6b65b8a287985174c534736f3b2072e2e..15e214d773833c2a5de857747d62ad92dcd604e3 100644 GIT binary patch literal 17 UcmZR6EW&taZl>sI1_*Ej050zX{{R30 literal 17 UcmZR6EW&taZl>sI1_;mv0501D>i_@% diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 87da60b337c48f7148354e0d7e16031666cdf56e..7fcdb16292441e34b1fa96d288f77be089a954d7 100644 GIT binary patch delta 373 zcmaDjiShIl#tkMCnz9WH?BR#JdA~4#fk*IvC}>#u=ioZ_Yu_Q_Uh0!wB`gHG4@&$v zp4_Jb5%f%)Tqnnqtla z6+8=5e5aXH&TPis9H@9JO#J@#-$j@Bq`e^GUd%A@A4btmi@biSLe)=)iSuUd+_Y3? zLpW5uB}`m$df>8XM-@&hsD|B>uL7N}Ge2@!O@s>{RPZBAwZX>KW$~<#}}%&cyg_z6BE-h4JAe#tkMCf&vW;?BR#JdA~4#fk*J6 TPTZ*YLwut_huCIE4+Ta5$T1Zf diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..152f65b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +ARG DEPENDENCY=target/dependency + +COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib +COPY ${DEPENDENCY}/META-INF /app/META-INF +COPY ${DEPENDENCY}/BOOT-INF/classes /app + +ENTRYPOINT ["java","-cp","app:app/lib/*","org.kpmp.Application"] diff --git a/README.md b/README.md index 8293daf..9046d2a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ # stateManagerService The state manager service will do the work to keep track of the state of packages as they travel from the data lake to the knowledge environment. + +State manager will run in its own docker-compose script (found in the heavens-docker/stateManager repo on gitHub) and will run on the same network as orion. + +To run on your local machine: +1) Navigate to your heavens-docker/orion +2) docker-compose -f docker-compose.dev.yml up -d +3) Navigate to heavens-docker/stateManager +4) docker-compose -f docker-compose.dev.yml up -d diff --git a/build.gradle b/build.gradle index 0a2192a..8890f72 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ apply plugin: 'io.spring.dependency-management' apply plugin: 'com.palantir.docker' jar { - baseName='stateManagerService' + baseName='state-manager-service' version= '0.1' } From f1023f8a122b8a23b220102f92c88a304bcc3d15 Mon Sep 17 00:00:00 2001 From: Becky Reamy Date: Wed, 4 Sep 2019 10:43:50 -0400 Subject: [PATCH 5/5] KPMP-1128: Updated readme and version number in build.gradle --- README.md | 44 ++++++++++++++++++++++++++++++++++++-------- build.gradle | 2 +- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 9046d2a..2420aa6 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,39 @@ -# stateManagerService +# State Manager Service + +This is intended to be a service available to other services and applications inside of KPMP. It is not a stand-alone website, so there is only a Java project for the service layer. -The state manager service will do the work to keep track of the state of packages as they travel from the data lake to the knowledge environment. +It will run inside the dataLake network which is created by orion when running on a developer machine, or by the dataLakeProxyServer when running on our production-like and production instances. -State manager will run in its own docker-compose script (found in the heavens-docker/stateManager repo on gitHub) and will run on the same network as orion. +## Set up on your local machine -To run on your local machine: -1) Navigate to your heavens-docker/orion -2) docker-compose -f docker-compose.dev.yml up -d -3) Navigate to heavens-docker/stateManager -4) docker-compose -f docker-compose.dev.yml up -d +- Change directory to heavens-docker/orion +- docker-compose -f docker-compose.dev.yml up -d +- Change directory to heavens-docker/stateManager +- docker-compose -f docker-compose.dev.yml up -d + +At this point you should be able to interact with the service by hitting endpoints at http://localhost:3060 + +As you are working on changes, you should make sure to run ./gradlew build docker in order to create new docker images locally to be used inside docker. After rebuilding the image, you will need to restart the docker container in order to pick up your changes. + +When you are done with your local changes, you will need to push the latest image to cloud.docker.com + +1) docker login +2) Provide username/password (see another developer for these values) +3) docker push kingstonduo/state-manager-service // This will push to the 'latest' tag which we are using on our local development machines +4) docker image ls +5) Find the image you just built (should be at the top of the list) and grab the hash +6) docker tag kingstonduo/state-manager-service: // Where hash is the value you just grabbed, and x.x is the release version you are working on +7) docker push kingstonduo/state-manager-service: + +## Set up in dev, qa or prod + +- Pull down the stateManagerService project at http://github.com/KPMP +- Change directory to heavens-docker/dataLakeProxyServer +- docker-compose up -d +- Change directory to heavens-docker/ara +- docker-compose up -d +- Change directory to heavens-docker/orion +- docker-compose -f docker-compose.shib.yml up -d +- Change directory to heavens-docker/stateManager +- docker-compose -f docker-compose.prod.yml up -d +~ diff --git a/build.gradle b/build.gradle index 8890f72..943bd9a 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ apply plugin: 'com.palantir.docker' jar { baseName='state-manager-service' - version= '0.1' + version= '1.0' } repositories {