ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

falcon-plus 主机组删除接口实战:DELETE /api/v1/hostgroup/{id} 的权限模型与级联清理原理

falcon-plus 主机组删除接口实战:DELETE /api/v1/hostgroup/{id} 的权限模型与级联清理原理 运维观测指标监控告警【免费下载链接】falcon-plusAn open-source and enterprise-level monitoring system.项目地址https://gitcode.com/gh_mirrors/fa/falcon-plus点击查看免费下载本篇文章聚焦于 Open-Falcon falcon-plus 监控系统中主机组HostGroup删除接口的完整用法从 REST 端点、会话认证与权限校验开始逐步深入 hostgroup_controller.go 中删除逻辑的事务实现说明删除主机组时为何会连带清理主机绑定、插件与聚合器并给出可直接复制的 curl 命令与错误响应对照表。读完本文你将掌握该接口的调用方式、权限边界、级联删除行为以及排查删除失败的方法。接口定义与基本约定删除主机组是 falcon-plus API 模块提供的一组主机组管理操作之一对应的接口定义位于官方 API 文档 2017-01-01-hostgroup_delete.md。请求方法DELETE请求路径/api/v1/hostgroup/{hostgroup_id}认证要求需要有效的会话Session即接口必须携带由登录接口签发的Apitoken请求头响应格式JSON以删除 id 为343的主机组为例完整请求路径为/api/v1/hostgroup/343删除成功后的响应如下{message:hostgroup:343 has been deleted}从路由注册代码 host_routes.go 可以看到该端点与主机组的其他管理端点创建、查询、绑定主机、绑定模板等一并挂在/api/v1分组下且整个分组统一启用了AuthSessionMidd会话认证中间件hostr : r.Group(/api/v1) hostr.Use(utils.AuthSessionMidd) // ... hostr.DELETE(/hostgroup/:host_group, DeleteHostGroup)也就是说DELETE /api/v1/hostgroup/{id}是grp主机组资源在 REST 语义下的删除操作与其对应的是POST /api/v1/hostgroup创建、PUT /api/v1/hostgroup更新名称和GET /api/v1/hostgroup/{id}查询详情。会话认证删除操作的前置条件与同系列其他 HostGroup 文档一致该文档明确标注了[Session](#/authentication) Required即任何删除请求都必须先通过会话校验。认证机制详见 authentication 文档RequestHeader: { Apitoken: {\name\:\root\,\sig\:\427d6803b78311e68afd0242ac130006\}, X-Forwarded-For: 127.0.0.1 }认证中间件实现在 auth_middle.gofunc AuthSessionMidd(c *gin.Context) { auth, err : h.SessionChecking(c) if !viper.GetBool(skip_auth) { if err ! nil || auth ! true { h.JSONR(c, http.StatusUnauthorized, err) c.Abort() return } } c.Set(auth, auth) }这里有两个值得注意的行为会话失效或缺失时请求会被直接拒绝并返回401 Unauthorized同时c.Abort()终止后续处理删除操作不会执行中间件支持通过配置项skip_auth跳过认证例如本地调试环境若开启该配置即使没有有效会话也可调用删除接口生产环境务必关闭。会话通过校验后中间件会把认证结果写入 gin 上下文c.Set(auth, auth)后续权限判断即可从上下文中取得当前登录用户。权限模型Admin 与创建者的边界该文档明确规定了权限规则如果使用者不是 Admin只能对自己创建的 hostgroup 执行删除操作。这一规则在DeleteHostGroup中落地见 hostgroup_controller.gouser, _ : h.GetUser(c) hostgroup : f.HostGroup{} if !user.IsAdmin() { if dt : db.Falcon.Where(id ?, grpID).Find(hostgroup); dt.Error ! nil { h.JSONR(c, badstatus, dt.Error) return } if hostgroup.CreateUser ! user.Name { h.JSONR(c, badstatus, You dont have permission!) return } }逻辑拆解如下使用者角色权限行为Admin直接放行可以删除任意主机组无需校验create_user非 Admin先从grp表按 id 查出该主机组若记录的create_user与当前登录用户名不一致立即返回400 Bad Request与提示信息You dont have permission!这里的create_user是主机组创建时写入的字段。创建接口 CreateHostGroup 在写入grp表时固定记录了当前操作者hostgroup : f.HostGroup{Name: inputs.Name, CreateUser: user.Name, ComeFrom: 1}因此非 Admin 用户能否删除某主机组取决于谁是它的创建者。这种创建者即所有者的权限模型在 falcon-plus 的主机组操作中是一致的——绑定/解绑主机、绑定/解绑模板等接口同样遵循非 Admin 只能操作自己创建的主机组规则。请求示例curl 调用与响应以下是一个完整的删除调用示例假设删除 id 为 343 的主机组会话 token 替换为实际登录所得curl -X DELETE http://127.0.0.1:8080/api/v1/hostgroup/343 \ -H Apitoken: {name:root,sig:427d6803b78311e68afd0242ac130006}成功时返回 HTTP200响应体为{message:hostgroup:343 has been deleted}若未登录或会话过期返回401 Unauthorized若非 Admin 且目标主机组非本人创建返回400 Bad Request与You dont have permission!若路径中的 id 不是合法数字例如/api/v1/hostgroup/abc参数解析失败同样返回400与解析错误信息若请求路径缺失 idgrp id is missing返回400。值得说明的是falcon-plus API 模块还定义了expecstatus http.StatusExpectationFailedHTTP 417用于数据库操作失败等服务端预期之外的错误场景调用方在排查删除失败时应同时关注 400/401/417 三类状态码。级联删除一次删除背后的四张表删除一个主机组并非只删除grp表中的一行记录。从 DeleteHostGroup 的实现看整个删除过程被包在一个数据库事务中依次执行四步tx : db.Falcon.Begin() // 1. 删除 grp_host 表中的主机绑定关联 tx.Where(grp_id ?, grpID).Delete(f.GrpHost{}) // 2. 删除 plugin_dir 表中该主机组的插件 tx.Where(grp_id ?, grpID).Delete(f.Plugin{}) // 3. 删除 cluster 表中该主机组的聚合器 tx.Where(grp_id ?, grpID).Delete(f.Cluster{}) // 4. 最后删除 grp 表中的主机组本体 tx.Where(id ?, grpID).Delete(f.HostGroup{}) tx.Commit()这四步对应四张数据库表模型定义分别位于 host_group.go、grp_host.go、plugin_dir.go 与 cluster.go删除顺序表名对应模型作用1grp_hostGrpHost主机组与主机host的绑定关系2plugin_dirPlugin主机组绑定的插件目录3clusterCluster主机组关联的聚合器配置4grpHostGroup主机组本体这些表的建表语句与索引可以在数据库初始化脚本 2_portal-db-schema.sql 中找到例如grp_host表CREATE TABLE grp_host ( grp_id INT UNSIGNED NOT NULL, host_id INT(11) NOT NULL, KEY idx_grp_host_grp_id (grp_id), KEY idx_grp_host_host_id (host_id) );grp_id上建有索引这正是删除时按grp_id批量清理关联数据的依据。值得注意的是删除主机组并不会删除主机本身——grp_host只记录绑定关系删除绑定关系不会影响host表中的主机记录同样插件与聚合器删除的是配置记录而非底层脚本或运行中的数据。事务的使用保证了级联清理的原子性任意一步失败整个删除都会回滚。从代码可以看到每一步出错时都会先通过h.JSONR(c, expecstatus, ...)返回错误并调用tx.Rollback()确保不会出现主机组已删但绑定关系残留的中间状态。这一点对生产环境的数据一致性至关重要。注意事项与最佳实践删除不可恢复接口不提供软删除或回收站删除后grp及关联的grp_host、plugin_dir、cluster记录会从数据库中永久移除操作前建议先在GET /api/v1/hostgroup/{id}确认目标主机组无误对监控策略的影响主机组是模板template与主机绑定的中间层删除主机组后该组下主机通过grp_tpl关联的监控策略将随之失效——虽然本接口不直接删除grp_tpl绑定记录但主机组消失后相关主机的策略继承链路会被打断变更前应评估对告警的影响非 Admin 权限校验靠前权限检查发生在级联删除之前非本人创建的主机组会在第一步就被拦截不会产生任何写操作接口幂等性提示从源码结构看删除按grp_id执行若目标 id 已不存在事务内的各步Delete并不会报错最终仍返回删除成功的响应文案因此该接口更适合确保目标存在后再删除的使用方式认证配置确认 API 模块配置中skip_auth为false避免删除接口在无认证状态下暴露。小结DELETE /api/v1/hostgroup/{id}是 falcon-plus 主机组生命周期管理的收尾操作。它对外表现为一个受会话保护、带创建者权限边界的 REST 接口对内则是在单个事务中依次清理grp_host、plugin_dir、cluster与grp四张表的级联删除。理解这两层行为可以帮助你在删除主机组时准确预判其对监控数据、插件与聚合器的影响并快速定位 400/401/417 各类失败响应的根因。赞分享运维观测指标监控告警【免费下载链接】falcon-plusAn open-source and enterprise-level monitoring system.项目地址https://gitcode.com/gh_mirrors/fa/falcon-plus点击查看免费下载相关推荐Falcon-Plus 模板删除 API 实战指南DELETE /api/v1/template/{template_id} 的调用方法与级联清理原理Falcon Plus 模板删除 API 实战指南DELETE /api/v1/template/{template_id} 的调用方法与级联清理原理 导读运维观测指标监控告警falcon-plus Dashboard Graph 删除接口实战DELETE /api/v1/dashboard/graph/:id 全解析falcon plus Dashboard Graph 删除接口实战DELETE /api/v1/dashboard/graph/:id 全解析 本文是 fa运维观测指标监控告警falcon-plus Expression 删除接口实战DELETE /api/v1/expression/{id} 调用方式与源码解析falcon plus Expression 删除接口实战DELETE /api/v1/expression/{id} 调用方式与源码解析 导读 Expres运维观测指标监控告警上一篇OBS Studio HDR配置终极指南三步告别色彩混乱的完整方案下一篇python_for_data_analysis_2nd_chinese_version附录详解NumPy高级应用与广播机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表