Skip to content

Commit

Permalink
add reload and upgrade function
Browse files Browse the repository at this point in the history
  • Loading branch information
blackstar-baba committed Dec 13, 2020
1 parent 0bb7116 commit 2b7c5b6
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
import com.softwarelab.application.bean.SecurityUser;
import com.softwarelab.application.checker.ImageChecker;
import com.softwarelab.application.entity.Instance;
import com.softwarelab.application.service.ContainerService;
import com.softwarelab.application.service.IAppService;
import com.softwarelab.application.service.IAppVersionService;
import com.softwarelab.application.service.IInstanceService;
import com.softwarelab.application.service.*;
import com.softwarelab.application.websocket.MessageWebSocketHandler;
import com.softwarelab.application.websocket.TerminalWebSocketHandler;
import com.softwarelab.application.common.DbConst;
Expand Down Expand Up @@ -53,6 +50,8 @@ public class WebSocketConfig implements WebSocketConfigurer {
@Autowired
private IAppVersionService appVersionService;

@Autowired
private IAppSourceService appSourceService;

@Bean
public ServletServerContainerFactoryBean createWebSocketContainer() {
Expand All @@ -78,7 +77,7 @@ public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse res
return false;
} else {
if (((ExceptionWebSocketHandlerDecorator) wsHandler).getLastHandler() instanceof TerminalWebSocketHandler) {
return handshakeTerminal(request,instanceService);
return handshakeTerminal(request, instanceService);
}
return true;
}
Expand Down Expand Up @@ -113,7 +112,7 @@ public TerminalWebSocketHandler newTerminalHandler() {

@Bean
public MessageWebSocketHandler newMessageHandler() {
return new MessageWebSocketHandler(imageChecker, containerService, appService,appVersionService);
return new MessageWebSocketHandler(imageChecker, containerService, appService, appVersionService, appSourceService);
}

protected SecurityUser getCurrentUser() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.time.LocalDateTime;
import java.io.Serializable;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.*;
import lombok.experimental.Accessors;
Expand All @@ -25,8 +26,10 @@ public class AppVersion implements Serializable {

private static final long serialVersionUID = 1L;

@TableField
private String appName;

@TableField
private String version;

private String additionalInfo;
Expand All @@ -40,4 +43,5 @@ public class AppVersion implements Serializable {
private Integer downloadStatus;



}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.softwarelab.application.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.softwarelab.application.bean.AppSourceInfo;
import com.softwarelab.application.bean.SourceRelease;
Expand Down Expand Up @@ -121,7 +122,7 @@ public boolean loadToDb() {
File appFile = new File(appsDir + File.separator + fileName);
AppSourceInfo appSourceInfo = objectMapper.readValue(appFile, AppSourceInfo.class);
String appName = fileName.split("\\.")[0];
appService.save(App.builder()
appService.saveOrUpdate(App.builder()
.name(appName)
.type(appSourceInfo.getType())
.description(appSourceInfo.getDescription())
Expand All @@ -134,15 +135,24 @@ public boolean loadToDb() {
List<AppSourceInfo.AppSourceVersion> versions = appSourceInfo.getVersions();
if (versions != null && versions.size() > 0) {
for (AppSourceInfo.AppSourceVersion appSourceVersion : versions) {
appVersionService.save(AppVersion.builder()
QueryWrapper<AppVersion> appVersionWrapper = new QueryWrapper<AppVersion>()
.eq(DbConst.COLUMN_APP_NAME, appName)
.eq(DbConst.COLUMN_VERSION, appSourceVersion.getVersion());
AppVersion existAppVersion = appVersionService.getOne(appVersionWrapper);
AppVersion newAppVersion = AppVersion.builder()
.appName(appName)
.version(appSourceVersion.getVersion())
.additionalInfo(appSourceVersion.getAdditionalInfo() != null ? appSourceVersion.getAdditionalInfo().toString(): null)
.additionalInfo(appSourceVersion.getAdditionalInfo() != null ? appSourceVersion.getAdditionalInfo().toString() : null)
.createTime(now)
.updateTime(now)
.status(DbConst.STATUS_NORMAL)
.downloadStatus(DbConst.DOWNLOAD_STATUS_INIT)
.build());
.build();
if(existAppVersion == null) {
appVersionService.save(newAppVersion);
} else {
appVersionService.update(newAppVersion,appVersionWrapper);
}
}
}

Expand All @@ -157,7 +167,7 @@ public boolean loadToDb() {
return false;

}
appSourceService.save(AppSource.builder()
appSourceService.saveOrUpdate(AppSource.builder()
.id("00000000-0000-0000-0000-000000000000")
//set true version
.version(new String(versionContext, StandardCharsets.UTF_8))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.softwarelab.application.entity.AppVersion;
import com.softwarelab.application.service.ContainerService;
import com.softwarelab.application.service.IAppService;
import com.softwarelab.application.service.IAppSourceService;
import com.softwarelab.application.service.IAppVersionService;
import com.softwarelab.application.common.DbConst;
import com.fasterxml.jackson.databind.ObjectMapper;
Expand All @@ -29,13 +30,16 @@ public class MessageWebSocketHandler extends TextWebSocketHandler {

private final IAppVersionService appVersionService;

private final IAppSourceService appSourceService;

private ObjectMapper objectMapper = new ObjectMapper();

public MessageWebSocketHandler(ImageChecker imageChecker, ContainerService containerService,IAppService appService,IAppVersionService appVersionService) {
public MessageWebSocketHandler(ImageChecker imageChecker, ContainerService containerService, IAppService appService, IAppVersionService appVersionService, IAppSourceService appSourceService) {
this.imageChecker = imageChecker;
this.containerService = containerService;
this.appService = appService;
this.appVersionService = appVersionService;
this.appSourceService = appSourceService;
}

@Override
Expand All @@ -52,6 +56,8 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message)
case "image":
processImageMessage(session, webSocketRequestMessage);
break;
case "app":
processAppMessage(session, webSocketRequestMessage);
default:
break;
}
Expand All @@ -60,15 +66,26 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message)
}

private void processImageMessage(WebSocketSession session, WebSocketRequestMessage message) {

switch (message.getOperate()) {
case "download":
processImageDownload(session, message.getContent());
break;
default:
break;
}
}

private void processAppMessage(WebSocketSession session, WebSocketRequestMessage message) {
switch (message.getOperate()) {
case "upgrade":
processAppUpgrade(session, message.getContent());
break;
case "reload":
processAppReload(session, message.getContent());
break;
default:
break;
}
}

private void processImageDownload(WebSocketSession session, String content) {
Expand All @@ -91,24 +108,24 @@ private void processImageDownload(WebSocketSession session, String content) {
try {
ContainerSetting containerSetting = objectMapper.readValue(app.getAdditionalInfo(), ContainerSetting.class);
imageName = containerSetting.getImageName();
if(imageName == null) {
if (imageName == null) {
responseMessage = new WebSocketResponseMessage("failed", content + " can't find image");
session.sendMessage(new TextMessage(objectMapper.writeValueAsBytes(responseMessage)));
}
} catch (IOException e) {
//do nothing
}
if (!containerService.hasImage(appVersion.getAppName()+":"+appVersion.getVersion())) {
if (!containerService.hasImage(appVersion.getAppName() + ":" + appVersion.getVersion())) {
imageChecker.add(appVersion, WebSocketSessionAndCallback.builder()
.webSocketSession(session)
.callback(containerService.pullImage(imageName+":"+appVersion.getVersion()))
.callback(containerService.pullImage(imageName + ":" + appVersion.getVersion()))
.build());
responseMessage = new WebSocketResponseMessage("success", content + " begin download");
} else {
appVersionService.update(new UpdateWrapper<AppVersion>()
.eq(DbConst.COLUMN_APP_NAME,appVersion.getAppName())
.eq(DbConst.COLUMN_VERSION,appVersion.getVersion())
.set(DbConst.COLUMN_DOWNLOAD_STATUS,DbConst.DOWNLOAD_STATUS_FINISH));
.eq(DbConst.COLUMN_APP_NAME, appVersion.getAppName())
.eq(DbConst.COLUMN_VERSION, appVersion.getVersion())
.set(DbConst.COLUMN_DOWNLOAD_STATUS, DbConst.DOWNLOAD_STATUS_FINISH));
responseMessage = new WebSocketResponseMessage("success", content + " is exist");
}
try {
Expand All @@ -119,6 +136,28 @@ private void processImageDownload(WebSocketSession session, String content) {

}

private void processAppUpgrade(WebSocketSession session, String content) {
//todo if is upgrading,ignore this time
String detail = appSourceService.upgrade() ? "success" : "failed";
WebSocketResponseMessage responseMessage = new WebSocketResponseMessage("success", "Upgrade " + detail);
try {
session.sendMessage(new TextMessage(objectMapper.writeValueAsBytes(responseMessage)));
} catch (IOException e) {
// do nothing
}
}

private void processAppReload(WebSocketSession session, String content) {
//todo if is reloading,ignore this time
String detail = appSourceService.loadToDb() ? "success" : "failed";
WebSocketResponseMessage responseMessage = new WebSocketResponseMessage("success", "Reload " + detail);
try {
session.sendMessage(new TextMessage(objectMapper.writeValueAsBytes(responseMessage)));
} catch (IOException e) {
// do nothing
}
}


@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
Expand Down
33 changes: 22 additions & 11 deletions ui/src/views/app/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@
import { getTop, getList, getVersionsByAppName } from '@/api/app'
import { getToken } from '@/utils/auth'
import { getAddress } from '@/utils'
import { MessageBox } from 'element-ui'
import store from '@/store'
export default {
filters: {
Expand Down Expand Up @@ -185,20 +187,29 @@ export default {
}))
},
upgrade() {
// todo pop
this.socket.send(JSON.stringify({
type: 'app',
operate: 'upgrade'
}))
MessageBox.confirm('', 'Confirm upgrade', {
confirmButtonText: 'Upgrade',
cancelButtonText: 'Cancel',
type: 'warning'
}).then(() => {
this.socket.send(JSON.stringify({
type: 'app',
operate: 'upgrade'
}))
})
},
reload() {
// todo pop
this.socket.send(JSON.stringify({
type: 'app',
operate: 'reload'
}))
MessageBox.confirm('', 'Confirm reload', {
confirmButtonText: 'Reload',
cancelButtonText: 'Cancel',
type: 'warning'
}).then(() => {
this.socket.send(JSON.stringify({
type: 'app',
operate: 'reload'
}))
})
}
}
}
</script>
Expand Down

0 comments on commit 2b7c5b6

Please sign in to comment.