znt/module/instance/control.php

812 lines
32 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
/**
* The control file of instance module of ZenTaoPMS.
*
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Sun Guangming <sunguangming@easycorp.ltd>
* @package instance
* @version $Id$
* @link https://www.zentao.net
* @property instanceModel $instance
* @property instanceZen $instanceZen
* @property cneModel $cne
*/
class instance extends control
{
/**
* Construct function.
*
* @param string $moduleName
* @param string $methodName
* @access public
* @return void
*/
public function __construct(string $moduleName = '', string $methodName = '')
{
parent::__construct($moduleName, $methodName);
$this->loadModel('action');
$this->loadModel('cne');
$this->loadModel('store');
}
/**
* 查看应用详情。
* Show instance view.
*
* @param int $id
* @param string $type
* @param string $tab
* @access public
* @return void
*/
public function view(int $id, string $type = 'store', string $tab = 'baseinfo')
{
if(!commonModel::hasPriv('space', 'browse')) $this->loadModel('common')->deny('space', 'browse', false);
if($type === 'store')
{
$this->instanceZen->storeView($id, $tab);
}
else
{
$instance = $this->loadModel('gitea')->fetchByID($id);
$instance->status = 'running';
$instance->source = 'user';
$instance->externalID = $instance->id;
$instance->runDuration = 0;
$instance->appName = $instance->type;
$instance->createdAt = $instance->createdDate;
$instanceMetric = new stdclass();
$instanceMetric->cpu = 0;
$instanceMetric->memory = 0;
$instanceMetric->disk = 0;
$this->view->title = $instance->name;
$this->view->instance = $instance;
$this->view->actions = $this->loadModel('action')->getList($instance->type, $id);
$this->view->defaultAccount = '';
$this->view->instanceMetric = $instanceMetric;
$this->view->dbList = array();
}
$this->view->users = $this->loadModel('user')->getPairs('noletter');
$this->view->tab = $tab;
$this->view->type = $type;
$this->display();
}
/**
* 设置应用。
* Setting instance.
*
* @param int $id
* @param string $component 0|mysql
* @access public
* @return void
*/
public function setting(int $id, string $component = '0')
{
if(!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
$instance = $this->instance->getByID($id);
$currentResource = $this->cne->getAppConfig($instance);
if(empty($component)) $component = false;
$diskSettings = $this->cne->getDiskSettings($instance, $component);
$this->lang->instance->errors->invalidDiskSize = sprintf($this->lang->instance->errors->invalidDiskSize, $diskSettings->size, $diskSettings->limit);
$this->lang->instance->tips->resizeDisk = sprintf($this->lang->instance->tips->resizeDisk, $diskSettings->size, $diskSettings->limit);
if(!empty($_POST))
{
$newInstance = fixer::input('post')->trim('name')->get();
$memoryKb = $this->post->memory_kb;
if(intval($currentResource->max->memory / 1024) != $memoryKb)
{
/* Check free memory size is enough or not. */
$clusterResource = $this->cne->cneMetrics();
$freeMemory = intval($clusterResource->metrics->memory->allocatable * 0.9); // Remain 10% memory for system.
if($memoryKb * 1024 > $freeMemory) $this->send(array('result' => 'fail', 'message' => $this->lang->instance->errors->notEnoughResource));
/* Request CNE to adjust memory size. */
$instance->oldValue = $currentResource->max->memory;
if(!$this->instance->updateMemorySize($instance, $memoryKb * 1024))
{
return $this->send(array('result' => 'fail', 'message' => dao::getError()));
}
}
$cpu = $this->post->cpu;
if($currentResource->max->cpu != $cpu)
{
$instance->oldValue = $currentResource->max->cpu;
if(!$this->instance->updateCpuSize($instance, $cpu))
{
return $this->send(array('result' => 'fail', 'message' => dao::getError()));
}
}
$disk = $this->post->disk_gb;
if(is_numeric($disk) && $disk != $diskSettings->size && $disk != $diskSettings->requestSize)
{
if($disk < $diskSettings->size || $disk > $diskSettings->limit) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->errors->invalidDiskSize));
$instance->oldValue = $diskSettings->size;
if(!$this->instance->updateVolSize($instance, $disk . 'Gi', $diskSettings->name)) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
}
if(empty($component))
{
$this->instance->updateByID($id, $newInstance);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
if($newInstance->name != $instance->name)
{
$this->action->create('instance', $instance->id, 'editName', '', json_encode(array('result' => array('result' => 'success'), 'data' => array('oldName' => $instance->name, 'newName' => $newInstance->name))));
}
}
return $this->send(array('result' => 'success', 'load' => true, 'closeModal' => true));
}
$this->view->diskSettings = $diskSettings;
$this->view->currentResource = $currentResource;
$this->view->instance = $instance;
$this->display();
}
/**
* 升级一个应用。
* Upgrade a instance.
*
* @param int $id
* @access public
* @return mixed
*/
public function upgrade(int $id)
{
if(!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
$instance = $this->instance->getByID($id);
$instance->latestVersion = $this->store->appLatestVersion($instance->appID, $instance->version);
if($_POST)
{
if(empty($instance->latestVersion)) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->noHigherVersion, 'closeModal' => true));
$postData = fixer::input('post')->get();
if($postData->confirm == 'yes') $success = $this->instance->upgrade($instance, $instance->latestVersion->version, $instance->latestVersion->app_version);
$logExtra = array('result' => 'success', 'data' => array('oldVersion' => $instance->appVersion, 'newVersion' => $instance->latestVersion->app_version));
if(!$success)
{
$logExtra['result'] = 'fail';
$this->action->create('instance', $instance->id, 'upgrade', '', json_encode($logExtra));
return $this->send(array('result' => 'fail', 'message' => !empty($logExtra['message']) ? $logExtra['message'] : $this->lang->instance->notices['upgradeFail'], 'closeModal' => true));
}
$this->action->create('instance', $instance->id, 'upgrade', '', json_encode($logExtra));
return $this->send(array('result' => 'success', 'message' => $this->lang->instance->notices['upgradeSuccess'], 'load' => $this->createLink('instance', 'view', "id=$id"), 'closeModal' => true));
}
$this->view->title = $this->lang->instance->upgrade . $instance->name;
$this->view->instance = $instance;
$this->display();
}
/**
* 访问一个应用。
* Visit a app.
*
* @param int $id
* @param int $externalID
* @access public
* @return void
*/
public function visit(int $id, int $externalID = 0)
{
if(!commonModel::hasPriv('space', 'browse')) $this->loadModel('common')->deny('space', 'browse', false);
if(!$externalID)
{
$instance = $this->instance->getByID($id);
$url = $this->instance->url($instance);
}
else
{
$pipeline = $this->loadModel('pipeline')->getByID($externalID);
$url = $pipeline->url;
}
return $this->send(array('result' => 'success', 'callback' => "window.open('{$url}')"));
}
/**
* 创建手工配置外部应用。
* Create a external app.
*
* @param string $type
* @access public
* @return void
*/
public function createExternalApp(string $type)
{
if(!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
$this->loadModel('sonarqube');
$this->app->loadLang('pipeline');
$externalApp = form::data($this->config->instance->form->create)
->add('createdBy', isset($this->app->user->account) ? $this->app->user->account : '')
->get();
$externalApp->type = $type;
$externalApp->url = rtrim($externalApp->url, '/');
if(!$this->instance->checkAppNameUnique($externalApp->name)) return $this->send(array('result' => false, 'message' => array('name' => sprintf($this->lang->error->repeat, $this->lang->pipeline->name, $externalApp->name))));
$appID = $this->loadModel('pipeline')->create($externalApp);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$this->loadModel('action')->create($type, $appID, 'created');
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('space', 'browse')));
}
/**
* 编辑手工配置外部应用。
* Edit a external app.
*
* @param int $externalID
* @access public
* @return void
*/
public function editExternalApp(int $externalID)
{
if(!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
$oldApp = $this->loadModel('pipeline')->getByID($externalID);
if($_POST)
{
$instance = form::data($this->config->instance->form->edit)
->add('editedBy', isset($this->app->user->account) ? $this->app->user->account : '')
->get();
$this->pipeline->update($externalID, $instance);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$app = $this->pipeline->getByID($externalID);
$actionID = $this->loadModel('action')->create($app->type, $externalID, 'edited');
$changes = common::createChanges($oldApp, $app);
$this->action->logHistory($actionID, $changes);
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => true, 'closeModal' => true));
}
$this->app->loadLang('space');
$this->app->loadLang('sonarqube');
$this->view->app = $oldApp;
$this->display();
}
/**
* 删除一个外部应用。
* Delete a external app.
*
* @param int $externalID
* @access public
* @return void
*/
public function deleteExternalApp(int $externalID)
{
if(!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
$oldApp = $this->loadModel('pipeline')->getByID($externalID);
$actionID = $this->pipeline->deleteByObject($externalID, $oldApp->type);
if(!$actionID)
{
$response['result'] = 'fail';
$response['callback'] = sprintf('zui.Modal.alert("%s");', $this->lang->pipeline->delError);
return $this->send($response);
}
$app = $this->pipeline->getByID($externalID);
$changes = common::createChanges($oldApp, $app);
$this->loadModel('action')->logHistory($actionID, $changes);
$response['load'] = true;
$response['message'] = zget($this->lang->instance->notices, 'uninstallSuccess');
$response['result'] = 'success';
return $this->send($response);
}
/**
* 安装应用。
* Install app.
*
* @param int $appID
* @param string $checkResource
* @access public
* @return void
*/
public function install(int $appID, string $checkResource = 'true')
{
if(!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
$cloudApp = $this->store->getAppInfo($appID);
if(empty($cloudApp)) return $this->send(array('result' => 'fail', 'load' => array('alert' => $this->lang->instance->errors->noAppInfo)));
$versionList = $this->store->appVersionList($cloudApp->id);
$mysqlList = $this->cne->sharedDBList('mysql');
$pgList = $this->cne->sharedDBList('postgresql');
if(!empty($_POST))
{
$customData = form::data($this->config->instance->form->install)->get();
if($customData->version && isset($versionList[$customData->version])) $customData->app_version = $versionList[$customData->version]->app_version;
$this->instanceZen->checkForInstall($customData);
if($checkResource == 'true')
{
$resource = new stdclass();
$resource->cpu = $cloudApp->cpu;
$resource->memory = $cloudApp->memory;
$result = $this->cne->tryAllocate(array($resource));
if(!isset($result->code) || $result->code != 200) return $this->send(array('callback' => 'alertResource()'));
}
/* If select the version, replace the latest version of App by selected version. */
if($customData->version)
{
$cloudApp->version = $customData->version;
$cloudApp->app_version = $customData->app_version;
}
$sharedDB = new stdclass();
if(isset($cloudApp->dependencies->mysql) && $customData->dbType == 'sharedDB')
{
$sharedDB = zget($mysqlList, $customData->dbService, $sharedDB);
}
elseif(isset($cloudApp->dependencies->postgresql) && $customData->dbType == 'sharedDB')
{
$sharedDB = zget($pgList, $customData->dbService, $sharedDB);
}
$instance = $this->instance->install($cloudApp, $sharedDB, $customData);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
if(!$instance) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->notices['installFail']));
return $this->send(array('result' => 'success', 'message' => $this->lang->instance->notices['installSuccess'], 'load' => $this->createLink('instance', 'view', "id=$instance->id"), 'closeModal' => true));
}
$this->view->versionList = array();
foreach($versionList as $version) $this->view->versionList[$version->version] = $version->app_version . " ({$version->version})";
$this->view->title = $this->lang->instance->install . $cloudApp->alias;
$this->view->cloudApp = $cloudApp;
$this->view->thirdDomain = $this->instance->randThirdDomain();
$this->view->mysqlList = $this->instance->dbListToOptions($mysqlList);
$this->view->pgList = $this->instance->dbListToOptions($pgList);
$this->display();
}
/**
* 卸载应用。
* Uninstall app instance.
*
* @param int $instanceID
* @param string $type
* @access public
* @return void
*/
public function ajaxUninstall(int $instanceID, string $type = '')
{
if(!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
if($type !== 'store')
{
$instance = $this->loadModel('pipeline')->getByID($instanceID);
if(!$instance) return $this->send(array('result' => 'success', 'message' => $this->lang->instance->notices['success'], 'load' => $this->createLink('space', 'browse')));
if($instance->type == 'nexus') return $this->deleteExternalApp($instance->id);
return $this->fetch($instance->type, 'delete', array('id' => $instance->id));
}
$instance = $this->instance->getByID($instanceID);
if(!$instance) return $this->send(array('result' => 'success', 'message' => $this->lang->instance->notices['success'], 'load' => $this->createLink('space', 'browse')));
$externalApp = $this->loadModel('space')->getExternalAppByApp($instance);
if($externalApp)
{
$actionID = $this->loadModel('pipeline')->deleteByObject($externalApp->id, strtolower($instance->appName));
if(!$actionID) return $this->send(array('result' => 'fail', 'message' => $this->lang->pipeline->delError));
}
$success = $this->instance->uninstall($instance);
$this->action->create('instance', $instance->id, 'uninstall', '', json_encode(array('result' => $success, 'app' => array('alias' => $instance->appName, 'app_version' => $instance->version))));
/* Synchronize deletion of backup tasks. */
/* 同步删除备份任务。 */
$this->instance->deleteBackupCron($instance);
if($success) return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'uninstallSuccess'), 'load' => $this->createLink('space', 'browse')));
return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'uninstallFail')));
}
/**
* 启动应用实例。
* Start app instance.
*
* @param int $instanceID
* @access public
* @return void
*/
public function ajaxStart(int $instanceID)
{
if(!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
$instance = $this->instance->getByID($instanceID);
if(!$instance) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->instanceNotExists));
$result = $this->instance->start($instance);
$this->action->create('instance', $instance->id, 'start', '', json_encode(array('result' => $result, 'app' => array('alias' => $instance->appName, 'app_version' => $instance->version))));
if($result->code == 200) return $this->send(array('result' => 'success', 'load' => true, 'message' => zget($this->lang->instance->notices, 'startSuccess')));
return $this->send(array('result' => 'fail', 'message' => !empty($result->message) ? $result->message : zget($this->lang->instance->notices, 'startFail')));
}
/**
* 停止应用实例。
* Stop app instance.
*
* @param int $instanceID
* @access public
* @return void
*/
public function ajaxStop(int $instanceID)
{
if(!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
$instance = $this->instance->getByID($instanceID);
if(!$instance) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->instanceNotExists));
$result = $this->instance->stop($instance);
$this->action->create('instance', $instance->id, 'stop', '', json_encode(array('result' => $result, 'app' => array('alias' => $instance->appName, 'app_version' => $instance->version))));
if($result->code == 200) return $this->send(array('result' => 'success', 'load' => true, 'message' => zget($this->lang->instance->notices, 'stopSuccess')));
return $this->send(array('result' => 'fail', 'message' => !empty($result->message) ? $result->message : zget($this->lang->instance->notices, 'stopFail')));
}
/**
* 查看应用的运行状态。
* Query status of app instance.
*
* @access public
* @return void
*/
public function ajaxStatus()
{
$postData = fixer::input('post')->setDefault('idList', array())->get();
$instances = $this->instance->getByIdList($postData->idList);
$statusList = $this->instance->batchFresh($instances);
return $this->send(array('result' => 'success', 'data' => $statusList));
}
/**
* 授权数据库。
* Generate database auth parameters and jump to login page.
*
* @access public
* @return void
*/
public function ajaxDBAuthUrl()
{
if(!commonModel::hasPriv('space', 'browse')) $this->loadModel('common')->deny('space', 'browse', false);
$post = fixer::input('post')
->setDefault('namespace', 'default')
->setDefault('instanceID', 0)
->setDefault('dbType', '')
->get();
if(empty($post->dbName)) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->errors->dbNameIsEmpty));
$instance = $this->instance->getByID((int)$post->instanceID);
if(empty($instance)) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->instanceNotExists));
$detail = $this->loadModel('cne')->appDBDetail($instance, $post->dbName);
if(empty($detail)) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->errors->notFoundDB));
$dbAuth = array();
$dbAuth['driver'] = zget($this->config->instance->adminer->dbTypes, $post->dbType, '');
$dbAuth['server'] = $detail->host . ':' . $detail->port;
$dbAuth['username'] = $detail->username;
$dbAuth['db'] = $detail->database;
$dbAuth['password'] = $detail->password;
$url = '/adminer?' . http_build_query($dbAuth);
$this->send(array('result' => 'success', 'message' => '', 'data' => array('url' => $url)));
}
/**
* 定时任务同步GitFox数据。方法用于DevOps解决方案
* Sync GitFox data (for DevOps solution).
*
* @access public
* @return void
*/
public function syncGitFoxData()
{
if(!file_exists($this->app->basePath . 'extension' . DS . 'custom' . DS . 'gitfox' . DS . 'control.php')) return false;
$this->loadModel('instance')->syncGitFoxData();
return true;
}
/**
* Instance Backup List.
* 应用备份列表。
* @param int $id
* @param int $recPerPage
* @param int $pageID
* @return void
*/
public function backupList(int $id, int $recPerPage = 5, int $pageID = 1)
{
/* Initialize Backup List. */
$instance = $this->instance->getByID($id);
$backupList = $this->instance->backupList($instance);
/* Pager. */
$this->app->loadClass('pager', true);
$recTotal = count($backupList);
$pager = new pager($recTotal, $recPerPage, $pageID);
$backupList = array_chunk($backupList, $pager->recPerPage);
$backupList = empty($backupList) ? array() : $backupList[$pageID - 1];
$this->view->instance = $instance;
$this->view->pager = $pager;
$this->view->backupList = $backupList;
$this->display();
}
/**
* Restore instance by ajax.
* 还原应用。
* @access public
* @return void
*/
public function ajaxRestore(int $instanceID, string $backupName)
{
if(empty($instanceID) || empty($backupName)) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->errors->wrongRequestData));
$backupName = base64_decode(helper::safe64Decode($backupName));
$instance = $this->instance->getByID($instanceID);
if(empty($instance)) return $this->send(array('result' => 'fail', 'load' => array('alert' => $this->lang->instance->instanceNotExists)));
$success = $this->instance->restore($instance, $this->app->user, $backupName);
if(!$success)
{
$this->action->create('instance', $instance->id, 'restore', '', json_encode(array('result' => array('result' => 'fail'))));
return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'restoreFail') ));
}
$this->action->create('instance', $instance->id, 'restore', '', json_encode(array('result' => array('result' => 'success'))));
return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'restoreSuccess'), 'load' => true));
}
/**
* 手动备份。
* Manual backup.
*
* @param int $id
* @param string $component 0|mysql
* @access public
* @return void
*/
public function manualBackup(int $id)
{
$instance = $this->instance->getByID($id);
$success = $this->instance->backup($instance, $this->app->user);
if(!$success)
{
$this->action->create('instance', $instance->id, 'manualbackup', '', json_encode(array('result' => 'fail')));
return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'backupFail')));
}
$this->action->create('instance', $instance->id, 'manualbackup', '', json_encode(array('result' => 'success')));
return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'backupSuccess')));
}
/**
* 备份设置。
* backup settings.
*
* @param int $id
* @param string $component 0|mysql
* @access public
* @return void
*/
public function backupSettings(int $instanceID)
{
$instance = $this->instance->getByID($instanceID);
if($_POST)
{
$this->instance->saveBackupSettings($instance);
if(dao::isError()) return $this->send(array('result' => 'fail', 'load' => array('alert' => dao::getError())));
$locate = $this->createLink('instance', 'view', 'id=' . $instanceID);
return $this->send(array('result' => 'success', 'load' => array('alert' => $this->lang->saveSuccess, 'locate' => $locate, 'closeModal' => true)));
}
$this->view->instance = $instance;
$this->view->backupSettings = $this->instance->getBackupSettings($instanceID);
$this->display();
}
/**
* Cron task of auto backup.
* 定时备份。
*
* @param $instanceID
* @return int|null
*/
public function cronBackup(string $instanceID)
{
$instance = $this->instance->getByID((int)$instanceID);
if(empty($instance)) return $this->send(array('result' => 'success', 'message' => $this->lang->instance->instanceNotExists));
$sysUser = new stdclass;
$sysUser->account = 'system';
$success = $this->instance->autoBackup($instance, $sysUser);
if(!$success)
{
return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'backupFail')));
}
return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'backupSuccess')));
}
/**
* Cron cleaning backup.
* 定时清理备份。
*
* @return void
*/
public function cronCleanBackup()
{
if(!$this->config->inQuickon) return $this->send(array('result' => 'success', 'message' => $this->lang->instance->notices['NoCleanBackupFiles']));
/* Init instance list. */
$instances = $this->loadModel('space')->getSpaceInstances(0, 'running');
if(empty($instances)) return $this->send(array('result' => 'success', 'message' => $this->lang->instance->notices['NoCleanBackupFiles']));
/* Cycle cleaning backup. */
$sysUser = new stdclass;
$sysUser->account = 'system';
foreach($instances as $instance) $this->instance->cleanBackup($instance, $sysUser);
return $this->send(array('result' => 'success', 'message' => $this->lang->instance->notices['cleanBackupSuccess']));
}
/**
* Delete backup by ajax.
* 删除备份。
* @param int $backupID
* @access public
* @return void
*/
public function ajaxDeleteBackup(string $instanceID, string $backupName)
{
$instance = $this->instance->getByID((int)$instanceID);
if(empty($instance)) $this->send(array('result' => 'success', 'message' => $this->lang->instance->instanceNotExists));
$backupName = base64_decode(helper::safe64Decode($backupName));
$success = $this->instance->deleteBackup($instance, $backupName);
if(!$success) return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'deleteFail')));
$this->action->create('instance', $instance->id, 'manualdeletebackup', '', json_encode(array('result' => 'success')));
return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'deleteSuccess'), 'load' => $this->createLink('instance', 'view', 'id=' . $instanceID)));
}
/**
* Ajax 方式获取组件列表。
* ajax Get Components.
* @param int $id
* @return void
*/
public function ajaxGetComponents(int $id)
{
$componentList = array();
$instance = $this->instance->getByID($id);
$components = $this->cne->getComponents($instance);
if(empty($components->data)) return print(json_encode($componentList));
foreach($components->data as $component)
{
$componentList[] = array('value' => $component->name, 'text' => $component->name);
}
return print(json_encode($componentList));
}
/**
* Ajax 方式获取 Pods 列表。
* ajax Get Pods.
* @param int $id
* @return void
*/
public function ajaxGetPods(int $id)
{
$podList = [];
$instance = $this->instance->getByID($id);
$formData = form::data($this->config->instance->form->events)->get();
$pods = $this->cne->getPods($instance, $formData->component);
if(empty($pods->data)) return print(json_encode($podList));
foreach($pods->data as $pod)
{
$podList[] = array('value' => $pod->name, 'text' => $pod->name);
}
return print(json_encode($podList));
}
/**
* watch Logs page.
* 查看日志页面.
*
* @param int $id
* @return void
*/
public function logs(int $id): void
{
if (!commonModel::hasPriv('instance', 'manage')) $this->loadModel('common')->deny('instance', 'manage', false);
$instance = $this->instance->getByID($id);
$this->view->instance = $instance;
$this->view->title = $this->lang->instance->log->viewButton;
$this->display();
}
/**
* Get logs api.
* 获取日志接口。
* @param int $id
* @return void
*/
public function showLogs(int $id)
{
$instance = $this->instance->getByID($id);
$formData = form::data($this->config->instance->form->events)->get();
$component = $formData->component;
$pod = $formData->pod;
$previous = $formData->previous == 1;
$container = $formData->container;
$data = $this->cne->getAppLogs($instance, $component, $pod, $container, $previous) ?? new stdClass();
return print(json_encode($data));
}
/**
* watch Events page.
* 查看事件页面.
*
* @param int $id
* @return void
*/
public function events(int $id): void
{
if (!commonModel::hasPriv('instance', 'manage'))
{
$this->loadModel('common')->deny('instance', 'manage', false);
}
$this->view->instance = $this->instance->getByID($id);
$this->display();
}
/**
* Get Events api.
* 获取日志接口。
* @param int $id
* @return void
*/
public function showEvents(int $id)
{
$instance = $this->instance->getByID($id);
$formData = form::data($this->config->instance->form->events)->get();
$data = $this->cne->getEvents($instance, $formData->component) ?? new stdClass();
return print(json_encode($data));
}
}