diff --git a/db/update18.6.sql b/db/update18.6.sql index 4b2388e3bc..29aab90f39 100644 --- a/db/update18.6.sql +++ b/db/update18.6.sql @@ -88,6 +88,10 @@ CREATE TABLE `zt_artifactrepo` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +ALTER TABLE `zt_host` ADD COLUMN `product` varchar(255) NOT NULL DEFAULT '' AFTER `hostType`,ADD COLUMN `testType` varchar(10) NOT NULL DEFAULT '' AFTER `product`; +UPDATE `zt_host` SET `testType`='kvm',`type`='normal' WHERE `type`='zahost'; +UPDATE `zt_host` SET `testType`='node',`type`='normal',`hostType`='physical' WHERE `type`='node' AND `parent`=0; + INSERT INTO `zt_privmanager` (`parent`, `code`, `type`, `edition`, `vision`, `order`) VALUES (515, 'application', 'package', ',open,biz,max,ipd,', ',rnd,', 5); INSERT INTO `zt_priv` (`module`, `method`, `parent`, `edition`, `vision`, `system`, `order`) VALUES ('space', 'browse', 651, ',open,biz,max,ipd,', ',rnd,', '1', 10),('instance', 'view', 651, ',open,biz,max,ipd,', ',rnd,', '1', 20),('space', 'getStoreAppInfo', 651, ',open,biz,max,ipd,', ',rnd,', '1', 30),('instance', 'install', 651, ',open,biz,max,ipd,', ',rnd,', '1', 40),('instance', 'visit', 651, ',open,biz,max,ipd,', ',rnd,', '1', 50),('instance', 'ajaxStatus', 651, ',open,biz,max,ipd,', ',rnd,', '1', 60),('instance', 'ajaxStart', 651, ',open,biz,max,ipd,', ',rnd,', '1', 70),('instance', 'ajaxStop', 651, ',open,biz,max,ipd,', ',rnd,', '1', 80),('instance', 'ajaxUninstall', 651, ',open,biz,max,ipd,', ',rnd,', '1', 90),('instance', 'upgrade', 651, ',open,biz,max,ipd,', ',rnd,', '1', 100); diff --git a/module/host/config.php b/module/host/config.php index c223cdbba6..f04d4e8fb4 100644 --- a/module/host/config.php +++ b/module/host/config.php @@ -2,9 +2,9 @@ $config->host->create = new stdclass(); $config->host->edit = new stdclass(); $config->host->changestatus = new stdclass(); -$config->host->create->requiredFields = 'name,zap,tags,provider,intranet,extranet'; -$config->host->edit->requiredFields = 'name,zap,tags,provider,intranet,extranet'; -$config->host->create->intFields = 'cpuNumber,cpuCores,zap'; +$config->host->create->requiredFields = 'name,tags,provider,intranet,extranet'; +$config->host->edit->requiredFields = 'name,tags,provider,intranet,extranet'; +$config->host->create->intFields = 'cpuNumber,cpuCores'; $config->host->create->ipFields = 'intranet,extranet'; $config->host->editor = new stdclass(); diff --git a/module/host/config/dtable.php b/module/host/config/dtable.php index 5efbc85ead..7bf1a18392 100644 --- a/module/host/config/dtable.php +++ b/module/host/config/dtable.php @@ -59,6 +59,13 @@ $config->host->dtable->fieldList['status']['sortType'] = true; $config->host->dtable->fieldList['status']['width'] = 80; $config->host->dtable->fieldList['status']['map'] = $lang->host->statusList; +$config->host->dtable->fieldList['heartbeat']['title'] = $lang->host->registerDate; +$config->host->dtable->fieldList['heartbeat']['name'] = 'heartbeat'; +$config->host->dtable->fieldList['heartbeat']['type'] = 'datetime'; +$config->host->dtable->fieldList['heartbeat']['sortType'] = true; +$config->host->dtable->fieldList['heartbeat']['width'] = 80; +$config->host->dtable->fieldList['heartbeat']['map'] = $lang->host->statusList; + $config->host->actionList = array(); $config->host->actionList['online']['icon'] = 'arrow-up'; $config->host->actionList['online']['text'] = $lang->host->online; diff --git a/module/host/control.php b/module/host/control.php index 863d644d91..799774a2ff 100644 --- a/module/host/control.php +++ b/module/host/control.php @@ -49,6 +49,7 @@ class host extends control $this->loadModel('search')->setSearchParams($this->config->host->search); $this->loadModel('tree'); + $this->app->loadLang('zahost'); $this->view->title = $this->lang->host->common; $this->view->hostList = $hostList; $this->view->pager = $pager; @@ -71,29 +72,34 @@ class host extends control * @access public * @return void */ - public function create($osName = 'linux') + public function create($osName = 'linux', $hostType = 'physical', $isTestNode = 0) { if($_POST) { $id = $this->host->create(); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse'))); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $_POST['testType'] === 'node' && $_POST['$isTestNode'] == 1 ? inlink('view', "id=$id") : inlink('browse'))); } $this->view->defaultParams = array( - 'zap' => '8085', - 'pri' => '100', - 'bridgeID' => 'br0', + 'pri' => '100', + 'bridgeID' => 'br0', ); + $testTypes = $this->lang->host->testTypes; + if($hostType != 'physical') unset($testTypes['kvm']); + $this->view->title = $this->lang->host->create; $this->view->osName = $osName; + $this->view->hostType = $hostType; + $this->view->testTypes = $testTypes; + $this->view->isTestNode = intval($isTestNode); $this->view->position[] = html::a($this->createLink('host', 'browse'), $this->lang->host->common); $this->view->position[] = $this->lang->host->create; - $this->view->rooms = $this->loadModel('serverroom')->getPairs(); $this->view->accounts = $this->loadModel('account')->getPairs(); + $this->view->products = $this->loadModel('product')->getPairs('', 0, '', 'all'); $this->view->optionMenu = $this->loadModel('tree')->getOptionMenu(0, 'host'); $this->display(); @@ -105,7 +111,7 @@ class host extends control * @access public * @return void */ - public function edit($id, $osName = '') + public function edit($id, $osName = '', $hostType = 'physical', $isTestNode = -1) { if($_POST) { @@ -118,19 +124,29 @@ class host extends control if(!empty($changes)) $this->action->logHistory($actionID, $changes); } - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => inlink('browse'), 'closeModal' => true)); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $_POST['testType'] === 'node' && $_POST['isTestNode'] == 1 ? inlink('view', "id=$id") : inlink('browse'), 'closeModal' => true)); } + $host = $this->host->getById($id); + $testTypes = $this->lang->host->testTypes; + if($hostType != 'physical') unset($testTypes['kvm']); + if($isTestNode == -1) $isTestNode = $host->testType ? 1 : 0; + + $this->view->osName = $osName; + $this->view->hostType = $hostType; + $this->view->testTypes = $testTypes; + $this->view->isTestNode = intval($isTestNode); $this->view->accounts = $this->loadModel('account')->getPairs(); $this->view->title = $this->lang->host->edit; $this->view->position[] = html::a($this->createLink('host', 'browse'), $this->lang->host->common); $this->view->position[] = $this->lang->host->edit; - $this->view->host = $this->host->getById($id); + $this->view->host = $host; $this->view->osName = $osName ? $osName : $this->view->host->osName; $this->view->accounts = $this->loadModel('account')->getPairs(); $this->view->rooms = $this->loadModel('serverroom')->getPairs(); $this->view->optionMenu = $this->loadModel('tree')->getOptionMenu(0, 'host'); + $this->view->products = $this->loadModel('product')->getPairs('', 0, '', 'all'); $this->display(); } diff --git a/module/host/css/common.ui.css b/module/host/css/common.ui.css index be802106ed..a574a11a59 100644 --- a/module/host/css/common.ui.css +++ b/module/host/css/common.ui.css @@ -6,3 +6,5 @@ #mainNavbar .nav-item>a {padding-right: 0.5rem} #mainNavbar .nav-item>.active {color: unset; font-weight: 700;} #mainNavbar .nav-item>a.active:after {position: absolute; content: ''; border-bottom: 2px solid #2e7fff; inset: 0 6px 0 15px;} +.form-grid .form-label{width: 8rem;} +.form-grid .form-group{padding-left: 8rem;} \ No newline at end of file diff --git a/module/host/js/browse.ui.js b/module/host/js/browse.ui.js index 1cd652aa99..0c3d1c820c 100644 --- a/module/host/js/browse.ui.js +++ b/module/host/js/browse.ui.js @@ -11,7 +11,27 @@ window.renderCell = function(result, {col, row}) if(col.name === 'osVersion') { const{osName, osVersion} = row.data; - if(osName) result[0] = {html: hostLang[osName + 'List'][osVersion]}; + if(osName && osVersion != '') result[0] = {html: hostLang[osName + 'List'][osVersion]}; + + return result; + } + + if(col.name === 'status') + { + let status = ''; + if(row.data.testType === '') + { + status = hostLang.statusList[row.data.status]; + result[0] = {html: status}; + } + else + { + status = zahostLang.statusList[row.data.status]; + let html = "" + status + ""; + if(row.data.status === 'wait') html = "" + status + ""; + result[0] = {html: html}; + + } return result; } diff --git a/module/host/js/create.ui.js b/module/host/js/create.ui.js index 44a291ffdb..09271d43ec 100644 --- a/module/host/js/create.ui.js +++ b/module/host/js/create.ui.js @@ -1,4 +1,18 @@ +var params = 'osName={osName}&hostType={hostType}&isTestNode={isTestNode}'; window.osChange = function(e) { - loadPage($.createLink('host', 'create', 'osName=' + e.target.value), '#osVersion'); + var currentParam = params.replace('{osName}', e.target.value).replace('{hostType}', hostType).replace('{isTestNode}', isTestNode); + loadPage($.createLink('host', 'create', currentParam), '#osVersion'); +} +window.hostTypeChange = function(e) +{ + var currentParam = params.replace('{osName}', osName).replace('{hostType}', e.target.value).replace('{isTestNode}', isTestNode); + loadPage($.createLink('host', 'create', currentParam), '#testType'); +} + +window.isTestNodeChange = function(e) +{ + const checked = $('#isTestNode').prop('checked'); + var currentParam = params.replace('{osName}', osName).replace('{hostType}', hostType).replace('{isTestNode}', checked ? 1 : 0); + loadPage($.createLink('host', 'create', currentParam), '#testContainer'); } \ No newline at end of file diff --git a/module/host/js/edit.ui.js b/module/host/js/edit.ui.js index 894d3eed0d..8fcee1293c 100644 --- a/module/host/js/edit.ui.js +++ b/module/host/js/edit.ui.js @@ -1,4 +1,19 @@ +var params = 'id=' + host.id + '&osName={osName}&hostType={hostType}&isTestNode={isTestNode}'; window.osChange = function(e) { - loadPage($.createLink('host', 'edit', 'id=' + host.id + '&osName=' + e.target.value), '#osVersion'); -} \ No newline at end of file + var currentParam = params.replace('{osName}', e.target.value).replace('{hostType}', hostType).replace('{isTestNode}', isTestNode); + loadPage($.createLink('host', 'edit', currentParam), '#osVersion'); +} +window.hostTypeChange = function(e) +{ + var currentParam = params.replace('{osName}', osName).replace('{hostType}', e.target.value).replace('{isTestNode}', isTestNode); + loadPage($.createLink('host', 'edit', currentParam), '#testType'); +} + +window.isTestNodeChange = function(e) +{ + const checked = $('#isTestNode_1').prop('checked'); + console.log(111, checked) + var currentParam = params.replace('{osName}', osName).replace('{hostType}', hostType).replace('{isTestNode}', checked ? 1 : 0); + loadPage($.createLink('host', 'edit', currentParam), '#testContainer'); +} diff --git a/module/host/lang/de.php b/module/host/lang/de.php index 58fd0aa49e..a08967f216 100644 --- a/module/host/lang/de.php +++ b/module/host/lang/de.php @@ -11,6 +11,7 @@ $lang->host->treemap = 'Host Topology'; $lang->host->changeStatus = 'Online/Offline'; $lang->host->byQuery = 'Search'; $lang->host->reason = 'Reason'; +$lang->host->testType = 'Type'; $lang->host->name = 'Name'; $lang->host->type = 'Type'; @@ -28,12 +29,14 @@ $lang->host->cpuCores = 'CPU Cores'; $lang->host->cpuRate = 'CPU Rate'; $lang->host->memory = 'Memory Size'; $lang->host->serverRoom = 'IDC'; +$lang->host->isTestNode = 'Used as test node'; -$lang->host->createdBy = 'CreatedBy'; -$lang->host->createdDate = 'CreatedDate'; -$lang->host->editedBy = 'EditedBy'; -$lang->host->editedDate = 'EditedDate'; -$lang->host->all = 'All Hosts'; +$lang->host->createdBy = 'CreatedBy'; +$lang->host->createdDate = 'CreatedDate'; +$lang->host->editedBy = 'EditedBy'; +$lang->host->editedDate = 'EditedDate'; +$lang->host->registerDate = 'RegisterDate'; +$lang->host->all = 'All Hosts'; $lang->host->empty = 'No Host'; diff --git a/module/host/lang/en.php b/module/host/lang/en.php index 58fd0aa49e..a08967f216 100644 --- a/module/host/lang/en.php +++ b/module/host/lang/en.php @@ -11,6 +11,7 @@ $lang->host->treemap = 'Host Topology'; $lang->host->changeStatus = 'Online/Offline'; $lang->host->byQuery = 'Search'; $lang->host->reason = 'Reason'; +$lang->host->testType = 'Type'; $lang->host->name = 'Name'; $lang->host->type = 'Type'; @@ -28,12 +29,14 @@ $lang->host->cpuCores = 'CPU Cores'; $lang->host->cpuRate = 'CPU Rate'; $lang->host->memory = 'Memory Size'; $lang->host->serverRoom = 'IDC'; +$lang->host->isTestNode = 'Used as test node'; -$lang->host->createdBy = 'CreatedBy'; -$lang->host->createdDate = 'CreatedDate'; -$lang->host->editedBy = 'EditedBy'; -$lang->host->editedDate = 'EditedDate'; -$lang->host->all = 'All Hosts'; +$lang->host->createdBy = 'CreatedBy'; +$lang->host->createdDate = 'CreatedDate'; +$lang->host->editedBy = 'EditedBy'; +$lang->host->editedDate = 'EditedDate'; +$lang->host->registerDate = 'RegisterDate'; +$lang->host->all = 'All Hosts'; $lang->host->empty = 'No Host'; diff --git a/module/host/lang/fr.php b/module/host/lang/fr.php index 30216996f3..4ee4f9110c 100644 --- a/module/host/lang/fr.php +++ b/module/host/lang/fr.php @@ -11,6 +11,7 @@ $lang->host->treemap = 'Topologie Serveur'; $lang->host->changeStatus = 'Online/Offline'; $lang->host->byQuery = 'Recherche'; $lang->host->reason = 'Raison'; +$lang->host->testType = 'Type'; $lang->host->name = 'Nom'; $lang->host->type = 'Type'; @@ -28,12 +29,14 @@ $lang->host->cpuCores = 'CPU Cores'; $lang->host->cpuRate = 'CPU Freq.'; $lang->host->memory = 'Capacité Mémoire'; $lang->host->serverRoom = 'IDC'; +$lang->host->isTestNode = 'Used as test node'; -$lang->host->createdBy = 'Créé par'; -$lang->host->createdDate = 'Créé le'; -$lang->host->editedBy = 'Edité par'; -$lang->host->editedDate = 'Edité le'; -$lang->host->all = 'Tous Serveurs'; +$lang->host->createdBy = 'Créé par'; +$lang->host->createdDate = 'Créé le'; +$lang->host->editedBy = 'Edité par'; +$lang->host->editedDate = 'Edité le'; +$lang->host->registerDate = 'RegisterDate'; +$lang->host->all = 'Tous Serveurs'; $lang->host->empty = 'No Host'; diff --git a/module/host/lang/vi.php b/module/host/lang/vi.php index c651ab195b..5c0cd2d50f 100644 --- a/module/host/lang/vi.php +++ b/module/host/lang/vi.php @@ -11,6 +11,7 @@ $lang->host->treemap = 'Cấu trúc Host'; $lang->host->changeStatus = 'Online/Offline'; $lang->host->byQuery = 'Tìm kiếm'; $lang->host->reason = 'Lý do'; +$lang->host->testType = 'Type'; $lang->host->name = 'Tên'; $lang->host->type = 'Loại'; @@ -28,12 +29,14 @@ $lang->host->cpuCores = 'CPU Cores'; $lang->host->cpuRate = 'CPU Rate'; $lang->host->memory = 'Memory Size'; $lang->host->serverRoom = 'IDC'; +$lang->host->isTestNode = 'Used as test node'; -$lang->host->createdBy = 'Người tạo'; -$lang->host->createdDate = 'Ngày tạo'; -$lang->host->editedBy = 'Người sửa'; -$lang->host->editedDate = 'Ngày sửa'; -$lang->host->all = 'Tất cả Hosts'; +$lang->host->createdBy = 'Người tạo'; +$lang->host->createdDate = 'Ngày tạo'; +$lang->host->editedBy = 'Người sửa'; +$lang->host->editedDate = 'Ngày sửa'; +$lang->host->registerDate = 'RegisterDate'; +$lang->host->all = 'Tất cả Hosts'; $lang->host->groupMaintenance = 'Quản lý Group'; diff --git a/module/host/lang/zh-cn.php b/module/host/lang/zh-cn.php index d55d9bee85..688bcbcb8e 100644 --- a/module/host/lang/zh-cn.php +++ b/module/host/lang/zh-cn.php @@ -11,6 +11,7 @@ $lang->host->treemap = '主机拓扑图'; $lang->host->changeStatus = '上架/下架'; $lang->host->byQuery = '搜索'; $lang->host->reason = '原因'; +$lang->host->testType = '方式'; $lang->host->name = '名称'; $lang->host->type = '类型'; @@ -28,12 +29,14 @@ $lang->host->cpuCores = '单CPU核心数'; $lang->host->cpuRate = 'CPU频率'; $lang->host->memory = '内存大小'; $lang->host->serverRoom = '机房'; +$lang->host->isTestNode = '用于自动化测试'; -$lang->host->createdBy = '由谁创建'; -$lang->host->createdDate = '创建时间'; -$lang->host->editedBy = '由谁编辑'; -$lang->host->editedDate = '编辑时间'; -$lang->host->all = '全部主机'; +$lang->host->createdBy = '由谁创建'; +$lang->host->createdDate = '创建时间'; +$lang->host->editedBy = '由谁编辑'; +$lang->host->editedDate = '编辑时间'; +$lang->host->registerDate = '最后注册时间'; +$lang->host->all = '全部主机'; $lang->host->empty = '暂时没有主机'; @@ -44,6 +47,9 @@ $lang->host->statusList['online'] = '已上架'; $lang->host->statusList['busy'] = '已超载'; $lang->host->statusList['offline'] = '已下架'; +$lang->host->testTypes['node'] = '使用主机执行测试'; +$lang->host->testTypes['kvm'] = '使用主机生成的虚拟机执行测试'; + $lang->host->online = '上架'; $lang->host->busy = '超载'; $lang->host->offline = '下架'; diff --git a/module/host/lang/zh-tw.php b/module/host/lang/zh-tw.php index 076f77df46..7b1dfe50c7 100644 --- a/module/host/lang/zh-tw.php +++ b/module/host/lang/zh-tw.php @@ -9,6 +9,7 @@ $lang->host->treemap = '拓撲圖'; $lang->host->changeStatus = '上架/下架'; $lang->host->byQuery = '搜索'; $lang->host->reason = '原因'; +$lang->host->testType = '方式'; $lang->host->name = '名稱'; $lang->host->type = '類型'; @@ -24,12 +25,14 @@ $lang->host->cpuCores = '單CPU核心數'; $lang->host->cpuRate = 'CPU頻率'; $lang->host->memory = '內存大小'; $lang->host->serverRoom = '機房'; +$lang->host->isTestNode = '用於自動化測試'; -$lang->host->createdBy = '由誰創建'; -$lang->host->createdDate = '創建時間'; -$lang->host->editedBy = '由誰編輯'; -$lang->host->editedDate = '編輯時間'; -$lang->host->all = '所有主機'; +$lang->host->createdBy = '由誰創建'; +$lang->host->createdDate = '創建時間'; +$lang->host->editedBy = '由誰編輯'; +$lang->host->editedDate = '編輯時間'; +$lang->host->registerDate = '最後注冊時間'; +$lang->host->all = '所有主機'; $lang->host->groupMaintenance = '分組維護'; diff --git a/module/host/model.php b/module/host/model.php index 8a17e4a089..e6b6125abd 100644 --- a/module/host/model.php +++ b/module/host/model.php @@ -24,6 +24,22 @@ class hostModel extends model ->where('id')->eq($id) ->fetch(); + if($host->testType === 'kvm') + { + $host->heartbeat = empty($host->heartbeat) ? '' : $host->heartbeat; + + if(time() - strtotime($host->heartbeat) > 60 && $host->status == 'online') + { + $host->status = 'offline'; + } + } + elseif($host->testType === 'node') + { + if(time() - strtotime($host->heartbeat) > 60) + { + $host->status = 'offline'; + } + } return $host; } @@ -84,15 +100,35 @@ class hostModel extends model } $orderBy = str_replace($orderBy, 't1.', ''); - $host = $this->dao->select('*,id as hostID')->from(TABLE_HOST) + $hostList = $this->dao->select('*,id as hostID')->from(TABLE_HOST) ->where('deleted')->eq('0') - ->andWhere('type')->eq('normal') + ->andWhere('type')->in('normal,zahost') ->beginIF($modules)->andWhere('`group`')->in($modules)->fi() ->beginIF($query)->andWhere($query)->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll(); - return $host; + + foreach($hostList as $host) + { + + $host->heartbeat = empty($host->heartbeat) ? '' : $host->heartbeat; + if($host->testType === 'kvm') + { + if(time() - strtotime($host->heartbeat) > 60 && $host->status == 'online') + { + $host->status = 'offline'; + } + } + elseif($host->testType === 'node') + { + if(time() - strtotime($host->heartbeat) > 60) + { + $host->status = 'offline'; + } + } + } + return $hostList; } /** @@ -110,7 +146,7 @@ class hostModel extends model return $this->dao->select('id,name')->from(TABLE_HOST) ->where('deleted')->eq('0') ->andWhere('`id`')->in($hostIdList) - ->andWhere('type')->eq('normal') + ->andWhere('type')->in('normal,zahost') ->orderBy('`group`') ->fetchPairs('id', 'name'); } @@ -138,7 +174,7 @@ class hostModel extends model return $this->dao->select("id,name")->from(TABLE_HOST) ->where('deleted')->eq('0') - ->andWhere('type')->eq('normal') + ->andWhere('type')->in('normal,zahost') ->beginIF($modules)->andWhere('`group`')->in($modules)->fi() ->orderBy('`group`') ->fetchPairs('id', 'name'); @@ -155,13 +191,33 @@ class hostModel extends model $hostInfo = fixer::input('post') ->setDefault('hardwareType', 'server') ->setDefault('cpuNumber,cpuCores,diskSize,memory', 0) + ->trim('extranet') ->get(); + if(isset($hostInfo->isTestNode)) + { + $hostInfo->product = empty($hostInfo->product) ? '' : ',' . implode(',', $hostInfo->product) . ','; + if($hostInfo->testType === 'kvm') + { + $hostInfo->status = 'wait'; + $hostInfo->zap = $this->config->zahost->defaultPort; + $hostInfo->secret = md5($hostInfo->name . time()); + } + } + else + { + $hostInfo->product = ''; + $hostInfo->testType = ''; + } + + unset($hostInfo->isTestNode); + $hostInfo->admin = intval($hostInfo->admin); $hostInfo->serverRoom = intval($hostInfo->serverRoom); $this->dao->update(TABLE_HOST)->data($hostInfo) ->batchCheck($this->config->host->create->requiredFields, 'notempty') - ->batchCheck('diskSize,memory', 'float'); + ->batchCheck('diskSize,memory', 'float') + ->check('name', 'unique', "type='normal'"); if(dao::isError()) return false; $intFields = explode(',', $this->config->host->create->intFields); @@ -192,7 +248,7 @@ class hostModel extends model { $hostID = $this->dao->lastInsertID(); $this->loadModel('action')->create('host', $hostID, 'created'); - return true; + return $hostID; } return false; @@ -214,12 +270,29 @@ class hostModel extends model ->setDefault('cpuNumber,cpuCores,diskSize,memory', 0) ->get(); + if(isset($hostInfo->isTestNode)) + { + $hostInfo->product = empty($hostInfo->product) ? '' : ',' . implode(',', $hostInfo->product) . ','; + if($hostInfo->testType === 'kvm') + { + $hostInfo->status = 'wait'; + $hostInfo->zap = $this->config->zahost->defaultPort; + $hostInfo->secret = md5($hostInfo->name . time()); + } + } + else + { + $hostInfo->product = ''; + $hostInfo->testType = ''; + } + unset($hostInfo->isTestNode); $hostInfo->admin = intval($hostInfo->admin); $hostInfo->serverRoom = intval($hostInfo->serverRoom); $this->dao->update(TABLE_HOST)->data($hostInfo) ->batchCheck($this->config->host->create->requiredFields, 'notempty') - ->batchCheck('diskSize,memory', 'float'); + ->batchCheck('diskSize,memory', 'float') + ->check('name', 'unique', "id != $id and type='normal'"); if(dao::isError()) return false; $intFields = explode(',', $this->config->host->create->intFields); @@ -241,7 +314,7 @@ class hostModel extends model return false; } } - + $hostInfo->type = 'normal'; $hostInfo->editedBy = $this->app->user->account; $hostInfo->editedDate = helper::now(); $this->dao->update(TABLE_HOST)->data($hostInfo)->autoCheck()->where('id')->eq($id)->exec(); @@ -274,7 +347,7 @@ class hostModel extends model $stmt = $this->dao->select('t1.id,t1.name,t3.id as roomID,t3.city,t3.name as roomName,t1.extranet')->from(TABLE_HOST)->alias('t1') ->leftJoin(TABLE_SERVERROOM)->alias('t3')->on('t1.serverRoom=t3.id') ->where('t1.deleted')->eq(0) - ->andWhere('t1.type')->eq('normal') + ->andWhere('t1.type')->in('normal,zahost') ->andWhere('t3.deleted')->eq(0) ->andWhere('t1.serverRoom')->ne(0) ->orderBy('t3.city,t3.id,t1.id') @@ -334,7 +407,7 @@ class hostModel extends model $this->app->loadLang('serverroom'); $hostGroups = $this->dao->select('id,name,`group`,extranet')->from(TABLE_HOST) ->where('deleted')->eq(0) - ->andWhere('type')->eq('normal') + ->andWhere('type')->in('normal,zahost') ->fetchGroup('group', 'id'); /* Get module list by host group. */ @@ -403,6 +476,7 @@ class hostModel extends model { if(!$host->id) return false; if (in_array($action, array('online', 'offline')) && !common::hasPriv('host', 'changeStatus')) return false; + if (in_array($action, array('online', 'offline')) && $host->testType !== '') return false; if($host->status == 'online' && $action == 'online') return false; if($host->status == 'offline' && $action == 'offline') return false; diff --git a/module/host/ui/browse.html.php b/module/host/ui/browse.html.php index 469637d38b..4520ea22d3 100644 --- a/module/host/ui/browse.html.php +++ b/module/host/ui/browse.html.php @@ -12,8 +12,9 @@ declare(strict_types=1); namespace zin; -jsVar('orderBy', $orderBy); -jsVar('hostLang', $lang->host); +jsVar('orderBy', $orderBy); +jsVar('hostLang', $lang->host); +jsVar('zahostLang', $lang->zahost); jsVar('sortLink', helper::createLink('host', 'browse', "browseType=$browseType¶m=$param&orderBy={orderBy}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}")); $config->host->featureBar[0]['active'] = true; diff --git a/module/host/ui/create.html.php b/module/host/ui/create.html.php index 7fb8edb3f7..e892114b83 100644 --- a/module/host/ui/create.html.php +++ b/module/host/ui/create.html.php @@ -12,6 +12,10 @@ declare(strict_types=1); namespace zin; +jsVar('osName', $osName); +jsVar('hostType', $hostType); +jsVar('isTestNode', $isTestNode); + formPanel ( set::id('hostCreateForm'), @@ -126,7 +130,8 @@ formPanel set::control('picker'), set::name('hostType'), set::items($lang->host->hostTypeList), - set::value('virtual') + set::value($hostType), + on::change('hostTypeChange'), ) ), formRow @@ -146,6 +151,7 @@ formPanel set::width('1/3'), set::label($lang->host->osVersion), set::control('picker'), + set::required(true), set::name('osVersion'), set::items($lang->host->{"{$osName}List"}), ) @@ -155,9 +161,10 @@ formPanel formGroup ( set::width('1/3'), - set::name('zap'), - set::label($lang->host->zap), - set::value(8086), + set::label($lang->host->provider), + set::control('picker'), + set::name('provider'), + set::items($lang->host->providerList), ), formGroup ( @@ -189,10 +196,10 @@ formPanel formGroup ( set::width('1/3'), - set::label($lang->host->provider), - set::control('picker'), - set::name('provider'), - set::items($lang->host->providerList), + set::label($lang->host->isTestNode), + set::control('checkbox'), + set::name('isTestNode'), + on::change('isTestNodeChange'), ), formGroup ( @@ -205,4 +212,27 @@ formPanel set::items($lang->host->statusList), ) ), + formRow + ( + setID('testContainer'), + formGroup + ( + set::width('1/3'), + setClass($isTestNode ? '' : 'hidden'), + set::name("product[]"), + set::label($lang->story->product), + set::control(array("type" => "picker","multiple" => true)), + set::items($products), + ), + formGroup + ( + set::width('1/3'), + setClass($isTestNode ? '' : 'hidden'), + set::name("testType"), + set::required(true), + set::label($lang->host->testType), + set::control('picker'), + set::items($testTypes), + ), + ), ); diff --git a/module/host/ui/edit.html.php b/module/host/ui/edit.html.php index ae0f9cf7b0..126ddd8017 100644 --- a/module/host/ui/edit.html.php +++ b/module/host/ui/edit.html.php @@ -13,6 +13,9 @@ declare(strict_types=1); namespace zin; jsVar('host', $host); +jsVar('osName', $osName); +jsVar('hostType', $hostType); +jsVar('isTestNode', $isTestNode); formPanel ( @@ -169,9 +172,11 @@ formPanel formGroup ( set::width('400px'), - set::name('zap'), - set::label($lang->host->zap), - set::value($host->zap ? $host->zap : 8086), + set::label($lang->host->provider), + set::control('picker'), + set::name('provider'), + set::items($lang->host->providerList), + set::value($host->provider) ), formGroup ( @@ -189,6 +194,7 @@ formPanel ( set::width('400px'), set::name('intranet'), + set::readonly($host->testType === 'kvm'), set::label($lang->host->intranet), set::value($host->intranet), ), @@ -196,6 +202,7 @@ formPanel ( set::width('400px'), set::name('extranet'), + set::readonly($host->testType === 'kvm'), set::label($lang->host->extranet), set::value($host->extranet), ) @@ -204,22 +211,50 @@ formPanel ( formGroup ( - set::width('400px'), - set::label($lang->host->provider), - set::control('picker'), - set::name('provider'), - set::items($lang->host->providerList), - set::value($host->provider) + set::width('1/3'), + set::label($lang->host->isTestNode), + set::control('checkbox'), + set::name('isTestNode'), + set::disabled($host->testType == 'kvm'), + on::change('isTestNodeChange'), + set::value($host->testType ? '1' : ''), + set::items(array('1' => '')) ), - formGroup + $host->testType == 'kvm' ? null : formGroup ( - set::width('400px'), + set::width('1/3'), set::name('status'), set::control('radioList'), set::label($lang->host->status), - set::value($host->status ? $host->status : 'online'), + set::value('online'), set::inline(true), set::items($lang->host->statusList), ) ), + formRow + ( + setID('testContainer'), + formGroup + ( + set::width('1/3'), + setClass($isTestNode ? '' : 'hidden'), + set::name("product[]"), + set::label($lang->story->product), + set::control(array("type" => "picker","multiple" => true)), + set::items($products), + set::value(trim($host->product, ',')), + ), + formGroup + ( + set::width('1/3'), + setClass($isTestNode ? '' : 'hidden'), + set::name("testType"), + set::required(true), + set::label($lang->host->testType), + set::control('picker'), + set::items($testTypes), + set::disabled($host->testType == 'kvm'), + set::value($host->testType), + ), + ), ); diff --git a/module/zahost/model.php b/module/zahost/model.php index 87af4dbe07..cfd114a5f0 100644 --- a/module/zahost/model.php +++ b/module/zahost/model.php @@ -440,15 +440,17 @@ class zahostModel extends model /** * Get pairs. * - * @param string $idFrom + * @param int $productID * @access public * @return array */ - public function getPairs() + public function getPairs($productID) { return $this->dao->select("id,name")->from(TABLE_ZAHOST) ->where('deleted')->eq('0') - ->andWhere('type')->eq('zahost') + ->andWhere('type')->eq('normal') + ->andWhere('testType')->eq('kvm') + ->beginIF(!empty($productID))->andWhere('product')->like("%,$productID,%")->fi() ->orderBy('`group`') ->fetchPairs('id', 'name'); } diff --git a/module/zanode/control.php b/module/zanode/control.php index 810e5759d7..fc1dcd762f 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -104,7 +104,7 @@ class zanode extends control } $this->view->title = $this->lang->zanode->create; - $this->view->hostPairs = array('' => '') + $this->loadModel('zahost')->getPairs('host'); + $this->view->hostPairs = array('' => '') + $this->loadModel('zahost')->getPairs($this->session->product); $this->view->hostID = $hostID; return $this->display();