diff --git a/application/src/main/java/com/softwarelab/application/config/WebSocketConfig.java b/application/src/main/java/com/softwarelab/application/config/WebSocketConfig.java index bd254fd..954f6a5 100644 --- a/application/src/main/java/com/softwarelab/application/config/WebSocketConfig.java +++ b/application/src/main/java/com/softwarelab/application/config/WebSocketConfig.java @@ -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; @@ -53,6 +50,8 @@ public class WebSocketConfig implements WebSocketConfigurer { @Autowired private IAppVersionService appVersionService; + @Autowired + private IAppSourceService appSourceService; @Bean public ServletServerContainerFactoryBean createWebSocketContainer() { @@ -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; } @@ -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() { diff --git a/application/src/main/java/com/softwarelab/application/entity/AppVersion.java b/application/src/main/java/com/softwarelab/application/entity/AppVersion.java index f8e53d3..9b2380b 100644 --- a/application/src/main/java/com/softwarelab/application/entity/AppVersion.java +++ b/application/src/main/java/com/softwarelab/application/entity/AppVersion.java @@ -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; @@ -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; @@ -40,4 +43,5 @@ public class AppVersion implements Serializable { private Integer downloadStatus; + } diff --git a/application/src/main/java/com/softwarelab/application/service/impl/AppSourceServiceImpl.java b/application/src/main/java/com/softwarelab/application/service/impl/AppSourceServiceImpl.java index 7a004a5..1f64e2e 100644 --- a/application/src/main/java/com/softwarelab/application/service/impl/AppSourceServiceImpl.java +++ b/application/src/main/java/com/softwarelab/application/service/impl/AppSourceServiceImpl.java @@ -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; @@ -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()) @@ -134,15 +135,24 @@ public boolean loadToDb() { List versions = appSourceInfo.getVersions(); if (versions != null && versions.size() > 0) { for (AppSourceInfo.AppSourceVersion appSourceVersion : versions) { - appVersionService.save(AppVersion.builder() + QueryWrapper appVersionWrapper = new QueryWrapper() + .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); + } } } @@ -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)) diff --git a/application/src/main/java/com/softwarelab/application/websocket/MessageWebSocketHandler.java b/application/src/main/java/com/softwarelab/application/websocket/MessageWebSocketHandler.java index b402256..b9437e7 100644 --- a/application/src/main/java/com/softwarelab/application/websocket/MessageWebSocketHandler.java +++ b/application/src/main/java/com/softwarelab/application/websocket/MessageWebSocketHandler.java @@ -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; @@ -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 @@ -52,6 +56,8 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message) case "image": processImageMessage(session, webSocketRequestMessage); break; + case "app": + processAppMessage(session, webSocketRequestMessage); default: break; } @@ -60,7 +66,6 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message) } private void processImageMessage(WebSocketSession session, WebSocketRequestMessage message) { - switch (message.getOperate()) { case "download": processImageDownload(session, message.getContent()); @@ -68,7 +73,19 @@ private void processImageMessage(WebSocketSession session, WebSocketRequestMessa 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) { @@ -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() - .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 { @@ -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 { diff --git a/ui/src/views/app/index.vue b/ui/src/views/app/index.vue index 401cea8..e66597f 100755 --- a/ui/src/views/app/index.vue +++ b/ui/src/views/app/index.vue @@ -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: { @@ -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' + })) + }) } - } }