mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-10-11 07:55:59 +08:00
fix: Optimize container image repo restart detection logic (#9347)
Refs #8978
This commit is contained in:
parent
e6092b2658
commit
c7058cb3e6
15 changed files with 159 additions and 74 deletions
|
@ -98,20 +98,20 @@ func (b *BaseApi) CreateRepo(c *gin.Context) {
|
||||||
// @Tags Container Image-repo
|
// @Tags Container Image-repo
|
||||||
// @Summary Delete image repo
|
// @Summary Delete image repo
|
||||||
// @Accept json
|
// @Accept json
|
||||||
// @Param request body dto.ImageRepoDelete true "request"
|
// @Param request body dto.OperateByID true "request"
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200
|
// @Success 200
|
||||||
// @Security ApiKeyAuth
|
// @Security ApiKeyAuth
|
||||||
// @Security Timestamp
|
// @Security Timestamp
|
||||||
// @Router /containers/repo/del [post]
|
// @Router /containers/repo/del [post]
|
||||||
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"image_repos","output_column":"name","output_value":"names"}],"formatZH":"删除镜像仓库 [names]","formatEN":"delete image repo [names]"}
|
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"image_repos","output_column":"name","output_value":"name"}],"formatZH":"删除镜像仓库 [name]","formatEN":"delete image repo [name]"}
|
||||||
func (b *BaseApi) DeleteRepo(c *gin.Context) {
|
func (b *BaseApi) DeleteRepo(c *gin.Context) {
|
||||||
var req dto.ImageRepoDelete
|
var req dto.OperateByID
|
||||||
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
if err := helper.CheckBindAndValidate(&req, c); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := imageRepoService.BatchDelete(req); err != nil {
|
if err := imageRepoService.Delete(req); err != nil {
|
||||||
helper.InternalServer(c, err)
|
helper.InternalServer(c, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,8 @@ type ImageRepoCreate struct {
|
||||||
Name string `json:"name" validate:"required"`
|
Name string `json:"name" validate:"required"`
|
||||||
DownloadUrl string `json:"downloadUrl"`
|
DownloadUrl string `json:"downloadUrl"`
|
||||||
Protocol string `json:"protocol"`
|
Protocol string `json:"protocol"`
|
||||||
Username string `json:"username" validate:"max=256"`
|
Username string `json:"username"`
|
||||||
Password string `json:"password" validate:"max=256"`
|
Password string `json:"password"`
|
||||||
Auth bool `json:"auth"`
|
Auth bool `json:"auth"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,8 +15,8 @@ type ImageRepoUpdate struct {
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
DownloadUrl string `json:"downloadUrl"`
|
DownloadUrl string `json:"downloadUrl"`
|
||||||
Protocol string `json:"protocol"`
|
Protocol string `json:"protocol"`
|
||||||
Username string `json:"username" validate:"max=256"`
|
Username string `json:"username"`
|
||||||
Password string `json:"password" validate:"max=256"`
|
Password string `json:"password"`
|
||||||
Auth bool `json:"auth"`
|
Auth bool `json:"auth"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ type IImageRepoService interface {
|
||||||
Login(req dto.OperateByID) error
|
Login(req dto.OperateByID) error
|
||||||
Create(req dto.ImageRepoCreate) error
|
Create(req dto.ImageRepoCreate) error
|
||||||
Update(req dto.ImageRepoUpdate) error
|
Update(req dto.ImageRepoUpdate) error
|
||||||
BatchDelete(req dto.ImageRepoDelete) error
|
Delete(req dto.OperateByID) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewIImageRepoService() IImageRepoService {
|
func NewIImageRepoService() IImageRepoService {
|
||||||
|
@ -91,28 +91,7 @@ func (u *ImageRepoService) Create(req dto.ImageRepoCreate) error {
|
||||||
if err := u.handleRegistries(req.DownloadUrl, "", "create"); err != nil {
|
if err := u.handleRegistries(req.DownloadUrl, "", "create"); err != nil {
|
||||||
return fmt.Errorf("create registry %s failed, err: %v", req.DownloadUrl, err)
|
return fmt.Errorf("create registry %s failed, err: %v", req.DownloadUrl, err)
|
||||||
}
|
}
|
||||||
if err := restartDocker(); err != nil {
|
if err := stopBeforeUpdateRepo(); err != nil {
|
||||||
return err
|
|
||||||
}
|
|
||||||
ticker := time.NewTicker(3 * time.Second)
|
|
||||||
defer ticker.Stop()
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*20)
|
|
||||||
if err := func() error {
|
|
||||||
for range ticker.C {
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
cancel()
|
|
||||||
return errors.New("the docker service cannot be restarted")
|
|
||||||
default:
|
|
||||||
stdout, err := cmd.RunDefaultWithStdoutBashC("systemctl is-active docker")
|
|
||||||
if string(stdout) == "active\n" && err == nil {
|
|
||||||
global.LOG.Info("docker restart with new conf successful!")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}(); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,15 +110,32 @@ func (u *ImageRepoService) Create(req dto.ImageRepoCreate) error {
|
||||||
return imageRepoRepo.Create(&imageRepo)
|
return imageRepoRepo.Create(&imageRepo)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *ImageRepoService) BatchDelete(req dto.ImageRepoDelete) error {
|
func (u *ImageRepoService) Delete(req dto.OperateByID) error {
|
||||||
for _, id := range req.Ids {
|
if req.ID == 1 {
|
||||||
if id == 1 {
|
|
||||||
return errors.New("The default value cannot be edit !")
|
return errors.New("The default value cannot be edit !")
|
||||||
}
|
}
|
||||||
|
itemRepo, _ := imageRepoRepo.Get(repo.WithByID(req.ID))
|
||||||
|
if itemRepo.ID == 0 {
|
||||||
|
return buserr.New("ErrRecordNotFound")
|
||||||
}
|
}
|
||||||
if err := imageRepoRepo.Delete(repo.WithByIDs(req.Ids)); err != nil {
|
if itemRepo.Auth {
|
||||||
|
_, _ = cmd.NewCommandMgr().RunWithStdout("docker", "logout", "-i", itemRepo.DownloadUrl)
|
||||||
|
}
|
||||||
|
if itemRepo.Protocol == "https" {
|
||||||
|
return imageRepoRepo.Delete(repo.WithByID(req.ID))
|
||||||
|
}
|
||||||
|
if err := u.handleRegistries("", itemRepo.DownloadUrl, "delete"); err != nil {
|
||||||
|
return fmt.Errorf("delete registry %s failed, err: %v", itemRepo.DownloadUrl, err)
|
||||||
|
}
|
||||||
|
if err := validateDockerConfig(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err := imageRepoRepo.Delete(repo.WithByID(req.ID)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
_ = restartDocker()
|
||||||
|
}()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,39 +150,38 @@ func (u *ImageRepoService) Update(req dto.ImageRepoUpdate) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
needRestart := false
|
||||||
if repo.Protocol == "http" && req.Protocol == "https" {
|
if repo.Protocol == "http" && req.Protocol == "https" {
|
||||||
if err := u.handleRegistries("", repo.DownloadUrl, "delete"); err != nil {
|
if err := u.handleRegistries("", repo.DownloadUrl, "delete"); err != nil {
|
||||||
return fmt.Errorf("delete registry %s failed, err: %v", repo.DownloadUrl, err)
|
return fmt.Errorf("delete registry %s failed, err: %v", repo.DownloadUrl, err)
|
||||||
}
|
}
|
||||||
|
needRestart = true
|
||||||
}
|
}
|
||||||
if repo.Protocol == "http" && req.Protocol == "http" {
|
if repo.Protocol == "http" && req.Protocol == "http" {
|
||||||
if err := u.handleRegistries(req.DownloadUrl, repo.DownloadUrl, "update"); err != nil {
|
if err := u.handleRegistries(req.DownloadUrl, repo.DownloadUrl, "update"); err != nil {
|
||||||
return fmt.Errorf("update registry %s => %s failed, err: %v", repo.DownloadUrl, req.DownloadUrl, err)
|
return fmt.Errorf("update registry %s => %s failed, err: %v", repo.DownloadUrl, req.DownloadUrl, err)
|
||||||
}
|
}
|
||||||
|
needRestart = repo.DownloadUrl == req.DownloadUrl
|
||||||
}
|
}
|
||||||
if repo.Protocol == "https" && req.Protocol == "http" {
|
if repo.Protocol == "https" && req.Protocol == "http" {
|
||||||
if err := u.handleRegistries(req.DownloadUrl, "", "create"); err != nil {
|
if err := u.handleRegistries(req.DownloadUrl, "", "create"); err != nil {
|
||||||
return fmt.Errorf("create registry %s failed, err: %v", req.DownloadUrl, err)
|
return fmt.Errorf("create registry %s failed, err: %v", req.DownloadUrl, err)
|
||||||
}
|
}
|
||||||
|
needRestart = true
|
||||||
|
}
|
||||||
|
if needRestart {
|
||||||
|
if err := stopBeforeUpdateRepo(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if repo.Auth != req.Auth || repo.DownloadUrl != req.DownloadUrl {
|
|
||||||
if repo.Auth {
|
if repo.Auth {
|
||||||
cmdMgr := cmd.NewCommandMgr()
|
_, _ = cmd.NewCommandMgr().RunWithStdout("docker", "logout", "-i", repo.DownloadUrl)
|
||||||
_, _ = cmdMgr.RunWithStdout("docker", "logout", "-i", repo.DownloadUrl)
|
|
||||||
}
|
}
|
||||||
if req.Auth {
|
if req.Auth {
|
||||||
if err := u.CheckConn(req.DownloadUrl, req.Username, req.Password); err != nil {
|
if err := u.CheckConn(req.DownloadUrl, req.Username, req.Password); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if err := validateDockerConfig(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := restartDocker(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
upMap := make(map[string]interface{})
|
upMap := make(map[string]interface{})
|
||||||
upMap["download_url"] = req.DownloadUrl
|
upMap["download_url"] = req.DownloadUrl
|
||||||
|
@ -260,3 +255,34 @@ func (u *ImageRepoService) handleRegistries(newHost, delHost, handle string) err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func stopBeforeUpdateRepo() error {
|
||||||
|
if err := validateDockerConfig(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := restartDocker(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ticker := time.NewTicker(3 * time.Second)
|
||||||
|
defer ticker.Stop()
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second*30)
|
||||||
|
if err := func() error {
|
||||||
|
for range ticker.C {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
cancel()
|
||||||
|
return errors.New("the docker service cannot be restarted")
|
||||||
|
default:
|
||||||
|
stdout, err := cmd.RunDefaultWithStdoutBashC("systemctl is-active docker")
|
||||||
|
if string(stdout) == "active\n" && err == nil {
|
||||||
|
global.LOG.Info("docker restart with new conf successful!")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -246,9 +246,6 @@ export namespace Container {
|
||||||
password: string;
|
password: string;
|
||||||
auth: boolean;
|
auth: boolean;
|
||||||
}
|
}
|
||||||
export interface RepoDelete {
|
|
||||||
ids: Array<number>;
|
|
||||||
}
|
|
||||||
export interface RepoInfo {
|
export interface RepoInfo {
|
||||||
id: number;
|
id: number;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
|
|
@ -141,8 +141,8 @@ export const createImageRepo = (params: Container.RepoCreate) => {
|
||||||
export const updateImageRepo = (params: Container.RepoUpdate) => {
|
export const updateImageRepo = (params: Container.RepoUpdate) => {
|
||||||
return http.post(`/containers/repo/update`, params, TimeoutEnum.T_40S);
|
return http.post(`/containers/repo/update`, params, TimeoutEnum.T_40S);
|
||||||
};
|
};
|
||||||
export const deleteImageRepo = (params: Container.RepoDelete) => {
|
export const deleteImageRepo = (id: Number) => {
|
||||||
return http.post(`/containers/repo/del`, params, TimeoutEnum.T_40S);
|
return http.post(`/containers/repo/del`, { id: id }, TimeoutEnum.T_40S);
|
||||||
};
|
};
|
||||||
|
|
||||||
// composeTemplate
|
// composeTemplate
|
||||||
|
|
|
@ -886,6 +886,7 @@ const message = {
|
||||||
|
|
||||||
repo: 'Container registry | Container registries',
|
repo: 'Container registry | Container registries',
|
||||||
createRepo: 'Add',
|
createRepo: 'Add',
|
||||||
|
httpRepoHelper: 'Operating an HTTP-type repository requires restarting the Docker service.',
|
||||||
httpRepo: 'Choosing HTTP protocol requires restarting the Docker service to add it into insecure registries.',
|
httpRepo: 'Choosing HTTP protocol requires restarting the Docker service to add it into insecure registries.',
|
||||||
delInsecure: 'Deletion of credit',
|
delInsecure: 'Deletion of credit',
|
||||||
delInsecureHelper:
|
delInsecureHelper:
|
||||||
|
|
|
@ -861,6 +861,7 @@ const message = {
|
||||||
|
|
||||||
repo: 'レジストリ',
|
repo: 'レジストリ',
|
||||||
createRepo: '追加',
|
createRepo: '追加',
|
||||||
|
httpRepoHelper: 'HTTPタイプのリポジトリを操作するにはDockerサービスの再起動が必要です。',
|
||||||
httpRepo:
|
httpRepo:
|
||||||
'HTTPプロトコルを選択するには、Dockerサービスを再起動して不安定なレジストリに追加する必要があります。',
|
'HTTPプロトコルを選択するには、Dockerサービスを再起動して不安定なレジストリに追加する必要があります。',
|
||||||
delInsecure: 'クレジットの削除',
|
delInsecure: 'クレジットの削除',
|
||||||
|
|
|
@ -852,6 +852,7 @@ const message = {
|
||||||
|
|
||||||
repo: '레지스트리',
|
repo: '레지스트리',
|
||||||
createRepo: '추가',
|
createRepo: '추가',
|
||||||
|
httpRepoHelper: 'HTTP 타입 저장소 작업 시 Docker 서비스 재시작이 필요합니다.',
|
||||||
httpRepo: 'HTTP 프로토콜을 선택하면 Docker 서비스를 재시작하여 불안정한 레지스트리에 추가해야 합니다.',
|
httpRepo: 'HTTP 프로토콜을 선택하면 Docker 서비스를 재시작하여 불안정한 레지스트리에 추가해야 합니다.',
|
||||||
delInsecure: '신뢰할 수 없는 항목 삭제',
|
delInsecure: '신뢰할 수 없는 항목 삭제',
|
||||||
delInsecureHelper:
|
delInsecureHelper:
|
||||||
|
|
|
@ -878,6 +878,7 @@ const message = {
|
||||||
|
|
||||||
repo: 'Pendaftaran',
|
repo: 'Pendaftaran',
|
||||||
createRepo: 'Tambah',
|
createRepo: 'Tambah',
|
||||||
|
httpRepoHelper: 'Mengoperasikan repositori jenis HTTP memerlukan mulakan semula perkhidmatan Docker.',
|
||||||
httpRepo:
|
httpRepo:
|
||||||
'Memilih protokol HTTP memerlukan memulakan semula perkhidmatan Docker untuk menambahkannya ke pendaftaran tidak selamat.',
|
'Memilih protokol HTTP memerlukan memulakan semula perkhidmatan Docker untuk menambahkannya ke pendaftaran tidak selamat.',
|
||||||
delInsecure: 'Padamkan pendaftaran tidak selamat',
|
delInsecure: 'Padamkan pendaftaran tidak selamat',
|
||||||
|
|
|
@ -872,6 +872,7 @@ const message = {
|
||||||
|
|
||||||
repo: 'Registries',
|
repo: 'Registries',
|
||||||
createRepo: 'Adicionar',
|
createRepo: 'Adicionar',
|
||||||
|
httpRepoHelper: 'Operar um repositório do tipo HTTP requer reinicialização do serviço Docker.',
|
||||||
httpRepo:
|
httpRepo:
|
||||||
'Escolher o protocolo HTTP requer reiniciar o serviço Docker para adicioná-lo a registries inseguros.',
|
'Escolher o protocolo HTTP requer reiniciar o serviço Docker para adicioná-lo a registries inseguros.',
|
||||||
delInsecure: 'Remover da lista de segurança',
|
delInsecure: 'Remover da lista de segurança',
|
||||||
|
|
|
@ -874,6 +874,7 @@ const message = {
|
||||||
|
|
||||||
repo: 'Реестры',
|
repo: 'Реестры',
|
||||||
createRepo: 'Добавить',
|
createRepo: 'Добавить',
|
||||||
|
httpRepoHelper: 'Работа с репозиторием HTTP-типа требует перезапуска службы Docker.',
|
||||||
httpRepo: 'Выбор HTTP протокола требует перезапуска службы Docker для добавления в небезопасные реестры.',
|
httpRepo: 'Выбор HTTP протокола требует перезапуска службы Docker для добавления в небезопасные реестры.',
|
||||||
delInsecure: 'Удаление учетных данных',
|
delInsecure: 'Удаление учетных данных',
|
||||||
delInsecureHelper: 'Это перезапустит службу Docker для удаления из небезопасных реестров. Хотите продолжить?',
|
delInsecureHelper: 'Это перезапустит службу Docker для удаления из небезопасных реестров. Хотите продолжить?',
|
||||||
|
|
|
@ -854,6 +854,7 @@ const message = {
|
||||||
|
|
||||||
repo: '倉庫',
|
repo: '倉庫',
|
||||||
createRepo: '添加倉庫',
|
createRepo: '添加倉庫',
|
||||||
|
httpRepoHelper: '操作 HTTP 類型倉庫需要重啟 Docker 服務。',
|
||||||
downloadUrl: '下載地址',
|
downloadUrl: '下載地址',
|
||||||
imageRepo: '鏡像倉庫',
|
imageRepo: '鏡像倉庫',
|
||||||
repoHelper: '是否包含鏡像倉庫/組織/項目?',
|
repoHelper: '是否包含鏡像倉庫/組織/項目?',
|
||||||
|
|
|
@ -852,6 +852,7 @@ const message = {
|
||||||
|
|
||||||
repo: '仓库',
|
repo: '仓库',
|
||||||
createRepo: '添加仓库',
|
createRepo: '添加仓库',
|
||||||
|
httpRepoHelper: '操作 http 类型仓库需要重启 Docker 服务。',
|
||||||
downloadUrl: '下载地址',
|
downloadUrl: '下载地址',
|
||||||
imageRepo: '镜像仓库',
|
imageRepo: '镜像仓库',
|
||||||
repoHelper: '是否包含镜像仓库/组织/项目?',
|
repoHelper: '是否包含镜像仓库/组织/项目?',
|
||||||
|
|
|
@ -52,8 +52,9 @@
|
||||||
</template>
|
</template>
|
||||||
</LayoutContent>
|
</LayoutContent>
|
||||||
|
|
||||||
<OpDialog ref="opRef" @search="search" />
|
<OpDialog ref="opRef" @search="search" @submit="submitDelete" />
|
||||||
<OperatorDialog @search="search" ref="dialogRef" />
|
<OperatorDialog @search="search" ref="dialogRef" />
|
||||||
|
<ConfirmDialog ref="confirmDialog" @confirm="submitDelete" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -78,6 +79,8 @@ const paginationConfig = reactive({
|
||||||
const searchName = ref();
|
const searchName = ref();
|
||||||
|
|
||||||
const opRef = ref();
|
const opRef = ref();
|
||||||
|
const confirmDialog = ref();
|
||||||
|
const currentRepo = ref();
|
||||||
|
|
||||||
const isActive = ref();
|
const isActive = ref();
|
||||||
const isExist = ref();
|
const isExist = ref();
|
||||||
|
@ -118,7 +121,16 @@ const onOpenDialog = async (
|
||||||
};
|
};
|
||||||
|
|
||||||
const onDelete = async (row: Container.RepoInfo) => {
|
const onDelete = async (row: Container.RepoInfo) => {
|
||||||
let ids = [row.id];
|
currentRepo.value = row.id;
|
||||||
|
if (row.protocol === 'http') {
|
||||||
|
let params = {
|
||||||
|
header: i18n.global.t('container.repo'),
|
||||||
|
operationInfo: i18n.global.t('container.httpRepoHelper'),
|
||||||
|
submitInputInfo: i18n.global.t('database.restartNow'),
|
||||||
|
};
|
||||||
|
confirmDialog.value!.acceptParams(params);
|
||||||
|
return;
|
||||||
|
}
|
||||||
opRef.value.acceptParams({
|
opRef.value.acceptParams({
|
||||||
title: i18n.global.t('commons.button.delete'),
|
title: i18n.global.t('commons.button.delete'),
|
||||||
names: [row.name],
|
names: [row.name],
|
||||||
|
@ -126,8 +138,18 @@ const onDelete = async (row: Container.RepoInfo) => {
|
||||||
i18n.global.t('container.repo'),
|
i18n.global.t('container.repo'),
|
||||||
i18n.global.t('commons.button.delete'),
|
i18n.global.t('commons.button.delete'),
|
||||||
]),
|
]),
|
||||||
api: deleteImageRepo,
|
});
|
||||||
params: { ids: ids },
|
};
|
||||||
|
|
||||||
|
const submitDelete = async () => {
|
||||||
|
loading.value = true;
|
||||||
|
await deleteImageRepo(currentRepo.value)
|
||||||
|
.then(() => {
|
||||||
|
loading.value = false;
|
||||||
|
search();
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
loading.value = false;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,8 @@
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</DrawerPro>
|
</DrawerPro>
|
||||||
|
|
||||||
|
<ConfirmDialog ref="confirmDialog" @confirm="submit" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
@ -88,6 +90,10 @@ interface DialogProps {
|
||||||
rowData?: Container.RepoInfo;
|
rowData?: Container.RepoInfo;
|
||||||
getTableList?: () => Promise<any>;
|
getTableList?: () => Promise<any>;
|
||||||
}
|
}
|
||||||
|
const confirmDialog = ref();
|
||||||
|
const oldUrl = ref();
|
||||||
|
const oldProto = ref();
|
||||||
|
|
||||||
const title = ref<string>('');
|
const title = ref<string>('');
|
||||||
const drawerVisible = ref(false);
|
const drawerVisible = ref(false);
|
||||||
const dialogData = ref<DialogProps>({
|
const dialogData = ref<DialogProps>({
|
||||||
|
@ -95,12 +101,15 @@ const dialogData = ref<DialogProps>({
|
||||||
});
|
});
|
||||||
const acceptParams = (params: DialogProps): void => {
|
const acceptParams = (params: DialogProps): void => {
|
||||||
dialogData.value = params;
|
dialogData.value = params;
|
||||||
|
oldUrl.value = params.rowData.downloadUrl;
|
||||||
|
oldProto.value = params.rowData.protocol;
|
||||||
title.value = i18n.global.t('commons.button.' + dialogData.value.title);
|
title.value = i18n.global.t('commons.button.' + dialogData.value.title);
|
||||||
drawerVisible.value = true;
|
drawerVisible.value = true;
|
||||||
};
|
};
|
||||||
const emit = defineEmits<{ (e: 'search'): void }>();
|
const emit = defineEmits<{ (e: 'search'): void }>();
|
||||||
|
|
||||||
const handleClose = () => {
|
const handleClose = () => {
|
||||||
|
emit('search');
|
||||||
drawerVisible.value = false;
|
drawerVisible.value = false;
|
||||||
};
|
};
|
||||||
const rules = reactive({
|
const rules = reactive({
|
||||||
|
@ -130,6 +139,30 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
|
||||||
if (!formEl) return;
|
if (!formEl) return;
|
||||||
formEl.validate(async (valid) => {
|
formEl.validate(async (valid) => {
|
||||||
if (!valid) return;
|
if (!valid) return;
|
||||||
|
let newProto = dialogData.value.rowData.protocol;
|
||||||
|
if (newProto === 'https' && dialogData.value.title === 'add') {
|
||||||
|
submit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (newProto === oldProto.value) {
|
||||||
|
if (
|
||||||
|
(oldProto.value === 'http' && dialogData.value.rowData.downloadUrl === oldUrl.value) ||
|
||||||
|
oldProto.value === 'https'
|
||||||
|
) {
|
||||||
|
submit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let params = {
|
||||||
|
header: i18n.global.t('container.repo'),
|
||||||
|
operationInfo: i18n.global.t('container.httpRepoHelper'),
|
||||||
|
submitInputInfo: i18n.global.t('database.restartNow'),
|
||||||
|
};
|
||||||
|
confirmDialog.value!.acceptParams(params);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const submit = async () => {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
if (dialogData.value.title === 'add') {
|
if (dialogData.value.title === 'add') {
|
||||||
await createImageRepo(dialogData.value.rowData!)
|
await createImageRepo(dialogData.value.rowData!)
|
||||||
|
@ -154,7 +187,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
|
|
Loading…
Add table
Reference in a new issue