商业版支持L2节点

This commit is contained in:
GoEdgeLab
2022-04-04 12:08:18 +08:00
parent c4588803e7
commit 1373517c57
13 changed files with 113 additions and 42 deletions

View File

@@ -33,7 +33,7 @@ func (this *DetailAction) RunGet(params struct {
this.ErrorPage(err) this.ErrorPage(err)
return return
} }
node := nodeResp.Node var node = nodeResp.Node
if node == nil { if node == nil {
this.WriteString("找不到要操作的节点") this.WriteString("找不到要操作的节点")
return return
@@ -197,7 +197,7 @@ func (this *DetailAction) RunGet(params struct {
} }
// 运行状态 // 运行状态
status := &nodeconfigs.NodeStatus{} var status = &nodeconfigs.NodeStatus{}
if len(node.StatusJSON) > 0 { if len(node.StatusJSON) > 0 {
err = json.Unmarshal(node.StatusJSON, &status) err = json.Unmarshal(node.StatusJSON, &status)
if err != nil { if err != nil {
@@ -285,6 +285,8 @@ func (this *DetailAction) RunGet(params struct {
"isOn": node.IsOn, "isOn": node.IsOn,
"records": recordMaps, "records": recordMaps,
"routes": routeMaps, "routes": routeMaps,
"level": node.Level,
"levelInfo": nodeconfigs.FindNodeLevel(int(node.Level)),
"status": maps.Map{ "status": maps.Map{
"isActive": status.IsActive, "isActive": status.IsActive,

View File

@@ -38,6 +38,7 @@ func InitNodeInfo(parentAction *actionutils.ParentAction, nodeId int64) (*pb.Nod
"isOn": node.IsOn, "isOn": node.IsOn,
"isUp": node.IsUp, "isUp": node.IsUp,
"group": groupMap, "group": groupMap,
"level": node.Level,
} }
var clusterId int64 = 0 var clusterId int64 = 0
if node.NodeCluster != nil { if node.NodeCluster != nil {

View File

@@ -37,7 +37,7 @@ func (this *UpdateAction) RunGet(params struct {
this.ErrorPage(err) this.ErrorPage(err)
return return
} }
node := nodeResp.Node var node = nodeResp.Node
if node == nil { if node == nil {
this.WriteString("找不到要操作的节点") this.WriteString("找不到要操作的节点")
return return
@@ -97,7 +97,7 @@ func (this *UpdateAction) RunGet(params struct {
} }
} }
var m = maps.Map{ var nodeMap = maps.Map{
"id": node.Id, "id": node.Id,
"name": node.Name, "name": node.Name,
"ipAddresses": ipAddressMaps, "ipAddresses": ipAddressMaps,
@@ -105,15 +105,16 @@ func (this *UpdateAction) RunGet(params struct {
"isOn": node.IsOn, "isOn": node.IsOn,
"group": groupMap, "group": groupMap,
"region": regionMap, "region": regionMap,
"level": node.Level,
} }
if node.NodeCluster != nil { if node.NodeCluster != nil {
m["primaryCluster"] = maps.Map{ nodeMap["primaryCluster"] = maps.Map{
"id": node.NodeCluster.Id, "id": node.NodeCluster.Id,
"name": node.NodeCluster.Name, "name": node.NodeCluster.Name,
} }
} else { } else {
m["primaryCluster"] = nil nodeMap["primaryCluster"] = nil
} }
if len(node.SecondaryNodeClusters) > 0 { if len(node.SecondaryNodeClusters) > 0 {
@@ -124,12 +125,12 @@ func (this *UpdateAction) RunGet(params struct {
"name": cluster.Name, "name": cluster.Name,
}) })
} }
m["secondaryClusters"] = secondaryClusterMaps nodeMap["secondaryClusters"] = secondaryClusterMaps
} else { } else {
m["secondaryClusters"] = []interface{}{} nodeMap["secondaryClusters"] = []interface{}{}
} }
this.Data["node"] = m this.Data["node"] = nodeMap
this.Show() this.Show()
} }
@@ -144,11 +145,12 @@ func (this *UpdateAction) RunPost(params struct {
PrimaryClusterId int64 PrimaryClusterId int64
SecondaryClusterIds []byte SecondaryClusterIds []byte
IsOn bool IsOn bool
Level int32
Must *actions.Must Must *actions.Must
}) { }) {
// 创建日志 // 创建日志
defer this.CreateLog(oplogs.LevelInfo, "修改节点 %d", params.NodeId) defer this.CreateLog(oplogs.LevelInfo, "修改节点 %d 基本信息", params.NodeId)
if params.NodeId <= 0 { if params.NodeId <= 0 {
this.Fail("要操作的节点不存在") this.Fail("要操作的节点不存在")
@@ -194,6 +196,7 @@ func (this *UpdateAction) RunPost(params struct {
NodeClusterId: params.PrimaryClusterId, NodeClusterId: params.PrimaryClusterId,
SecondaryNodeClusterIds: secondaryClusterIds, SecondaryNodeClusterIds: secondaryClusterIds,
IsOn: params.IsOn, IsOn: params.IsOn,
Level: params.Level,
}) })
if err != nil { if err != nil {
this.ErrorPage(err) this.ErrorPage(err)

View File

@@ -3,6 +3,7 @@ package cluster
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
@@ -29,6 +30,7 @@ func (this *NodesAction) RunGet(params struct {
InstalledState int InstalledState int
ActiveState int ActiveState int
Keyword string Keyword string
Level int32
CpuOrder string CpuOrder string
MemoryOrder string MemoryOrder string
@@ -40,6 +42,7 @@ func (this *NodesAction) RunGet(params struct {
this.Data["installState"] = params.InstalledState this.Data["installState"] = params.InstalledState
this.Data["activeState"] = params.ActiveState this.Data["activeState"] = params.ActiveState
this.Data["keyword"] = params.Keyword this.Data["keyword"] = params.Keyword
this.Data["level"] = params.Level
// 集群是否已经设置了线路 // 集群是否已经设置了线路
clusterDNSResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeClusterDNS(this.AdminContext(), &pb.FindEnabledNodeClusterDNSRequest{NodeClusterId: params.ClusterId}) clusterDNSResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeClusterDNS(this.AdminContext(), &pb.FindEnabledNodeClusterDNSRequest{NodeClusterId: params.ClusterId})
@@ -63,6 +66,7 @@ func (this *NodesAction) RunGet(params struct {
NodeClusterId: params.ClusterId, NodeClusterId: params.ClusterId,
NodeGroupId: params.GroupId, NodeGroupId: params.GroupId,
NodeRegionId: params.RegionId, NodeRegionId: params.RegionId,
Level: params.Level,
InstallState: types.Int32(params.InstalledState), InstallState: types.Int32(params.InstalledState),
ActiveState: types.Int32(params.ActiveState), ActiveState: types.Int32(params.ActiveState),
Keyword: params.Keyword, Keyword: params.Keyword,
@@ -81,6 +85,7 @@ func (this *NodesAction) RunGet(params struct {
NodeClusterId: params.ClusterId, NodeClusterId: params.ClusterId,
NodeGroupId: params.GroupId, NodeGroupId: params.GroupId,
NodeRegionId: params.RegionId, NodeRegionId: params.RegionId,
Level: params.Level,
InstallState: types.Int32(params.InstalledState), InstallState: types.Int32(params.InstalledState),
ActiveState: types.Int32(params.ActiveState), ActiveState: types.Int32(params.ActiveState),
Keyword: params.Keyword, Keyword: params.Keyword,
@@ -210,6 +215,7 @@ func (this *NodesAction) RunGet(params struct {
"group": groupMap, "group": groupMap,
"region": regionMap, "region": regionMap,
"dnsRouteNames": dnsRouteNames, "dnsRouteNames": dnsRouteNames,
"level": node.Level,
}) })
} }
this.Data["nodes"] = nodeMaps this.Data["nodes"] = nodeMaps
@@ -257,6 +263,12 @@ func (this *NodesAction) RunGet(params struct {
} }
this.Data["regions"] = regionMaps this.Data["regions"] = regionMaps
// 级别
this.Data["levels"] = []maps.Map{}
if teaconst.IsPlus {
this.Data["levels"] = nodeconfigs.FindAllNodeLevels()
}
// 记录最近访问 // 记录最近访问
_, err = this.RPC().LatestItemRPC().IncreaseLatestItem(this.AdminContext(), &pb.IncreaseLatestItemRequest{ _, err = this.RPC().LatestItemRPC().IncreaseLatestItem(this.AdminContext(), &pb.IncreaseLatestItemRequest{
ItemType: "cluster", ItemType: "cluster",

View File

@@ -0,0 +1,31 @@
// 节点级别选择器
Vue.component("node-level-selector", {
props: ["v-node-level"],
data: function () {
let levelCode = this.vNodeLevel
if (levelCode == null || levelCode < 1) {
levelCode = 1
}
return {
levels: [
{
name: "边缘节点",
code: 1,
description: "普通的边缘节点。"
},
{
name: "L2节点",
code: 2,
description: "特殊的边缘节点,同时负责同组上一级节点的回源。"
}
],
levelCode: levelCode
}
},
template: `<div>
<select class="ui dropdown auto-width" name="level" v-model="levelCode">
<option v-for="level in levels" :value="level.code">{{level.name}}</option>
</select>
<p class="comment" v-if="typeof(levels[levelCode - 1]) != null">{{levels[levelCode - 1].description}}</p>
</div>`
})

View File

@@ -14,20 +14,20 @@
<p class="comment">每行一个节点IP。</p> <p class="comment">每行一个节点IP。</p>
</td> </td>
</tr> </tr>
<tr>
<td>所属区域</td>
<td>
<node-region-selector></node-region-selector>
<p class="comment">设置区域后才能根据区域进行流量统计和计费。</p>
</td>
</tr>
<tr> <tr>
<td>所属分组</td> <td>所属分组</td>
<td> <td>
<node-group-selector :v-cluster-id="clusterId"></node-group-selector> <node-group-selector :v-cluster-id="clusterId"></node-group-selector>
<p class="comment">用来筛选服务</p> <p class="comment">用来筛选节点<span v-if="teaIsPlus">,同时可以在分组中设置二级缓存节点</span></p>
</td> </td>
</tr> </tr>
<tr>
<td>所属区域</td>
<td>
<node-region-selector></node-region-selector>
<p class="comment">设置区域后可以根据区域进行流量统计和计费。</p>
</td>
</tr>
</table> </table>
<submit-btn></submit-btn> <submit-btn></submit-btn>
</form> </form>

View File

@@ -41,20 +41,20 @@
<p class="comment">当前节点对应的DNS线路可用线路是根据集群设置的域名获取的注意DNS服务商可能对这些线路有其他限制。</p> <p class="comment">当前节点对应的DNS线路可用线路是根据集群设置的域名获取的注意DNS服务商可能对这些线路有其他限制。</p>
</td> </td>
</tr> </tr>
<tr>
<td>所属区域</td>
<td>
<node-region-selector></node-region-selector>
<p class="comment">设置区域后才能根据区域进行流量统计和计费。</p>
</td>
</tr>
<tr> <tr>
<td>所属分组</td> <td>所属分组</td>
<td> <td>
<node-group-selector :v-cluster-id="clusterId"></node-group-selector> <node-group-selector :v-cluster-id="clusterId"></node-group-selector>
<p class="comment">用来筛选服务</p> <p class="comment">用来筛选节点<span v-if="teaIsPlus">,同时可以在分组中设置二级缓存节点</span></p>
</td> </td>
</tr> </tr>
<tr>
<td>所属区域</td>
<td>
<node-region-selector></node-region-selector>
<p class="comment">设置区域后可以根据区域进行流量统计和计费。</p>
</td>
</tr>
<tr> <tr>
<td colspan="2"> <td colspan="2">
<more-options-indicator></more-options-indicator> <more-options-indicator></more-options-indicator>

View File

@@ -1,14 +1,17 @@
<second-menu> <second-menu>
<a :href="'/clusters/cluster/nodes?clusterId=' + clusterId" class="item">{{currentClusterName}}</a> <a :href="'/clusters/cluster/nodes?clusterId=' + clusterId" class="item">{{currentClusterName}}</a>
<raquo-item></raquo-item> <raquo-item></raquo-item>
<a :href="'/clusters/cluster/nodes?clusterId=' + clusterId + '&groupId=' + node.group.id" v-if="node.group != null" class="item" style="padding-left: 0">{{node.group.name}}</a> <a :href="'/clusters/cluster/nodes?clusterId=' + clusterId + '&groupId=' + node.group.id" v-if="node.group != null" class="item">{{node.group.name}}</a>
<raquo-item v-if="node.group != null"></raquo-item> <raquo-item v-if="node.group != null"></raquo-item>
<menu-item :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">{{node.name}}</menu-item> <menu-item :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">
{{node.name}}
<sup v-if="node.level > 1">&nbsp; <span class="blue">L{{node.level}}</span></sup>
</menu-item>
<raquo-item></raquo-item> <raquo-item></raquo-item>
<menu-item :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id" code="node" v-if="!teaIsPlus">节点详情</menu-item> <menu-item :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id" code="node" v-if="!teaIsPlus">节点详情</menu-item>
<menu-item :href="'/clusters/cluster/node/boards?clusterId=' + clusterId + '&nodeId=' + node.id" code="board" v-if="teaIsPlus">节点看板</menu-item> <menu-item :href="'/clusters/cluster/node/boards?clusterId=' + clusterId + '&nodeId=' + node.id" code="board" v-if="teaIsPlus">节点看板</menu-item>
<menu-item :href="'/clusters/cluster/node/detail?clusterId=' + clusterId + '&nodeId=' + node.id" code="node" v-if="teaIsPlus">节点详情</menu-item> <menu-item :href="'/clusters/cluster/node/detail?clusterId=' + clusterId + '&nodeId=' + node.id" code="node" v-if="teaIsPlus">节点详情</menu-item>
<menu-item :href="'/clusters/cluster/node/logs?clusterId=' + clusterId + '&nodeId=' + node.id" code="log">运行日志</menu-item> <menu-item :href="'/clusters/cluster/node/logs?clusterId=' + clusterId + '&nodeId=' + node.id" code="log">运行日志</menu-item>
<menu-item :href="'/clusters/cluster/node/install?clusterId=' + clusterId + '&nodeId=' + node.id" code="install">安装节点</menu-item> <menu-item :href="'/clusters/cluster/node/install?clusterId=' + clusterId + '&nodeId=' + node.id" code="install">安装节点</menu-item>
<menu-item :href="'/clusters/cluster/node/update?clusterId=' + clusterId + '&nodeId=' + node.id" code="update">修改设置</menu-item> <menu-item :href="'/clusters/cluster/node/update?clusterId=' + clusterId + '&nodeId=' + node.id" code="update">节点设置</menu-item>
</second-menu> </second-menu>

View File

@@ -84,6 +84,12 @@
<span v-else class="disabled">没有设置分组。</span> <span v-else class="disabled">没有设置分组。</span>
</td> </td>
</tr> </tr>
<tr v-if="teaIsPlus">
<td>级别</td>
<td>
<span :class="{blue: node.levelInfo.code > 1}">{{node.levelInfo.name}}</span>
</td>
</tr>
<tr> <tr>
<td colspan="2"><more-options-indicator>更多选项</more-options-indicator></td> <td colspan="2"><more-options-indicator>更多选项</more-options-indicator></td>
</tr> </tr>

View File

@@ -30,24 +30,30 @@
<p class="comment">用于访问节点和域名解析等。</p> <p class="comment">用于访问节点和域名解析等。</p>
</td> </td>
</tr> </tr>
<tr>
<td>所属区域</td>
<td>
<node-region-selector :v-region="node.region"></node-region-selector>
<p class="comment">设置区域后才能根据区域进行流量统计和计费。</p>
</td>
</tr>
<tr> <tr>
<td>所属分组</td> <td>所属分组</td>
<td> <td>
<node-group-selector :v-cluster-id="clusterId" :v-group="node.group"></node-group-selector> <node-group-selector :v-cluster-id="clusterId" :v-group="node.group"></node-group-selector>
<p class="comment">用来筛选服务</p> <p class="comment">用来筛选节点<span v-if="teaIsPlus">,同时可以在分组中设置二级缓存节点</span></p>
</td>
</tr>
<tr>
<td>所属区域</td>
<td>
<node-region-selector :v-region="node.region"></node-region-selector>
<p class="comment">设置区域后可以根据区域进行流量统计和计费。</p>
</td> </td>
</tr> </tr>
<tr> <tr>
<td colspan="2"><more-options-indicator></more-options-indicator></td> <td colspan="2"><more-options-indicator></more-options-indicator></td>
</tr> </tr>
<tbody v-show="moreOptionsVisible"> <tbody v-show="moreOptionsVisible">
<tr v-if="teaIsPlus">
<td>级别</td>
<td>
<node-level-selector :v-node-level="node.level"></node-level-selector>
</td>
</tr>
<tr> <tr>
<td>是否启用</td> <td>是否启用</td>
<td> <td>

View File

@@ -31,12 +31,18 @@
<option value="2">未安装</option> <option value="2">未安装</option>
</select> </select>
</div> </div>
<div class="ui field" v-if="teaIsPlus && levels.length > 0">
<select class="ui dropdown" name="level" v-model="level">
<option value="0">[级别]</option>
<option v-for="levelInfo in levels" :value="levelInfo.code">{{levelInfo.name}}</option>
</select>
</div>
<div class="ui field"> <div class="ui field">
<input type="text" name="keyword" placeholder="关键词" v-model="keyword" style="width:10em"/> <input type="text" name="keyword" placeholder="关键词" v-model="keyword" style="width:10em"/>
</div> </div>
<div class="ui field"> <div class="ui field">
<button class="ui button" type="submit">搜索</button> &nbsp; <button class="ui button" type="submit">搜索</button> &nbsp;
<a :href="'/clusters/cluster/nodes?clusterId=' + clusterId" v-if="regionId >0 || groupId > 0 || installState > 0 || activeState > 0 || keyword.length > 0">[清除条件]</a> <a :href="'/clusters/cluster/nodes?clusterId=' + clusterId" v-if="regionId > 0 || groupId > 0 || installState > 0 || activeState > 0 || keyword.length > 0 || level > 0">[清除条件]</a>
</div> </div>
</div> </div>
</form> </form>
@@ -66,7 +72,7 @@
</tr> </tr>
</thead> </thead>
<tr v-for="node in nodes"> <tr v-for="node in nodes">
<td><a :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">{{node.name}}</a> <td><a :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">{{node.name}}<sup v-if="node.level > 1"><span class="blue"> &nbsp;L{{node.level}}</span></sup></a>
<div v-if="node.region != null"> <div v-if="node.region != null">
<grey-label>区域:{{node.region.name}}</grey-label> <grey-label>区域:{{node.region.name}}</grey-label>
</div> </div>

View File

@@ -1,7 +1,7 @@
<second-menu> <second-menu>
<menu-item :href="'/clusters/cluster?clusterId=' + clusterId">{{currentClusterName}}</menu-item> <menu-item :href="'/clusters/cluster?clusterId=' + clusterId">{{currentClusterName}}</menu-item>
<span class="disabled item" style="padding: 0">&raquo;</span> <raquo-item></raquo-item>
<menu-item :href="'/clusters/cluster/settings?clusterId=' + clusterId">设置</menu-item> <menu-item :href="'/clusters/cluster/settings?clusterId=' + clusterId">集群设置</menu-item>
<span class="disabled item" style="padding: 0" v-if="leftMenuActiveItem != null">&raquo;</span> <raquo-item></raquo-item>
<a class="item active" v-if="leftMenuActiveItem != null" :href="leftMenuActiveItem.url">"{{leftMenuActiveItem.name}}"设置</a> <a class="item active" v-if="leftMenuActiveItem != null" :href="leftMenuActiveItem.url">"{{leftMenuActiveItem.name}}"设置</a>
</second-menu> </second-menu>

View File

@@ -30,6 +30,7 @@
<span v-if="task.type == 'configChanged'">同步配置</span> <span v-if="task.type == 'configChanged'">同步配置</span>
<span v-if="task.type == 'ipItemChanged'">同步IP名单</span> <span v-if="task.type == 'ipItemChanged'">同步IP名单</span>
<span v-if="task.type == 'scriptsChanged'">同步脚本</span> <span v-if="task.type == 'scriptsChanged'">同步脚本</span>
<span v-if="task.type == 'nodeLevelChanged'">同步L2节点</span>
</td> </td>
<td> <td>
<span v-if="task.isDone" class="red">{{task.error}}</span> <span v-if="task.isDone" class="red">{{task.error}}</span>