Skip to content

Commit 251683d

Browse files
authored
Merge pull request #66 from ErnestOrt/31-depens-on
31 depens on
2 parents a00f03e + 26ec404 commit 251683d

File tree

9 files changed

+142
-39
lines changed

9 files changed

+142
-39
lines changed

README.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Trampoline [![Twitter](https://img.shields.io/twitter/follow/espadrine.svg?style=social&logo=twitter&label=Follow)](https://twitter.com/TrampolineSB)
1+
# Trampoline [![Twitter](https://img.shields.io/twitter/follow/espadrine.svg?style=social&logo=twitter&label=Follow)](https://twitter.com/TrampolineSB)
22

33

44
[![Build Status](https://travis-ci.org/stunstunstun/awesome-spring-boot.svg?branch=master)](https://travis-ci.org/stunstunstun/awesome-spring-boot) [![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg)](https://gitter.im/Trampoline-springboot/Lobby)
@@ -13,7 +13,7 @@ Are you Admin Spring Boot locally? Are you **tired of that set of scripts**? Rel
1313

1414
The aim is to **help during the course of developing an application based on the paradigm of microservices with _Spring Boot_**. How? Easy, thanks to a **comfortable interface** you can **declare new microservices**, **start instances**, **restart** and **kill them**.
1515

16-
![Alt text](https://github.com/ErnestOrt/Trampoline/blob/master/TrampolineUI_3_13.png)
16+
![Alt text](https://github.com/ErnestOrt/Trampoline/blob/master/TrampolineUI_3_14.png)
1717

1818
Also you will be able to:
1919

@@ -25,7 +25,7 @@ Also you will be able to:
2525
* See Git branch and last commit on instances
2626
* Checkout branch, pull code and restart instances with a single mouse click
2727
* Define microservices groups and launch them all with one click
28-
* Monitor microservies deployed on other machines.
28+
* Monitor microservies deployed on other machines
2929

3030
### Requirements
3131

@@ -49,8 +49,12 @@ To Admin Spring Boot locally:
4949

5050
### FAQ
5151

52+
* How microservices groups are launched?
53+
54+
All microservices are launched secuantially, folowing the order specified, applying defined delay for each instance.
55+
5256
* Which build tools are Trampoline compatible with in my microservices?
53-
57+
5458
You can use Apache Maven or Gradle Wrapper.
5559

5660
* Can I run it on any OS?

TrampolineUI_3_14.png

1.41 MB
Loading

trampoline/src/main/java/org/ernest/applications/trampoline/controller/InstancesController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,13 @@ public Microservice getInstanceInfo(@RequestParam(value="id") String id) throws
6262

6363
@RequestMapping(value= "/startinstance", method = RequestMethod.POST)
6464
@ResponseBody
65-
public void startInstance(@RequestParam(value="id") String id, @RequestParam(value="port") String port, @RequestParam(value="vmArguments") String vmArguments) throws CreatingSettingsFolderException, ReadingEcosystemException, RunningMicroserviceScriptException, SavingEcosystemException {
66-
ecosystemManager.startInstance(id, port, vmArguments);
65+
public void startInstance(@RequestParam(value="id") String id, @RequestParam(value="port") String port, @RequestParam(value="vmArguments") String vmArguments) throws CreatingSettingsFolderException, ReadingEcosystemException, RunningMicroserviceScriptException, SavingEcosystemException, InterruptedException {
66+
ecosystemManager.startInstance(id, port, vmArguments, 0);
6767
}
6868

6969
@RequestMapping(value= "/restartinstance", method = RequestMethod.POST)
7070
@ResponseBody
71-
public void restartInstance(@RequestParam(value="id") String id) throws CreatingSettingsFolderException, ReadingEcosystemException, SavingEcosystemException, ShuttingDownInstanceException {
71+
public void restartInstance(@RequestParam(value="id") String id) throws CreatingSettingsFolderException, ReadingEcosystemException, SavingEcosystemException, ShuttingDownInstanceException, InterruptedException {
7272
ecosystemManager.restartInstance(id);
7373
}
7474

@@ -106,7 +106,7 @@ public boolean checkPort(@RequestParam(value="port") int port) throws CreatingSe
106106

107107
@RequestMapping(value= "/startgroup", method = RequestMethod.POST)
108108
@ResponseBody
109-
public void startGroup(@RequestParam(value="id") String id) {
109+
public void startGroup(@RequestParam(value="id") String id) throws InterruptedException {
110110
ecosystemManager.startGroup(id);
111111
}
112112

trampoline/src/main/java/org/ernest/applications/trampoline/controller/SettingsController.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
import org.springframework.web.bind.annotation.ResponseBody;
1919

2020
import java.io.IOException;
21+
import java.util.HashMap;
2122
import java.util.List;
23+
import java.util.Map;
2224
import java.util.stream.Collectors;
2325

2426
@Controller
@@ -99,8 +101,8 @@ public Microservice getMicroserviceInfo(@RequestParam(value="id") String id) thr
99101

100102
@RequestMapping(value= "/setmicroservicesgroup", method = RequestMethod.POST)
101103
@ResponseBody
102-
public void getMicroserviceInfo(@RequestParam(value="name") String name, @RequestParam(value="idsMicroservicesGroup[]") List<String> idsMicroservicesGroup) throws CreatingSettingsFolderException, ReadingEcosystemException, CreatingMicroserviceScriptException, SavingEcosystemException {
103-
ecosystemManager.setMicroserviceGroup(name, idsMicroservicesGroup);
104+
public void getMicroserviceInfo(@RequestParam(value="name") String name, @RequestParam(value="idsMicroservicesGroup[]") List<String> idsMicroservicesGroup, @RequestParam(value="delaysMicroservicesGroup[]") List<Integer> delaysMicroservicesGroup) throws CreatingSettingsFolderException, ReadingEcosystemException, CreatingMicroserviceScriptException, SavingEcosystemException {
105+
ecosystemManager.setMicroserviceGroup(name, idsMicroservicesGroup, delaysMicroservicesGroup);
104106
}
105107

106108
@RequestMapping(value= "/groupinfo", method = RequestMethod.POST)
@@ -111,9 +113,15 @@ public MicroserviceGroupInfo getGroupInfo(@RequestParam(value="id") String id) t
111113

112114
MicroserviceGroupInfo info = new MicroserviceGroupInfo();
113115
info.setName(microservicesGroup.getName());
116+
117+
Map<String, Integer> delays = new HashMap<>();
118+
for (int index = 0; index < microservicesGroup.getMicroservicesIds().size(); index++){
119+
delays.put(microservicesGroup.getMicroservicesIds().get(index), microservicesGroup.getMicroservicesDelays().get(index));
120+
}
121+
114122
info.setMicroservicesNames(microservices.stream()
115123
.filter(m->microservicesGroup.getMicroservicesIds().contains(m.getId()))
116-
.map(Microservice::getName)
124+
.map(microservice -> microservice.getName() +" ["+delays.get(microservice.getId())+" sec]")
117125
.collect(Collectors.toList()));
118126
return info;
119127
}
@@ -141,7 +149,13 @@ public void checkoutAndPull(@RequestParam(value="id") String id, @RequestParam(v
141149
public void checkoutAndPullAndRestart(@RequestParam(value="id") String id, @RequestParam(value="branchName") String branchName) throws CreatingSettingsFolderException, ReadingEcosystemException, SavingEcosystemException, IOException, GitAPIException {
142150
gitManager.checkoutAndPull(id, branchName);
143151
List<String> intancesIds = ecosystemManager.getEcosystem().getInstances().stream().filter(i-> i.getMicroserviceId().equals(id)).map(Instance::getId).collect(Collectors.toList());
144-
intancesIds.forEach(intancesId-> ecosystemManager.restartInstance(intancesId));
152+
intancesIds.forEach(intancesId-> {
153+
try {
154+
ecosystemManager.restartInstance(intancesId);
155+
} catch (InterruptedException e) {
156+
e.printStackTrace();
157+
}
158+
});
145159
}
146160

147161
@RequestMapping(value= "/git/config/save", method = RequestMethod.POST)

trampoline/src/main/java/org/ernest/applications/trampoline/entities/MicroservicesGroup.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public class MicroservicesGroup {
88
private String id;
99
private String name;
1010
private List<String> microservicesIds;
11+
private List<Integer> microservicesDelays;
1112

1213
public String getId() {
1314
return id;
@@ -33,5 +34,11 @@ public void setMicroservicesIds(List<String> microservicesIds) {
3334
this.microservicesIds = microservicesIds;
3435
}
3536

37+
public List<Integer> getMicroservicesDelays() {
38+
return microservicesDelays;
39+
}
3640

41+
public void setMicroservicesDelays(List<Integer> microservicesDelays) {
42+
this.microservicesDelays = microservicesDelays;
43+
}
3744
}

trampoline/src/main/java/org/ernest/applications/trampoline/services/EcosystemManager.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,13 @@ public void removeMicroservice(String idToBeDeleted) throws CreatingSettingsFold
7373
fileManager.saveEcosystem(ecosystem);
7474
}
7575

76-
public void setMicroserviceGroup(String name, List<String> idsMicroservicesGroup) {
76+
public void setMicroserviceGroup(String name, List<String> idsMicroservicesGroup, List<Integer> delaysMicroservicesGroup) {
7777
log.info("Creating group name: [{}] with microservices [{}]", name, idsMicroservicesGroup.stream().collect(Collectors.joining(",")));
7878
MicroservicesGroup microservicesGroup = new MicroservicesGroup();
7979
microservicesGroup.setId(UUID.randomUUID().toString());
8080
microservicesGroup.setName(name);
8181
microservicesGroup.setMicroservicesIds(idsMicroservicesGroup);
82+
microservicesGroup.setMicroservicesDelays(delaysMicroservicesGroup);
8283

8384
Ecosystem ecosystem = fileManager.getEcosystem();
8485
ecosystem.getMicroservicesGroups().add(microservicesGroup);
@@ -92,11 +93,13 @@ public void removeGroup(String id) {
9293
fileManager.saveEcosystem(ecosystem);
9394
}
9495

95-
public void startInstance(String id, String port, String vmArguments) throws CreatingSettingsFolderException, ReadingEcosystemException, RunningMicroserviceScriptException, SavingEcosystemException{
96-
log.info("Starting instances id: [{}] port: [{}] vmArguments: [{}]", id, port, vmArguments);
96+
public void startInstance(String id, String port, String vmArguments, Integer startingDelay) throws CreatingSettingsFolderException, ReadingEcosystemException, RunningMicroserviceScriptException, SavingEcosystemException, InterruptedException {
97+
log.info("Starting instances id: [{}] port: [{}] vmArguments: [{}] startingDelay: [{}]", id, port, vmArguments, startingDelay);
9798
Ecosystem ecosystem = fileManager.getEcosystem();
9899

99100
Microservice microservice = ecosystem.getMicroservices().stream().filter(m -> m.getId().equals(id)).findAny().get();
101+
Thread.sleep(startingDelay*1000);
102+
log.info("Launching script to start instances id: [{}]", id);
100103
fileManager.runScript(microservice, ecosystem.getMavenBinaryLocation(), ecosystem.getMavenHomeLocation(), port, vmArguments);
101104

102105
Instance instance = new Instance();
@@ -150,24 +153,27 @@ private boolean isDeployed(Instance instance) {
150153
return true;
151154
}
152155

153-
public void startGroup(String id) {
156+
public void startGroup(String id) throws InterruptedException {
154157
log.info("Starting group id: [{}]", id);
155-
MicroservicesGroup group = fileManager.getEcosystem().getMicroservicesGroups().stream().filter(g -> g.getId().equals(id)).findFirst().get();
158+
Ecosystem ecosystem = fileManager.getEcosystem();
159+
MicroservicesGroup group = ecosystem.getMicroservicesGroups().stream().filter(g -> g.getId().equals(id)).findFirst().get();
156160

157-
fileManager.getEcosystem().getMicroservices().stream()
158-
.filter(m->group.getMicroservicesIds().contains(m.getId()))
159-
.forEach(m->prepareMicroservice(m));
161+
for(int index = 0; index < group.getMicroservicesIds().size(); index++){
162+
int microserviceIndex = index;
163+
Microservice microservice = ecosystem.getMicroservices().stream().filter(m->m.getId().equals(group.getMicroservicesIds().get(microserviceIndex))).findAny().get();
164+
prepareMicroservice(microservice, group.getMicroservicesDelays().get(microserviceIndex));
165+
}
160166
}
161167

162-
private void prepareMicroservice(Microservice microservice) {
168+
private void prepareMicroservice(Microservice microservice, Integer startingDelay) throws InterruptedException {
163169
int port = Integer.parseInt(microservice.getDefaultPort());
164170
boolean instanceStarted = false;
165171
List<Instance> instances = fileManager.getEcosystem().getInstances();
166172

167173
while(!instanceStarted) {
168174
final int portToBeLaunched = port;
169175
if (PortsChecker.available(portToBeLaunched) && !instances.stream().anyMatch(i -> i.getPort().equals(String.valueOf(portToBeLaunched)))) {
170-
startInstance(microservice.getId(), String.valueOf(port), "");
176+
startInstance(microservice.getId(), String.valueOf(port), "", startingDelay);
171177
instanceStarted = true;
172178
}else{
173179
port++;
@@ -192,12 +198,12 @@ public void updateMicroservice(String id, String pomLocation, String defaultPort
192198
fileManager.saveEcosystem(ecosystem);
193199
}
194200

195-
public void restartInstance(String instanceId) {
201+
public void restartInstance(String instanceId) throws InterruptedException {
196202
log.info("Restarting instance id: [{}]", instanceId);
197203
Ecosystem ecosystem = fileManager.getEcosystem();
198204
Instance instance = ecosystem.getInstances().stream().filter(i -> i.getId().equals(instanceId)).findFirst().get();
199205
killInstance(instance.getId());
200-
startInstance(instance.getMicroserviceId(), instance.getPort(), instance.getVmArguments());
206+
startInstance(instance.getMicroserviceId(), instance.getPort(), instance.getVmArguments(), 0);
201207
}
202208

203209
public void saveGitCred(String user, String pass) {

trampoline/src/main/java/org/ernest/applications/trampoline/services/FileManager.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.File;
44
import java.io.IOException;
5+
import java.util.stream.Collectors;
56

67
import org.apache.commons.io.FileUtils;
78
import org.ernest.applications.trampoline.entities.BuildTools;
@@ -64,12 +65,21 @@ private void updateMicroservicesInformationStored(Ecosystem ecosystem) {
6465
ecosystemChanged = createBuildTool(ecosystem, ecosystemChanged);
6566
ecosystemChanged = createVersion(ecosystem, ecosystemChanged, currentVersion);
6667
ecosystemChanged = createIp(ecosystem, ecosystemChanged);
68+
ecosystemChanged = createGroupDelays(ecosystem, ecosystemChanged);
6769

6870
if(ecosystemChanged){
6971
saveEcosystem(ecosystem);
7072
}
7173
}
7274

75+
private boolean createGroupDelays(Ecosystem ecosystem, boolean ecosystemChanged) {
76+
if(ecosystem.getMicroservicesGroups().stream().anyMatch(i -> i.getMicroservicesDelays() == null)){
77+
ecosystem.getMicroservicesGroups().stream().filter(i -> i.getMicroservicesDelays() == null).forEach(i -> i.setMicroservicesDelays(i.getMicroservicesIds().stream().map(s -> new Integer(0)).collect(Collectors.toList())));
78+
ecosystemChanged = true;
79+
}
80+
return ecosystemChanged;
81+
}
82+
7383
private boolean createIp(Ecosystem ecosystem, boolean ecosystemChanged) {
7484
if(ecosystem.getInstances().stream().anyMatch(i -> i.getIp() == null)){
7585
ecosystem.getInstances().stream().filter(i -> i.getIp() == null).forEach(i -> i.setIp("127.0.0.1"));

trampoline/src/main/resources/static/v2/js/app/settings.js

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,30 @@ function changeSelectedClass(element) {
1111
}
1212

1313
function createGroup(){
14+
idsMicroservicesGroup = [];
15+
delaysMicroservicesGroup = [];
16+
17+
$( ".group-definition-ms" ).each(function( index ) {
18+
idsMicroservicesGroup.push($( this ).data("id"));
19+
delaysMicroservicesGroup.push($( this ).val());
20+
});
21+
22+
$.ajax({
23+
url : "/settings/setmicroservicesgroup",
24+
type: "POST",
25+
data : {name: $("#input-groupname").val(),
26+
idsMicroservicesGroup: idsMicroservicesGroup,
27+
delaysMicroservicesGroup: delaysMicroservicesGroup},
28+
success: function(data, textStatus, jqXHR) {location.reload();},
29+
error: function (request, status, error) {
30+
$('.front-loading').hide();
31+
showNotification('danger', "Error occurred when trying to create a group. Check Logs for more info");
32+
}
33+
});
34+
35+
}
36+
37+
function defineGroup(){
1438
idsMicroservicesGroup = [];
1539
$( ".microservice-group-form.btn-success" ).each(function( index ) {
1640
idsMicroservicesGroup.push($( this ).data("id"));
@@ -21,21 +45,33 @@ function createGroup(){
2145
$("#form-groupname").removeClass("has-error");
2246
showNotification('danger', "You must select <b>at least two microservices</b> to register a group. <b>Remember to register microservices first</b>.");
2347
}else{
24-
$("#modal-microservice-information").modal("show");
25-
$.ajax({
26-
url : "/settings/setmicroservicesgroup",
27-
type: "POST",
28-
data : {name: $("#input-groupname").val(),
29-
idsMicroservicesGroup: idsMicroservicesGroup},
30-
success: function(data, textStatus, jqXHR) {location.reload();},
31-
error: function (request, status, error) {
32-
$('.front-loading').hide();
33-
showNotification('danger', "Error occurred when trying to create a group. Check Logs for more info");
34-
}
35-
});
48+
$("#title-group-definition").html($("#input-groupname").val());
49+
$("#table-group-definition > tbody").html("");
50+
51+
$( ".microservice-group-form.btn-success" ).each(function( index ) {
52+
$('#table-group-definition > tbody').append('<tr class="even gradeA"><td>'+$( this ).data("name")+'</td><td><input class="group-definition-ms" data-id="'+$( this ).data("id")+'" type="text" class="form-control border-input" value="0"/></td>'+
53+
'<td>'+
54+
'<input id="group-item-'+index+'" class="group-definition-ms-order" value="'+(index+1)+'" onchange="sortGroupRows()"/>'+
55+
'</td></tr>');
56+
});
57+
58+
$("#modal-group-definition").modal("show");
3659
}
3760
}
3861

62+
function sortGroupRows(){
63+
var tb = $('#table-group-definition > tbody');
64+
var rows = tb.find('tr');
65+
rows.sort(function(a, b) {
66+
console.log(a)
67+
var keyA = $(a).find('.group-definition-ms-order').val();
68+
var keyB = $(b).find('.group-definition-ms-order').val();
69+
return keyA - keyB;
70+
});
71+
$.each(rows, function(index, row) {
72+
tb.append(row);
73+
});}
74+
3975
function setMavenInformation(){
4076
if($("#input-mavenhomelocation").val() == ''){
4177
$("#form-mavenhomelocation").addClass("has-error");

0 commit comments

Comments
 (0)