├── .gitignore ├── .vscode ├── launch.json └── settings.json ├── LICENSE ├── Makefile ├── README.md ├── apps ├── account │ ├── README.md │ ├── account.pb.go │ ├── interface.go │ ├── pb │ │ ├── account.proto │ │ └── rpc.proto │ └── rpc.pb.go ├── api.go ├── bill │ ├── README.md │ ├── api │ │ ├── bill.go │ │ └── http.go │ ├── app.go │ ├── bill.pb.go │ ├── impl │ │ ├── bill.go │ │ ├── bill_test.go │ │ ├── dao.go │ │ ├── impl.go │ │ └── sql.go │ ├── pb │ │ ├── bill.proto │ │ └── rpc.proto │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── cost │ ├── README.md │ ├── api │ │ ├── cost.go │ │ └── http.go │ ├── app.go │ ├── cost.pb.go │ ├── cost_enum.pb.go │ ├── impl │ │ ├── impl.go │ │ └── sql.go │ └── pb │ │ └── cost.proto ├── database │ ├── README.md │ ├── database.pb.go │ ├── interface.go │ └── pb │ │ └── database.proto ├── dict │ ├── README.md │ ├── api │ │ ├── dict.go │ │ └── http.go │ └── app.go ├── disk │ ├── README.md │ ├── api │ │ └── http.go │ ├── app.go │ ├── disk.pb.go │ ├── disk_enum.pb.go │ ├── impl │ │ └── impl.go │ ├── pb │ │ ├── disk.proto │ │ └── rpc.proto │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── dns │ ├── api │ │ └── http.go │ ├── app.go │ ├── domain.pb.go │ ├── impl │ │ └── impl.go │ ├── pb │ │ ├── domain.proto │ │ └── rpc.proto │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── eip │ ├── api │ │ └── http.go │ ├── app.go │ ├── eip.pb.go │ ├── eip_enum.pb.go │ ├── impl │ │ └── impl.go │ ├── pb │ │ ├── eip.proto │ │ └── rpc.proto │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── health │ ├── README.md │ └── impl │ │ ├── health.go │ │ └── impl.go ├── host │ ├── README.md │ ├── api │ │ ├── host.go │ │ └── http.go │ ├── app.go │ ├── host.pb.go │ ├── host_enum.pb.go │ ├── impl │ │ ├── dao.go │ │ ├── host.go │ │ ├── impl.go │ │ └── sql.go │ ├── pb │ │ ├── host.proto │ │ └── rpc.proto │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── internal.go ├── lb │ ├── README.md │ ├── api │ │ └── http.go │ ├── app.go │ ├── impl │ │ └── impl.go │ ├── lb.pb.go │ ├── lb_enum.pb.go │ ├── pb │ │ ├── lb.proto │ │ └── rpc.proto │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── metric │ ├── app.go │ ├── metric.pb.go │ ├── pb │ │ ├── metric.proto │ │ └── rpc.proto │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── mongodb │ ├── app.go │ ├── mongodb.pb.go │ ├── mongodb_enum.pb.go │ ├── pb │ │ ├── mongodb.proto │ │ └── rpc.proto │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── order │ ├── README.md │ ├── api │ │ └── http.go │ ├── app.go │ ├── impl │ │ └── impl.go │ ├── order.pb.go │ ├── order_enum.pb.go │ └── pb │ │ └── order.proto ├── oss │ ├── api │ │ └── http.go │ ├── app.go │ ├── impl │ │ └── impl.go │ ├── oss.pb.go │ ├── pb │ │ ├── oss.proto │ │ └── rpc.proto │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── rds │ ├── README.md │ ├── api │ │ └── http.go │ ├── app.go │ ├── impl │ │ ├── dao.go │ │ ├── impl.go │ │ ├── rds.go │ │ └── sql.go │ ├── pb │ │ ├── rds.proto │ │ └── rpc.proto │ ├── rds.pb.go │ ├── rds_enum.pb.go │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── redis │ ├── README.md │ ├── api │ │ └── http.go │ ├── app.go │ ├── impl │ │ └── impl.go │ ├── pb │ │ ├── redis.proto │ │ └── rpc.proto │ ├── redis.pb.go │ ├── redis_enum.pb.go │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── resource │ ├── README.md │ ├── api │ │ ├── discovery.go │ │ ├── http.go │ │ └── resource.go │ ├── discovery.go │ ├── impl │ │ ├── dao.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── model.go │ │ ├── resource.go │ │ ├── sql.go │ │ └── tx.go │ ├── interface.go │ ├── pb │ │ ├── resource.proto │ │ └── rpc.proto │ ├── resource.go │ ├── resource.pb.go │ ├── resource_enum.pb.go │ ├── rpc.pb.go │ └── rpc_grpc.pb.go ├── secret │ ├── README.md │ ├── api │ │ ├── http.go │ │ └── secret.go │ ├── impl │ │ ├── impl.go │ │ ├── impl_test.go │ │ └── secret.go │ ├── interface.go │ ├── pb │ │ ├── rpc.proto │ │ └── secret.proto │ ├── rpc.pb.go │ ├── rpc_grpc.pb.go │ ├── secret.go │ ├── secret.pb.go │ └── secret_enum.pb.go └── task │ ├── api │ ├── http.go │ └── task.go │ ├── impl │ ├── bill.go │ ├── dao.go │ ├── host.go │ ├── impl.go │ ├── rds.go │ ├── redis.go │ ├── sql.go │ ├── task.go │ ├── task_test.go │ └── tools.go │ ├── interface.go │ ├── pb │ ├── rpc.proto │ └── task.proto │ ├── rpc.pb.go │ ├── rpc_grpc.pb.go │ ├── task.go │ ├── task.pb.go │ └── task_enum.pb.go ├── client ├── rest │ ├── client.go │ ├── client_test.go │ ├── config.go │ └── resource.go └── rpc │ ├── client.go │ └── client_test.go ├── cmd ├── init.go ├── root.go └── start.go ├── common └── pb │ └── github.com │ └── infraboard │ └── mcube │ └── pb │ ├── example │ └── test.proto │ ├── http │ └── entry.proto │ ├── page │ └── page.proto │ ├── request │ └── request.proto │ ├── resource │ └── base.proto │ └── response │ └── response.proto ├── conf ├── config.go ├── load.go └── log.go ├── docs ├── README.md └── schema │ └── tables.sql ├── etc ├── config.example.env ├── config.example.toml └── unit_test.example.env ├── go.mod ├── go.sum ├── main.go ├── protocol ├── grpc.go └── http.go ├── provider ├── aliyun │ ├── actiontrail │ │ ├── README.md │ │ ├── event.go │ │ ├── event_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ └── sample │ │ │ └── ResourceType_Ecs.json │ ├── alb │ │ ├── alb.go │ │ ├── alb_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ └── sample │ │ │ └── list.json │ ├── bss │ │ ├── README.md │ │ ├── bill.go │ │ ├── bill_pager.go │ │ ├── detail.go │ │ ├── detail_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── order.go │ │ ├── order_pager.go │ │ └── sample │ │ │ ├── instance_bill.json │ │ │ ├── order_detail.json │ │ │ ├── order_list.json │ │ │ └── splite_bill.json │ ├── cms │ │ ├── README.md │ │ ├── impl.go │ │ ├── impl_test.go │ │ └── metric.go │ ├── connectivity │ │ ├── client.go │ │ └── client_test.go │ ├── dds │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── mongo.go │ │ ├── mongo_pager.go │ │ └── sample │ │ │ └── mongo.json │ ├── dns │ │ ├── domain.go │ │ ├── domain_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── record.go │ │ ├── record_pager.go │ │ └── sample │ │ │ ├── domain.json │ │ │ └── record.json │ ├── ecs │ │ ├── disk.go │ │ ├── disk_pager.go │ │ ├── ecs.go │ │ ├── ecs_pager.go │ │ ├── ecs_price.go │ │ ├── eip.go │ │ ├── eip_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ └── sample │ │ │ ├── disk.json │ │ │ ├── ecs.json │ │ │ └── eip.json │ ├── mapping │ │ └── mapping.go │ ├── nlb │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── nlb.go │ │ ├── nlb_pager.go │ │ └── sample │ │ │ └── list.json │ ├── operator.go │ ├── oss │ │ ├── bucket.go │ │ ├── bucket_pager.go │ │ ├── impl.go │ │ └── impl_test.go │ ├── rds │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── rds.go │ │ └── rds_pager.go │ ├── redis │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── redis.go │ │ └── redis_pager.go │ ├── region │ │ ├── region.go │ │ └── region.json │ ├── slb │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── listener.go │ │ ├── mapping.go │ │ ├── rule.go │ │ ├── rule_pager.go │ │ ├── sample │ │ │ └── instance.json │ │ ├── slb.go │ │ └── slb_pager.go │ ├── sms │ │ └── sms.go │ └── voice │ │ └── voice.go ├── aws │ ├── README.md │ ├── connectivity │ │ ├── client.go │ │ └── client_test.go │ ├── ec2 │ │ ├── disk.go │ │ ├── ec2.go │ │ ├── ec2_pager.go │ │ ├── eip.go │ │ ├── impl.go │ │ └── impl_test.go │ ├── operator.go │ └── region │ │ └── region.go ├── base.go ├── bill.go ├── cms.go ├── dns.go ├── event.go ├── execl │ └── README.md ├── host.go ├── huawei │ ├── bss │ │ ├── README.md │ │ ├── bill.go │ │ ├── bill_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── order.go │ │ ├── order_pager.go │ │ ├── price.go │ │ └── sample │ │ │ ├── order_detail.json │ │ │ └── order_list.json │ ├── connectivity │ │ ├── client.go │ │ └── client_test.go │ ├── cts │ │ ├── README.md │ │ ├── event.go │ │ ├── event_pager.go │ │ ├── impl.go │ │ └── impl_test.go │ ├── dcs │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── redis.go │ │ └── redis_pager.go │ ├── dds │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── mongo.go │ │ ├── mongo_pager.go │ │ └── sample │ │ │ └── instance_list.json │ ├── dns │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── private.go │ │ ├── private_pager.go │ │ ├── public.go │ │ ├── public_pager.go │ │ ├── record.go │ │ └── sample │ │ │ └── zone.json │ ├── ecs │ │ ├── disk.go │ │ ├── disk_pager.go │ │ ├── ecs.go │ │ ├── ecs_pager.go │ │ ├── ecs_price.go │ │ ├── eip.go │ │ ├── eip_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ └── sample │ │ │ ├── describe.json │ │ │ ├── disk.json │ │ │ └── eip.json │ ├── elb │ │ ├── elb.go │ │ ├── elb_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ └── sample │ │ │ └── elb.json │ ├── mapping │ │ └── mapping.go │ ├── obs │ │ ├── bucket.go │ │ ├── bucket_pager.go │ │ ├── impl.go │ │ └── impl_test.go │ ├── operator.go │ ├── rds │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── rds.go │ │ └── rds_pager.go │ └── region │ │ └── region.go ├── lb.go ├── mongo.go ├── openstack │ └── README.md ├── oss.go ├── rds.go ├── redis.go ├── txyun │ ├── billing │ │ ├── README.md │ │ ├── bill.go │ │ ├── bill_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── order.go │ │ ├── order_pager.go │ │ └── sample │ │ │ └── order.json │ ├── cdb │ │ ├── cdb.go │ │ ├── cdb_pager.go │ │ ├── cdb_price.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ └── mapping.go │ ├── clb │ │ ├── clb.go │ │ ├── clb_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ └── sample │ │ │ └── clb.json │ ├── cloudaudit │ │ ├── README.md │ │ ├── events.go │ │ ├── events_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ └── sample │ │ │ ├── RunInstances_list.json │ │ │ ├── StartInstances.json │ │ │ ├── TerminateInstances_detail.json │ │ │ └── TerminateInstances_list.json │ ├── connectivity │ │ ├── client.go │ │ └── client_test.go │ ├── cos │ │ ├── bucket.go │ │ ├── bucket_pager.go │ │ ├── impl.go │ │ └── impl_test.go │ ├── cvm │ │ ├── cvm.go │ │ ├── cvm_create.go │ │ ├── cvm_pager.go │ │ ├── cvm_price.go │ │ ├── disk.go │ │ ├── disk_pager.go │ │ ├── eip.go │ │ ├── eip_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ └── sample │ │ │ ├── cvm.json │ │ │ ├── disk.json │ │ │ └── eip.json │ ├── dns │ │ ├── domain.go │ │ ├── domain_pager.go │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── record.go │ │ ├── record_pager.go │ │ └── sample │ │ │ ├── domain.json │ │ │ └── record.json │ ├── mapping │ │ └── mapping.go │ ├── mongo │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── mongo.go │ │ ├── mongo_pager.go │ │ └── sample │ │ │ ├── list_connectons.json │ │ │ └── list_instance.json │ ├── operator.go │ ├── redis │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── redis.go │ │ └── redis_pager.go │ ├── region │ │ └── region.go │ └── sqlserver │ │ ├── impl.go │ │ ├── impl_test.go │ │ ├── mapping.go │ │ ├── sample │ │ └── list.json │ │ ├── sqlserver.go │ │ └── sqlserver_pager.go └── vsphere │ ├── connectivity │ ├── client.go │ └── client_test.go │ ├── operator.go │ └── vm │ ├── mapping.go │ ├── query.go │ ├── vm.go │ └── vm_test.go ├── swagger └── docs.go ├── test ├── data │ └── README.md └── tools │ └── setup.go ├── utils ├── enum.go ├── hash.go ├── ptr_value.go ├── time.go ├── time_test.go └── value_ptr.go └── version └── version.go /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | *.log 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | # vendor/ 17 | 18 | # 二进制文件 19 | cmdb 20 | cmdb-api 21 | 22 | logs/* 23 | 24 | 25 | # 本地配置文件 26 | config.toml 27 | config.env 28 | unit_test.env 29 | 30 | 31 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // 使用 IntelliSense 了解相关属性。 3 | // 悬停以查看现有属性的描述。 4 | // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "cmdb server", 9 | "type": "go", 10 | "request": "launch", 11 | "mode": "auto", 12 | "program": "${workspaceFolder}/main.go", 13 | "cwd": "${workspaceFolder}", 14 | "args": ["start","-f","etc/config.toml"] 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "go.testEnvFile": "${workspaceFolder}/etc/unit_test.env", 3 | "protoc": { 4 | "options": [ 5 | "--proto_path=.", 6 | "--proto_path=common/pb", 7 | ] 8 | } 9 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 infraboard 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cmdb 2 | 3 | 多云资产管理平台, 支持厂商: 4 | + 阿里云 5 | + 腾讯云 6 | + 华为云 7 | + AWS 8 | + VMware 9 | 10 | ## SDK使用 11 | 12 | ```go 13 | package main 14 | 15 | import ( 16 | "context" 17 | "fmt" 18 | 19 | "github.com/infraboard/cmdb/client" 20 | "github.com/infraboard/cmdb/apps/resource" 21 | ) 22 | 23 | func main() { 24 | // 配置cmdb grpc服务调用地址和凭证 25 | conf := client.NewConfig("localhost:18060") 26 | conf.WithClientCredentials("xx", "xx") 27 | 28 | // 创建CMDB客户端 29 | client, err := client.NewClientSet(conf) 30 | if err != nil { 31 | panic(err) 32 | } 33 | 34 | // 服务调用 35 | rs, err := client.Resource().Search(context.Background(), resource.NewSearchRequest()) 36 | if err != nil { 37 | panic(err) 38 | } 39 | fmt.Println(rs) 40 | } 41 | ``` 42 | 43 | ## 开发环境 44 | 45 | grpc 环境准备 46 | ```sh 47 | # 1.安装protoc编译器, 项目使用版本: v3.19.1 48 | # 下载预编译包安装: https://github.com/protocolbuffers/protobuf/releases 49 | 50 | # 2.protoc-gen-go go语言查询, 项目使用版本: v1.27.1 51 | go install google.golang.org/protobuf/cmd/protoc-gen-go@latest 52 | 53 | # 3.安装protoc-gen-go-grpc插件, 项目使用版本: 1.1.0 54 | go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest 55 | 56 | # 4.安装自定义proto tag插件 57 | go install github.com/favadi/protoc-go-inject-tag@latest 58 | ``` 59 | 60 | 运行程序: 61 | ```sh 62 | make run 63 | ``` 64 | 65 | protobuf代码生成: 66 | ``` 67 | make gen 68 | ``` 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /apps/account/README.md: -------------------------------------------------------------------------------- 1 | # 账号管理 2 | 3 | 配置 4 | 5 | // 存储 6 | Rds instance db username password 7 | Redis instance db username password 8 | Mongodb instance db username password 9 | ref@xxx 10 | 11 | // 12 | Kafka address topic username password 13 | 14 | // 使用应用凭证访问 15 | Bucket bucket 16 | 17 | // 功能 18 | Sms 模版Id name:value 19 | Vms 模版Id value 20 | 21 | 注入的应用凭证: app_id, app_secret 22 | 23 | cluster 24 | 25 | A rds ins_ref ref_db ref_account 26 | redis ins_ref ref_db 27 | mongo inf_ref ref_db ref_account 28 | bucket bucket_ref 29 | 30 | 关联映射: 31 | RDS RDS_0_ADDRESS RDS_0_DB RDS_0_USERNAME RDS_0_PASSWORD bind RDS instance_a, db01, acc_01 32 | REDIS REDIS_0_ADDRESS RDS_0_DB RDS_0_PASSWORD 33 | MONGO MONGO_0_ADDRESS MONGO_0_DB MONGO_0_USERNAME MONGO_0_PASSWORD 34 | -------------------------------------------------------------------------------- /apps/account/interface.go: -------------------------------------------------------------------------------- 1 | package account 2 | 3 | const ( 4 | AppName = "account" 5 | ) 6 | -------------------------------------------------------------------------------- /apps/account/pb/account.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.account; 4 | option go_package="github.com/infraboard/cmdb/apps/account"; 5 | 6 | import "apps/resource/pb/resource.proto"; 7 | 8 | message Account { 9 | // @gotags: json:"resource" 10 | resource.Resource resource = 1; 11 | // @gotags: json:"describe" 12 | Describe describe = 2; 13 | } 14 | 15 | message Describe { 16 | } 17 | 18 | message Secret { 19 | // 服务地址 20 | // @gotags: json:"address" 21 | string address = 1; 22 | // 服务地址 23 | // @gotags: json:"database" 24 | string database = 2; 25 | // 用户名称 26 | // @gotags: json:"username" 27 | string username = 3; 28 | // 用户密码 29 | // @gotags: json:"password" 30 | string password = 4; 31 | } -------------------------------------------------------------------------------- /apps/account/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.account; 4 | option go_package="github.com/infraboard/cmdb/apps/account"; 5 | 6 | // import "apps/resource/pb/account.proto"; 7 | 8 | // service RPC { 9 | // } -------------------------------------------------------------------------------- /apps/api.go: -------------------------------------------------------------------------------- 1 | package apps 2 | 3 | import ( 4 | // 内置健康检查 5 | _ "github.com/infraboard/mcube/app/health/api" 6 | 7 | _ "github.com/infraboard/cmdb/apps/bill/api" 8 | _ "github.com/infraboard/cmdb/apps/dict/api" 9 | _ "github.com/infraboard/cmdb/apps/host/api" 10 | _ "github.com/infraboard/cmdb/apps/resource/api" 11 | _ "github.com/infraboard/cmdb/apps/secret/api" 12 | _ "github.com/infraboard/cmdb/apps/task/api" 13 | ) 14 | -------------------------------------------------------------------------------- /apps/bill/README.md: -------------------------------------------------------------------------------- 1 | 账单管理 2 | 3 | 账单数据分类: 4 | 5 | 原始账单: 云商同步过来的账单 6 | 7 | 问题: 8 | + 存在 一个实例多个账单 9 | + 账单维度过粗的问题, 比如oss 是以Region出的账单 10 | 11 | 针对一个实例多个账单的情况需要合并处理 12 | 针对粗的问题, 需要进行一次分摊处理 13 | 14 | 实例账单: 聚合后生成以实例维度的账单, 供上层业务使用 15 | 16 | -------------------------------------------------------------------------------- /apps/bill/api/bill.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/bill/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "github.com/infraboard/cmdb/apps/bill" 5 | "github.com/infraboard/mcube/http/router" 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | 9 | "github.com/infraboard/mcube/app" 10 | ) 11 | 12 | var ( 13 | h = &handler{} 14 | ) 15 | 16 | type handler struct { 17 | service bill.ServiceServer 18 | log logger.Logger 19 | } 20 | 21 | func (h *handler) Config() error { 22 | h.log = zap.L().Named(bill.AppName) 23 | h.service = app.GetGrpcApp(bill.AppName).(bill.ServiceServer) 24 | return nil 25 | } 26 | 27 | func (h *handler) Name() string { 28 | return bill.AppName 29 | } 30 | 31 | func (h *handler) Registry(r router.SubRouter) { 32 | hr := r.ResourceRouter("bill") 33 | hr.Permission(true) 34 | } 35 | 36 | func init() { 37 | app.RegistryHttpApp(h) 38 | } 39 | -------------------------------------------------------------------------------- /apps/bill/impl/dao.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/bill/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | import ( 4 | "database/sql" 5 | 6 | "github.com/infraboard/cmdb/apps/bill" 7 | "github.com/infraboard/cmdb/conf" 8 | "github.com/infraboard/mcube/app" 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "google.golang.org/grpc" 12 | ) 13 | 14 | var ( 15 | // Service 服务实例 16 | svr = &service{} 17 | ) 18 | 19 | type service struct { 20 | db *sql.DB 21 | log logger.Logger 22 | bill.UnimplementedServiceServer 23 | } 24 | 25 | func (s *service) Config() error { 26 | db, err := conf.C().MySQL.GetDB() 27 | if err != nil { 28 | return err 29 | } 30 | 31 | s.log = zap.L().Named(s.Name()) 32 | s.db = db 33 | return nil 34 | } 35 | 36 | func (s *service) Name() string { 37 | return bill.AppName 38 | } 39 | 40 | func (s *service) Registry(server *grpc.Server) { 41 | bill.RegisterServiceServer(server, svr) 42 | } 43 | 44 | func init() { 45 | app.RegistryGrpcApp(svr) 46 | } 47 | -------------------------------------------------------------------------------- /apps/cost/README.md: -------------------------------------------------------------------------------- 1 | 基于实例聚合后的账单为准 2 | 3 | 4 | 类型 value year month cost delta_cost delta_percent task_id 5 | domain(总账) 6 | 7 | 8 | namespace(项目) domain 9 | env 10 | vendor 11 | account 12 | 13 | 14 | 15 | 总帐: 0xxxxx 16 | 17 | 18 | 1月 2月 3月 4月 19 | 20 | namesapce|vendor|account|env|resource_type 21 | 22 | --------- 23 | ns1 xxxx +192(200%) 24 | ns2 xxxx -110(100%) 25 | ns3 xxxx +100(100%) 26 | 27 | 分摊处理 28 | 29 | 项目账单: 0xxxxxxx 30 | 31 | 32 | 1月 2月 3月 4月 33 | 34 | 35 | ---------- 36 | app1 xxxx +192(200%) 37 | app2 xxxx -100(100%) 38 | 39 | ins1 xxxxx app weight cost 40 | ns-app-c1 app1 1 10 41 | ns-app-c2 app2 1 10 42 | ns-app-c2 app3 1 10 43 | 44 | ins2 xxxxx 30 45 | app app1 10 46 | app app2 10 47 | app app3 10 48 | 49 | -------------------------------------------------------------------------------- /apps/cost/api/cost.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/cost/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/cost/app.go: -------------------------------------------------------------------------------- 1 | package cost 2 | 3 | var ( 4 | AppName = "cost" 5 | ) 6 | -------------------------------------------------------------------------------- /apps/cost/cost_enum.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by github.com/infraboard/mcube 2 | // DO NOT EDIT 3 | 4 | package cost 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "strings" 10 | ) 11 | 12 | // ParseTypeFromString Parse Type from string 13 | func ParseTypeFromString(str string) (Type, error) { 14 | key := strings.Trim(string(str), `"`) 15 | v, ok := Type_value[strings.ToUpper(key)] 16 | if !ok { 17 | return 0, fmt.Errorf("unknown Type: %s", str) 18 | } 19 | 20 | return Type(v), nil 21 | } 22 | 23 | // Equal type compare 24 | func (t Type) Equal(target Type) bool { 25 | return t == target 26 | } 27 | 28 | // IsIn todo 29 | func (t Type) IsIn(targets ...Type) bool { 30 | for _, target := range targets { 31 | if t.Equal(target) { 32 | return true 33 | } 34 | } 35 | 36 | return false 37 | } 38 | 39 | // MarshalJSON todo 40 | func (t Type) MarshalJSON() ([]byte, error) { 41 | b := bytes.NewBufferString(`"`) 42 | b.WriteString(strings.ToUpper(t.String())) 43 | b.WriteString(`"`) 44 | return b.Bytes(), nil 45 | } 46 | 47 | // UnmarshalJSON todo 48 | func (t *Type) UnmarshalJSON(b []byte) error { 49 | ins, err := ParseTypeFromString(string(b)) 50 | if err != nil { 51 | return err 52 | } 53 | *t = ins 54 | return nil 55 | } 56 | -------------------------------------------------------------------------------- /apps/cost/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/cost/impl/sql.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/cost/pb/cost.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.cost; 4 | option go_package="github.com/infraboard/cmdb/apps/cost"; 5 | 6 | // 成本单元类型 7 | enum Type { 8 | // 基于域统计的总账单 9 | DOMAIN = 0; 10 | // 基于空间的总账单 11 | NAMESPACE = 1; 12 | // 基于云商的总账单 13 | VENDOR = 2; 14 | // 基于云商账号的总账单 15 | ACCOUNT = 3; 16 | // 基于地域的总账单 17 | REGION = 4; 18 | // 基于资源类型的总账单 19 | RESOURCE_TYPE = 5; 20 | // 基于环境的总账单 21 | ENV = 6; 22 | } 23 | 24 | // 用于成本聚合统计的单元 25 | message Unit { 26 | // 财务单元类型 27 | // @gotags: json:"type" 28 | Type type = 1; 29 | // 财务单元所属域, 到统计域时,该值为空 30 | // @gotags: json:"domain" 31 | Type domain = 2; 32 | // 财务单元的名称 33 | // @gotags: json:"name" 34 | string name = 3; 35 | // 财务单元的描述信息 36 | // @gotags: json:"description" 37 | string description = 4; 38 | // 年份 39 | // @gotags: json:"year" 40 | int32 year = 5; 41 | // 月份 42 | // @gotags: json:"month" 43 | int32 month = 6; 44 | // 月账单 45 | // @gotags: json:"real_cost" 46 | double real_cost = 7; 47 | // 同步增长金额 48 | // @gotags: json:"delta_cost" 49 | double delta_cost = 8; 50 | // 同步增长比例 51 | // @gotags: json:"delta_percent" 52 | double delta_percent = 9; 53 | // 关联的具体详情Task 54 | // @gotags: json:"task_id" 55 | double task_id = 15; 56 | } -------------------------------------------------------------------------------- /apps/database/README.md: -------------------------------------------------------------------------------- 1 | # 数据库管理 2 | 3 | -------------------------------------------------------------------------------- /apps/database/interface.go: -------------------------------------------------------------------------------- 1 | package database 2 | 3 | const ( 4 | AppName = "database" 5 | ) 6 | -------------------------------------------------------------------------------- /apps/database/pb/database.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.database; 4 | option go_package="github.com/infraboard/cmdb/apps/database"; 5 | 6 | import "apps/resource/pb/resource.proto"; 7 | 8 | message Database { 9 | // @gotags: json:"resource" 10 | resource.Resource resource = 1; 11 | // @gotags: json:"describe" 12 | Describe describe = 2; 13 | } 14 | 15 | message Describe { 16 | } -------------------------------------------------------------------------------- /apps/dict/README.md: -------------------------------------------------------------------------------- 1 | # 数据字典 2 | 3 | 用于前端使用枚举类型 4 | -------------------------------------------------------------------------------- /apps/dict/api/dict.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "github.com/emicklei/go-restful/v3" 5 | "github.com/infraboard/cmdb/apps/dict" 6 | "github.com/infraboard/mcube/http/restful/response" 7 | ) 8 | 9 | func (h *handler) CrendentialType(r *restful.Request, w *restful.Response) { 10 | response.Success(w, dict.CrendentialTypes) 11 | } 12 | 13 | func (h *handler) Vendor(r *restful.Request, w *restful.Response) { 14 | response.Success(w, dict.Vendors) 15 | } 16 | 17 | func (h *handler) ResourceType(r *restful.Request, w *restful.Response) { 18 | response.Success(w, dict.ResourceTypes) 19 | } 20 | 21 | func (h *handler) VendorRegion(r *restful.Request, w *restful.Response) { 22 | response.Success(w, dict.Regions) 23 | } 24 | -------------------------------------------------------------------------------- /apps/disk/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/disk/app.go: -------------------------------------------------------------------------------- 1 | package disk 2 | 3 | import ( 4 | "encoding/json" 5 | 6 | resource "github.com/infraboard/cmdb/apps/resource" 7 | ) 8 | 9 | const ( 10 | AppName = "disk" 11 | ) 12 | 13 | func NewDefaultDisk() *Disk { 14 | return &Disk{ 15 | Resource: resource.NewDefaultResource(resource.TYPE_DISK), 16 | Describe: &Describe{}, 17 | } 18 | } 19 | 20 | func NewDiskSet() *DiskSet { 21 | return &DiskSet{ 22 | Items: []*Disk{}, 23 | } 24 | } 25 | 26 | func (s *DiskSet) Add(items ...any) { 27 | for i := range items { 28 | s.Items = append(s.Items, items[i].(*Disk)) 29 | } 30 | } 31 | 32 | func (s *DiskSet) ResourceIds() (ids []string) { 33 | for i := range s.Items { 34 | ids = append(ids, s.Items[i].Resource.Meta.Id) 35 | } 36 | return 37 | } 38 | 39 | func (s *DiskSet) Length() int64 { 40 | return int64(len(s.Items)) 41 | } 42 | 43 | func (s *DiskSet) ToAny() (items []any) { 44 | for i := range s.Items { 45 | items = append(items, s.Items[i]) 46 | } 47 | return 48 | } 49 | 50 | func (s *DiskSet) ToJsonString() string { 51 | b, _ := json.Marshal(s) 52 | return string(b) 53 | } 54 | -------------------------------------------------------------------------------- /apps/disk/disk_enum.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by github.com/infraboard/mcube 2 | // DO NOT EDIT 3 | 4 | package disk 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "strings" 10 | ) 11 | 12 | // ParseSTATUSFromString Parse STATUS from string 13 | func ParseSTATUSFromString(str string) (STATUS, error) { 14 | key := strings.Trim(string(str), `"`) 15 | v, ok := STATUS_value[strings.ToUpper(key)] 16 | if !ok { 17 | return 0, fmt.Errorf("unknown STATUS: %s", str) 18 | } 19 | 20 | return STATUS(v), nil 21 | } 22 | 23 | // Equal type compare 24 | func (t STATUS) Equal(target STATUS) bool { 25 | return t == target 26 | } 27 | 28 | // IsIn todo 29 | func (t STATUS) IsIn(targets ...STATUS) bool { 30 | for _, target := range targets { 31 | if t.Equal(target) { 32 | return true 33 | } 34 | } 35 | 36 | return false 37 | } 38 | 39 | // MarshalJSON todo 40 | func (t STATUS) MarshalJSON() ([]byte, error) { 41 | b := bytes.NewBufferString(`"`) 42 | b.WriteString(strings.ToUpper(t.String())) 43 | b.WriteString(`"`) 44 | return b.Bytes(), nil 45 | } 46 | 47 | // UnmarshalJSON todo 48 | func (t *STATUS) UnmarshalJSON(b []byte) error { 49 | ins, err := ParseSTATUSFromString(string(b)) 50 | if err != nil { 51 | return err 52 | } 53 | *t = ins 54 | return nil 55 | } 56 | -------------------------------------------------------------------------------- /apps/disk/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/disk/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.disk; 4 | option go_package="github.com/infraboard/cmdb/apps/disk"; 5 | 6 | 7 | import "github.com/infraboard/mcube/pb/page/page.proto"; 8 | import "apps/disk/pb/disk.proto"; 9 | 10 | service Service { 11 | rpc SyncDisk(Disk) returns(Disk) {} 12 | rpc QueryDisk(QueryDiskRequest) returns(DiskSet) {} 13 | } 14 | 15 | message QueryDiskRequest { 16 | // 分页参数 17 | // @gotags: json:"page" 18 | infraboard.mcube.page.PageRequest page = 1; 19 | } -------------------------------------------------------------------------------- /apps/dns/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/dns/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/dns/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.domain; 4 | option go_package="github.com/infraboard/cmdb/apps/dns"; 5 | 6 | import "github.com/infraboard/mcube/pb/page/page.proto"; 7 | import "apps/dns/pb/domain.proto"; 8 | 9 | service Service { 10 | rpc SyncDomain(Domain) returns(Domain) {} 11 | rpc QueryDomain(QueryDomainRequest) returns(DomainSet) {} 12 | } 13 | 14 | message QueryDomainRequest { 15 | // 分页参数 16 | // @gotags: json:"page" 17 | infraboard.mcube.page.PageRequest page = 1; 18 | } -------------------------------------------------------------------------------- /apps/eip/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/eip/app.go: -------------------------------------------------------------------------------- 1 | package eip 2 | 3 | import ( 4 | "encoding/json" 5 | 6 | resource "github.com/infraboard/cmdb/apps/resource" 7 | ) 8 | 9 | const ( 10 | AppName = "eip" 11 | ) 12 | 13 | func NewDefaultEip() *EIP { 14 | return &EIP{ 15 | Resource: resource.NewDefaultResource(resource.TYPE_EIP), 16 | Describe: &Describe{}, 17 | } 18 | } 19 | 20 | func NewEIPSet() *EIPSet { 21 | return &EIPSet{ 22 | Items: []*EIP{}, 23 | } 24 | } 25 | 26 | func (s *EIPSet) Add(items ...any) { 27 | for i := range items { 28 | s.Items = append(s.Items, items[i].(*EIP)) 29 | } 30 | } 31 | 32 | func (s *EIPSet) ResourceIds() (ids []string) { 33 | for i := range s.Items { 34 | ids = append(ids, s.Items[i].Resource.Meta.Id) 35 | } 36 | return 37 | } 38 | 39 | func (s *EIPSet) Length() int64 { 40 | return int64(len(s.Items)) 41 | } 42 | 43 | func (s *EIPSet) ToAny() (items []any) { 44 | for i := range s.Items { 45 | items = append(items, s.Items[i]) 46 | } 47 | return 48 | } 49 | 50 | func (s *EIPSet) ToJsonString() string { 51 | b, _ := json.Marshal(s) 52 | return string(b) 53 | } 54 | -------------------------------------------------------------------------------- /apps/eip/eip_enum.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by github.com/infraboard/mcube 2 | // DO NOT EDIT 3 | 4 | package eip 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "strings" 10 | ) 11 | 12 | // ParseSTATUSFromString Parse STATUS from string 13 | func ParseSTATUSFromString(str string) (STATUS, error) { 14 | key := strings.Trim(string(str), `"`) 15 | v, ok := STATUS_value[strings.ToUpper(key)] 16 | if !ok { 17 | return 0, fmt.Errorf("unknown STATUS: %s", str) 18 | } 19 | 20 | return STATUS(v), nil 21 | } 22 | 23 | // Equal type compare 24 | func (t STATUS) Equal(target STATUS) bool { 25 | return t == target 26 | } 27 | 28 | // IsIn todo 29 | func (t STATUS) IsIn(targets ...STATUS) bool { 30 | for _, target := range targets { 31 | if t.Equal(target) { 32 | return true 33 | } 34 | } 35 | 36 | return false 37 | } 38 | 39 | // MarshalJSON todo 40 | func (t STATUS) MarshalJSON() ([]byte, error) { 41 | b := bytes.NewBufferString(`"`) 42 | b.WriteString(strings.ToUpper(t.String())) 43 | b.WriteString(`"`) 44 | return b.Bytes(), nil 45 | } 46 | 47 | // UnmarshalJSON todo 48 | func (t *STATUS) UnmarshalJSON(b []byte) error { 49 | ins, err := ParseSTATUSFromString(string(b)) 50 | if err != nil { 51 | return err 52 | } 53 | *t = ins 54 | return nil 55 | } 56 | -------------------------------------------------------------------------------- /apps/eip/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/eip/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.eip; 4 | option go_package="github.com/infraboard/cmdb/apps/eip"; 5 | 6 | import "github.com/infraboard/mcube/pb/page/page.proto"; 7 | import "apps/eip/pb/eip.proto"; 8 | 9 | service Service { 10 | rpc SyncEIP(EIP) returns(EIP) {} 11 | rpc QueryEIP(QueryEIPRequest) returns(EIPSet) {} 12 | } 13 | 14 | message QueryEIPRequest { 15 | // 分页参数 16 | // @gotags: json:"page" 17 | infraboard.mcube.page.PageRequest page = 1; 18 | } -------------------------------------------------------------------------------- /apps/health/README.md: -------------------------------------------------------------------------------- 1 | # 服务健康检查 2 | 3 | 在 加载由mcube提供的内置健康检查API, 内置检查API依赖业务自己实现一个健康检查服务实例: health.AppName, 然后托管给ioc 4 | ```go 5 | package apps 6 | 7 | import ( 8 | // 内置健康检查 9 | _ "github.com/infraboard/mcube/app/health/api" 10 | 11 | ... 12 | ) 13 | ``` -------------------------------------------------------------------------------- /apps/health/impl/health.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | import ( 4 | "context" 5 | 6 | healthgrpc "google.golang.org/grpc/health/grpc_health_v1" 7 | ) 8 | 9 | func (i *impl) Check(ctx context.Context, req *healthgrpc.HealthCheckRequest) ( 10 | *healthgrpc.HealthCheckResponse, error) { 11 | return i.Server.Check(ctx, req) 12 | } 13 | -------------------------------------------------------------------------------- /apps/health/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | import ( 4 | "github.com/infraboard/mcube/app" 5 | "google.golang.org/grpc" 6 | "google.golang.org/grpc/health" 7 | healthgrpc "google.golang.org/grpc/health/grpc_health_v1" 8 | 9 | my "github.com/infraboard/mcube/app/health" 10 | ) 11 | 12 | var ( 13 | // Service 服务实例 14 | svr = &impl{Server: health.NewServer()} 15 | ) 16 | 17 | type impl struct { 18 | *health.Server 19 | } 20 | 21 | func (i *impl) Config() error { 22 | return nil 23 | } 24 | 25 | func (i *impl) Name() string { 26 | return my.AppName 27 | } 28 | 29 | func (i *impl) Registry(server *grpc.Server) { 30 | healthgrpc.RegisterHealthServer(server, svr) 31 | } 32 | 33 | func init() { 34 | app.RegistryInternalApp(svr) 35 | app.RegistryGrpcApp(svr) 36 | } 37 | -------------------------------------------------------------------------------- /apps/host/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | import ( 4 | "database/sql" 5 | 6 | "github.com/infraboard/cmdb/apps/host" 7 | "github.com/infraboard/cmdb/conf" 8 | "github.com/infraboard/mcube/app" 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "google.golang.org/grpc" 12 | ) 13 | 14 | var ( 15 | // Service 服务实例 16 | 17 | svr = &service{} 18 | ) 19 | 20 | type service struct { 21 | db *sql.DB 22 | log logger.Logger 23 | host.UnimplementedServiceServer 24 | } 25 | 26 | func (s *service) Config() error { 27 | db, err := conf.C().MySQL.GetDB() 28 | if err != nil { 29 | return err 30 | } 31 | 32 | s.log = zap.L().Named(s.Name()) 33 | s.db = db 34 | return nil 35 | } 36 | 37 | func (s *service) Name() string { 38 | return host.AppName 39 | } 40 | 41 | func (s *service) Registry(server *grpc.Server) { 42 | host.RegisterServiceServer(server, svr) 43 | } 44 | 45 | func init() { 46 | app.RegistryGrpcApp(svr) 47 | } 48 | -------------------------------------------------------------------------------- /apps/host/impl/sql.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | const ( 4 | insertHostSQL = ` 5 | INSERT INTO resource_host ( 6 | resource_id,gpu_spec,os_type,os_name, 7 | image_id,internet_max_bandwidth_out, 8 | internet_max_bandwidth_in,key_pair_name,security_groups 9 | ) VALUES (?,?,?,?,?,?,?,?,?); 10 | ` 11 | 12 | updateHostSQL = ` 13 | UPDATE resource_host SET 14 | gpu_spec=?,os_type=?,os_name=?, 15 | image_id=?,internet_max_bandwidth_out=?, 16 | internet_max_bandwidth_in=?,key_pair_name=?,security_groups=? 17 | WHERE resource_id = ? 18 | ` 19 | 20 | queryHostSQL = ` 21 | SELECT 22 | r.*, 23 | h.* 24 | FROM 25 | resource AS r 26 | LEFT JOIN resource_host h ON r.id = h.resource_id 27 | LEFT JOIN resource_tag t ON r.id = t.resource_id` 28 | countHostSQL = `SELECT 29 | COUNT(DISTINCT r.id) 30 | FROM 31 | resource AS r 32 | LEFT JOIN resource_host h ON r.id = h.resource_id 33 | LEFT JOIN resource_tag t ON r.id = t.resource_id 34 | ` 35 | 36 | deleteHostSQL = `DELETE FROM resource_host WHERE resource_id = ?;` 37 | ) 38 | -------------------------------------------------------------------------------- /apps/internal.go: -------------------------------------------------------------------------------- 1 | package apps 2 | 3 | import ( 4 | _ "github.com/infraboard/cmdb/apps/bill/impl" 5 | _ "github.com/infraboard/cmdb/apps/health/impl" 6 | _ "github.com/infraboard/cmdb/apps/host/impl" 7 | _ "github.com/infraboard/cmdb/apps/rds/impl" 8 | _ "github.com/infraboard/cmdb/apps/resource/impl" 9 | _ "github.com/infraboard/cmdb/apps/secret/impl" 10 | _ "github.com/infraboard/cmdb/apps/task/impl" 11 | ) 12 | -------------------------------------------------------------------------------- /apps/lb/README.md: -------------------------------------------------------------------------------- 1 | # 负载均衡管理 2 | 3 | 4 | ## 统一状态 5 | 6 | 7 | ### 各云商状态 8 | 9 | 阿里云: [API 文档](https://next.api.aliyun.com/api/Slb/2014-05-15/DescribeLoadBalancers?params={}&lang=GO&tab=DOC) 10 | + inactive: 实例已停止,此状态的实例监听不会再转发流量。 11 | + active: 实例运行中,实例创建后,默认状态为active。 12 | + locked: 实例已锁定。当负载均衡实例到期后,但到期时间未超过7天时,负载均衡实例进入锁定状态。此种状态下,您不能对负载均衡实例进行任何操作,并且实例不再会进行流量转发,但会保留实例的IP和其它配置。 13 | 14 | 腾讯云: [LoadBalancer数据结构](https://cloud.tencent.com/document/api/214/30694#LoadBalancer) 15 | 0:创建中 16 | 1:正常运行。 17 | 18 | 华为云: [API 文档](https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=ELB&api=ListLoadbalancers&version=v2) 19 | + ONLINE 20 | + FROZEN 21 | 22 | ### 统一后状态 23 | 24 | + PENDING:表示创建中 25 | + RUNNING:表示运行中 26 | + LOCKED: 实例已锁定 -------------------------------------------------------------------------------- /apps/lb/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/lb/app.go: -------------------------------------------------------------------------------- 1 | package lb 2 | 3 | import ( 4 | "encoding/json" 5 | 6 | resource "github.com/infraboard/cmdb/apps/resource" 7 | ) 8 | 9 | const ( 10 | AppName = "lb" 11 | ) 12 | 13 | func NewDefaultLoadBalancer() *LoadBalancer { 14 | return &LoadBalancer{ 15 | Resource: resource.NewDefaultResource(resource.TYPE_LB), 16 | Describe: &Describe{}, 17 | } 18 | } 19 | 20 | func NewLoadBalancerSet() *LoadBalancerSet { 21 | return &LoadBalancerSet{ 22 | Items: []*LoadBalancer{}, 23 | } 24 | } 25 | 26 | func (s *LoadBalancerSet) GetLast() *LoadBalancer { 27 | l := s.Length() 28 | if l == 0 { 29 | return nil 30 | } 31 | 32 | return s.Items[l-1] 33 | } 34 | 35 | func (s *LoadBalancerSet) Add(items ...any) { 36 | for i := range items { 37 | s.Items = append(s.Items, items[i].(*LoadBalancer)) 38 | } 39 | } 40 | 41 | func (s *LoadBalancerSet) ResourceIds() (ids []string) { 42 | for i := range s.Items { 43 | ids = append(ids, s.Items[i].Resource.Meta.Id) 44 | } 45 | return 46 | } 47 | 48 | func (s *LoadBalancerSet) Length() int64 { 49 | return int64(len(s.Items)) 50 | } 51 | 52 | func (s *LoadBalancerSet) ToAny() (items []any) { 53 | for i := range s.Items { 54 | items = append(items, s.Items[i]) 55 | } 56 | return 57 | } 58 | 59 | func (s *LoadBalancerSet) ToJsonString() string { 60 | b, _ := json.Marshal(s) 61 | return string(b) 62 | } 63 | -------------------------------------------------------------------------------- /apps/lb/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/lb/lb_enum.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by github.com/infraboard/mcube 2 | // DO NOT EDIT 3 | 4 | package lb 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "strings" 10 | ) 11 | 12 | // ParseSTATUSFromString Parse STATUS from string 13 | func ParseSTATUSFromString(str string) (STATUS, error) { 14 | key := strings.Trim(string(str), `"`) 15 | v, ok := STATUS_value[strings.ToUpper(key)] 16 | if !ok { 17 | return 0, fmt.Errorf("unknown STATUS: %s", str) 18 | } 19 | 20 | return STATUS(v), nil 21 | } 22 | 23 | // Equal type compare 24 | func (t STATUS) Equal(target STATUS) bool { 25 | return t == target 26 | } 27 | 28 | // IsIn todo 29 | func (t STATUS) IsIn(targets ...STATUS) bool { 30 | for _, target := range targets { 31 | if t.Equal(target) { 32 | return true 33 | } 34 | } 35 | 36 | return false 37 | } 38 | 39 | // MarshalJSON todo 40 | func (t STATUS) MarshalJSON() ([]byte, error) { 41 | b := bytes.NewBufferString(`"`) 42 | b.WriteString(strings.ToUpper(t.String())) 43 | b.WriteString(`"`) 44 | return b.Bytes(), nil 45 | } 46 | 47 | // UnmarshalJSON todo 48 | func (t *STATUS) UnmarshalJSON(b []byte) error { 49 | ins, err := ParseSTATUSFromString(string(b)) 50 | if err != nil { 51 | return err 52 | } 53 | *t = ins 54 | return nil 55 | } 56 | -------------------------------------------------------------------------------- /apps/lb/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.slb; 4 | option go_package="github.com/infraboard/cmdb/apps/lb"; 5 | 6 | import "github.com/infraboard/mcube/pb/page/page.proto"; 7 | import "apps/lb/pb/lb.proto"; 8 | 9 | service Service { 10 | rpc SyncSLB(LoadBalancer) returns(LoadBalancer) {} 11 | rpc QuerySLB(QuerySLBRequest) returns(LoadBalancer) {} 12 | } 13 | 14 | message QuerySLBRequest { 15 | // 分页参数 16 | // @gotags: json:"page" 17 | infraboard.mcube.page.PageRequest page = 1; 18 | } -------------------------------------------------------------------------------- /apps/metric/app.go: -------------------------------------------------------------------------------- 1 | package metric 2 | 3 | const ( 4 | AppName = "metric" 5 | ) 6 | -------------------------------------------------------------------------------- /apps/metric/pb/metric.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.metric; 4 | option go_package="github.com/infraboard/cmdb/apps/metric"; 5 | 6 | import "apps/resource/pb/resource.proto"; 7 | 8 | // 统一多个云商的指标名称 9 | message Metric { 10 | // 资源类型 11 | // @gotags: json:"resource_type" 12 | resource.TYPE resource_type = 1; 13 | // 指标名称 14 | // @gotags: json:"name" 15 | string name = 2; 16 | // 指标映射名称, 比如 aliyun:xxx@rds 17 | // @gotags: json:"mapping_name" 18 | map mapping_name = 3; 19 | // 指标描述 20 | // @gotags: json:"describe" 21 | string describe =4; 22 | // 指标单位 23 | // @gotags: json:"unit" 24 | string unit =5; 25 | // 指标的维度 26 | // @gotags: json:"dimensions" 27 | repeated string dimensions = 6; 28 | } 29 | 30 | message MetricSet { 31 | // 总数 32 | // @gotags: json:"total" 33 | int64 total = 1; 34 | // 指标列表 35 | // @gotags: json:"items" 36 | repeated Metric items = 2; 37 | } 38 | 39 | message QueryMetricRequest { 40 | // 资源类型 41 | // @gotags: json:"resource_type" 42 | resource.TYPE resource_type = 1; 43 | } -------------------------------------------------------------------------------- /apps/metric/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.metric; 4 | option go_package="github.com/infraboard/cmdb/apps/metric"; 5 | 6 | import "apps/metric/pb/metric.proto"; 7 | 8 | service RPC { 9 | rpc QueryMetric(QueryMetricRequest) returns(MetricSet); 10 | } -------------------------------------------------------------------------------- /apps/mongodb/app.go: -------------------------------------------------------------------------------- 1 | package mongodb 2 | 3 | import resource "github.com/infraboard/cmdb/apps/resource" 4 | 5 | const ( 6 | AppName = "mongodb" 7 | ) 8 | 9 | func NewDefaultMongoDB() *MongoDB { 10 | return &MongoDB{ 11 | Resource: resource.NewDefaultResource(resource.TYPE_MONGODB), 12 | Describe: &Describe{}, 13 | } 14 | } 15 | 16 | func NewMongoDBSet() *MongoDBSet { 17 | return &MongoDBSet{ 18 | Items: []*MongoDB{}, 19 | } 20 | } 21 | 22 | func (s *MongoDBSet) ToAny() (items []any) { 23 | for i := range s.Items { 24 | items = append(items, s.Items[i]) 25 | } 26 | return 27 | } 28 | 29 | func (s *MongoDBSet) Add(items ...any) { 30 | for i := range items { 31 | s.Items = append(s.Items, items[i].(*MongoDB)) 32 | } 33 | } 34 | 35 | func (s *MongoDBSet) AddSet(set *MongoDBSet) { 36 | s.Items = append(s.Items, set.Items...) 37 | } 38 | 39 | func (s *MongoDBSet) Length() int64 { 40 | return int64(len(s.Items)) 41 | } 42 | -------------------------------------------------------------------------------- /apps/mongodb/mongodb_enum.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by github.com/infraboard/mcube 2 | // DO NOT EDIT 3 | 4 | package mongodb 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "strings" 10 | ) 11 | 12 | // ParseSTATUSFromString Parse STATUS from string 13 | func ParseSTATUSFromString(str string) (STATUS, error) { 14 | key := strings.Trim(string(str), `"`) 15 | v, ok := STATUS_value[strings.ToUpper(key)] 16 | if !ok { 17 | return 0, fmt.Errorf("unknown STATUS: %s", str) 18 | } 19 | 20 | return STATUS(v), nil 21 | } 22 | 23 | // Equal type compare 24 | func (t STATUS) Equal(target STATUS) bool { 25 | return t == target 26 | } 27 | 28 | // IsIn todo 29 | func (t STATUS) IsIn(targets ...STATUS) bool { 30 | for _, target := range targets { 31 | if t.Equal(target) { 32 | return true 33 | } 34 | } 35 | 36 | return false 37 | } 38 | 39 | // MarshalJSON todo 40 | func (t STATUS) MarshalJSON() ([]byte, error) { 41 | b := bytes.NewBufferString(`"`) 42 | b.WriteString(strings.ToUpper(t.String())) 43 | b.WriteString(`"`) 44 | return b.Bytes(), nil 45 | } 46 | 47 | // UnmarshalJSON todo 48 | func (t *STATUS) UnmarshalJSON(b []byte) error { 49 | ins, err := ParseSTATUSFromString(string(b)) 50 | if err != nil { 51 | return err 52 | } 53 | *t = ins 54 | return nil 55 | } 56 | -------------------------------------------------------------------------------- /apps/mongodb/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.mongodb; 4 | option go_package="github.com/infraboard/cmdb/apps/mongodb"; 5 | 6 | import "apps/mongodb/pb/mongodb.proto"; 7 | import "github.com/infraboard/mcube/pb/page/page.proto"; 8 | 9 | service Service { 10 | rpc SyncMongoDB(MongoDB) returns(MongoDB) {} 11 | rpc QueryMongoDB(QueryMongoDBRequest) returns(MongoDBSet) {} 12 | } 13 | 14 | message QueryMongoDBRequest { 15 | // 分页参数 16 | // @gotags: json:"page" 17 | infraboard.mcube.page.PageRequest page = 1; 18 | } -------------------------------------------------------------------------------- /apps/order/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/order/app.go: -------------------------------------------------------------------------------- 1 | package order 2 | 3 | import "github.com/alibabacloud-go/tea/tea" 4 | 5 | const ( 6 | AppName = "order" 7 | ) 8 | 9 | func NewDefaultOrder() *Order { 10 | return &Order{ 11 | Cost: &Cost{}, 12 | } 13 | } 14 | 15 | func NewOrderSet() *OrderSet { 16 | return &OrderSet{ 17 | Items: []*Order{}, 18 | } 19 | } 20 | 21 | func (s *OrderSet) ToAny() (items []any) { 22 | for i := range s.Items { 23 | items = append(items, s.Items[i]) 24 | } 25 | 26 | return 27 | } 28 | 29 | func (s *OrderSet) Add(items ...any) { 30 | for i := range items { 31 | s.Items = append(s.Items, items[i].(*Order)) 32 | } 33 | } 34 | 35 | func (s *OrderSet) GetOrderById(orderId string) *Order { 36 | for i := range s.Items { 37 | if s.Items[i].Id == orderId { 38 | return s.Items[i] 39 | } 40 | } 41 | 42 | return nil 43 | } 44 | 45 | func (s *OrderSet) Length() int64 { 46 | return int64(len(s.Items)) 47 | } 48 | 49 | func (o *Order) ToJsonString() string { 50 | return tea.Prettify(o) 51 | } 52 | -------------------------------------------------------------------------------- /apps/order/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/oss/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/oss/app.go: -------------------------------------------------------------------------------- 1 | package oss 2 | 3 | import resource "github.com/infraboard/cmdb/apps/resource" 4 | 5 | const ( 6 | AppName = "oss" 7 | ) 8 | 9 | func NewBucketSet() *BucketSet { 10 | return &BucketSet{ 11 | Items: []*Bucket{}, 12 | } 13 | } 14 | 15 | func (s *BucketSet) ToAny() (items []any) { 16 | for i := range s.Items { 17 | items = append(items, s.Items[i]) 18 | } 19 | return 20 | } 21 | 22 | func (s *BucketSet) Add(items ...any) { 23 | for i := range items { 24 | s.Items = append(s.Items, items[i].(*Bucket)) 25 | } 26 | } 27 | 28 | func (s *BucketSet) AddSet(set *BucketSet) { 29 | s.Items = append(s.Items, set.Items...) 30 | } 31 | 32 | func (s *BucketSet) Length() int64 { 33 | return int64(len(s.Items)) 34 | } 35 | 36 | func NewDefaultBucket() *Bucket { 37 | return &Bucket{ 38 | Resource: resource.NewDefaultResource(resource.TYPE_BUCKET), 39 | Describe: &Describe{}, 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /apps/oss/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/oss/pb/oss.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.oss; 4 | option go_package="github.com/infraboard/cmdb/apps/oss"; 5 | 6 | import "apps/resource/pb/resource.proto"; 7 | 8 | message Bucket { 9 | // @gotags: json:"resource" 10 | resource.Resource resource = 1; 11 | // @gotags: json:"describe" 12 | Describe describe = 3; 13 | } 14 | 15 | message Describe { 16 | // 存储类型 17 | // @gotags: json:"storage_class" 18 | string storage_class = 1; 19 | } 20 | 21 | message BucketSet { 22 | // 总数量 23 | // @gotags: json:"total" 24 | int64 total = 1; 25 | // 列表项 26 | // @gotags: json:"items" 27 | repeated Bucket items = 2; 28 | } -------------------------------------------------------------------------------- /apps/oss/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.oss; 4 | option go_package="github.com/infraboard/cmdb/apps/oss"; 5 | 6 | import "apps/oss/pb/oss.proto"; 7 | import "github.com/infraboard/mcube/pb/page/page.proto"; 8 | 9 | service Service { 10 | rpc SyncBucket(Bucket) returns(Bucket) {} 11 | rpc QueryBucket(QueryBucketRequest) returns(BucketSet) {} 12 | } 13 | 14 | message QueryBucketRequest { 15 | // 分页参数 16 | // @gotags: json:"page" 17 | infraboard.mcube.page.PageRequest page = 1; 18 | } -------------------------------------------------------------------------------- /apps/rds/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/rds/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | import ( 4 | "database/sql" 5 | 6 | "github.com/infraboard/cmdb/apps/rds" 7 | "github.com/infraboard/cmdb/conf" 8 | "github.com/infraboard/mcube/app" 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "google.golang.org/grpc" 12 | ) 13 | 14 | var ( 15 | // Service 服务实例 16 | svr = &service{} 17 | ) 18 | 19 | type service struct { 20 | db *sql.DB 21 | log logger.Logger 22 | rds.UnimplementedServiceServer 23 | } 24 | 25 | func (s *service) Config() error { 26 | db, err := conf.C().MySQL.GetDB() 27 | if err != nil { 28 | return err 29 | } 30 | 31 | s.log = zap.L().Named(s.Name()) 32 | s.db = db 33 | return nil 34 | } 35 | 36 | func (s *service) Name() string { 37 | return rds.AppName 38 | } 39 | 40 | func (s *service) Registry(server *grpc.Server) { 41 | rds.RegisterServiceServer(server, svr) 42 | } 43 | 44 | func init() { 45 | app.RegistryGrpcApp(svr) 46 | } 47 | -------------------------------------------------------------------------------- /apps/rds/impl/rds.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/infraboard/cmdb/apps/rds" 7 | "github.com/infraboard/mcube/types/ftime" 8 | "github.com/rs/xid" 9 | ) 10 | 11 | func (s *service) SyncRDS(ctx context.Context, h *rds.Rds) ( 12 | *rds.Rds, error) { 13 | h.Resource.Meta.Id = xid.New().String() 14 | h.Resource.Meta.SyncAt = ftime.Now().Timestamp() 15 | 16 | if err := s.save(ctx, h); err != nil { 17 | return nil, err 18 | } 19 | return h, nil 20 | } 21 | -------------------------------------------------------------------------------- /apps/rds/impl/sql.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | const ( 4 | insertRdsSQL = `INSERT INTO resource_rds ( 5 | resource_id,engine_type,engine_version,instance_class,class_type,export_type, 6 | network_type,type,db_max_quantity,account_max_quantity,max_connections, 7 | max_iops,collation,time_zone,storage_type,security_ip_mode, 8 | security_ip_list,connection_mode,ip_type,deploy_mode, 9 | port,extra 10 | ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);` 11 | updateRdsSQL = `UPDATE resource_rds SET 12 | cpu=?,memory=?,collation=?,time_zone=?,storage_type=?,storage_capacity=?, 13 | security_ip_mode=?,security_ip_list=?,connection_mode=?,ip_type=?, 14 | lock_mode=?,lock_reason=?,port=?,extra=? 15 | WHERE resource_id = ?` 16 | 17 | queryRdsSQL = `SELECT * FROM resource as r LEFT JOIN resource_rds i ON i.id=h.resource_id` 18 | deleteRdsSQL = `DELETE FROM resource_rds WHERE resource_id = ?;` 19 | ) 20 | -------------------------------------------------------------------------------- /apps/rds/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.rds; 4 | option go_package="github.com/infraboard/cmdb/apps/rds"; 5 | 6 | import "github.com/infraboard/mcube/pb/page/page.proto"; 7 | import "apps/rds/pb/rds.proto"; 8 | 9 | service Service { 10 | rpc SyncRDS(Rds) returns(Rds) {} 11 | rpc QueryRDS(QueryRDSRequest) returns(RdsSet) {} 12 | } 13 | 14 | message QueryRDSRequest { 15 | // 分页参数 16 | // @gotags: json:"page" 17 | infraboard.mcube.page.PageRequest page = 1; 18 | } -------------------------------------------------------------------------------- /apps/rds/rds_enum.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by github.com/infraboard/mcube 2 | // DO NOT EDIT 3 | 4 | package rds 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "strings" 10 | ) 11 | 12 | // ParseSTATUSFromString Parse STATUS from string 13 | func ParseSTATUSFromString(str string) (STATUS, error) { 14 | key := strings.Trim(string(str), `"`) 15 | v, ok := STATUS_value[strings.ToUpper(key)] 16 | if !ok { 17 | return 0, fmt.Errorf("unknown STATUS: %s", str) 18 | } 19 | 20 | return STATUS(v), nil 21 | } 22 | 23 | // Equal type compare 24 | func (t STATUS) Equal(target STATUS) bool { 25 | return t == target 26 | } 27 | 28 | // IsIn todo 29 | func (t STATUS) IsIn(targets ...STATUS) bool { 30 | for _, target := range targets { 31 | if t.Equal(target) { 32 | return true 33 | } 34 | } 35 | 36 | return false 37 | } 38 | 39 | // MarshalJSON todo 40 | func (t STATUS) MarshalJSON() ([]byte, error) { 41 | b := bytes.NewBufferString(`"`) 42 | b.WriteString(strings.ToUpper(t.String())) 43 | b.WriteString(`"`) 44 | return b.Bytes(), nil 45 | } 46 | 47 | // UnmarshalJSON todo 48 | func (t *STATUS) UnmarshalJSON(b []byte) error { 49 | ins, err := ParseSTATUSFromString(string(b)) 50 | if err != nil { 51 | return err 52 | } 53 | *t = ins 54 | return nil 55 | } 56 | -------------------------------------------------------------------------------- /apps/redis/api/http.go: -------------------------------------------------------------------------------- 1 | package api 2 | -------------------------------------------------------------------------------- /apps/redis/app.go: -------------------------------------------------------------------------------- 1 | package redis 2 | 3 | import resource "github.com/infraboard/cmdb/apps/resource" 4 | 5 | const ( 6 | AppName = "redis" 7 | ) 8 | 9 | func NewSet() *Set { 10 | return &Set{ 11 | Items: []*Redis{}, 12 | } 13 | } 14 | 15 | func (s *Set) Add(items ...any) { 16 | for i := range items { 17 | s.Items = append(s.Items, items[i].(*Redis)) 18 | } 19 | } 20 | 21 | func (s *Set) ToAny() (items []any) { 22 | for i := range s.Items { 23 | items = append(items, s.Items[i]) 24 | } 25 | return 26 | } 27 | 28 | func (s *Set) Length() int64 { 29 | return int64(len(s.Items)) 30 | } 31 | 32 | func NewDefaultRedis() *Redis { 33 | return &Redis{ 34 | Resource: resource.NewDefaultResource(resource.TYPE_REDIS), 35 | Describe: &Describe{}, 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /apps/redis/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/redis/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.redis; 4 | option go_package="github.com/infraboard/cmdb/apps/redis"; 5 | 6 | import "apps/redis/pb/redis.proto"; 7 | import "github.com/infraboard/mcube/pb/page/page.proto"; 8 | 9 | service Service { 10 | rpc SyncRedis(Redis) returns(Redis) {} 11 | rpc QueryRedis(QueryRedisRequest) returns(Set) {} 12 | } 13 | 14 | message QueryRedisRequest { 15 | // 分页参数 16 | // @gotags: json:"page" 17 | infraboard.mcube.page.PageRequest page = 1; 18 | } -------------------------------------------------------------------------------- /apps/redis/redis_enum.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by github.com/infraboard/mcube 2 | // DO NOT EDIT 3 | 4 | package redis 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "strings" 10 | ) 11 | 12 | // ParseSTATUSFromString Parse STATUS from string 13 | func ParseSTATUSFromString(str string) (STATUS, error) { 14 | key := strings.Trim(string(str), `"`) 15 | v, ok := STATUS_value[strings.ToUpper(key)] 16 | if !ok { 17 | return 0, fmt.Errorf("unknown STATUS: %s", str) 18 | } 19 | 20 | return STATUS(v), nil 21 | } 22 | 23 | // Equal type compare 24 | func (t STATUS) Equal(target STATUS) bool { 25 | return t == target 26 | } 27 | 28 | // IsIn todo 29 | func (t STATUS) IsIn(targets ...STATUS) bool { 30 | for _, target := range targets { 31 | if t.Equal(target) { 32 | return true 33 | } 34 | } 35 | 36 | return false 37 | } 38 | 39 | // MarshalJSON todo 40 | func (t STATUS) MarshalJSON() ([]byte, error) { 41 | b := bytes.NewBufferString(`"`) 42 | b.WriteString(strings.ToUpper(t.String())) 43 | b.WriteString(`"`) 44 | return b.Bytes(), nil 45 | } 46 | 47 | // UnmarshalJSON todo 48 | func (t *STATUS) UnmarshalJSON(b []byte) error { 49 | ins, err := ParseSTATUSFromString(string(b)) 50 | if err != nil { 51 | return err 52 | } 53 | *t = ins 54 | return nil 55 | } 56 | -------------------------------------------------------------------------------- /apps/resource/api/discovery.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "github.com/emicklei/go-restful/v3" 5 | "github.com/infraboard/cmdb/apps/resource" 6 | "github.com/infraboard/mcube/exception" 7 | "github.com/infraboard/mcube/http/restful/response" 8 | ) 9 | 10 | func (h *handler) DiscoveryPrometheus(r *restful.Request, w *restful.Response) { 11 | query, err := resource.NewSearchRequestFromHTTP(r.Request) 12 | if err != nil { 13 | response.Failed(w, exception.NewBadRequest("new request error, %s", err)) 14 | return 15 | } 16 | 17 | // 补充必须的标签 18 | query.AddTag(resource.NewPrometheusScrapeTag()) 19 | query.WithTags = true 20 | 21 | set, err := h.service.Search(r.Request.Context(), query) 22 | if err != nil { 23 | response.Failed(w, err) 24 | return 25 | } 26 | 27 | response.Success(w, set.PrometheusFormat()) 28 | } 29 | -------------------------------------------------------------------------------- /apps/resource/api/resource.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "github.com/emicklei/go-restful/v3" 5 | "github.com/infraboard/cmdb/apps/resource" 6 | "github.com/infraboard/mcube/exception" 7 | "github.com/infraboard/mcube/http/restful/response" 8 | ) 9 | 10 | func (h *handler) SearchResource(r *restful.Request, w *restful.Response) { 11 | query, err := resource.NewSearchRequestFromHTTP(r.Request) 12 | if err != nil { 13 | response.Failed(w, exception.NewBadRequest("new request error, %s", err)) 14 | return 15 | } 16 | 17 | set, err := h.service.Search(r.Request.Context(), query) 18 | if err != nil { 19 | response.Failed(w, err) 20 | return 21 | } 22 | response.Success(w, set) 23 | } 24 | -------------------------------------------------------------------------------- /apps/resource/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | import ( 4 | "github.com/infraboard/mcube/app" 5 | "github.com/infraboard/mcube/logger" 6 | "github.com/infraboard/mcube/logger/zap" 7 | "google.golang.org/grpc" 8 | "gorm.io/gorm" 9 | "gorm.io/gorm/clause" 10 | 11 | "github.com/infraboard/cmdb/apps/resource" 12 | "github.com/infraboard/cmdb/conf" 13 | ) 14 | 15 | var ( 16 | // Service 服务实例 17 | svr = &service{} 18 | ) 19 | 20 | type service struct { 21 | db *gorm.DB 22 | log logger.Logger 23 | 24 | resource.UnimplementedRPCServer 25 | } 26 | 27 | func (s *service) Config() error { 28 | orm, err := conf.C().MySQL.ORM() 29 | if err != nil { 30 | return err 31 | } 32 | // 在冲突时,更新除主键以外的所有列到新值。 33 | orm = orm.Clauses(clause.OnConflict{ 34 | UpdateAll: true, 35 | }) 36 | // 是否开启debug 37 | if conf.C().Log.Level == "debug" { 38 | orm.Debug() 39 | } 40 | 41 | s.log = zap.L().Named(s.Name()) 42 | s.db = orm 43 | return nil 44 | } 45 | 46 | func (s *service) Name() string { 47 | return resource.AppName 48 | } 49 | 50 | func (s *service) Registry(server *grpc.Server) { 51 | resource.RegisterRPCServer(server, svr) 52 | } 53 | 54 | func init() { 55 | app.RegistryGrpcApp(svr) 56 | app.RegistryInternalApp(svr) 57 | } 58 | -------------------------------------------------------------------------------- /apps/resource/impl/impl_test.go: -------------------------------------------------------------------------------- 1 | package impl_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | "time" 7 | 8 | "github.com/infraboard/cmdb/apps/resource" 9 | "github.com/infraboard/cmdb/test/tools" 10 | "github.com/infraboard/mcube/app" 11 | ) 12 | 13 | var ( 14 | impl resource.Service 15 | ctx = context.Background() 16 | ) 17 | 18 | func TestPut(t *testing.T) { 19 | res := resource.NewDefaultResource(resource.TYPE_HOST) 20 | res.Meta.Id = "test01" 21 | res.Meta.Domain = "default" 22 | res.Meta.Namespace = "default" 23 | res.Meta.SyncAt = time.Now().Unix() 24 | ins, err := impl.Put(ctx, res) 25 | if err != nil { 26 | t.Fatal(err) 27 | } 28 | t.Log(ins) 29 | } 30 | 31 | func init() { 32 | tools.DevelopmentSetup() 33 | impl = app.GetInternalApp(resource.AppName).(resource.Service) 34 | } 35 | -------------------------------------------------------------------------------- /apps/secret/README.md: -------------------------------------------------------------------------------- 1 | # 云商凭证管理 2 | 3 | -------------------------------------------------------------------------------- /apps/secret/impl/impl.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | import ( 4 | "github.com/infraboard/cmdb/apps/secret" 5 | "github.com/infraboard/cmdb/conf" 6 | "github.com/infraboard/mcube/app" 7 | "github.com/infraboard/mcube/logger" 8 | "github.com/infraboard/mcube/logger/zap" 9 | "google.golang.org/grpc" 10 | "gorm.io/gorm" 11 | ) 12 | 13 | var ( 14 | // Service 服务实例 15 | svr = &service{} 16 | ) 17 | 18 | type service struct { 19 | db *gorm.DB 20 | log logger.Logger 21 | 22 | secret.UnimplementedRPCServer 23 | } 24 | 25 | func (s *service) Config() error { 26 | db, err := conf.C().MySQL.ORM() 27 | if err != nil { 28 | return err 29 | } 30 | 31 | s.log = zap.L().Named(s.Name()) 32 | s.db = db 33 | return nil 34 | } 35 | 36 | func (s *service) Name() string { 37 | return secret.AppName 38 | } 39 | 40 | func (s *service) Registry(server *grpc.Server) { 41 | secret.RegisterRPCServer(server, svr) 42 | } 43 | 44 | func init() { 45 | app.RegistryInternalApp(svr) 46 | app.RegistryGrpcApp(svr) 47 | } 48 | -------------------------------------------------------------------------------- /apps/secret/impl/impl_test.go: -------------------------------------------------------------------------------- 1 | package impl_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | "github.com/infraboard/cmdb/apps/secret" 8 | "github.com/infraboard/cmdb/test/tools" 9 | "github.com/infraboard/mcube/app" 10 | ) 11 | 12 | var ( 13 | impl secret.Service 14 | ctx = context.Background() 15 | ) 16 | 17 | func TestQuerySecret(t *testing.T) { 18 | req := secret.NewQuerySecretRequest() 19 | set, err := impl.QuerySecret(ctx, req) 20 | if err != nil { 21 | t.Fatal(err) 22 | } 23 | t.Log(set) 24 | } 25 | 26 | func init() { 27 | tools.DevelopmentSetup() 28 | 29 | impl = app.GetInternalApp(secret.AppName).(secret.Service) 30 | } 31 | -------------------------------------------------------------------------------- /apps/secret/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.secret; 4 | option go_package="github.com/infraboard/cmdb/apps/secret"; 5 | 6 | import "github.com/infraboard/mcube/pb/page/page.proto"; 7 | import "apps/secret/pb/secret.proto"; 8 | 9 | service RPC { 10 | rpc QuerySecret (QuerySecretRequest) returns (SecretSet); 11 | rpc DescribeSecret (DescribeSecretRequest) returns (Secret); 12 | } 13 | 14 | message QuerySecretRequest { 15 | // 分页参数 16 | // @gotags: json:"page" 17 | mcube.page.PageRequest page = 1; 18 | // 关键字参数 19 | // @gotags: json:"keywords" 20 | string keywords = 2; 21 | // 所属Domain 22 | // @gotags: json:"domain" 23 | string domain = 14; 24 | // 所属Namespace 25 | // @gotags: json:"namespace" 26 | string namespace = 15; 27 | } 28 | 29 | message DescribeSecretRequest { 30 | string id = 1; 31 | } 32 | 33 | 34 | message DeleteSecretRequest { 35 | string id = 1; 36 | } -------------------------------------------------------------------------------- /apps/secret/secret.go: -------------------------------------------------------------------------------- 1 | package secret 2 | 3 | import "encoding/json" 4 | 5 | func (s *Secret) TableName() string { 6 | return "secrets" 7 | } 8 | 9 | func (c *Secret) MarshalJSON() ([]byte, error) { 10 | return json.Marshal(struct { 11 | *Meta 12 | *CreateSecretRequest 13 | }{c.Meta, c.Spec}) 14 | } 15 | -------------------------------------------------------------------------------- /apps/secret/secret_enum.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by github.com/infraboard/mcube 2 | // DO NOT EDIT 3 | 4 | package secret 5 | 6 | import ( 7 | "bytes" 8 | "fmt" 9 | "strings" 10 | ) 11 | 12 | // ParseTYPEFromString Parse TYPE from string 13 | func ParseTYPEFromString(str string) (TYPE, error) { 14 | key := strings.Trim(string(str), `"`) 15 | v, ok := TYPE_value[strings.ToUpper(key)] 16 | if !ok { 17 | return 0, fmt.Errorf("unknown TYPE: %s", str) 18 | } 19 | 20 | return TYPE(v), nil 21 | } 22 | 23 | // Equal type compare 24 | func (t TYPE) Equal(target TYPE) bool { 25 | return t == target 26 | } 27 | 28 | // IsIn todo 29 | func (t TYPE) IsIn(targets ...TYPE) bool { 30 | for _, target := range targets { 31 | if t.Equal(target) { 32 | return true 33 | } 34 | } 35 | 36 | return false 37 | } 38 | 39 | // MarshalJSON todo 40 | func (t TYPE) MarshalJSON() ([]byte, error) { 41 | b := bytes.NewBufferString(`"`) 42 | b.WriteString(strings.ToUpper(t.String())) 43 | b.WriteString(`"`) 44 | return b.Bytes(), nil 45 | } 46 | 47 | // UnmarshalJSON todo 48 | func (t *TYPE) UnmarshalJSON(b []byte) error { 49 | ins, err := ParseTYPEFromString(string(b)) 50 | if err != nil { 51 | return err 52 | } 53 | *t = ins 54 | return nil 55 | } 56 | -------------------------------------------------------------------------------- /apps/task/impl/redis.go: -------------------------------------------------------------------------------- 1 | package impl 2 | -------------------------------------------------------------------------------- /apps/task/impl/sql.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | const ( 4 | insertTaskSQL = ` 5 | INSERT INTO task ( 6 | id,region,resource_type,credential_id,credential_desc,timeout,status, 7 | message,start_at,end_at,total_succeed,total_failed, 8 | domain,namespace 9 | ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?); 10 | ` 11 | 12 | updateTaskSQL = ` 13 | UPDATE task SET status=?,message=?,end_at=?, 14 | total_succeed=?,total_failed=? WHERE id = ? 15 | ` 16 | 17 | queryTaskSQL = `SELECT * FROM task` 18 | 19 | insertTaskRecordSQL = ` 20 | INSERT INTO task_record ( 21 | instance_id,instance_name,is_success,message,task_id,create_at) 22 | VALUES (?,?,?,?,?,?); 23 | ` 24 | 25 | queryTaskRecordSQL = `SELECT * FROM task_record` 26 | ) 27 | -------------------------------------------------------------------------------- /apps/task/impl/tools.go: -------------------------------------------------------------------------------- 1 | package impl 2 | 3 | import ( 4 | "github.com/infraboard/cmdb/apps/resource" 5 | "github.com/infraboard/cmdb/apps/secret" 6 | ) 7 | 8 | func InjectBaseFromSecret(b *resource.Meta, s *secret.Secret) { 9 | // 补充管理信息 10 | b.CredentialId = s.Meta.Id 11 | b.Domain = s.Spec.Domain 12 | b.Namespace = s.Spec.Namespace 13 | } 14 | -------------------------------------------------------------------------------- /apps/task/pb/rpc.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.cmdb.task; 4 | option go_package="github.com/infraboard/cmdb/apps/task"; 5 | 6 | import "github.com/infraboard/mcube/pb/page/page.proto"; 7 | import "apps/task/pb/task.proto"; 8 | import "apps/resource/pb/resource.proto"; 9 | 10 | service Service { 11 | rpc CreatTask (CreateTaskRequst) returns (Task); 12 | rpc QueryTask (QueryTaskRequest) returns (TaskSet); 13 | rpc DescribeTask(DescribeTaskRequest) returns(Task); 14 | rpc QueryTaskRecord(QueryTaskRecordRequest) returns(RecordSet); 15 | } 16 | 17 | message QueryTaskRequest { 18 | // 分页参数 19 | // @gotags: json:"page" 20 | infraboard.mcube.page.PageRequest page = 1; 21 | // @gotags: json:"resource_type" 22 | infraboard.cmdb.resource.TYPE resource_type = 3; 23 | // @gotags: json:"keywords" 24 | string keywords = 4; 25 | } 26 | 27 | message DescribeTaskRequest { 28 | // Task id 29 | // @gotags: json:"id" validate:"required" 30 | string id = 1; 31 | } 32 | 33 | message QueryTaskRecordRequest { 34 | // Task id 35 | // @gotags: json:"task_id" validate:"required" 36 | string task_id = 1; 37 | } -------------------------------------------------------------------------------- /client/rest/client.go: -------------------------------------------------------------------------------- 1 | package rest 2 | 3 | import ( 4 | "github.com/infraboard/mcube/client/rest" 5 | ) 6 | 7 | func NewClient(conf *Config) *ClientSet { 8 | c := rest.NewRESTClient() 9 | c.SetBearerTokenAuth(conf.Token) 10 | c.SetBaseURL(conf.Address + conf.PathPrefix) 11 | return &ClientSet{ 12 | c: c, 13 | } 14 | } 15 | 16 | type ClientSet struct { 17 | c *rest.RESTClient 18 | } 19 | -------------------------------------------------------------------------------- /client/rest/client_test.go: -------------------------------------------------------------------------------- 1 | package rest_test 2 | -------------------------------------------------------------------------------- /client/rest/config.go: -------------------------------------------------------------------------------- 1 | package rest 2 | 3 | func NewDefaultConfig() *Config { 4 | return &Config{ 5 | Address: "http://127.0.0.1:8060", 6 | PathPrefix: "/cmdb/api/v1/", 7 | } 8 | } 9 | 10 | type Config struct { 11 | Token string `json:"token" toml:"token" yaml:"token" env:"KEYAUTH_TOKEN"` 12 | Address string `json:"address" toml:"address" yaml:"address" env:"KEYAUTH_ADDRESS"` 13 | PathPrefix string `json:"path_prefix" toml:"path_prefix" yaml:"path_prefix" env:"KEYAUTH_PATH_PREFIX"` 14 | } 15 | -------------------------------------------------------------------------------- /client/rest/resource.go: -------------------------------------------------------------------------------- 1 | package rest 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/infraboard/cmdb/apps/resource" 7 | "github.com/infraboard/mcube/client/rest" 8 | ) 9 | 10 | type ResourceService interface { 11 | Search(context.Context, *resource.SearchRequest) (*resource.ResourceSet, error) 12 | } 13 | 14 | type resourceImpl struct { 15 | client *rest.RESTClient 16 | } 17 | 18 | func (i *resourceImpl) Search(ctx context.Context, req *resource.SearchRequest) ( 19 | *resource.ResourceSet, error) { 20 | set := resource.NewResourceSet() 21 | 22 | err := i.client. 23 | Get("resource/search"). 24 | Do(ctx). 25 | Into(set) 26 | if err != nil { 27 | return nil, err 28 | } 29 | 30 | return set, nil 31 | } 32 | -------------------------------------------------------------------------------- /client/rpc/client_test.go: -------------------------------------------------------------------------------- 1 | package rpc_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | "github.com/infraboard/cmdb/apps/resource" 8 | "github.com/infraboard/cmdb/client/rpc" 9 | "github.com/infraboard/cmdb/conf" 10 | "github.com/infraboard/mcenter/apps/health" 11 | "github.com/infraboard/mcube/exception" 12 | "github.com/infraboard/mcube/logger/zap" 13 | ) 14 | 15 | var ( 16 | client *rpc.ClientSet 17 | ctx = context.Background() 18 | ) 19 | 20 | func TestClient(t *testing.T) { 21 | rs, err := client.Resource().Search(ctx, resource.NewSearchRequest()) 22 | if err != nil { 23 | if e, ok := err.(exception.APIException); ok { 24 | t.Fatal(e.ToJson()) 25 | } else { 26 | t.Fatal(err) 27 | } 28 | } 29 | 30 | t.Log(rs) 31 | } 32 | 33 | func TestHealth(t *testing.T) { 34 | req := health.NewHealthCheckRequest() 35 | resp, err := client.Health().Check(ctx, req) 36 | if err != nil { 37 | t.Fatal(err) 38 | } 39 | t.Log(resp) 40 | } 41 | 42 | func init() { 43 | if err := zap.DevelopmentSetup(); err != nil { 44 | panic(err) 45 | } 46 | if err := conf.LoadConfigFromEnv(); err != nil { 47 | panic(err) 48 | } 49 | 50 | c, err := rpc.NewClientSet(conf.C().Mcenter) 51 | if err != nil { 52 | panic(err) 53 | } 54 | client = c 55 | } 56 | -------------------------------------------------------------------------------- /common/pb/github.com/infraboard/mcube/pb/example/test.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.mcube.example; 4 | option go_package = "github.com/infraboard/mcube/pb/example"; 5 | 6 | enum FOO { 7 | X = 0; 8 | } 9 | 10 | message Test { 11 | string label = 1; 12 | int32 type = 2; 13 | int64 reps = 3; 14 | } -------------------------------------------------------------------------------- /common/pb/github.com/infraboard/mcube/pb/page/page.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.mcube.page; 4 | option go_package = "github.com/infraboard/mcube/http/request"; 5 | 6 | message PageRequest { 7 | uint64 page_size = 1; 8 | uint64 page_number = 2; 9 | int64 offset = 3; 10 | } -------------------------------------------------------------------------------- /common/pb/github.com/infraboard/mcube/pb/request/request.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.mcube.request; 4 | option go_package = "github.com/infraboard/mcube/pb/request"; 5 | 6 | enum UpdateMode { 7 | PUT = 0; 8 | PATCH = 1; 9 | } -------------------------------------------------------------------------------- /common/pb/github.com/infraboard/mcube/pb/resource/base.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.mcube.resource; 4 | option go_package = "github.com/infraboard/mcube/pb/resource"; 5 | 6 | enum VisiableMode { 7 | // 默认Namespace可见 8 | NAMESPACE = 0; 9 | // 全局可见 10 | GLOBAL = 1; 11 | } -------------------------------------------------------------------------------- /common/pb/github.com/infraboard/mcube/pb/response/response.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package infraboard.mcube.response; 4 | option go_package = "github.com/infraboard/mcube/pb/response"; 5 | 6 | import "google/protobuf/any.proto"; 7 | 8 | // Response to be used by controllers. 9 | message Response { 10 | // 自定义返回码 0:表示正常 11 | int32 code = 1; 12 | // 数据类型, 可以缺省 13 | string type = 2; 14 | // 异常的范围 15 | string namespace = 3; 16 | // 异常原因 17 | string reason = 4; 18 | // 关于这次响应的说明信息 19 | string message = 5; 20 | // 数据meta 21 | map meta = 6; 22 | // data 具体的数据 23 | google.protobuf.Any data = 7; 24 | } -------------------------------------------------------------------------------- /conf/load.go: -------------------------------------------------------------------------------- 1 | package conf 2 | 3 | import ( 4 | "github.com/BurntSushi/toml" 5 | "github.com/caarlos0/env/v6" 6 | ) 7 | 8 | var ( 9 | global *Config 10 | ) 11 | 12 | // C 全局配置对象 13 | func C() *Config { 14 | if global == nil { 15 | panic("Load Config first") 16 | } 17 | 18 | return global 19 | } 20 | 21 | // LoadConfigFromToml 从toml中添加配置文件, 并初始化全局对象 22 | func LoadConfigFromToml(filePath string) error { 23 | cfg := newConfig() 24 | if _, err := toml.DecodeFile(filePath, cfg); err != nil { 25 | return err 26 | } 27 | 28 | // 加载全局配置单例 29 | return cfg.InitGloabl() 30 | } 31 | 32 | // LoadConfigFromEnv 从环境变量中加载配置 33 | func LoadConfigFromEnv() error { 34 | cfg := newConfig() 35 | if err := env.Parse(cfg); err != nil { 36 | return err 37 | } 38 | 39 | // 加载全局配置单例 40 | return cfg.InitGloabl() 41 | } 42 | -------------------------------------------------------------------------------- /conf/log.go: -------------------------------------------------------------------------------- 1 | package conf 2 | 3 | // LogFormat 日志格式 4 | type LogFormat string 5 | 6 | const ( 7 | // TextFormat 文本格式 8 | TextFormat = LogFormat("text") 9 | // JSONFormat json格式 10 | JSONFormat = LogFormat("json") 11 | ) 12 | 13 | // LogTo 日志记录到哪儿 14 | type LogTo string 15 | 16 | const ( 17 | // ToFile 保存到文件 18 | ToFile = LogTo("file") 19 | // ToStdout 打印到标准输出 20 | ToStdout = LogTo("stdout") 21 | ) 22 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ## MySQL安装 6 | 7 | ```sh 8 | $ docker run -p 3306:3306 -itd -e MARIADB_USER=cmdb -e MARIADB_PASSWORD=123456 -e MARIADB_ROOT_PASSWORD=123456 --name mysql mariadb:latest 9 | ``` 10 | 11 | 详细文档请参考: [mariadb docker hub](https://hub.docker.com/_/mariadb) 12 | 13 | 14 | 进入docker创建数据库和账号: 15 | ``` 16 | docker exec -it b272a099f6d9 mysql -uroot -p123456 17 | 18 | create database cmdb; 19 | GRANT ALL PRIVILEGES ON cmdb.* TO 'cmdb'@'%' IDENTIFIED BY '123456'; 20 | flush privileges; 21 | ``` 22 | -------------------------------------------------------------------------------- /etc/config.example.env: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infraboard/cmdb/7aae7b90475c64ea831b8bd53fc4d11f937b900a/etc/config.example.env -------------------------------------------------------------------------------- /etc/config.example.toml: -------------------------------------------------------------------------------- 1 | [app] 2 | name = "cmdb" 3 | http_host = "127.0.0.1" 4 | http_port = "8060" 5 | grpc_host = "127.0.0.1" 6 | grpc_port = "18060" 7 | key = "this is your app key" 8 | 9 | [mysql] 10 | host = "127.0.0.1" 11 | port = "3306" 12 | username = "root" 13 | password = "123456" 14 | database = "cmdb" 15 | 16 | [mcenter] 17 | adress="127.0.0.1:18010" 18 | client_id="xxx" 19 | client_secret="xxx" 20 | 21 | [log] 22 | level = "debug" 23 | path = "logs" 24 | format = "text" 25 | to = "stdout" -------------------------------------------------------------------------------- /etc/unit_test.example.env: -------------------------------------------------------------------------------- 1 | TX_CLOUD_SECRET_ID= 2 | TX_CLOUD_SECRET_KEY= 3 | TX_CLOUD_REGION= 4 | 5 | AL_CLOUD_ACCESS_KEY= 6 | AL_CLOUD_ACCESS_SECRET= 7 | AL_CLOUD_REGION= 8 | 9 | HW_CLOUD_ACCESS_KEY= 10 | HW_CLOUD_ACCESS_SECRET= 11 | HW_CLOUD_REGION= 12 | 13 | AWS_ACCESS_KEY= 14 | AWS_ACCESS_SECRET= 15 | AWS_REGION= 16 | 17 | VS_HOST= 18 | VS_USERNAME= 19 | VS_PASSWORD= 20 | 21 | TX_DNS_DOMAIN= 22 | AL_DNS_DOMAIN= 23 | 24 | MYSQL_HOST= 25 | MYSQL_PORT= 26 | MYSQL_USERNAME= 27 | MYSQL_PASSWORD= 28 | MYSQL_DATABASE= 29 | 30 | MCENTER_GRPC_ADDRESS= 31 | MCENTER_CLINET_ID= 32 | MCENTER_CLIENT_SECRET= -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/infraboard/cmdb/cmd" 5 | ) 6 | 7 | func main() { 8 | cmd.Execute() 9 | } 10 | -------------------------------------------------------------------------------- /provider/aliyun/actiontrail/README.md: -------------------------------------------------------------------------------- 1 | # 操作审计 2 | 3 | [事件查询控制台](https://actiontrail.console.aliyun.com/cn-hangzhou/event-list) 4 | 5 | [支持的云服务审计事件](https://help.aliyun.com/document_detail/452799.html) 6 | 7 | ## ECS常用事件 8 | 9 | + Release: 实例释放 10 | + DeleteInstances (调用DeleteInstances释放一台或多台按量付费ECS实例或者到期的包年包月ECS实例) 11 | + RunInstances (调用RunInstances创建一台或多台按量付费或者包年包月ECS实例) 12 | + ModifyInstanceAttribute: 修改实例属性 13 | 14 | 15 | ## RDS常用事件 16 | 17 | + ModifyDBInstanceSpec 调用ModifyDBInstanceSpec接口变更RDS实例的(包括常规实例和只读实例,不包括灾备...) 18 | + DeleteDBInstance (调用DeleteDBInstance接口释放RDS实例) 19 | + CreateDBInstance (调用CreateDBInstance接口创建RDS实例) 20 | 21 | ## Redis常用事件 22 | 23 | 资源类型: ACS::Redis::DBInstance 24 | 25 | + ModifyInstanceSpec 26 | + Create 27 | + RemainRefund -------------------------------------------------------------------------------- /provider/aliyun/actiontrail/event.go: -------------------------------------------------------------------------------- 1 | package actiontrail 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | 7 | "github.com/infraboard/cmdb/apps/lb" 8 | "github.com/infraboard/cmdb/provider" 9 | "github.com/infraboard/mcube/pager" 10 | 11 | actiontrail "github.com/alibabacloud-go/actiontrail-20200706/v2/client" 12 | ) 13 | 14 | func (o *Operator) PageQueryEvent(req *provider.QueryEventRequest) pager.Pager { 15 | p := newPager(o, req, o.log) 16 | p.SetRate(float64(req.Rate)) 17 | return p 18 | } 19 | 20 | // 检索详细历史事件 21 | // 参考: https://next.api.aliyun.com/api/Actiontrail/2020-07-06/LookupEvents?params={}&sdkStyle=old&lang=GO&tab=DEMO 22 | func (o *Operator) QueryEvents(ctx context.Context, req *actiontrail.LookupEventsRequest) (*lb.LoadBalancerSet, error) { 23 | resp, err := o.client.LookupEvents(req) 24 | if err != nil { 25 | return nil, err 26 | } 27 | 28 | fmt.Println(resp.String()) 29 | return nil, nil 30 | } 31 | -------------------------------------------------------------------------------- /provider/aliyun/actiontrail/impl.go: -------------------------------------------------------------------------------- 1 | package actiontrail 2 | 3 | import ( 4 | "github.com/infraboard/mcube/logger" 5 | "github.com/infraboard/mcube/logger/zap" 6 | 7 | actiontrail "github.com/alibabacloud-go/actiontrail-20200706/v2/client" 8 | ) 9 | 10 | func NewOperator(client *actiontrail.Client) *Operator { 11 | return &Operator{ 12 | client: client, 13 | log: zap.L().Named("ali.actiontrail"), 14 | } 15 | } 16 | 17 | type Operator struct { 18 | client *actiontrail.Client 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/aliyun/actiontrail/impl_test.go: -------------------------------------------------------------------------------- 1 | package actiontrail_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | "time" 8 | 9 | "github.com/infraboard/cmdb/apps/lb" 10 | "github.com/infraboard/cmdb/provider" 11 | "github.com/infraboard/cmdb/provider/aliyun" 12 | "github.com/infraboard/mcube/logger/zap" 13 | ) 14 | 15 | var ( 16 | operator provider.EventOperator 17 | ctx = context.Background() 18 | ) 19 | 20 | func TestPageQueryEvent(t *testing.T) { 21 | req := provider.NewQueryEventRequest() 22 | req.StartTime = time.Now().Add(-24 * 10 * time.Hour) 23 | pager := operator.PageQueryEvent(req) 24 | 25 | for pager.Next() { 26 | set := lb.NewLoadBalancerSet() 27 | if err := pager.Scan(ctx, set); err != nil { 28 | panic(err) 29 | } 30 | fmt.Println(set) 31 | } 32 | } 33 | 34 | func init() { 35 | zap.DevelopmentSetup() 36 | 37 | err := aliyun.LoadOperatorFromEnv() 38 | if err != nil { 39 | panic(err) 40 | } 41 | 42 | operator = aliyun.O().EventOperator() 43 | } 44 | -------------------------------------------------------------------------------- /provider/aliyun/alb/alb_pager.go: -------------------------------------------------------------------------------- 1 | package alb 2 | 3 | import ( 4 | "context" 5 | 6 | alb "github.com/alibabacloud-go/alb-20200616/v2/client" 7 | "github.com/alibabacloud-go/tea/tea" 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | ) 12 | 13 | func newPager(operator *ALBOperator) pager.Pager { 14 | return &albPager{ 15 | BasePager: pager.NewBasePager(), 16 | operator: operator, 17 | req: &alb.ListLoadBalancersRequest{}, 18 | log: zap.L().Named("ali.alb"), 19 | } 20 | } 21 | 22 | type albPager struct { 23 | *pager.BasePager 24 | operator *ALBOperator 25 | req *alb.ListLoadBalancersRequest 26 | log logger.Logger 27 | } 28 | 29 | func (p *albPager) Scan(ctx context.Context, set pager.Set) error { 30 | resp, err := p.operator.QueryLoadBalancer(p.nextReq()) 31 | if err != nil { 32 | return err 33 | } 34 | p.CheckHasNext(resp) 35 | 36 | set.Add(resp.ToAny()...) 37 | return nil 38 | } 39 | 40 | func (p *albPager) WithLogger(log logger.Logger) { 41 | p.log = log 42 | } 43 | 44 | func (p *albPager) nextReq() *alb.ListLoadBalancersRequest { 45 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 46 | p.req.MaxResults = tea.Int32(int32(p.PageSize())) 47 | return p.req 48 | } 49 | -------------------------------------------------------------------------------- /provider/aliyun/alb/impl.go: -------------------------------------------------------------------------------- 1 | package alb 2 | 3 | import ( 4 | alb "github.com/alibabacloud-go/alb-20200616/v2/client" 5 | "github.com/infraboard/mcube/logger" 6 | "github.com/infraboard/mcube/logger/zap" 7 | ) 8 | 9 | func NewALBOperator(client *alb.Client) *ALBOperator { 10 | return &ALBOperator{ 11 | client: client, 12 | log: zap.L().Named("ali.slb"), 13 | } 14 | } 15 | 16 | type ALBOperator struct { 17 | client *alb.Client 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/aliyun/alb/impl_test.go: -------------------------------------------------------------------------------- 1 | package alb_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/lb" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/cmdb/provider/aliyun" 11 | "github.com/infraboard/mcube/logger/zap" 12 | ) 13 | 14 | var ( 15 | operator provider.LoadBalancerOperator 16 | ctx = context.Background() 17 | ) 18 | 19 | func TestPageQueryLoadBalancer(t *testing.T) { 20 | req := provider.NewQueryRequest() 21 | pager := operator.PageQueryLoadBalancer(req) 22 | 23 | for pager.Next() { 24 | set := lb.NewLoadBalancerSet() 25 | if err := pager.Scan(ctx, set); err != nil { 26 | panic(err) 27 | } 28 | fmt.Println(set) 29 | } 30 | } 31 | 32 | func init() { 33 | zap.DevelopmentSetup() 34 | err := aliyun.LoadOperatorFromEnv() 35 | if err != nil { 36 | panic(err) 37 | } 38 | operator = aliyun.O().ALbOperator() 39 | } 40 | -------------------------------------------------------------------------------- /provider/aliyun/alb/mapping.go: -------------------------------------------------------------------------------- 1 | package alb 2 | 3 | import ( 4 | "strings" 5 | 6 | "github.com/infraboard/cmdb/apps/lb" 7 | ) 8 | 9 | var ( 10 | 11 | // Inactive: 已停止,监听不再转发流量。 12 | // Active::运行中。 13 | // Provisioning:创建中。 14 | // Configuring:变配中。 15 | // CreateFailed:创建失败,此时不会产生费用,实例只能被删除。系统默认清理最近1天创建失败的实例。 16 | SLB_STATUS_MAP = map[string]lb.STATUS{ 17 | "inactive:": lb.STATUS_STOPPED, 18 | "active": lb.STATUS_RUNNING, 19 | "provisioning": lb.STATUS_PENDING, 20 | "configuring": lb.STATUS_RUNNING, 21 | "createFailed": lb.STATUS_CREATE_FAILED, 22 | } 23 | ) 24 | 25 | func praseSlbStatus(s *string) string { 26 | if s == nil { 27 | return "" 28 | } 29 | 30 | if v, ok := SLB_STATUS_MAP[strings.ToLower(*s)]; ok { 31 | return v.String() 32 | } 33 | 34 | return *s 35 | } 36 | -------------------------------------------------------------------------------- /provider/aliyun/alb/sample/list.json: -------------------------------------------------------------------------------- 1 | { 2 | "TotalCount": 4, 3 | "RequestId": "xxxx-xxxx", 4 | "MaxResults": 20, 5 | "LoadBalancers": [ 6 | { 7 | "LoadBalancerEdition": "Standard", 8 | "ResourceGroupId": "rg-xxxx", 9 | "LoadBalancerBillingConfig": { 10 | "InternetBandwidth": 400, 11 | "PayType": "PostPay", 12 | "InternetChargeType": "PayByTraffic" 13 | }, 14 | "CreateTime": "2022-08-23T10:17:25Z", 15 | "LoadBalancerId": "alb-xxxxx", 16 | "DNSName": "alb-xxx.cn-xxx.alb.aliyuncs.com", 17 | "ModificationProtectionConfig": {}, 18 | "LoadBalancerName": "xxx-xxxx", 19 | "AccessLogConfig": {}, 20 | "LoadBalancerBussinessStatus": "Normal", 21 | "VpcId": "vpc-xxx", 22 | "DeletionProtectionConfig": { 23 | "Enabled": false 24 | }, 25 | "AddressAllocatedMode": "Dynamic", 26 | "AddressType": "Internet", 27 | "LoadBalancerStatus": "Active" 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /provider/aliyun/bss/README.md: -------------------------------------------------------------------------------- 1 | # 订单管理 2 | 3 | [订单列表](https://usercenter2.aliyun.com/order/list) 4 | 5 | [账单接口](https://next.api.aliyun.com/api/BssOpenApi/2017-12-14/DescribeInstanceBill?params=%7B%7D&lang=GO) -------------------------------------------------------------------------------- /provider/aliyun/bss/detail_pager.go: -------------------------------------------------------------------------------- 1 | package bss 2 | -------------------------------------------------------------------------------- /provider/aliyun/bss/impl.go: -------------------------------------------------------------------------------- 1 | package bss 2 | 3 | import ( 4 | bssopenapi "github.com/alibabacloud-go/bssopenapi-20171214/v2/client" 5 | 6 | "github.com/infraboard/mcube/flowcontrol/tokenbucket" 7 | "github.com/infraboard/mcube/logger" 8 | "github.com/infraboard/mcube/logger/zap" 9 | ) 10 | 11 | func NewBssOperator(client *bssopenapi.Client) *BssOperator { 12 | return &BssOperator{ 13 | client: client, 14 | log: zap.L().Named("ali.bss"), 15 | tb: tokenbucket.NewBucketWithRate(5, 1), 16 | } 17 | } 18 | 19 | type BssOperator struct { 20 | client *bssopenapi.Client 21 | log logger.Logger 22 | tb *tokenbucket.Bucket 23 | } 24 | -------------------------------------------------------------------------------- /provider/aliyun/cms/README.md: -------------------------------------------------------------------------------- 1 | # 云监控 2 | 3 | [什么是云监控](https://help.aliyun.com/document_detail/35170.html) 4 | 5 | + [云产品监控项](https://help.aliyun.com/document_detail/163515.html?spm=api-workbench.API%20Explorer.0.0.25386468wUNrOt) 6 | + [ECS监控项](https://cms.console.aliyun.com/metric-meta/acs_ecs_dashboard/ecs?spm=a2c4g.11186623.0.0.595a76ab2VoGQ3) -------------------------------------------------------------------------------- /provider/aliyun/cms/impl.go: -------------------------------------------------------------------------------- 1 | package cms 2 | 3 | import ( 4 | cms "github.com/alibabacloud-go/cms-20190101/v7/client" 5 | "github.com/infraboard/mcube/logger" 6 | "github.com/infraboard/mcube/logger/zap" 7 | ) 8 | 9 | func NewCmsOperator(client *cms.Client) *CmsOperator { 10 | return &CmsOperator{ 11 | client: client, 12 | log: zap.L().Named("ali.cms"), 13 | } 14 | } 15 | 16 | type CmsOperator struct { 17 | client *cms.Client 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/aliyun/cms/impl_test.go: -------------------------------------------------------------------------------- 1 | package cms_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | "github.com/infraboard/cmdb/provider" 8 | "github.com/infraboard/cmdb/provider/aliyun" 9 | "github.com/infraboard/mcube/logger/zap" 10 | ) 11 | 12 | var ( 13 | operator provider.CmsOperator 14 | ctx = context.Background() 15 | ) 16 | 17 | // 云产品监控项: https://help.aliyun.com/document_detail/163515.html?spm=api-workbench.API%20Explorer.0.0.25386468wUNrOt 18 | // ECS监控项: https://cms.console.aliyun.com/metric-meta/acs_ecs_dashboard/ecs?spm=a2c4g.11186623.0.0.595a76ab2VoGQ3 19 | func TestDescribeMetric(t *testing.T) { 20 | req := provider.NewDescribeMetricLastRequeset("acs_rds_dashboard", "CpuUsage") 21 | set, err := operator.DescribeMetricLast(ctx, req) 22 | if err != nil { 23 | t.Fatal(err) 24 | } 25 | t.Log(set) 26 | } 27 | 28 | func init() { 29 | zap.DevelopmentSetup() 30 | 31 | err := aliyun.LoadOperatorFromEnv() 32 | if err != nil { 33 | panic(err) 34 | } 35 | operator = aliyun.O().CmsOperator() 36 | } 37 | -------------------------------------------------------------------------------- /provider/aliyun/connectivity/client_test.go: -------------------------------------------------------------------------------- 1 | package connectivity_test 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/caarlos0/env/v6" 8 | "github.com/infraboard/cmdb/provider/aliyun/connectivity" 9 | "github.com/stretchr/testify/assert" 10 | ) 11 | 12 | func TestClient(t *testing.T) { 13 | should := assert.New(t) 14 | 15 | client := &connectivity.AliCloudClient{} 16 | if err := env.Parse(client); err != nil { 17 | if should.NoError(err) { 18 | fmt.Println(client.Account()) 19 | } 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /provider/aliyun/dds/impl.go: -------------------------------------------------------------------------------- 1 | package dds 2 | 3 | import ( 4 | dds "github.com/alibabacloud-go/dds-20151201/v3/client" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewOperator(client *dds.Client) *Operator { 11 | return &Operator{ 12 | client: client, 13 | log: zap.L().Named("ali.mongodb"), 14 | } 15 | } 16 | 17 | type Operator struct { 18 | client *dds.Client 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/aliyun/dds/impl_test.go: -------------------------------------------------------------------------------- 1 | package dds_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/mongodb" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/cmdb/provider/aliyun" 11 | "github.com/infraboard/mcube/logger/zap" 12 | ) 13 | 14 | var ( 15 | operator provider.MongoOperator 16 | ctx = context.Background() 17 | ) 18 | 19 | func TestQuery(t *testing.T) { 20 | req := provider.NewQueryRequest() 21 | pager := operator.PageQueryMongo(req) 22 | 23 | for pager.Next() { 24 | set := mongodb.NewMongoDBSet() 25 | if err := pager.Scan(ctx, set); err != nil { 26 | panic(err) 27 | } 28 | for i := range set.Items { 29 | fmt.Println(set.Items[i]) 30 | } 31 | } 32 | } 33 | 34 | func init() { 35 | zap.DevelopmentSetup() 36 | err := aliyun.LoadOperatorFromEnv() 37 | if err != nil { 38 | panic(err) 39 | } 40 | operator = aliyun.O().MongoOperator() 41 | } 42 | -------------------------------------------------------------------------------- /provider/aliyun/dds/mapping.go: -------------------------------------------------------------------------------- 1 | package dds 2 | 3 | import "github.com/infraboard/cmdb/apps/mongodb" 4 | 5 | var ( 6 | // 参考: https://help.aliyun.com/document_detail/63870.html?spm=api-workbench.API%20Explorer.0.0.1d601e0fQ8GR2n 7 | STATUS_MAP = map[string]mongodb.STATUS{ 8 | "Creating": mongodb.STATUS_PENDING, 9 | "Running": mongodb.STATUS_RUNNING, 10 | "Deleting": mongodb.STATUS_DELETING, 11 | "Rebooting": mongodb.STATUS_REBOOTING, 12 | "Restoring": mongodb.STATUS_RESTORING, 13 | "Transing": mongodb.STATUS_TRANSING, 14 | "DBInstanceClassChanging": mongodb.STATUS_MODIFYING, 15 | "GuardSwitching": mongodb.STATUS_SWITCHOVER, 16 | "Importing": mongodb.STATUS_IMPORTING, 17 | "EngineVersionUpgrading": mongodb.STATUS_UPGRADING, 18 | "DBInstanceNetTypeChanging": mongodb.STATUS_NET_CHANGING, 19 | "TransingToOthers": mongodb.STATUS_TRANSING, 20 | "ImportingFromOthers": mongodb.STATUS_IMPORTING, 21 | } 22 | ) 23 | 24 | func praseStatus(s string) string { 25 | if v, ok := STATUS_MAP[s]; ok { 26 | return v.String() 27 | } 28 | 29 | return s 30 | } 31 | -------------------------------------------------------------------------------- /provider/aliyun/dds/sample/mongo.json: -------------------------------------------------------------------------------- 1 | { 2 | "CapacityUnit": "", 3 | "ChargeType": "PrePaid", 4 | "CreationTime": "2021-11-09T12:06:05Z", 5 | "DBInstanceClass": "dds.mongo.large", 6 | "DBInstanceDescription": "xxx", 7 | "DBInstanceId": "dds-xxx", 8 | "DBInstanceStatus": "Running", 9 | "DBInstanceStorage": 500, 10 | "DBInstanceType": "replicate", 11 | "Engine": "MongoDB", 12 | "EngineVersion": "4.0", 13 | "ExpireTime": "2022-09-09T16:00Z", 14 | "KindCode": "0", 15 | "LockMode": "Unlock", 16 | "MongosList": {}, 17 | "NetworkType": "VPC", 18 | "RegionId": "cn-hangzhou", 19 | "ReplicationFactor": "3", 20 | "ResourceGroupId": "rg-xxxx", 21 | "ShardList": {}, 22 | "StorageType": "", 23 | "Tags": {}, 24 | "ZoneId": "cn-hangzhou-i" 25 | } -------------------------------------------------------------------------------- /provider/aliyun/dns/domain_pager.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | "context" 5 | 6 | dom "github.com/alibabacloud-go/domain-20180129/v3/client" 7 | "github.com/alibabacloud-go/tea/tea" 8 | 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newDomainPager(operator *DnsOperator) pager.Pager { 15 | req := &dom.QueryDomainListRequest{} 16 | 17 | return &domainPager{ 18 | BasePager: pager.NewBasePager(), 19 | operator: operator, 20 | req: req, 21 | log: zap.L().Named("ali.dns.domain"), 22 | } 23 | } 24 | 25 | type domainPager struct { 26 | *pager.BasePager 27 | operator *DnsOperator 28 | req *dom.QueryDomainListRequest 29 | log logger.Logger 30 | } 31 | 32 | func (p *domainPager) Scan(ctx context.Context, set pager.Set) error { 33 | resp, err := p.operator.queryDomain(p.nextReq()) 34 | if err != nil { 35 | return err 36 | } 37 | p.CheckHasNext(resp) 38 | 39 | set.Add(resp.ToAny()...) 40 | return nil 41 | } 42 | 43 | func (p *domainPager) nextReq() *dom.QueryDomainListRequest { 44 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 45 | p.req.PageNum = tea.Int32(int32(p.PageNumber())) 46 | p.req.PageSize = tea.Int32(int32(p.PageSize())) 47 | return p.req 48 | } 49 | -------------------------------------------------------------------------------- /provider/aliyun/dns/impl.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | alidns "github.com/alibabacloud-go/alidns-20150109/v2/client" 5 | domain "github.com/alibabacloud-go/domain-20180129/v3/client" 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewDomainOperator(client *domain.Client, dns *alidns.Client) *DnsOperator { 11 | return &DnsOperator{ 12 | client: client, 13 | dns: dns, 14 | log: zap.L().Named("ali.domain"), 15 | } 16 | } 17 | 18 | type DnsOperator struct { 19 | dns *alidns.Client 20 | client *domain.Client 21 | log logger.Logger 22 | } 23 | -------------------------------------------------------------------------------- /provider/aliyun/dns/impl_test.go: -------------------------------------------------------------------------------- 1 | package dns_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "os" 7 | "testing" 8 | 9 | "github.com/infraboard/cmdb/apps/dns" 10 | "github.com/infraboard/cmdb/provider" 11 | "github.com/infraboard/mcube/logger/zap" 12 | 13 | "github.com/infraboard/cmdb/provider/aliyun" 14 | ) 15 | 16 | var ( 17 | operator provider.DnsOperator 18 | ctx = context.Background() 19 | ) 20 | 21 | func TestQueryDomain(t *testing.T) { 22 | req := provider.NewQueryDomainRequest() 23 | pager := operator.QueryDomain(req) 24 | for pager.Next() { 25 | set := dns.NewDomainSet() 26 | if err := pager.Scan(ctx, set); err != nil { 27 | panic(err) 28 | } 29 | fmt.Println(set) 30 | } 31 | } 32 | 33 | func TestQueryRecord(t *testing.T) { 34 | req := provider.NewQueryRecordRequest(os.Getenv("AL_DNS_DOMAIN")) 35 | pager := operator.QueryRecord(req) 36 | for pager.Next() { 37 | set := dns.NewRecordSet() 38 | if err := pager.Scan(ctx, set); err != nil { 39 | panic(err) 40 | } 41 | fmt.Println(set) 42 | } 43 | } 44 | 45 | func init() { 46 | zap.DevelopmentSetup() 47 | err := aliyun.LoadOperatorFromEnv() 48 | if err != nil { 49 | panic(err) 50 | } 51 | operator = aliyun.O().DnsOperator() 52 | } 53 | -------------------------------------------------------------------------------- /provider/aliyun/dns/record_pager.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | "context" 5 | 6 | alidns "github.com/alibabacloud-go/alidns-20150109/v2/client" 7 | "github.com/alibabacloud-go/tea/tea" 8 | 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newRecordPager(operator *DnsOperator) *recordPager { 15 | req := &alidns.DescribeDomainRecordsRequest{} 16 | 17 | return &recordPager{ 18 | BasePager: pager.NewBasePager(), 19 | operator: operator, 20 | req: req, 21 | log: zap.L().Named("ali.dns.record"), 22 | } 23 | } 24 | 25 | type recordPager struct { 26 | *pager.BasePager 27 | operator *DnsOperator 28 | req *alidns.DescribeDomainRecordsRequest 29 | log logger.Logger 30 | } 31 | 32 | func (p *recordPager) Scan(ctx context.Context, set pager.Set) error { 33 | resp, err := p.operator.queryRecord(p.nextReq()) 34 | if err != nil { 35 | return err 36 | } 37 | p.CheckHasNext(resp) 38 | 39 | set.Add(resp.ToAny()...) 40 | return nil 41 | } 42 | 43 | func (p *recordPager) nextReq() *alidns.DescribeDomainRecordsRequest { 44 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 45 | p.req.PageNumber = tea.Int64(p.PageNumber()) 46 | p.req.PageSize = tea.Int64(p.PageSize()) 47 | return p.req 48 | } 49 | -------------------------------------------------------------------------------- /provider/aliyun/dns/sample/domain.json: -------------------------------------------------------------------------------- 1 | { 2 | "DomainAuditStatus": "SUCCEED", 3 | "DomainName": "xxxx.cn", 4 | "DomainStatus": "3", 5 | "DomainType": "ccTLD", 6 | "ExpirationCurrDateDiff": 323, 7 | "ExpirationDate": "2023-06-16 16:31:16", 8 | "ExpirationDateLong": 1686904276000, 9 | "ExpirationDateStatus": "1", 10 | "InstanceId": "xxxxx", 11 | "Premium": false, 12 | "ProductId": "10681", 13 | "RegistrantType": "2", 14 | "RegistrationDate": "2022-06-16 16:31:16", 15 | "RegistrationDateLong": 1655368276000 16 | } -------------------------------------------------------------------------------- /provider/aliyun/dns/sample/record.json: -------------------------------------------------------------------------------- 1 | { 2 | "Status": "ENABLE", 3 | "Type": "A", 4 | "TTL": 600, 5 | "RecordId": "24xxxxx", 6 | "RR": "xxxx", 7 | "DomainName": "xxxxx", 8 | "Weight": 1, 9 | "Value": "6xxxxx", 10 | "Line": "default", 11 | "Locked": false 12 | } -------------------------------------------------------------------------------- /provider/aliyun/ecs/disk_pager.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | import ( 4 | "context" 5 | 6 | ecs "github.com/alibabacloud-go/ecs-20140526/v2/client" 7 | "github.com/alibabacloud-go/tea/tea" 8 | 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newDiskPager(operator *EcsOperator) pager.Pager { 15 | req := &ecs.DescribeDisksRequest{ 16 | RegionId: operator.client.RegionId, 17 | } 18 | 19 | return &diskPager{ 20 | BasePager: pager.NewBasePager(), 21 | operator: operator, 22 | req: req, 23 | log: zap.L().Named("ali.disk"), 24 | } 25 | } 26 | 27 | type diskPager struct { 28 | *pager.BasePager 29 | operator *EcsOperator 30 | req *ecs.DescribeDisksRequest 31 | log logger.Logger 32 | } 33 | 34 | func (p *diskPager) Scan(ctx context.Context, set pager.Set) error { 35 | resp, err := p.operator.QueryDisk(p.nextReq()) 36 | if err != nil { 37 | return err 38 | } 39 | p.CheckHasNext(resp) 40 | 41 | set.Add(resp.ToAny()...) 42 | return nil 43 | } 44 | 45 | func (p *diskPager) nextReq() *ecs.DescribeDisksRequest { 46 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 47 | p.req.PageNumber = tea.Int32(int32(p.PageNumber())) 48 | p.req.PageSize = tea.Int32(int32(p.PageSize())) 49 | return p.req 50 | } 51 | -------------------------------------------------------------------------------- /provider/aliyun/ecs/ecs_pager.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | import ( 4 | "context" 5 | 6 | ecs "github.com/alibabacloud-go/ecs-20140526/v2/client" 7 | "github.com/alibabacloud-go/tea/tea" 8 | 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newEcsPager(operator *EcsOperator) pager.Pager { 15 | req := &ecs.DescribeInstancesRequest{ 16 | RegionId: operator.client.RegionId, 17 | } 18 | 19 | return &ecsPager{ 20 | BasePager: pager.NewBasePager(), 21 | operator: operator, 22 | req: req, 23 | log: zap.L().Named("ali.ecs"), 24 | } 25 | } 26 | 27 | type ecsPager struct { 28 | *pager.BasePager 29 | operator *EcsOperator 30 | req *ecs.DescribeInstancesRequest 31 | log logger.Logger 32 | } 33 | 34 | func (p *ecsPager) Scan(ctx context.Context, set pager.Set) error { 35 | resp, err := p.operator.queryInstance(p.nextReq()) 36 | if err != nil { 37 | return err 38 | } 39 | p.CheckHasNext(resp) 40 | 41 | set.Add(resp.ToAny()...) 42 | return nil 43 | } 44 | 45 | func (p *ecsPager) nextReq() *ecs.DescribeInstancesRequest { 46 | p.req.PageNumber = tea.Int32(int32(p.PageNumber())) 47 | p.req.PageSize = tea.Int32(int32(p.PageSize())) 48 | p.log.Debugf("请求第%d页数据, 分页大小%d", *p.req.PageNumber, *p.req.PageSize) 49 | return p.req 50 | } 51 | -------------------------------------------------------------------------------- /provider/aliyun/ecs/ecs_price.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | import ( 4 | "fmt" 5 | 6 | ecs "github.com/alibabacloud-go/ecs-20140526/v2/client" 7 | "github.com/infraboard/cmdb/apps/disk" 8 | ) 9 | 10 | // 仅支持查询包年包月资源的续费价格 11 | // 参考文档: https://next.api.aliyun.com/api/Ecs/2014-05-26/DescribeRenewalPrice?params={}&tab=DEMO&lang=GO 12 | func (o *EcsOperator) InquiryRenewPrice(req *ecs.DescribeRenewalPriceRequest) (*disk.DiskSet, error) { 13 | set := disk.NewDiskSet() 14 | 15 | resp, err := o.client.DescribeRenewalPrice(req) 16 | if err != nil { 17 | return nil, err 18 | } 19 | 20 | fmt.Println(resp.String()) 21 | 22 | return set, nil 23 | } 24 | -------------------------------------------------------------------------------- /provider/aliyun/ecs/eip_pager.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | import ( 4 | "context" 5 | 6 | ecs "github.com/alibabacloud-go/ecs-20140526/v2/client" 7 | "github.com/alibabacloud-go/tea/tea" 8 | 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newEipPager(operator *EcsOperator) pager.Pager { 15 | req := &ecs.DescribeEipAddressesRequest{ 16 | RegionId: operator.client.RegionId, 17 | } 18 | 19 | return &eipPager{ 20 | BasePager: pager.NewBasePager(), 21 | operator: operator, 22 | req: req, 23 | log: zap.L().Named("ali.eip"), 24 | } 25 | } 26 | 27 | type eipPager struct { 28 | *pager.BasePager 29 | operator *EcsOperator 30 | req *ecs.DescribeEipAddressesRequest 31 | log logger.Logger 32 | } 33 | 34 | func (p *eipPager) Scan(ctx context.Context, set pager.Set) error { 35 | resp, err := p.operator.queryEip(p.nextReq()) 36 | if err != nil { 37 | return err 38 | } 39 | p.CheckHasNext(resp) 40 | 41 | set.Add(resp.ToAny()...) 42 | return nil 43 | } 44 | 45 | func (p *eipPager) nextReq() *ecs.DescribeEipAddressesRequest { 46 | p.req.PageNumber = tea.Int32(int32(p.PageNumber())) 47 | p.req.PageSize = tea.Int32(int32(p.PageSize())) 48 | p.log.Debugf("请求第%d页数据, 分页大小%d", *p.req.PageNumber, *p.req.PageSize) 49 | return p.req 50 | } 51 | -------------------------------------------------------------------------------- /provider/aliyun/ecs/impl.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | import ( 4 | ecs "github.com/alibabacloud-go/ecs-20140526/v2/client" 5 | 6 | "github.com/infraboard/cmdb/apps/resource" 7 | "github.com/infraboard/mcube/logger" 8 | "github.com/infraboard/mcube/logger/zap" 9 | ) 10 | 11 | func NewEcsOperator(client *ecs.Client) *EcsOperator { 12 | return &EcsOperator{ 13 | client: client, 14 | log: zap.L().Named("ali.ecs"), 15 | AccountGetter: &resource.AccountGetter{}, 16 | } 17 | } 18 | 19 | // https://next.api.aliyun.com/api/Ecs/2014-05-26/CreateInstance?lang=GO¶ms={} 20 | type EcsOperator struct { 21 | client *ecs.Client 22 | log logger.Logger 23 | *resource.AccountGetter 24 | } 25 | -------------------------------------------------------------------------------- /provider/aliyun/ecs/sample/eip.json: -------------------------------------------------------------------------------- 1 | { 2 | "AllocationId": "eip-xxxx", 3 | "AllocationTime": "2022-08-05T09:43:11Z", 4 | "Bandwidth": "5", 5 | "ChargeType": "PostPaid", 6 | "ExpiredTime": "", 7 | "InstanceId": "i-xxxx", 8 | "InstanceType": "EcsInstance", 9 | "InternetChargeType": "PayByBandwidth", 10 | "IpAddress": "xxxx", 11 | "OperationLocks": {}, 12 | "RegionId": "cn-hangzhou", 13 | "Status": "InUse" 14 | } -------------------------------------------------------------------------------- /provider/aliyun/mapping/mapping.go: -------------------------------------------------------------------------------- 1 | package mapping 2 | 3 | import "github.com/infraboard/cmdb/apps/resource" 4 | 5 | var ( 6 | // Subscription:预付费。 7 | // PayAsYouGo:后付费。 8 | // PrePaid:包年包月。 9 | // PostPaid:按量付费 10 | // 账单: 11 | // SubscriptionOrder (预付订单)。 12 | // PayAsYouGoBill (后付账单)。 13 | // Refund (退款)。 14 | // Adjustment (调账)。 15 | // 订单 16 | // Subscription:预付费。 17 | // PayAsYouGo:按量付费。 18 | // MongoDB: 19 | // PrePaid:预付费,包年包月。 20 | // PostPaid:按量付费。 21 | PAY_TYPE_STATUS_MAP = map[string]resource.PAY_MODE{ 22 | "SubscriptionOrder": resource.PAY_MODE_PRE_PAY, 23 | "Subscription": resource.PAY_MODE_PRE_PAY, 24 | "PrePaid": resource.PAY_MODE_PRE_PAY, 25 | "PrePay": resource.PAY_MODE_PRE_PAY, 26 | "PayAsYouGo": resource.PAY_MODE_POST_PAY, 27 | "PayAsYouGoBill": resource.PAY_MODE_POST_PAY, 28 | "PostPaid": resource.PAY_MODE_POST_PAY, 29 | "PostPay": resource.PAY_MODE_POST_PAY, 30 | } 31 | ) 32 | 33 | func PrasePAY_MODE(s *string) resource.PAY_MODE { 34 | if s == nil { 35 | return resource.PAY_MODE_NULL 36 | } 37 | if v, ok := PAY_TYPE_STATUS_MAP[*s]; ok { 38 | return v 39 | } 40 | 41 | return resource.PAY_MODE_NULL 42 | } 43 | -------------------------------------------------------------------------------- /provider/aliyun/nlb/impl.go: -------------------------------------------------------------------------------- 1 | package nlb 2 | 3 | import ( 4 | nlb "github.com/alibabacloud-go/nlb-20220430/client" 5 | "github.com/infraboard/mcube/logger" 6 | "github.com/infraboard/mcube/logger/zap" 7 | ) 8 | 9 | func NewNLBOperator(client *nlb.Client) *NLBOperator { 10 | return &NLBOperator{ 11 | client: client, 12 | log: zap.L().Named("ali.nlb"), 13 | } 14 | } 15 | 16 | type NLBOperator struct { 17 | client *nlb.Client 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/aliyun/nlb/impl_test.go: -------------------------------------------------------------------------------- 1 | package nlb_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/lb" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/cmdb/provider/aliyun" 11 | "github.com/infraboard/mcube/logger/zap" 12 | ) 13 | 14 | var ( 15 | operator provider.LoadBalancerOperator 16 | ctx = context.Background() 17 | ) 18 | 19 | func TestPageQueryLoadBalancer(t *testing.T) { 20 | req := provider.NewQueryRequest() 21 | pager := operator.PageQueryLoadBalancer(req) 22 | 23 | for pager.Next() { 24 | set := lb.NewLoadBalancerSet() 25 | if err := pager.Scan(ctx, set); err != nil { 26 | panic(err) 27 | } 28 | fmt.Println(set) 29 | } 30 | } 31 | 32 | func init() { 33 | zap.DevelopmentSetup() 34 | err := aliyun.LoadOperatorFromEnv() 35 | if err != nil { 36 | panic(err) 37 | } 38 | operator = aliyun.O().NLbOperator() 39 | } 40 | -------------------------------------------------------------------------------- /provider/aliyun/nlb/mapping.go: -------------------------------------------------------------------------------- 1 | package nlb 2 | 3 | import ( 4 | "strings" 5 | 6 | "github.com/infraboard/cmdb/apps/lb" 7 | ) 8 | 9 | var ( 10 | 11 | // 网络型负载均衡实例状态。取值: 12 | // Inactive:已停止,表示实例监听不会再转发流量。 13 | // Active:运行中。 14 | // Provisioning:创建中。 15 | // Configuring:变配中。 16 | // Deleting:删除中。 17 | // Deleted:已删除。 18 | NLB_STATUS_MAP = map[string]lb.STATUS{ 19 | "inactive:": lb.STATUS_STOPPED, 20 | "active": lb.STATUS_RUNNING, 21 | "provisioning": lb.STATUS_PENDING, 22 | "configuring": lb.STATUS_RUNNING, 23 | "deleting": lb.STATUS_DELETING, 24 | "deleted": lb.STATUS_DESTROYED, 25 | } 26 | ) 27 | 28 | func praseNLBStatus(s *string) string { 29 | if s == nil { 30 | return "" 31 | } 32 | 33 | if v, ok := NLB_STATUS_MAP[strings.ToLower(*s)]; ok { 34 | return v.String() 35 | } 36 | 37 | return *s 38 | } 39 | -------------------------------------------------------------------------------- /provider/aliyun/nlb/nlb_pager.go: -------------------------------------------------------------------------------- 1 | package nlb 2 | 3 | import ( 4 | "context" 5 | 6 | nlb "github.com/alibabacloud-go/nlb-20220430/client" 7 | "github.com/alibabacloud-go/tea/tea" 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | ) 12 | 13 | func newPager(operator *NLBOperator) pager.Pager { 14 | return &nlbPager{ 15 | BasePager: pager.NewBasePager(), 16 | operator: operator, 17 | req: &nlb.ListLoadBalancersRequest{}, 18 | log: zap.L().Named("ali.alb"), 19 | } 20 | } 21 | 22 | type nlbPager struct { 23 | *pager.BasePager 24 | operator *NLBOperator 25 | req *nlb.ListLoadBalancersRequest 26 | log logger.Logger 27 | } 28 | 29 | func (p *nlbPager) Scan(ctx context.Context, set pager.Set) error { 30 | resp, err := p.operator.QueryLoadBalancer(p.nextReq()) 31 | if err != nil { 32 | return err 33 | } 34 | p.CheckHasNext(resp) 35 | 36 | set.Add(resp.ToAny()...) 37 | return nil 38 | } 39 | 40 | func (p *nlbPager) WithLogger(log logger.Logger) { 41 | p.log = log 42 | } 43 | 44 | func (p *nlbPager) nextReq() *nlb.ListLoadBalancersRequest { 45 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 46 | p.req.MaxResults = tea.Int32(int32(p.PageSize())) 47 | return p.req 48 | } 49 | -------------------------------------------------------------------------------- /provider/aliyun/oss/bucket_pager.go: -------------------------------------------------------------------------------- 1 | package oss 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/pager" 8 | ) 9 | 10 | func newBucketPager(operator *OssOperator) pager.Pager { 11 | return &bucketPager{ 12 | BasePager: pager.NewBasePager(), 13 | operator: operator, 14 | req: &listBucketRequest{}, 15 | log: operator.log, 16 | } 17 | } 18 | 19 | type bucketPager struct { 20 | *pager.BasePager 21 | operator *OssOperator 22 | log logger.Logger 23 | req *listBucketRequest 24 | } 25 | 26 | func (p *bucketPager) Scan(ctx context.Context, set pager.Set) error { 27 | resp, err := p.operator.query(p.nextReq()) 28 | if err != nil { 29 | return err 30 | } 31 | p.CheckHasNext(resp) 32 | 33 | set.Add(resp.ToAny()...) 34 | return nil 35 | } 36 | 37 | func (p *bucketPager) nextReq() *listBucketRequest { 38 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 39 | p.req.pageSize = int(p.PageSize()) 40 | return p.req 41 | } 42 | -------------------------------------------------------------------------------- /provider/aliyun/oss/impl.go: -------------------------------------------------------------------------------- 1 | package oss 2 | 3 | import ( 4 | "github.com/aliyun/aliyun-oss-go-sdk/oss" 5 | "github.com/infraboard/mcube/logger" 6 | "github.com/infraboard/mcube/logger/zap" 7 | ) 8 | 9 | func NewOssOperator(client *oss.Client) *OssOperator { 10 | return &OssOperator{ 11 | client: client, 12 | log: zap.L().Named("ali.oss"), 13 | } 14 | } 15 | 16 | type OssOperator struct { 17 | client *oss.Client 18 | log logger.Logger 19 | account string 20 | } 21 | 22 | func (o *OssOperator) WithAccount(account string) { 23 | o.account = account 24 | } 25 | -------------------------------------------------------------------------------- /provider/aliyun/oss/impl_test.go: -------------------------------------------------------------------------------- 1 | package oss_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/oss" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/mcube/logger/zap" 11 | 12 | "github.com/infraboard/cmdb/provider/aliyun" 13 | ) 14 | 15 | var ( 16 | operator provider.OssOperator 17 | ctx = context.Background() 18 | ) 19 | 20 | func TestQuery(t *testing.T) { 21 | req := provider.NewQueryRequestWithRate(5) 22 | pager := operator.QueryBucket(ctx, req) 23 | 24 | set := oss.NewBucketSet() 25 | for pager.Next() { 26 | if err := pager.Scan(ctx, set); err != nil { 27 | panic(err) 28 | } 29 | fmt.Println(set) 30 | } 31 | } 32 | 33 | func init() { 34 | zap.DevelopmentSetup() 35 | err := aliyun.LoadOperatorFromEnv() 36 | if err != nil { 37 | panic(err) 38 | } 39 | operator = aliyun.O().OssOperator() 40 | } 41 | -------------------------------------------------------------------------------- /provider/aliyun/rds/impl.go: -------------------------------------------------------------------------------- 1 | package rds 2 | 3 | import ( 4 | rds "github.com/alibabacloud-go/rds-20140815/v2/client" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewRdsOperator(client *rds.Client) *RdsOperator { 11 | return &RdsOperator{ 12 | client: client, 13 | log: zap.L().Named("ali.rds"), 14 | } 15 | } 16 | 17 | type RdsOperator struct { 18 | client *rds.Client 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/aliyun/rds/impl_test.go: -------------------------------------------------------------------------------- 1 | package rds_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/rds" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/cmdb/provider/aliyun" 11 | "github.com/infraboard/mcube/logger/zap" 12 | ) 13 | 14 | var ( 15 | operator provider.RdsOperator 16 | ctx = context.Background() 17 | ) 18 | 19 | func TestQuery(t *testing.T) { 20 | req := provider.NewQueryRequest() 21 | pager := operator.PageQueryRds(req) 22 | 23 | for pager.Next() { 24 | set := rds.NewSet() 25 | if err := pager.Scan(ctx, set); err != nil { 26 | panic(err) 27 | } 28 | fmt.Println(set) 29 | } 30 | } 31 | 32 | func TestDescribe(t *testing.T) { 33 | req := provider.NewDescribeRequest("xxx") 34 | ins, err := operator.DescribeRds(ctx, req) 35 | if err != nil { 36 | t.Fatal(err) 37 | } 38 | t.Log(ins) 39 | } 40 | 41 | func init() { 42 | zap.DevelopmentSetup() 43 | err := aliyun.LoadOperatorFromEnv() 44 | if err != nil { 45 | panic(err) 46 | } 47 | operator = aliyun.O().RdsOperator() 48 | } 49 | -------------------------------------------------------------------------------- /provider/aliyun/rds/mapping.go: -------------------------------------------------------------------------------- 1 | package rds 2 | 3 | import "github.com/infraboard/cmdb/apps/rds" 4 | 5 | var ( 6 | STATUS_MAP = map[string]rds.STATUS{ 7 | "Creating": rds.STATUS_PENDING, 8 | "Running": rds.STATUS_RUNNING, 9 | "Deleting": rds.STATUS_DELETING, 10 | "Released": rds.STATUS_DESTROYED, 11 | "Rebooting": rds.STATUS_REBOOTING, 12 | "Restoring": rds.STATUS_RESTORING, 13 | "TRANSING": rds.STATUS_TRANSING, 14 | "DBInstanceClassChanging": rds.STATUS_MODIFYING, 15 | "GuardSwitching": rds.STATUS_SWITCHOVER, 16 | "GuardDBInstanceCreating": rds.STATUS_GUARD_CREATING, 17 | "Importing": rds.STATUS_IMPORTING, 18 | "INS_CLONING": rds.STATUS_CLONING, 19 | "EngineVersionUpgrading": rds.STATUS_UPGRADING, 20 | "DBInstanceNetTypeChanging": rds.STATUS_NET_CHANGING, 21 | "TransingToOthers": rds.STATUS_TRANSING, 22 | "ImportingFromOthers": rds.STATUS_IMPORTING, 23 | } 24 | ) 25 | 26 | func praseStatus(s string) string { 27 | if v, ok := STATUS_MAP[s]; ok { 28 | return v.String() 29 | } 30 | 31 | return s 32 | } 33 | -------------------------------------------------------------------------------- /provider/aliyun/rds/rds_pager.go: -------------------------------------------------------------------------------- 1 | package rds 2 | 3 | import ( 4 | "context" 5 | 6 | rds "github.com/alibabacloud-go/rds-20140815/v2/client" 7 | "github.com/alibabacloud-go/tea/tea" 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | ) 12 | 13 | func newPager(operator *RdsOperator) pager.Pager { 14 | return &rdsPager{ 15 | BasePager: pager.NewBasePager(), 16 | operator: operator, 17 | req: &rds.DescribeDBInstancesRequest{ 18 | RegionId: operator.client.RegionId, 19 | }, 20 | log: zap.L().Named("ali.rds"), 21 | } 22 | } 23 | 24 | type rdsPager struct { 25 | *pager.BasePager 26 | operator *RdsOperator 27 | req *rds.DescribeDBInstancesRequest 28 | log logger.Logger 29 | } 30 | 31 | func (p *rdsPager) Scan(ctx context.Context, set pager.Set) error { 32 | resp, err := p.operator.Query(p.nextReq()) 33 | if err != nil { 34 | return err 35 | } 36 | p.CheckHasNext(resp) 37 | 38 | set.Add(resp.ToAny()...) 39 | return nil 40 | } 41 | 42 | func (p *rdsPager) WithLogger(log logger.Logger) { 43 | p.log = log 44 | } 45 | 46 | func (p *rdsPager) nextReq() *rds.DescribeDBInstancesRequest { 47 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 48 | p.req.PageNumber = tea.Int32(int32(p.PageNumber())) 49 | p.req.PageSize = tea.Int32(int32(p.PageSize())) 50 | return p.req 51 | } 52 | -------------------------------------------------------------------------------- /provider/aliyun/redis/impl.go: -------------------------------------------------------------------------------- 1 | package redis 2 | 3 | import ( 4 | redis "github.com/alibabacloud-go/r-kvstore-20150101/v2/client" 5 | "github.com/infraboard/mcube/logger" 6 | "github.com/infraboard/mcube/logger/zap" 7 | ) 8 | 9 | func NewRedisOperator(client *redis.Client) *RedisOperator { 10 | return &RedisOperator{ 11 | client: client, 12 | log: zap.L().Named("ALI Redis"), 13 | } 14 | } 15 | 16 | type RedisOperator struct { 17 | client *redis.Client 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/aliyun/redis/impl_test.go: -------------------------------------------------------------------------------- 1 | package redis_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/redis" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/mcube/logger/zap" 11 | 12 | "github.com/infraboard/cmdb/provider/aliyun" 13 | ) 14 | 15 | var ( 16 | operator provider.RedisOperator 17 | ctx = context.Background() 18 | ) 19 | 20 | func TestQuery(t *testing.T) { 21 | req := provider.NewQueryRequestWithRate(5) 22 | pager := operator.PageQueryRedis(req) 23 | for pager.Next() { 24 | set := redis.NewSet() 25 | if err := pager.Scan(ctx, set); err != nil { 26 | panic(err) 27 | } 28 | for i := range set.Items { 29 | fmt.Println(set.Items[i]) 30 | } 31 | } 32 | } 33 | 34 | func TestDescribeRedis(t *testing.T) { 35 | req := provider.NewDescribeRequest("xx") 36 | ins, err := operator.DescribeRedis(ctx, req) 37 | if err != nil { 38 | t.Fatal(err) 39 | } 40 | t.Log(ins) 41 | } 42 | 43 | func init() { 44 | zap.DevelopmentSetup() 45 | err := aliyun.LoadOperatorFromEnv() 46 | if err != nil { 47 | panic(err) 48 | } 49 | operator = aliyun.O().RedisOperator() 50 | } 51 | -------------------------------------------------------------------------------- /provider/aliyun/redis/mapping.go: -------------------------------------------------------------------------------- 1 | package redis 2 | 3 | import "github.com/infraboard/cmdb/apps/redis" 4 | 5 | var ( 6 | STATUS_MAP = map[string]redis.STATUS{ 7 | "Normal": redis.STATUS_RUNNING, 8 | "Creating": redis.STATUS_PENDING, 9 | "Error": redis.STATUS_ERROR, 10 | "Flushing": redis.STATUS_FLUSHING, 11 | "Released": redis.STATUS_DESTROYED, 12 | "BackupRecovering": redis.STATUS_RESTORING, 13 | "MinorVersionUpgrading": redis.STATUS_UPGRADING, 14 | "MajorVersionUpgrading": redis.STATUS_UPGRADING, 15 | "NetworkModifying": redis.STATUS_NET_CHANGING, 16 | "Inactive": redis.STATUS_ISOLATIONED, 17 | "Changing": redis.STATUS_MODIFYING, 18 | "Transforming": redis.STATUS_TRANSING, 19 | "Migrating": redis.STATUS_TRANSING, 20 | "Unavailable": redis.STATUS_ERROR, 21 | "SSLModifying": redis.STATUS_MODIFYING, 22 | } 23 | ) 24 | 25 | func praseStatus(s *string) string { 26 | if s == nil { 27 | return "" 28 | } 29 | 30 | if v, ok := STATUS_MAP[*s]; ok { 31 | return v.String() 32 | } 33 | 34 | return *s 35 | } 36 | -------------------------------------------------------------------------------- /provider/aliyun/redis/redis_pager.go: -------------------------------------------------------------------------------- 1 | package redis 2 | 3 | import ( 4 | "context" 5 | 6 | redis "github.com/alibabacloud-go/r-kvstore-20150101/v2/client" 7 | "github.com/alibabacloud-go/tea/tea" 8 | 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newPager(operator *RedisOperator) pager.Pager { 15 | req := &redis.DescribeInstancesRequest{ 16 | RegionId: operator.client.RegionId, 17 | } 18 | 19 | return &redisPager{ 20 | BasePager: pager.NewBasePager(), 21 | operator: operator, 22 | req: req, 23 | log: zap.L().Named("ali.redis"), 24 | } 25 | } 26 | 27 | type redisPager struct { 28 | *pager.BasePager 29 | operator *RedisOperator 30 | req *redis.DescribeInstancesRequest 31 | log logger.Logger 32 | } 33 | 34 | func (p *redisPager) Scan(ctx context.Context, set pager.Set) error { 35 | resp, err := p.operator.query(p.nextReq()) 36 | if err != nil { 37 | return err 38 | } 39 | p.CheckHasNext(resp) 40 | 41 | set.Add(resp.ToAny()...) 42 | return nil 43 | } 44 | 45 | func (p *redisPager) nextReq() *redis.DescribeInstancesRequest { 46 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 47 | p.req.PageNumber = tea.Int32(int32(p.PageNumber())) 48 | p.req.PageSize = tea.Int32(int32(p.PageSize())) 49 | return p.req 50 | } 51 | -------------------------------------------------------------------------------- /provider/aliyun/slb/impl.go: -------------------------------------------------------------------------------- 1 | package slb 2 | 3 | import ( 4 | slb "github.com/alibabacloud-go/slb-20140515/v3/client" 5 | "github.com/infraboard/mcube/logger" 6 | "github.com/infraboard/mcube/logger/zap" 7 | ) 8 | 9 | func NewSLBOperator(client *slb.Client) *SLBOperator { 10 | return &SLBOperator{ 11 | client: client, 12 | log: zap.L().Named("ali.slb"), 13 | } 14 | } 15 | 16 | type SLBOperator struct { 17 | client *slb.Client 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/aliyun/slb/impl_test.go: -------------------------------------------------------------------------------- 1 | package slb_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/lb" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/cmdb/provider/aliyun" 11 | "github.com/infraboard/mcube/logger/zap" 12 | ) 13 | 14 | var ( 15 | operator provider.LoadBalancerOperator 16 | ctx = context.Background() 17 | ) 18 | 19 | func TestPageQueryLoadBalancer(t *testing.T) { 20 | req := provider.NewQueryRequest() 21 | pager := operator.PageQueryLoadBalancer(req) 22 | 23 | for pager.Next() { 24 | set := lb.NewLoadBalancerSet() 25 | if err := pager.Scan(ctx, set); err != nil { 26 | panic(err) 27 | } 28 | fmt.Println(set) 29 | } 30 | } 31 | 32 | func TestDescribeLoadBalancer(t *testing.T) { 33 | req := provider.NewDescribeRequest("xxx") 34 | ins, err := operator.DescribeLoadBalancer(ctx, req) 35 | if err != nil { 36 | t.Fatal(err) 37 | } 38 | t.Log(ins) 39 | } 40 | 41 | func init() { 42 | zap.DevelopmentSetup() 43 | err := aliyun.LoadOperatorFromEnv() 44 | if err != nil { 45 | panic(err) 46 | } 47 | operator = aliyun.O().LbOperator() 48 | } 49 | -------------------------------------------------------------------------------- /provider/aliyun/slb/listener.go: -------------------------------------------------------------------------------- 1 | package slb 2 | 3 | // 查询负载均衡监听列表 4 | // 参考文档: https://next.api.aliyun.com/api/Slb/2014-05-15/DescribeLoadBalancerListeners?tab=DEMO&lang=GO¶ms={} 5 | -------------------------------------------------------------------------------- /provider/aliyun/slb/mapping.go: -------------------------------------------------------------------------------- 1 | package slb 2 | 3 | import "github.com/infraboard/cmdb/apps/lb" 4 | 5 | var ( 6 | // inactive: 实例已停止,此状态的实例监听不会再转发流量。 7 | // active: 实例运行中,实例创建后,默认状态为active。 8 | // locked: 实例已锁定。当负载均衡实例到期后,但到期时间未超过7天时,负载均衡实例进入锁定状态。 9 | // 此种状态下,您不能对负载均衡实例进行任何操作,并且实例不再会进行流量转发,但会保留实例的IP和其它配置。 10 | SLB_STATUS_MAP = map[string]lb.STATUS{ 11 | "inactive": lb.STATUS_STOPPED, 12 | "active": lb.STATUS_RUNNING, 13 | "locked": lb.STATUS_LOCKED, 14 | } 15 | ) 16 | 17 | func praseSlbStatus(s *string) string { 18 | if s == nil { 19 | return "" 20 | } 21 | 22 | if v, ok := SLB_STATUS_MAP[*s]; ok { 23 | return v.String() 24 | } 25 | 26 | return *s 27 | } 28 | -------------------------------------------------------------------------------- /provider/aliyun/slb/rule.go: -------------------------------------------------------------------------------- 1 | package slb 2 | 3 | // 查询指定监听已配置的转发规则 4 | // 参考文档: https://next.api.aliyun.com/api/Slb/2014-05-15/DescribeRules?params={} 5 | -------------------------------------------------------------------------------- /provider/aliyun/slb/rule_pager.go: -------------------------------------------------------------------------------- 1 | package slb 2 | -------------------------------------------------------------------------------- /provider/aliyun/slb/sample/instance.json: -------------------------------------------------------------------------------- 1 | { 2 | "Address": "1xxxxx", 3 | "AddressIPVersion": "ipv4", 4 | "AddressType": "intranet", 5 | "Bandwidth": 5120, 6 | "CreateTime": "2022-07-20T15:29Z", 7 | "CreateTimeStamp": 1658302171000, 8 | "InternetChargeType": "4", 9 | "InternetChargeTypeAlias": "paybytraffic", 10 | "LoadBalancerId": "lb-xxxxx", 11 | "LoadBalancerName": "xxxxxslb", 12 | "LoadBalancerSpec": "slb.s1.small", 13 | "LoadBalancerStatus": "active", 14 | "MasterZoneId": "cn-hangzhou-j", 15 | "NetworkType": "vpc", 16 | "PayType": "PrePay", 17 | "RegionId": "cn-hangzhou", 18 | "RegionIdAlias": "cn-hangzhou", 19 | "ResourceGroupId": "rg-xxx", 20 | "SlaveZoneId": "cn-hangzhou-k", 21 | "Tags": {}, 22 | "VSwitchId": "vsw-xxxx", 23 | "VpcId": "vpc-xxx" 24 | } -------------------------------------------------------------------------------- /provider/aliyun/sms/sms.go: -------------------------------------------------------------------------------- 1 | package sms 2 | 3 | import ( 4 | sms "github.com/alibabacloud-go/dysmsapi-20170525/v2/client" 5 | "github.com/infraboard/mcube/logger" 6 | ) 7 | 8 | // 参考: https://next.api.aliyun.com/api/Dysmsapi/2017-05-25/SendSms?lang=GO¶ms={} 9 | type SmsOperator struct { 10 | client *sms.Client 11 | log logger.Logger 12 | } 13 | -------------------------------------------------------------------------------- /provider/aliyun/voice/voice.go: -------------------------------------------------------------------------------- 1 | package voice 2 | 3 | import ( 4 | vms "github.com/alibabacloud-go/dyvmsapi-20170525/v2/client" 5 | "github.com/infraboard/mcube/logger" 6 | ) 7 | 8 | // 参考: https://next.api.aliyun.com/api/Dyvmsapi/2017-05-25/SingleCallByVoice?params={} 9 | type VmsOperator struct { 10 | client *vms.Client 11 | log logger.Logger 12 | } 13 | -------------------------------------------------------------------------------- /provider/aws/README.md: -------------------------------------------------------------------------------- 1 | # aws 2 | 3 | 使用到的SDK: [AWS SDK for Go v2](https://github.com/aws/aws-sdk-go-v2) -------------------------------------------------------------------------------- /provider/aws/connectivity/client_test.go: -------------------------------------------------------------------------------- 1 | package connectivity_test 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/infraboard/cmdb/provider/aws/connectivity" 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | func TestClient(t *testing.T) { 11 | should := assert.New(t) 12 | 13 | err := connectivity.LoadClientFromEnv() 14 | if should.NoError(err) { 15 | _, err := connectivity.C().Ec2Client() 16 | should.NoError(err) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /provider/aws/ec2/disk.go: -------------------------------------------------------------------------------- 1 | package ec2 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/infraboard/cmdb/apps/disk" 7 | "github.com/infraboard/cmdb/provider" 8 | "github.com/infraboard/mcube/pager" 9 | ) 10 | 11 | func (o *Ec2operator) DescribeDisk(ctx context.Context, req *provider.DescribeRequest) ( 12 | *disk.Disk, error) { 13 | return nil, nil 14 | } 15 | 16 | func (o *Ec2operator) PageQueryDisk(req *provider.QueryRequest) pager.Pager { 17 | return nil 18 | } 19 | -------------------------------------------------------------------------------- /provider/aws/ec2/ec2_pager.go: -------------------------------------------------------------------------------- 1 | package ec2 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/aws/aws-sdk-go-v2/service/ec2" 7 | 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | 12 | "github.com/infraboard/cmdb/utils" 13 | ) 14 | 15 | func newPager(operator *Ec2operator) pager.Pager { 16 | req := &ec2.DescribeInstancesInput{} 17 | 18 | return &ec2Pager{ 19 | BasePager: pager.NewBasePager(), 20 | operator: operator, 21 | req: req, 22 | log: zap.L().Named("Pagger"), 23 | } 24 | } 25 | 26 | type ec2Pager struct { 27 | *pager.BasePager 28 | operator *Ec2operator 29 | req *ec2.DescribeInstancesInput 30 | log logger.Logger 31 | } 32 | 33 | func (p *ec2Pager) Scan(ctx context.Context, set pager.Set) error { 34 | resp, err := p.operator.Query(ctx, p.nextReq()) 35 | if err != nil { 36 | return err 37 | } 38 | set.Add(resp.ToAny()...) 39 | 40 | p.CheckHasNext(set) 41 | return nil 42 | } 43 | 44 | func (p *ec2Pager) WithLogger(log logger.Logger) { 45 | p.log = log 46 | } 47 | 48 | func (p *ec2Pager) nextReq() *ec2.DescribeInstancesInput { 49 | p.req.MaxResults = utils.Int32Ptr(int32(p.PageSize())) 50 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 51 | return p.req 52 | } 53 | -------------------------------------------------------------------------------- /provider/aws/ec2/eip.go: -------------------------------------------------------------------------------- 1 | package ec2 2 | 3 | import ( 4 | "github.com/infraboard/cmdb/provider" 5 | "github.com/infraboard/mcube/pager" 6 | ) 7 | 8 | func (o *Ec2operator) PageQueryEip(req *provider.QueryRequest) pager.Pager { 9 | return nil 10 | } 11 | -------------------------------------------------------------------------------- /provider/aws/ec2/impl.go: -------------------------------------------------------------------------------- 1 | package ec2 2 | 3 | import ( 4 | "github.com/aws/aws-sdk-go-v2/service/ec2" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | type Ec2operator struct { 11 | client *ec2.Client 12 | log logger.Logger 13 | } 14 | 15 | // NewEc2Operator Ec2Operator 16 | func NewEc2Operator(client *ec2.Client) *Ec2operator { 17 | return &Ec2operator{ 18 | client: client, 19 | log: zap.L().Named("aws.ec2"), 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /provider/aws/ec2/impl_test.go: -------------------------------------------------------------------------------- 1 | package ec2_test 2 | 3 | import ( 4 | "context" 5 | "testing" 6 | 7 | "github.com/infraboard/cmdb/apps/host" 8 | "github.com/infraboard/cmdb/provider" 9 | "github.com/infraboard/cmdb/provider/aws" 10 | "github.com/infraboard/mcube/logger/zap" 11 | ) 12 | 13 | var ( 14 | operator provider.HostOperator 15 | ctx = context.Background() 16 | ) 17 | 18 | func TestQuery(t *testing.T) { 19 | pager := operator.PageQueryHost(provider.NewQueryRequest()) 20 | 21 | for pager.Next() { 22 | set := host.NewHostSet() 23 | if err := pager.Scan(ctx, set); err != nil { 24 | panic(err) 25 | } 26 | t.Log(set) 27 | } 28 | } 29 | 30 | func init() { 31 | zap.DevelopmentSetup() 32 | err := aws.LoadOperatorFromEnv() 33 | if err != nil { 34 | panic(err) 35 | } 36 | operator = aws.O().HostOperator() 37 | } 38 | -------------------------------------------------------------------------------- /provider/aws/operator.go: -------------------------------------------------------------------------------- 1 | package aws 2 | 3 | import ( 4 | "github.com/caarlos0/env/v6" 5 | "github.com/infraboard/cmdb/provider" 6 | "github.com/infraboard/cmdb/provider/aws/connectivity" 7 | "github.com/infraboard/cmdb/provider/aws/ec2" 8 | ) 9 | 10 | var ( 11 | operator *Operator 12 | ) 13 | 14 | func O() *Operator { 15 | if operator == nil { 16 | panic("please load config first") 17 | } 18 | return operator 19 | } 20 | 21 | func LoadOperatorFromEnv() error { 22 | conf := &connectivity.AwsCloudClient{} 23 | if err := env.Parse(conf); err != nil { 24 | return err 25 | } 26 | operator = NewOperator(conf.AccessKey, conf.AccessSecret, conf.Region) 27 | return nil 28 | } 29 | 30 | func NewOperator(ak, sk, region string) *Operator { 31 | client := connectivity.NewAwsCloudClient(ak, sk, region) 32 | return &Operator{ 33 | client: client, 34 | } 35 | } 36 | 37 | type Operator struct { 38 | client *connectivity.AwsCloudClient 39 | } 40 | 41 | func (o *Operator) HostOperator() provider.HostOperator { 42 | c, err := o.client.Ec2Client() 43 | if err != nil { 44 | panic(err) 45 | } 46 | return ec2.NewEc2Operator(c) 47 | } 48 | -------------------------------------------------------------------------------- /provider/aws/region/region.go: -------------------------------------------------------------------------------- 1 | package region 2 | 3 | import "github.com/infraboard/cmdb/utils" 4 | 5 | var Regions = []utils.EnumDescribe{ 6 | {Value: "us-east-1", Describe: "美国东部 (弗吉尼亚北部)"}, 7 | {Value: "us-east-2", Describe: "美国东部 (俄亥俄州)"}, 8 | {Value: "us-west-1", Describe: "美国西部 (加利福尼亚北部)"}, 9 | {Value: "us-west-2", Describe: "美国西部 (俄勒冈州)"}, 10 | {Value: "af-south-1", Describe: "非洲 (开普敦)"}, 11 | {Value: "ap-east-1", Describe: "亚太地区 (香港)"}, 12 | {Value: "ap-south-1", Describe: "亚太地区 (孟买)"}, 13 | {Value: "ap-northeast-3", Describe: "亚太地区 (大阪)"}, 14 | {Value: "ap-northeast-2", Describe: "亚太地区 (首尔)"}, 15 | {Value: "ap-southeast-1", Describe: "亚太地区 (新加坡)"}, 16 | {Value: "ap-southeast-2", Describe: "亚太地区 (悉尼)"}, 17 | {Value: "ap-northeast-1", Describe: "亚太地区 (东京)"}, 18 | {Value: "ca-central-1", Describe: "加拿大 (中部)"}, 19 | {Value: "eu-central-1", Describe: "欧洲 (法兰克福)"}, 20 | {Value: "eu-west-1", Describe: "欧洲 (爱尔兰)"}, 21 | {Value: "eu-west-2", Describe: "欧洲 (伦敦)"}, 22 | {Value: "eu-south-1", Describe: "欧洲 (米兰)"}, 23 | {Value: "eu-west-3", Describe: "欧洲 (巴黎)"}, 24 | {Value: "eu-north-1", Describe: "欧洲 (斯德哥尔摩)"}, 25 | {Value: "me-south-1", Describe: "中东 (巴林)"}, 26 | {Value: "sa-east-1", Describe: "南美洲 (圣保罗)"}, 27 | } 28 | -------------------------------------------------------------------------------- /provider/base.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import "fmt" 4 | 5 | func NewDescribeRequest(id string) *DescribeRequest { 6 | return &DescribeRequest{ 7 | Id: id, 8 | } 9 | } 10 | 11 | type DescribeRequest struct { 12 | Id string `json:"id"` 13 | } 14 | 15 | func (req *DescribeRequest) Validate() error { 16 | if req.Id == "" { 17 | return fmt.Errorf("resource id required") 18 | } 19 | 20 | return nil 21 | } 22 | 23 | func NewQueryRequestWithRate(rate int32) *QueryRequest { 24 | return &QueryRequest{ 25 | Rate: float64(rate), 26 | } 27 | } 28 | 29 | func NewQueryRequest() *QueryRequest { 30 | return &QueryRequest{ 31 | Rate: 5, 32 | } 33 | } 34 | 35 | type QueryRequest struct { 36 | Rate float64 `json:"rate"` 37 | } 38 | -------------------------------------------------------------------------------- /provider/dns.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import "github.com/infraboard/mcube/pager" 4 | 5 | type DnsOperator interface { 6 | QueryDomain(req *QueryDomainRequest) pager.Pager 7 | QueryRecord(req *QueryRecordRequest) pager.Pager 8 | } 9 | 10 | func NewQueryDomainRequest() *QueryDomainRequest { 11 | return &QueryDomainRequest{ 12 | Rate: 5, 13 | } 14 | } 15 | 16 | type QueryDomainRequest struct { 17 | Rate float64 `json:"rate"` 18 | } 19 | 20 | func NewQueryRecordRequest(domain string) *QueryRecordRequest { 21 | return &QueryRecordRequest{ 22 | Domain: domain, 23 | Rate: 5, 24 | } 25 | } 26 | 27 | type QueryRecordRequest struct { 28 | Domain string `json:"domain"` 29 | Rate float64 `json:"rate"` 30 | } 31 | -------------------------------------------------------------------------------- /provider/event.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "time" 5 | 6 | "github.com/infraboard/mcube/pager" 7 | ) 8 | 9 | type EventOperator interface { 10 | PageQueryEvent(req *QueryEventRequest) pager.Pager 11 | } 12 | 13 | func NewQueryEventRequest() *QueryEventRequest { 14 | now := time.Now() 15 | return &QueryEventRequest{ 16 | Rate: 5, 17 | StartTime: now.Add(-1 * time.Hour), 18 | EndTime: now, 19 | } 20 | } 21 | 22 | type QueryEventRequest struct { 23 | Rate float64 24 | StartTime time.Time 25 | EndTime time.Time 26 | } 27 | -------------------------------------------------------------------------------- /provider/execl/README.md: -------------------------------------------------------------------------------- 1 | # Execl数据源 -------------------------------------------------------------------------------- /provider/host.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/infraboard/cmdb/apps/disk" 7 | "github.com/infraboard/cmdb/apps/host" 8 | "github.com/infraboard/mcube/pager" 9 | ) 10 | 11 | type HostOperator interface { 12 | PageQueryHost(req *QueryRequest) pager.Pager 13 | PageQueryDisk(req *QueryRequest) pager.Pager 14 | PageQueryEip(req *QueryRequest) pager.Pager 15 | DescribeHost(ctx context.Context, req *DescribeRequest) (*host.Host, error) 16 | DescribeDisk(ctx context.Context, req *DescribeRequest) (*disk.Disk, error) 17 | } 18 | -------------------------------------------------------------------------------- /provider/huawei/bss/README.md: -------------------------------------------------------------------------------- 1 | # 账单管理 2 | 3 | + [查询资源消费记录](https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=BSS&api=ListCustomerselfResourceRecords) -------------------------------------------------------------------------------- /provider/huawei/bss/impl.go: -------------------------------------------------------------------------------- 1 | package bss 2 | 3 | import ( 4 | v2 "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/bss/v2" 5 | 6 | "github.com/infraboard/mcube/flowcontrol/tokenbucket" 7 | "github.com/infraboard/mcube/logger" 8 | "github.com/infraboard/mcube/logger/zap" 9 | ) 10 | 11 | func NewBssOperator(client *v2.BssClient) *BssOperator { 12 | return &BssOperator{ 13 | client: client, 14 | log: zap.L().Named("hw.bss"), 15 | tb: tokenbucket.NewBucketWithRate(5, 1), 16 | } 17 | } 18 | 19 | type BssOperator struct { 20 | client *v2.BssClient 21 | log logger.Logger 22 | tb *tokenbucket.Bucket 23 | } 24 | -------------------------------------------------------------------------------- /provider/huawei/bss/price.go: -------------------------------------------------------------------------------- 1 | package bss 2 | 3 | // 伙伴在销售平台按照条件查询按需产品的价格 4 | // 参考文档: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=BSS&api=ListOnDemandResourceRatings 5 | -------------------------------------------------------------------------------- /provider/huawei/bss/sample/order_detail.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infraboard/cmdb/7aae7b90475c64ea831b8bd53fc4d11f937b900a/provider/huawei/bss/sample/order_detail.json -------------------------------------------------------------------------------- /provider/huawei/bss/sample/order_list.json: -------------------------------------------------------------------------------- 1 | { 2 | "order_id": "xxxxx", 3 | "customer_id": "xxxxx", 4 | "service_type_code": "hws.service.type.ec2", 5 | "service_type_name": "弹性云服务器", 6 | "source_type": 7, 7 | "status": 5, 8 | "order_type": 2, 9 | "amount_after_discount": 0, 10 | "official_amount": 0.55, 11 | "measure_id": 1, 12 | "create_time": "2020-06-29T07: 45: 35Z", 13 | "payment_time": "2020-06-29T07: 45: 35Z", 14 | "currency": "CNY", 15 | "amount_info": { 16 | "discounts": [ 17 | { 18 | "discount_type": "301", 19 | "discount_amount": 0.55 20 | } 21 | ], 22 | "flexipurchase_coupon_amount": 0, 23 | "coupon_amount": 0.55, 24 | "stored_card_amount": 0 25 | } 26 | } -------------------------------------------------------------------------------- /provider/huawei/connectivity/client_test.go: -------------------------------------------------------------------------------- 1 | package connectivity_test 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/infraboard/cmdb/provider/huawei/connectivity" 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | func TestClient(t *testing.T) { 12 | should := assert.New(t) 13 | 14 | err := connectivity.LoadClientFromEnv() 15 | if should.NoError(err) { 16 | c := connectivity.C() 17 | fmt.Println(c.Region) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /provider/huawei/cts/README.md: -------------------------------------------------------------------------------- 1 | # 云审计服务 2 | 3 | [控制台地址](https://console.huaweicloud.com/cts/?region=cn-north-4#/cts/manager/eventList) 4 | 5 | ## ECS常用事件 6 | 7 | 8 | 9 | [弹性云服务器事件列表](https://support.huaweicloud.com/usermanual-cts/cts_03_0024.html) 10 | 11 | 资源类型:ecs 12 | 13 | + createServer 创建云服务器 14 | + deleteServer 删除云服务器 15 | + updateServer 更新云服务器 16 | 17 | ## RDS 18 | 19 | [ 云数据库 RDS事件列表](https://support.huaweicloud.com/usermanual-rds/rds_06_0004.html) 20 | 21 | + createInstance 创建实例、创建只读、恢复到新实例 22 | + deleteInstance 删除实例 23 | + rdsUnsubscribeInstance 冻结删除 24 | 25 | ## Redis 26 | 27 | [云审计服务支持的DCS操作列表](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713012.html) 28 | 29 | + createDCSInstance 创建实例 30 | + deleteDCSInstance 删除实例 31 | + batchDeleteDCSInstance 批量删除实例 -------------------------------------------------------------------------------- /provider/huawei/cts/event.go: -------------------------------------------------------------------------------- 1 | package cts 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | 7 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cts/v3/model" 8 | "github.com/infraboard/cmdb/apps/lb" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/mcube/pager" 11 | ) 12 | 13 | func (o *Operator) PageQueryEvent(req *provider.QueryEventRequest) pager.Pager { 14 | p := newPager(o, req, o.log) 15 | p.SetRate(float64(req.Rate)) 16 | return p 17 | } 18 | 19 | // 查询事件列表 20 | // 参考: https://apiexplorer.developer.huaweicloud.com/apiexplorer/sdk?product=CTS&api=ListTraces 21 | func (o *Operator) QueryEvents(ctx context.Context, req *model.ListTracesRequest) (*lb.LoadBalancerSet, error) { 22 | resp, err := o.client.ListTraces(req) 23 | if err != nil { 24 | return nil, err 25 | } 26 | 27 | fmt.Println(resp.String()) 28 | return nil, nil 29 | } 30 | -------------------------------------------------------------------------------- /provider/huawei/cts/impl.go: -------------------------------------------------------------------------------- 1 | package cts 2 | 3 | import ( 4 | "github.com/infraboard/mcube/logger" 5 | "github.com/infraboard/mcube/logger/zap" 6 | 7 | cts "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cts/v3" 8 | ) 9 | 10 | func NewOperator(client *cts.CtsClient) *Operator { 11 | return &Operator{ 12 | client: client, 13 | log: zap.L().Named("huawei.cts"), 14 | } 15 | } 16 | 17 | type Operator struct { 18 | client *cts.CtsClient 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/huawei/cts/impl_test.go: -------------------------------------------------------------------------------- 1 | package cts_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | "time" 8 | 9 | "github.com/infraboard/cmdb/apps/redis" 10 | "github.com/infraboard/cmdb/provider/huawei/connectivity" 11 | "github.com/infraboard/mcube/logger/zap" 12 | 13 | "github.com/infraboard/cmdb/provider" 14 | op "github.com/infraboard/cmdb/provider/huawei/cts" 15 | ) 16 | 17 | var ( 18 | operator provider.EventOperator 19 | ctx = context.Background() 20 | ) 21 | 22 | func TestPageQueryRedis(t *testing.T) { 23 | req := provider.NewQueryEventRequest() 24 | req.StartTime = time.Now().Add(-24 * 1 * time.Hour) 25 | pager := operator.PageQueryEvent(req) 26 | 27 | set := redis.NewSet() 28 | for pager.Next() { 29 | if err := pager.Scan(ctx, set); err != nil { 30 | panic(err) 31 | } 32 | fmt.Println(set) 33 | } 34 | } 35 | 36 | func init() { 37 | zap.DevelopmentSetup() 38 | err := connectivity.LoadClientFromEnv() 39 | if err != nil { 40 | panic(err) 41 | } 42 | 43 | ec, err := connectivity.C().CtsClient() 44 | if err != nil { 45 | panic(err) 46 | } 47 | operator = op.NewOperator(ec) 48 | } 49 | -------------------------------------------------------------------------------- /provider/huawei/dcs/impl.go: -------------------------------------------------------------------------------- 1 | package dcs 2 | 3 | import ( 4 | dcs "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dcs/v2" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewDcsOperator(client *dcs.DcsClient) *DcsOperator { 11 | return &DcsOperator{ 12 | client: client, 13 | log: zap.L().Named("huawei.redis"), 14 | } 15 | } 16 | 17 | type DcsOperator struct { 18 | client *dcs.DcsClient 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/huawei/dcs/impl_test.go: -------------------------------------------------------------------------------- 1 | package dcs_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/redis" 9 | "github.com/infraboard/cmdb/provider/huawei/connectivity" 10 | "github.com/infraboard/mcube/logger/zap" 11 | 12 | "github.com/infraboard/cmdb/provider" 13 | op "github.com/infraboard/cmdb/provider/huawei/dcs" 14 | ) 15 | 16 | var ( 17 | operator provider.RedisOperator 18 | ctx = context.Background() 19 | ) 20 | 21 | func TestPageQueryRedis(t *testing.T) { 22 | req := provider.NewQueryRequestWithRate(5) 23 | pager := operator.PageQueryRedis(req) 24 | 25 | set := redis.NewSet() 26 | for pager.Next() { 27 | if err := pager.Scan(ctx, set); err != nil { 28 | panic(err) 29 | } 30 | fmt.Println(set) 31 | } 32 | } 33 | 34 | func TestDescribeRedis(t *testing.T) { 35 | req := provider.NewDescribeRequest("xxx") 36 | ins, err := operator.DescribeRedis(ctx, req) 37 | if err != nil { 38 | t.Fatal(err) 39 | } 40 | t.Log(ins) 41 | } 42 | 43 | func init() { 44 | zap.DevelopmentSetup() 45 | err := connectivity.LoadClientFromEnv() 46 | if err != nil { 47 | panic(err) 48 | } 49 | 50 | ec, err := connectivity.C().DcsClient() 51 | if err != nil { 52 | panic(err) 53 | } 54 | operator = op.NewDcsOperator(ec) 55 | } 56 | -------------------------------------------------------------------------------- /provider/huawei/dcs/mapping.go: -------------------------------------------------------------------------------- 1 | package dcs 2 | 3 | import "github.com/infraboard/cmdb/apps/redis" 4 | 5 | // CREATING: 申请缓存实例后,在缓存实例状态进入运行中之前的状态。 6 | // RUNNING: 缓存实例正常运行状态。在这个状态的实例可以运行您的业务。 7 | // CREATEFAILED: 缓存实例处于创建失败的状态。 8 | // ERROR: 缓存实例处于故障的状态。 9 | // FLUSHING: 缓存实例数据清空中的状态 10 | // RESTARTING: 缓存实例正在进行重启操作。 11 | // FROZEN: 缓存实例处于已冻结状态,用户可以在“我的订单”中续费开启冻结的缓存实例。 12 | // RESTORING: 缓存实例数据恢复中的状态。 13 | // EXTENDING: 缓存实例处于正在扩容的状态。 14 | var ( 15 | STATUS_MAP = map[string]redis.STATUS{ 16 | "RUNNING": redis.STATUS_RUNNING, 17 | "CREATING": redis.STATUS_PENDING, 18 | "ERROR": redis.STATUS_ERROR, 19 | "CREATEFAILED": redis.STATUS_CREATE_FAILED, 20 | "FLUSHING": redis.STATUS_FLUSHING, 21 | "RESTARTING": redis.STATUS_REBOOTING, 22 | "FROZEN": redis.STATUS_ISOLATIONED, 23 | "RESTORING": redis.STATUS_RESTORING, 24 | "EXTENDING": redis.STATUS_EXTENDING, 25 | } 26 | ) 27 | 28 | func praseStatus(s *string) string { 29 | if s == nil { 30 | return "" 31 | } 32 | 33 | if v, ok := STATUS_MAP[*s]; ok { 34 | return v.String() 35 | } 36 | 37 | return *s 38 | } 39 | 40 | var ( 41 | chargeModeMap = map[int32]string{ 42 | 0: "按需计费", 43 | 1: "包年/包月计费", 44 | } 45 | ) 46 | 47 | func (o *DcsOperator) parseChargeMod(t *int32) string { 48 | if t == nil { 49 | return "" 50 | } 51 | return chargeModeMap[*t] 52 | } 53 | -------------------------------------------------------------------------------- /provider/huawei/dcs/redis_pager.go: -------------------------------------------------------------------------------- 1 | package dcs 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dcs/v2/model" 7 | 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | 12 | "github.com/infraboard/cmdb/utils" 13 | ) 14 | 15 | func newPager(operator *DcsOperator) pager.Pager { 16 | return &rdsPager{ 17 | BasePager: pager.NewBasePager(), 18 | operator: operator, 19 | req: &model.ListInstancesRequest{}, 20 | log: zap.L().Named("huawei.redis"), 21 | } 22 | } 23 | 24 | type rdsPager struct { 25 | *pager.BasePager 26 | operator *DcsOperator 27 | req *model.ListInstancesRequest 28 | log logger.Logger 29 | } 30 | 31 | func (p *rdsPager) Scan(ctx context.Context, set pager.Set) error { 32 | resp, err := p.operator.Query(p.nextReq()) 33 | if err != nil { 34 | return err 35 | } 36 | p.CheckHasNext(resp) 37 | 38 | set.Add(resp.ToAny()...) 39 | return nil 40 | } 41 | 42 | func (p *rdsPager) nextReq() *model.ListInstancesRequest { 43 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 44 | p.req.Offset = utils.Int32Ptr(int32(p.Offset())) 45 | p.req.Limit = utils.Int32Ptr(int32(p.PageSize())) 46 | return p.req 47 | } 48 | -------------------------------------------------------------------------------- /provider/huawei/dds/impl.go: -------------------------------------------------------------------------------- 1 | package dds 2 | 3 | import ( 4 | dds "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dds/v3" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewDdsOperator(client *dds.DdsClient) *DdsOperator { 11 | return &DdsOperator{ 12 | client: client, 13 | log: zap.L().Named("huawei.dds"), 14 | } 15 | } 16 | 17 | type DdsOperator struct { 18 | client *dds.DdsClient 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/huawei/dds/impl_test.go: -------------------------------------------------------------------------------- 1 | package dds_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/mongodb" 9 | "github.com/infraboard/cmdb/provider/huawei/connectivity" 10 | "github.com/infraboard/mcube/logger/zap" 11 | 12 | "github.com/infraboard/cmdb/provider" 13 | op "github.com/infraboard/cmdb/provider/huawei/dds" 14 | ) 15 | 16 | var ( 17 | operator provider.MongoOperator 18 | ctx = context.Background() 19 | ) 20 | 21 | func TestPageQueryRedis(t *testing.T) { 22 | req := provider.NewQueryRequestWithRate(5) 23 | pager := operator.PageQueryMongo(req) 24 | 25 | set := mongodb.NewMongoDBSet() 26 | for pager.Next() { 27 | if err := pager.Scan(ctx, set); err != nil { 28 | panic(err) 29 | } 30 | for i := range set.Items { 31 | fmt.Println(set.Items[i]) 32 | } 33 | } 34 | } 35 | 36 | func init() { 37 | zap.DevelopmentSetup() 38 | err := connectivity.LoadClientFromEnv() 39 | if err != nil { 40 | panic(err) 41 | } 42 | 43 | ec, err := connectivity.C().DdsClient() 44 | if err != nil { 45 | panic(err) 46 | } 47 | operator = op.NewDdsOperator(ec) 48 | } 49 | -------------------------------------------------------------------------------- /provider/huawei/dds/mapping.go: -------------------------------------------------------------------------------- 1 | package dds 2 | 3 | import "github.com/infraboard/cmdb/apps/mongodb" 4 | 5 | var ( 6 | // 参考: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=DDS&api=ListInstances 7 | // normal,表示实例正常。 8 | // abnormal,表示实例异常。 9 | // creating,表示实例创建中。 10 | // frozen,表示实例被冻结。 11 | // data_disk_full,表示实例磁盘已满。 12 | // createfail,表示实例创建失败。 13 | // enlargefail,表示实例扩容节点个数失败。 14 | STATUS_MAP = map[string]mongodb.STATUS{ 15 | "creating": mongodb.STATUS_PENDING, 16 | "normal": mongodb.STATUS_RUNNING, 17 | "abnormal": mongodb.STATUS_ERROR, 18 | "frozen": mongodb.STATUS_LOCKED, 19 | "data_disk_full": mongodb.STATUS_STORAGE_FULL, 20 | "createfail": mongodb.STATUS_CREATE_FAILED, 21 | "enlargefail": mongodb.STATUS_ERROR, 22 | } 23 | ) 24 | 25 | func praseStatus(s string) string { 26 | if v, ok := STATUS_MAP[s]; ok { 27 | return v.String() 28 | } 29 | 30 | return s 31 | } 32 | -------------------------------------------------------------------------------- /provider/huawei/dds/mongo_pager.go: -------------------------------------------------------------------------------- 1 | package dds 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dds/v3/model" 7 | 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | 12 | "github.com/infraboard/cmdb/utils" 13 | ) 14 | 15 | func newPager(operator *DdsOperator) pager.Pager { 16 | return &ddsPager{ 17 | BasePager: pager.NewBasePager(), 18 | operator: operator, 19 | req: &model.ListInstancesRequest{}, 20 | log: zap.L().Named("huawei.dds"), 21 | } 22 | } 23 | 24 | type ddsPager struct { 25 | *pager.BasePager 26 | operator *DdsOperator 27 | req *model.ListInstancesRequest 28 | log logger.Logger 29 | } 30 | 31 | func (p *ddsPager) Scan(ctx context.Context, set pager.Set) error { 32 | resp, err := p.operator.Query(p.nextReq()) 33 | if err != nil { 34 | return err 35 | } 36 | p.CheckHasNext(resp) 37 | 38 | set.Add(resp.ToAny()...) 39 | return nil 40 | } 41 | 42 | func (p *ddsPager) nextReq() *model.ListInstancesRequest { 43 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 44 | p.req.Offset = utils.Int32Ptr(int32(p.Offset())) 45 | p.req.Limit = utils.Int32Ptr(int32(p.PageSize())) 46 | return p.req 47 | } 48 | -------------------------------------------------------------------------------- /provider/huawei/dns/impl.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | dns "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dns/v2" 5 | "github.com/infraboard/mcube/logger" 6 | "github.com/infraboard/mcube/logger/zap" 7 | ) 8 | 9 | func NewDnsOperator(client *dns.DnsClient) *DnsOperator { 10 | return &DnsOperator{ 11 | client: client, 12 | log: zap.L().Named("hw.dns"), 13 | } 14 | } 15 | 16 | type DnsOperator struct { 17 | client *dns.DnsClient 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/huawei/dns/impl_test.go: -------------------------------------------------------------------------------- 1 | package dns_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/dns" 9 | "github.com/infraboard/cmdb/provider/huawei/connectivity" 10 | "github.com/infraboard/mcube/logger/zap" 11 | 12 | "github.com/infraboard/cmdb/provider" 13 | op "github.com/infraboard/cmdb/provider/huawei/dns" 14 | ) 15 | 16 | var ( 17 | operator provider.DnsOperator 18 | ctx = context.Background() 19 | ) 20 | 21 | func TestQuery(t *testing.T) { 22 | req := provider.NewQueryDomainRequest() 23 | pager := operator.QueryDomain(req) 24 | 25 | for pager.Next() { 26 | set := dns.NewDomainSet() 27 | if err := pager.Scan(ctx, set); err != nil { 28 | panic(err) 29 | } 30 | fmt.Println(set) 31 | } 32 | } 33 | 34 | func init() { 35 | zap.DevelopmentSetup() 36 | err := connectivity.LoadClientFromEnv() 37 | if err != nil { 38 | panic(err) 39 | } 40 | 41 | ec, err := connectivity.C().DnsClient() 42 | if err != nil { 43 | panic(err) 44 | } 45 | operator = op.NewDnsOperator(ec) 46 | } 47 | -------------------------------------------------------------------------------- /provider/huawei/dns/private.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dns/v2/model" 7 | "github.com/infraboard/cmdb/apps/dns" 8 | "github.com/infraboard/cmdb/apps/resource" 9 | ) 10 | 11 | // 查询内网Zone的列表 12 | // 参考文档: https://apiexplorer.developer.huaweicloud.com/apiexplorer/sdk?product=DNS&api=ListPrivateZones 13 | func (o *DnsOperator) queryPrivateDomain(req *model.ListPrivateZonesRequest) (*dns.DomainSet, error) { 14 | set := dns.NewDomainSet() 15 | 16 | resp, err := o.client.ListPrivateZones(req) 17 | if err != nil { 18 | return nil, err 19 | } 20 | 21 | fmt.Println(resp.String()) 22 | 23 | set.Items = o.transferPrivateZoneSet(resp).Items 24 | 25 | return set, nil 26 | } 27 | 28 | func (o *DnsOperator) transferPrivateZoneSet(list *model.ListPrivateZonesResponse) *dns.DomainSet { 29 | set := dns.NewDomainSet() 30 | 31 | items := *list.Zones 32 | for i := range items { 33 | set.Add(o.transferPrivateZone(items[i])) 34 | } 35 | return set 36 | } 37 | 38 | func (o *DnsOperator) transferPrivateZone(ins model.PrivateZoneResp) *dns.Domain { 39 | r := dns.NewDefaultDomain() 40 | 41 | b := r.Resource.Spec 42 | b.Vendor = resource.VENDOR_HUAWEI 43 | return r 44 | } 45 | -------------------------------------------------------------------------------- /provider/huawei/dns/private_pager.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dns/v2/model" 7 | 8 | "github.com/infraboard/cmdb/utils" 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newPrivateZonePager(operator *DnsOperator) pager.Pager { 15 | req := &model.ListPublicZonesRequest{} 16 | 17 | return &privateZonePager{ 18 | BasePager: pager.NewBasePager(), 19 | operator: operator, 20 | req: req, 21 | log: zap.L().Named("hw.zone.private"), 22 | } 23 | } 24 | 25 | type privateZonePager struct { 26 | *pager.BasePager 27 | operator *DnsOperator 28 | req *model.ListPublicZonesRequest 29 | log logger.Logger 30 | } 31 | 32 | func (p *privateZonePager) Scan(ctx context.Context, set pager.Set) error { 33 | resp, err := p.operator.queryPublicDomain(p.nextReq()) 34 | if err != nil { 35 | return err 36 | } 37 | p.CheckHasNext(resp) 38 | 39 | set.Add(resp.ToAny()...) 40 | return nil 41 | } 42 | 43 | func (p *privateZonePager) nextReq() *model.ListPublicZonesRequest { 44 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 45 | 46 | // 注意: 华为云的Offse表示的是页码 47 | p.req.Offset = utils.Int32Ptr(int32(p.Offset())) 48 | p.req.Limit = utils.Int32Ptr(int32(p.PageSize())) 49 | return p.req 50 | } 51 | -------------------------------------------------------------------------------- /provider/huawei/dns/public_pager.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/dns/v2/model" 7 | 8 | "github.com/infraboard/cmdb/utils" 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newPublicZonePager(operator *DnsOperator) pager.Pager { 15 | req := &model.ListPublicZonesRequest{} 16 | 17 | return &publicZonePager{ 18 | BasePager: pager.NewBasePager(), 19 | operator: operator, 20 | req: req, 21 | log: zap.L().Named("hw.zone.public"), 22 | } 23 | } 24 | 25 | type publicZonePager struct { 26 | *pager.BasePager 27 | operator *DnsOperator 28 | req *model.ListPublicZonesRequest 29 | log logger.Logger 30 | } 31 | 32 | func (p *publicZonePager) Scan(ctx context.Context, set pager.Set) error { 33 | resp, err := p.operator.queryPublicDomain(p.nextReq()) 34 | if err != nil { 35 | return err 36 | } 37 | set.Add(resp.ToAny()...) 38 | 39 | p.CheckHasNext(resp) 40 | return nil 41 | } 42 | 43 | func (p *publicZonePager) nextReq() *model.ListPublicZonesRequest { 44 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 45 | 46 | // 注意: 华为云的Offse表示的是页码 47 | p.req.Offset = utils.Int32Ptr(int32(p.Offset())) 48 | p.req.Limit = utils.Int32Ptr(int32(p.PageSize())) 49 | return p.req 50 | } 51 | -------------------------------------------------------------------------------- /provider/huawei/dns/record.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | "github.com/infraboard/cmdb/provider" 5 | "github.com/infraboard/mcube/pager" 6 | ) 7 | 8 | func (o *DnsOperator) QueryRecord(req *provider.QueryRecordRequest) pager.Pager { 9 | return nil 10 | } 11 | -------------------------------------------------------------------------------- /provider/huawei/dns/sample/zone.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infraboard/cmdb/7aae7b90475c64ea831b8bd53fc4d11f937b900a/provider/huawei/dns/sample/zone.json -------------------------------------------------------------------------------- /provider/huawei/ecs/disk_pager.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/evs/v2/model" 7 | "github.com/infraboard/mcube/logger" 8 | "github.com/infraboard/mcube/logger/zap" 9 | "github.com/infraboard/mcube/pager" 10 | 11 | "github.com/infraboard/cmdb/utils" 12 | ) 13 | 14 | func newDiskPager(operator *EcsOperator) pager.Pager { 15 | req := &model.ListVolumesRequest{} 16 | 17 | return &diskPager{ 18 | BasePager: pager.NewBasePager(), 19 | operator: operator, 20 | req: req, 21 | log: zap.L().Named("huawei.disk"), 22 | } 23 | } 24 | 25 | type diskPager struct { 26 | *pager.BasePager 27 | operator *EcsOperator 28 | req *model.ListVolumesRequest 29 | log logger.Logger 30 | } 31 | 32 | func (p *diskPager) Scan(ctx context.Context, set pager.Set) error { 33 | resp, err := p.operator.QueryDisk(p.nextReq()) 34 | if err != nil { 35 | return err 36 | } 37 | p.CheckHasNext(resp) 38 | 39 | set.Add(resp.ToAny()...) 40 | return nil 41 | } 42 | 43 | func (p *diskPager) nextReq() *model.ListVolumesRequest { 44 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 45 | 46 | // 注意: 华为云的Offse表示的是页码 47 | p.req.Offset = utils.Int32Ptr(int32(p.Offset())) 48 | p.req.Limit = utils.Int32Ptr(int32(p.PageSize())) 49 | return p.req 50 | } 51 | -------------------------------------------------------------------------------- /provider/huawei/ecs/ecs_pager.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ecs/v2/model" 7 | 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | 12 | "github.com/infraboard/cmdb/utils" 13 | ) 14 | 15 | func newPager(operator *EcsOperator) pager.Pager { 16 | req := &model.ListServersDetailsRequest{} 17 | 18 | return &ecsPager{ 19 | BasePager: pager.NewBasePager(), 20 | operator: operator, 21 | req: req, 22 | log: zap.L().Named("huawei.ecs"), 23 | } 24 | } 25 | 26 | type ecsPager struct { 27 | *pager.BasePager 28 | operator *EcsOperator 29 | req *model.ListServersDetailsRequest 30 | log logger.Logger 31 | } 32 | 33 | func (p *ecsPager) Scan(ctx context.Context, set pager.Set) error { 34 | resp, err := p.operator.queryInstance(p.nextReq()) 35 | if err != nil { 36 | return err 37 | } 38 | p.CheckHasNext(resp) 39 | 40 | set.Add(resp.ToAny()...) 41 | return nil 42 | } 43 | 44 | func (p *ecsPager) nextReq() *model.ListServersDetailsRequest { 45 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 46 | 47 | // 注意: 华为云的Offse表示的是页码 48 | p.req.Offset = utils.Int32Ptr(int32(p.PageNumber())) 49 | p.req.Limit = utils.Int32Ptr(int32(p.PageSize())) 50 | return p.req 51 | } 52 | -------------------------------------------------------------------------------- /provider/huawei/ecs/ecs_price.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | // 4 | -------------------------------------------------------------------------------- /provider/huawei/ecs/eip_pager.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/eip/v2/model" 7 | 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | 12 | "github.com/infraboard/cmdb/utils" 13 | ) 14 | 15 | func newEipPager(operator *EcsOperator) pager.Pager { 16 | req := &model.ListPublicipsRequest{} 17 | 18 | return &eipPager{ 19 | BasePager: pager.NewBasePager(), 20 | operator: operator, 21 | req: req, 22 | log: zap.L().Named("huawei.eip"), 23 | } 24 | } 25 | 26 | type eipPager struct { 27 | *pager.BasePager 28 | operator *EcsOperator 29 | req *model.ListPublicipsRequest 30 | log logger.Logger 31 | } 32 | 33 | func (p *eipPager) Scan(ctx context.Context, set pager.Set) error { 34 | resp, err := p.operator.queryEip(p.nextReq()) 35 | if err != nil { 36 | return err 37 | } 38 | p.CheckHasNext(resp) 39 | 40 | set.Add(resp.ToAny()...) 41 | return nil 42 | } 43 | 44 | func (p *eipPager) nextReq() *model.ListPublicipsRequest { 45 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 46 | 47 | // 注意: 华为云的Offse表示的是页码 48 | p.req.Limit = utils.Int32Ptr(int32(p.PageSize())) 49 | return p.req 50 | } 51 | -------------------------------------------------------------------------------- /provider/huawei/ecs/impl.go: -------------------------------------------------------------------------------- 1 | package ecs 2 | 3 | import ( 4 | ecs "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ecs/v2" 5 | eip "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/eip/v2" 6 | evs "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/evs/v2" 7 | 8 | "github.com/infraboard/cmdb/apps/resource" 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | ) 12 | 13 | func NewEcsOperator(client *ecs.EcsClient, evs *evs.EvsClient, eip *eip.EipClient) *EcsOperator { 14 | return &EcsOperator{ 15 | client: client, 16 | evs: evs, 17 | eip: eip, 18 | log: zap.L().Named("hw.ecs"), 19 | AccountGetter: &resource.AccountGetter{}, 20 | } 21 | } 22 | 23 | type EcsOperator struct { 24 | client *ecs.EcsClient 25 | evs *evs.EvsClient 26 | eip *eip.EipClient 27 | log logger.Logger 28 | *resource.AccountGetter 29 | } 30 | -------------------------------------------------------------------------------- /provider/huawei/ecs/sample/eip.json: -------------------------------------------------------------------------------- 1 | { 2 | "bandwidth_id": "xxxx", 3 | "bandwidth_name": "bandwidth-xxx", 4 | "bandwidth_share_type": "PER", 5 | "bandwidth_size": 10, 6 | "create_time": "2022-02-21T07:47:10Z", 7 | "enterprise_project_id": "6xxxxx", 8 | "id": "0xxxx", 9 | "port_id": "dxxxx", 10 | "private_ip_address": "1xxx", 11 | "profile": {}, 12 | "public_ip_address": "1xxx", 13 | "status": "ACTIVE", 14 | "tenant_id": "0xxxx", 15 | "type": "5_bgp", 16 | "ip_version": 4, 17 | "public_border_group": "center", 18 | "allow_share_bandwidth_types": [ 19 | "share", 20 | "share_bgp_enter" 21 | ] 22 | } -------------------------------------------------------------------------------- /provider/huawei/elb/elb_pager.go: -------------------------------------------------------------------------------- 1 | package elb 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/elb/v2/model" 7 | 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | 12 | "github.com/infraboard/cmdb/utils" 13 | ) 14 | 15 | func newPager(operator *ELBOperator) pager.Pager { 16 | req := &model.ListLoadbalancersRequest{} 17 | 18 | return &ecsPager{ 19 | BasePager: pager.NewBasePager(), 20 | operator: operator, 21 | req: req, 22 | log: zap.L().Named("huawei.elb"), 23 | } 24 | } 25 | 26 | type ecsPager struct { 27 | *pager.BasePager 28 | operator *ELBOperator 29 | req *model.ListLoadbalancersRequest 30 | log logger.Logger 31 | } 32 | 33 | func (p *ecsPager) Scan(ctx context.Context, set pager.Set) error { 34 | resp, err := p.operator.QueryLoadBalancer(p.nextReq()) 35 | if err != nil { 36 | return err 37 | } 38 | p.CheckHasNext(resp) 39 | 40 | set.Add(resp.ToAny()...) 41 | return nil 42 | } 43 | 44 | func (p *ecsPager) nextReq() *model.ListLoadbalancersRequest { 45 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 46 | 47 | // 注意: 华为云的Offse表示的是页码 48 | p.req.Limit = utils.Int32Ptr(int32(p.PageSize())) 49 | return p.req 50 | } 51 | -------------------------------------------------------------------------------- /provider/huawei/elb/impl.go: -------------------------------------------------------------------------------- 1 | package elb 2 | 3 | import ( 4 | elb "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/elb/v2" 5 | "github.com/infraboard/mcube/logger" 6 | "github.com/infraboard/mcube/logger/zap" 7 | ) 8 | 9 | func NewELBOperator(client *elb.ElbClient) *ELBOperator { 10 | return &ELBOperator{ 11 | client: client, 12 | log: zap.L().Named("hw.elb"), 13 | } 14 | } 15 | 16 | type ELBOperator struct { 17 | client *elb.ElbClient 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/huawei/elb/impl_test.go: -------------------------------------------------------------------------------- 1 | package elb_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/lb" 9 | "github.com/infraboard/cmdb/provider/huawei/connectivity" 10 | "github.com/infraboard/mcube/logger/zap" 11 | 12 | "github.com/infraboard/cmdb/provider" 13 | op "github.com/infraboard/cmdb/provider/huawei/elb" 14 | ) 15 | 16 | var ( 17 | operator provider.LoadBalancerOperator 18 | ctx = context.Background() 19 | ) 20 | 21 | func TestPageQueryLoadBalancer(t *testing.T) { 22 | req := provider.NewQueryRequest() 23 | pager := operator.PageQueryLoadBalancer(req) 24 | 25 | for pager.Next() { 26 | set := lb.NewLoadBalancerSet() 27 | if err := pager.Scan(ctx, set); err != nil { 28 | panic(err) 29 | } 30 | fmt.Println(set) 31 | } 32 | } 33 | 34 | func TestDescribeLoadBalancer(t *testing.T) { 35 | req := provider.NewDescribeRequest("xxx") 36 | ins, err := operator.DescribeLoadBalancer(ctx, req) 37 | if err != nil { 38 | t.Fatal(err) 39 | } 40 | t.Log(ins) 41 | } 42 | 43 | func init() { 44 | zap.DevelopmentSetup() 45 | err := connectivity.LoadClientFromEnv() 46 | if err != nil { 47 | panic(err) 48 | } 49 | 50 | ec, err := connectivity.C().ElbClient() 51 | if err != nil { 52 | panic(err) 53 | } 54 | operator = op.NewELBOperator(ec) 55 | } 56 | -------------------------------------------------------------------------------- /provider/huawei/elb/mapping.go: -------------------------------------------------------------------------------- 1 | package elb 2 | 3 | import "github.com/infraboard/cmdb/apps/lb" 4 | 5 | var ( 6 | // ONLINE 7 | // FROZEN 8 | ELB_STATUS_MAP = map[string]lb.STATUS{ 9 | "ONLINE": lb.STATUS_RUNNING, 10 | "FROZEN": lb.STATUS_LOCKED, 11 | } 12 | ) 13 | 14 | func praseElbStatus(s string) string { 15 | if v, ok := ELB_STATUS_MAP[s]; ok { 16 | return v.String() 17 | } 18 | 19 | return s 20 | } 21 | -------------------------------------------------------------------------------- /provider/huawei/elb/sample/elb.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "05ccxxxx", 3 | "tenant_id": "089exxxx", 4 | "name": "xxxxxx", 5 | "description": "", 6 | "vip_subnet_id": "21xxxx", 7 | "vip_port_id": "71xxxx", 8 | "vip_address": "17xxxx", 9 | "listeners": [ 10 | { 11 | "id": "793xxx" 12 | }, 13 | { 14 | "id": "0cxxxxx" 15 | } 16 | ], 17 | "pools": [ 18 | { 19 | "id": "f9xxxx" 20 | }, 21 | { 22 | "id": "d7xxxx" 23 | } 24 | ], 25 | "provider": "vlb", 26 | "operating_status": "ONLINE", 27 | "provisioning_status": "ACTIVE", 28 | "admin_state_up": true, 29 | "created_at": "2022-05-27T06:32:06", 30 | "updated_at": "2022-05-30T14:34:50", 31 | "enterprise_project_id": "0", 32 | "project_id": "08xxxx", 33 | "tags": [] 34 | } -------------------------------------------------------------------------------- /provider/huawei/mapping/mapping.go: -------------------------------------------------------------------------------- 1 | package mapping 2 | 3 | import "github.com/infraboard/cmdb/apps/resource" 4 | 5 | var ( 6 | // 计费模式,0表示按需计费,1表示包年/包月计费。 7 | PAY_TYPE_STATUS_MAP = map[int32]resource.PAY_MODE{ 8 | 0: resource.PAY_MODE_POST_PAY, 9 | 1: resource.PAY_MODE_PRE_PAY, 10 | } 11 | ) 12 | 13 | func PrasePAY_MODE(s *int32) resource.PAY_MODE { 14 | if s == nil { 15 | return resource.PAY_MODE_NULL 16 | } 17 | if v, ok := PAY_TYPE_STATUS_MAP[*s]; ok { 18 | return v 19 | } 20 | 21 | return resource.PAY_MODE_NULL 22 | } 23 | -------------------------------------------------------------------------------- /provider/huawei/obs/bucket_pager.go: -------------------------------------------------------------------------------- 1 | package obs 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" 7 | 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/pager" 10 | ) 11 | 12 | func newPager(operator *ObsOperator) pager.Pager { 13 | return &obsPager{ 14 | BasePager: pager.NewBasePager(), 15 | operator: operator, 16 | req: &obs.ListBucketsInput{}, 17 | log: operator.log, 18 | } 19 | } 20 | 21 | type obsPager struct { 22 | *pager.BasePager 23 | operator *ObsOperator 24 | req *obs.ListBucketsInput 25 | log logger.Logger 26 | } 27 | 28 | func (p *obsPager) Scan(ctx context.Context, set pager.Set) error { 29 | resp, err := p.operator.Query(p.nextReq()) 30 | if err != nil { 31 | return err 32 | } 33 | p.CheckHasNext(resp) 34 | 35 | set.Add(resp.ToAny()...) 36 | return nil 37 | } 38 | 39 | func (p *obsPager) nextReq() *obs.ListBucketsInput { 40 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 41 | return p.req 42 | } 43 | -------------------------------------------------------------------------------- /provider/huawei/obs/impl.go: -------------------------------------------------------------------------------- 1 | package obs 2 | 3 | import ( 4 | "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewObsOperator(client *obs.ObsClient) *ObsOperator { 11 | return &ObsOperator{ 12 | client: client, 13 | log: zap.L().Named("huawei.obs"), 14 | } 15 | } 16 | 17 | type ObsOperator struct { 18 | client *obs.ObsClient 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/huawei/obs/impl_test.go: -------------------------------------------------------------------------------- 1 | package obs_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/oss" 9 | "github.com/infraboard/cmdb/provider/huawei/connectivity" 10 | "github.com/infraboard/mcube/logger/zap" 11 | 12 | "github.com/infraboard/cmdb/provider" 13 | op "github.com/infraboard/cmdb/provider/huawei/obs" 14 | ) 15 | 16 | var ( 17 | operator provider.OssOperator 18 | ctx = context.Background() 19 | ) 20 | 21 | func TestPageQueryRds(t *testing.T) { 22 | req := provider.NewQueryRequest() 23 | pager := operator.QueryBucket(ctx, req) 24 | 25 | for pager.Next() { 26 | set := oss.NewBucketSet() 27 | if err := pager.Scan(ctx, set); err != nil { 28 | panic(err) 29 | } 30 | fmt.Println(set) 31 | } 32 | } 33 | 34 | func init() { 35 | zap.DevelopmentSetup() 36 | err := connectivity.LoadClientFromEnv() 37 | if err != nil { 38 | panic(err) 39 | } 40 | 41 | ec, err := connectivity.C().ObsClient() 42 | if err != nil { 43 | panic(err) 44 | } 45 | operator = op.NewObsOperator(ec) 46 | } 47 | -------------------------------------------------------------------------------- /provider/huawei/rds/impl.go: -------------------------------------------------------------------------------- 1 | package rds 2 | 3 | import ( 4 | hw_rds "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/rds/v3" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewRdsOperator(client *hw_rds.RdsClient) *RdsOperator { 11 | return &RdsOperator{ 12 | client: client, 13 | log: zap.L().Named("hw.rds"), 14 | } 15 | } 16 | 17 | type RdsOperator struct { 18 | client *hw_rds.RdsClient 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/huawei/rds/impl_test.go: -------------------------------------------------------------------------------- 1 | package rds_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/rds" 9 | "github.com/infraboard/cmdb/provider/huawei/connectivity" 10 | "github.com/infraboard/mcube/logger/zap" 11 | 12 | "github.com/infraboard/cmdb/provider" 13 | op "github.com/infraboard/cmdb/provider/huawei/rds" 14 | ) 15 | 16 | var ( 17 | operator provider.RdsOperator 18 | ctx = context.Background() 19 | ) 20 | 21 | func TestPageQueryRds(t *testing.T) { 22 | req := provider.NewQueryRequest() 23 | pager := operator.PageQueryRds(req) 24 | 25 | for pager.Next() { 26 | set := rds.NewSet() 27 | if err := pager.Scan(ctx, set); err != nil { 28 | panic(err) 29 | } 30 | fmt.Println(set) 31 | } 32 | } 33 | 34 | func TestDescribeRds(t *testing.T) { 35 | req := provider.NewDescribeRequest("xxxx") 36 | ins, err := operator.DescribeRds(ctx, req) 37 | if err != nil { 38 | t.Fatal(err) 39 | } 40 | t.Log(ins) 41 | } 42 | 43 | func init() { 44 | zap.DevelopmentSetup() 45 | err := connectivity.LoadClientFromEnv() 46 | if err != nil { 47 | panic(err) 48 | } 49 | 50 | ec, err := connectivity.C().RdsClient() 51 | if err != nil { 52 | panic(err) 53 | } 54 | operator = op.NewRdsOperator(ec) 55 | } 56 | -------------------------------------------------------------------------------- /provider/huawei/rds/mapping.go: -------------------------------------------------------------------------------- 1 | package rds 2 | 3 | import ( 4 | "strings" 5 | 6 | "github.com/infraboard/cmdb/apps/rds" 7 | ) 8 | 9 | var ( 10 | STATUS_MAP = map[string]rds.STATUS{ 11 | "BUILD": rds.STATUS_PENDING, 12 | "ACTIVE": rds.STATUS_RUNNING, 13 | "FAILED": rds.STATUS_ERROR, 14 | "FROZEN": rds.STATUS_ISOLATIONED, 15 | "REBOOTING": rds.STATUS_REBOOTING, 16 | "RESTORING": rds.STATUS_RESTORING, 17 | "MIGRATING": rds.STATUS_TRANSING, 18 | "MODIFYING": rds.STATUS_MODIFYING, 19 | "SWITCHOVER": rds.STATUS_SWITCHOVER, 20 | "STORAGE FULL": rds.STATUS_STORAGE_FULL, 21 | "BACKING UP": rds.STATUS_BACKING_UP, 22 | "INS_CLONING": rds.STATUS_CLONING, 23 | "MODIFYING INSTANCE TYPE": rds.STATUS_MODIFYING, 24 | "MODIFYING DATABASE PORT": rds.STATUS_MODIFYING, 25 | } 26 | ) 27 | 28 | func praseStatus(s string) string { 29 | s = strings.ToUpper(s) 30 | 31 | if v, ok := STATUS_MAP[s]; ok { 32 | return v.String() 33 | } 34 | 35 | return s 36 | } 37 | -------------------------------------------------------------------------------- /provider/huawei/rds/rds_pager.go: -------------------------------------------------------------------------------- 1 | package rds 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/rds/v3/model" 7 | 8 | "github.com/infraboard/mcube/logger" 9 | "github.com/infraboard/mcube/logger/zap" 10 | "github.com/infraboard/mcube/pager" 11 | 12 | "github.com/infraboard/cmdb/utils" 13 | ) 14 | 15 | func newPager(operator *RdsOperator) pager.Pager { 16 | return &rdsPager{ 17 | BasePager: pager.NewBasePager(), 18 | operator: operator, 19 | req: &model.ListInstancesRequest{}, 20 | log: zap.L().Named("huawei.rds"), 21 | } 22 | } 23 | 24 | type rdsPager struct { 25 | *pager.BasePager 26 | operator *RdsOperator 27 | req *model.ListInstancesRequest 28 | log logger.Logger 29 | } 30 | 31 | func (p *rdsPager) Scan(ctx context.Context, set pager.Set) error { 32 | resp, err := p.operator.Query(p.nextReq()) 33 | if err != nil { 34 | return err 35 | } 36 | p.CheckHasNext(resp) 37 | 38 | set.Add(resp.ToAny()...) 39 | return nil 40 | } 41 | 42 | func (p *rdsPager) nextReq() *model.ListInstancesRequest { 43 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 44 | 45 | // 注意: 华为云的Offse表示的是页码 46 | p.req.Offset = utils.Int32Ptr(int32(p.Offset())) 47 | p.req.Limit = utils.Int32Ptr(int32(p.PageSize())) 48 | return p.req 49 | } 50 | -------------------------------------------------------------------------------- /provider/huawei/region/region.go: -------------------------------------------------------------------------------- 1 | package region 2 | 3 | import "github.com/infraboard/cmdb/utils" 4 | 5 | var Regions = []utils.EnumDescribe{ 6 | {Name: "CN_NORTH_1", Value: "cn-north-1", Describe: "华北-北京一"}, 7 | {Name: "CN_NORTH_4", Value: "cn-north-4", Describe: "华北-北京四"}, 8 | {Name: "CN_NORTH_9", Value: "cn-north-9", Describe: "华北-乌兰察布一"}, 9 | {Name: "CN_EAST_3", Value: "cn-east-3", Describe: "华东-上海一"}, 10 | {Name: "CN_SOUTH_1", Value: "cn-south-1", Describe: "华南-广州"}, 11 | {Name: "CN_SOUTH_4", Value: "cn-south-4", Describe: "华南-广州-友好用户环境"}, 12 | {Name: "CN_EAST_2", Value: "cn-east-2", Describe: "华东-上海二"}, 13 | {Name: "CN_SOUTHWEST_2", Value: "cn-southwest-2", Describe: "西南-贵阳一"}, 14 | {Name: "AP_SOUTHEAST_1", Value: "ap-southeast-1", Describe: "中国-香港"}, 15 | {Name: "AP_SOUTHEAST_2", Value: "ap-southeast-2", Describe: "亚太-曼谷"}, 16 | {Name: "AP_SOUTHEAST_3", Value: "ap-southeast-3", Describe: "亚太-新加坡"}, 17 | {Name: "AF_SOUTH_1", Value: "af-south-1", Describe: "非洲-约翰内斯堡"}, 18 | {Name: "NA_MEXICO_1", Value: "na-mexico-1", Describe: "拉美-墨西哥城一"}, 19 | {Name: "LA_NORTH_1", Value: "la-north-2", Describe: "拉美-墨西哥城二"}, 20 | {Name: "SA_BRAZIL_1", Value: "sa-brazil-1", Describe: "拉美-圣保罗一"}, 21 | {Name: "LA_SOUTH_2", Value: "la-south-2", Describe: "拉美-圣地亚哥"}, 22 | } 23 | -------------------------------------------------------------------------------- /provider/lb.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/infraboard/cmdb/apps/lb" 7 | "github.com/infraboard/mcube/pager" 8 | ) 9 | 10 | type LoadBalancerOperator interface { 11 | DescribeLoadBalancer(context.Context, *DescribeRequest) (*lb.LoadBalancer, error) 12 | PageQueryLoadBalancer(*QueryRequest) pager.Pager 13 | } 14 | -------------------------------------------------------------------------------- /provider/mongo.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import "github.com/infraboard/mcube/pager" 4 | 5 | type MongoOperator interface { 6 | PageQueryMongo(req *QueryRequest) pager.Pager 7 | } 8 | -------------------------------------------------------------------------------- /provider/openstack/README.md: -------------------------------------------------------------------------------- 1 | # openstack 2 | 3 | 参考SDK https://github.com/gophercloud/gophercloud -------------------------------------------------------------------------------- /provider/oss.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/infraboard/mcube/pager" 7 | ) 8 | 9 | type OssOperator interface { 10 | QueryBucket(ctx context.Context, req *QueryRequest) pager.Pager 11 | } 12 | -------------------------------------------------------------------------------- /provider/rds.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/infraboard/cmdb/apps/rds" 7 | "github.com/infraboard/mcube/pager" 8 | ) 9 | 10 | type RdsOperator interface { 11 | PageQueryRds(req *QueryRequest) pager.Pager 12 | DescribeRds(ctx context.Context, req *DescribeRequest) (*rds.Rds, error) 13 | } 14 | -------------------------------------------------------------------------------- /provider/redis.go: -------------------------------------------------------------------------------- 1 | package provider 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/infraboard/cmdb/apps/redis" 7 | "github.com/infraboard/mcube/pager" 8 | ) 9 | 10 | type RedisOperator interface { 11 | PageQueryRedis(req *QueryRequest) pager.Pager 12 | DescribeRedis(context.Context, *DescribeRequest) (*redis.Redis, error) 13 | } 14 | -------------------------------------------------------------------------------- /provider/txyun/billing/README.md: -------------------------------------------------------------------------------- 1 | # 账单管理 2 | 3 | + [查询账单明细数据](https://console.cloud.tencent.com/api/explorer?Product=billing&Version=2018-07-09&Action=DescribeBillDetail) -------------------------------------------------------------------------------- /provider/txyun/billing/impl.go: -------------------------------------------------------------------------------- 1 | package billing 2 | 3 | import ( 4 | billing "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/billing/v20180709" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewBillingoperator(client *billing.Client) *BillOperator { 11 | return &BillOperator{ 12 | client: client, 13 | log: zap.L().Named("tx.billing"), 14 | } 15 | } 16 | 17 | type BillOperator struct { 18 | client *billing.Client 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/txyun/cdb/cdb_price.go: -------------------------------------------------------------------------------- 1 | package cdb 2 | 3 | // 查询数据库价格 (CDB) 4 | // 参考文档: https://console.cloud.tencent.com/api/explorer?Product=cdb&Version=2017-03-20&Action=DescribeDBPrice&SignVersion= 5 | -------------------------------------------------------------------------------- /provider/txyun/cdb/impl.go: -------------------------------------------------------------------------------- 1 | package cdb 2 | 3 | import ( 4 | cdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb/v20170320" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewCDBOperator(client *cdb.Client) *CDBOperator { 11 | return &CDBOperator{ 12 | client: client, 13 | log: zap.L().Named("tx.cdb"), 14 | } 15 | } 16 | 17 | type CDBOperator struct { 18 | client *cdb.Client 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/txyun/cdb/impl_test.go: -------------------------------------------------------------------------------- 1 | package cdb_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/rds" 9 | "github.com/infraboard/cmdb/provider" 10 | op "github.com/infraboard/cmdb/provider/txyun/cdb" 11 | "github.com/infraboard/cmdb/provider/txyun/connectivity" 12 | "github.com/infraboard/mcube/logger/zap" 13 | ) 14 | 15 | var ( 16 | operator *op.CDBOperator 17 | ctx = context.Background() 18 | ) 19 | 20 | func TestPageQueryRds(t *testing.T) { 21 | req := provider.NewQueryRequest() 22 | pager := operator.PageQueryRds(req) 23 | 24 | for pager.Next() { 25 | set := rds.NewSet() 26 | if err := pager.Scan(ctx, set); err != nil { 27 | panic(err) 28 | } 29 | for i := range set.Items { 30 | fmt.Println(set.Items[i]) 31 | } 32 | } 33 | } 34 | 35 | func TestDescribeRds(t *testing.T) { 36 | req := provider.NewDescribeRequest("mssql-9ljodgmg") 37 | ins, err := operator.DescribeRds(ctx, req) 38 | if err != nil { 39 | t.Fatal(err) 40 | } 41 | t.Log(ins) 42 | } 43 | 44 | func init() { 45 | zap.DevelopmentSetup() 46 | err := connectivity.LoadClientFromEnv() 47 | if err != nil { 48 | panic(err) 49 | } 50 | 51 | client := connectivity.C() 52 | operator = op.NewCDBOperator(client.CDBClient()) 53 | } 54 | -------------------------------------------------------------------------------- /provider/txyun/clb/clb_pager.go: -------------------------------------------------------------------------------- 1 | package clb 2 | 3 | import ( 4 | "context" 5 | 6 | clb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317" 7 | "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" 8 | 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newPager(operator *CLBOperator) pager.Pager { 15 | return &clbPager{ 16 | BasePager: pager.NewBasePager(), 17 | operator: operator, 18 | req: clb.NewDescribeLoadBalancersRequest(), 19 | log: zap.L().Named("tx.clb"), 20 | } 21 | } 22 | 23 | type clbPager struct { 24 | *pager.BasePager 25 | operator *CLBOperator 26 | req *clb.DescribeLoadBalancersRequest 27 | log logger.Logger 28 | } 29 | 30 | func (p *clbPager) Scan(ctx context.Context, set pager.Set) error { 31 | resp, err := p.operator.QueryLoadBalancer(ctx, p.nextReq()) 32 | if err != nil { 33 | return err 34 | } 35 | p.CheckHasNext(resp) 36 | p.log.Debugf("get %d clb", len(resp.Items)) 37 | 38 | set.Add(resp.ToAny()...) 39 | return nil 40 | } 41 | 42 | func (p *clbPager) nextReq() *clb.DescribeLoadBalancersRequest { 43 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 44 | p.req.Offset = common.Int64Ptr(int64(p.Offset())) 45 | p.req.Limit = common.Int64Ptr(int64(p.PageSize())) 46 | return p.req 47 | } 48 | -------------------------------------------------------------------------------- /provider/txyun/clb/impl.go: -------------------------------------------------------------------------------- 1 | package clb 2 | 3 | import ( 4 | "github.com/infraboard/mcube/logger" 5 | "github.com/infraboard/mcube/logger/zap" 6 | clb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317" 7 | ) 8 | 9 | func NewCLBOperator(client *clb.Client) *CLBOperator { 10 | return &CLBOperator{ 11 | client: client, 12 | log: zap.L().Named("tx.clb"), 13 | } 14 | } 15 | 16 | type CLBOperator struct { 17 | client *clb.Client 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/txyun/clb/impl_test.go: -------------------------------------------------------------------------------- 1 | package clb_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/lb" 9 | "github.com/infraboard/cmdb/provider" 10 | op "github.com/infraboard/cmdb/provider/txyun/clb" 11 | "github.com/infraboard/cmdb/provider/txyun/connectivity" 12 | "github.com/infraboard/mcube/logger/zap" 13 | ) 14 | 15 | var ( 16 | operator *op.CLBOperator 17 | ctx = context.Background() 18 | ) 19 | 20 | func TestPageQueryLoadBalancer(t *testing.T) { 21 | req := provider.NewQueryRequest() 22 | pager := operator.PageQueryLoadBalancer(req) 23 | 24 | for pager.Next() { 25 | set := lb.NewLoadBalancerSet() 26 | if err := pager.Scan(ctx, set); err != nil { 27 | panic(err) 28 | } 29 | fmt.Println(set) 30 | } 31 | } 32 | 33 | func TestDescribeLoadBalancer(t *testing.T) { 34 | req := provider.NewDescribeRequest("xxx") 35 | ins, err := operator.DescribeLoadBalancer(ctx, req) 36 | if err != nil { 37 | t.Fatal(err) 38 | } 39 | t.Log(ins) 40 | } 41 | 42 | func init() { 43 | zap.DevelopmentSetup() 44 | err := connectivity.LoadClientFromEnv() 45 | if err != nil { 46 | panic(err) 47 | } 48 | 49 | client := connectivity.C() 50 | operator = op.NewCLBOperator(client.ClbClient()) 51 | } 52 | -------------------------------------------------------------------------------- /provider/txyun/clb/mapping.go: -------------------------------------------------------------------------------- 1 | package clb 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/infraboard/cmdb/apps/lb" 7 | ) 8 | 9 | var ( 10 | // 0:创建中 11 | // 1:正常运行。 12 | CLB_STATUS_MAP = map[uint64]lb.STATUS{ 13 | 0: lb.STATUS_PENDING, 14 | 1: lb.STATUS_RUNNING, 15 | } 16 | ) 17 | 18 | func praseClbStatus(s *uint64) string { 19 | if s == nil { 20 | return "" 21 | } 22 | 23 | if v, ok := CLB_STATUS_MAP[*s]; ok { 24 | return v.String() 25 | } 26 | 27 | return fmt.Sprintf("%d", *s) 28 | } 29 | -------------------------------------------------------------------------------- /provider/txyun/cloudaudit/README.md: -------------------------------------------------------------------------------- 1 | # 云审计 2 | 3 | [云审计服务文档](https://cloud.tencent.com/document/product/629) 4 | [云审计控制台](https://console.cloud.tencent.com/cloudaudit) 5 | 6 | ## CVM常用事件 7 | 8 | + RunInstances(创建实例) 9 | + TerminateInstances(退还实例) 10 | + PurgeInstances(销毁实例) 11 | + ModifyInstancesAttribute(修改实例的属性) 12 | 13 | ## CDB常用事件 14 | 15 | + CreateDBInstance(创建云数据库实例(包年包月)) 16 | + CreateDBInstanceHour(创建云数据库实例(按量计费)) 17 | + IsolateDBInstance(隔离云数据库实例) 18 | 19 | 20 | ## Redis常用事件 21 | 22 | + CleanUpInstance(回收站实例立即下线) 23 | + DestroyPostpaidInstance(按量计费实例销毁) 24 | + DestroyPrepaidInstance(包年包月实例退还) -------------------------------------------------------------------------------- /provider/txyun/cloudaudit/events.go: -------------------------------------------------------------------------------- 1 | package cloudaudit 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | 7 | "github.com/infraboard/cmdb/apps/lb" 8 | "github.com/infraboard/cmdb/provider" 9 | "github.com/infraboard/mcube/pager" 10 | cloudaudit "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit/v20190319" 11 | ) 12 | 13 | func (o *Operator) PageQueryEvents(req *provider.QueryEventRequest) pager.Pager { 14 | p := newPager(o, req) 15 | p.SetRate(float64(req.Rate)) 16 | return p 17 | } 18 | 19 | // 用于对操作日志进行检索,便于用户进行查询相关的操作信息 20 | // 参考: https://console.cloud.tencent.com/api/explorer?Product=cloudaudit&Version=2019-03-19&Action=DescribeEvents&SignVersion= 21 | func (o *Operator) QueryEvents(ctx context.Context, req *cloudaudit.DescribeEventsRequest) (*lb.LoadBalancerSet, error) { 22 | resp, err := o.client.DescribeEventsWithContext(ctx, req) 23 | if err != nil { 24 | return nil, err 25 | } 26 | 27 | req.NextToken = resp.Response.NextToken 28 | fmt.Println(resp.ToJsonString()) 29 | return nil, nil 30 | } 31 | -------------------------------------------------------------------------------- /provider/txyun/cloudaudit/impl.go: -------------------------------------------------------------------------------- 1 | package cloudaudit 2 | 3 | import ( 4 | "github.com/infraboard/mcube/logger" 5 | "github.com/infraboard/mcube/logger/zap" 6 | cloudaudit "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit/v20190319" 7 | ) 8 | 9 | func NewOperator(client *cloudaudit.Client) *Operator { 10 | return &Operator{ 11 | client: client, 12 | log: zap.L().Named("tx.cloudaudit"), 13 | } 14 | } 15 | 16 | type Operator struct { 17 | client *cloudaudit.Client 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/txyun/cloudaudit/impl_test.go: -------------------------------------------------------------------------------- 1 | package cloudaudit_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | "time" 8 | 9 | "github.com/infraboard/cmdb/apps/lb" 10 | "github.com/infraboard/cmdb/provider" 11 | op "github.com/infraboard/cmdb/provider/txyun/cloudaudit" 12 | "github.com/infraboard/cmdb/provider/txyun/connectivity" 13 | "github.com/infraboard/mcube/logger/zap" 14 | ) 15 | 16 | var ( 17 | operator *op.Operator 18 | ctx = context.Background() 19 | ) 20 | 21 | func TestPageQueryLoadBalancer(t *testing.T) { 22 | req := provider.NewQueryEventRequest() 23 | req.StartTime = time.Now().Add(-24 * 30 * time.Hour) 24 | pager := operator.PageQueryEvents(req) 25 | 26 | for pager.Next() { 27 | set := lb.NewLoadBalancerSet() 28 | if err := pager.Scan(ctx, set); err != nil { 29 | panic(err) 30 | } 31 | fmt.Println(set) 32 | } 33 | } 34 | 35 | func init() { 36 | zap.DevelopmentSetup() 37 | err := connectivity.LoadClientFromEnv() 38 | if err != nil { 39 | panic(err) 40 | } 41 | 42 | client := connectivity.C() 43 | operator = op.NewOperator(client.AuditClient()) 44 | } 45 | -------------------------------------------------------------------------------- /provider/txyun/cloudaudit/sample/RunInstances_list.json: -------------------------------------------------------------------------------- 1 | { 2 | "Response": { 3 | "ListOver": true, 4 | "NextToken": 111111, 5 | "Events": [ 6 | { 7 | "Username": "xxxx", 8 | "EventTime": "1661495571", 9 | "CloudAuditEvent":"", 10 | "ResourceTypeCn": "云服务器", 11 | "ErrorCode": 0, 12 | "EventName": "RunInstances", 13 | "SecretId": "", 14 | "EventSource": "cvm.tencentcloudapi.com", 15 | "RequestID": "xxxxx", 16 | "ResourceRegion": "ap-shanghai", 17 | "AccountID": 1000, 18 | "SourceIPAddress": "10.10.10.10", 19 | "EventNameCn": "创建实例", 20 | "Resources": { 21 | "ResourceType": "cvm", 22 | "ResourceName": "instance/*|image/img-xxxx1|sg/sg-xxx|sg/sg-xxxx|subnet/subnet-xxxx|systemdisk/*|vpc/vpc-xxxx" 23 | }, 24 | "EventRegion": "ap-shanghai", 25 | "Location": "未知" 26 | } 27 | ] 28 | } 29 | } -------------------------------------------------------------------------------- /provider/txyun/cloudaudit/sample/StartInstances.json: -------------------------------------------------------------------------------- 1 | { 2 | "Response": { 3 | "ListOver": true, 4 | "NextToken": 11111, 5 | "Events": [ 6 | { 7 | "Username": "xxx", 8 | "EventTime": "1661432283", 9 | "CloudAuditEvent": "", 10 | "ResourceTypeCn": "云服务器", 11 | "ErrorCode": 0, 12 | "EventName": "StartInstances", 13 | "SecretId": "xxx-xxxx", 14 | "EventSource": "cvm.ap-guangzhou.api.tencentyun.com/", 15 | "RequestID": "xxxx", 16 | "ResourceRegion": "ap-shanghai", 17 | "AccountID": 111111, 18 | "SourceIPAddress": "10.10.10.10", 19 | "EventNameCn": "启动实例", 20 | "Resources": { 21 | "ResourceType": "cvm", 22 | "ResourceName": "instance/ins-xxxx" 23 | }, 24 | "EventRegion": "ap-shanghai", 25 | "Location": "未知" 26 | } 27 | ] 28 | } 29 | } -------------------------------------------------------------------------------- /provider/txyun/cloudaudit/sample/TerminateInstances_list.json: -------------------------------------------------------------------------------- 1 | { 2 | "Response": { 3 | "ListOver": true, 4 | "NextToken": 11111, 5 | "Events": [ 6 | { 7 | "Username": "xxxxx", 8 | "EventTime": "1661330748", 9 | "CloudAuditEvent": "", 10 | "ResourceTypeCn": "云服务器", 11 | "ErrorCode": 0, 12 | "EventName": "TerminateInstances", 13 | "SecretId": "", 14 | "EventSource": "cvm.tencentcloudapi.com", 15 | "RequestID": "xxxxxx", 16 | "ResourceRegion": "ap-shanghai", 17 | "AccountID": 10000, 18 | "SourceIPAddress": "10.10.10.10", 19 | "EventNameCn": "退还实例", 20 | "Resources": { 21 | "ResourceType": "cvm", 22 | "ResourceName": "instance/ins-xxxx1|instance/ins-xxxx2|instance/ins-xxx3" 23 | }, 24 | "EventRegion": "ap-shanghai", 25 | "Location": "未知" 26 | } 27 | ] 28 | } 29 | } -------------------------------------------------------------------------------- /provider/txyun/connectivity/client_test.go: -------------------------------------------------------------------------------- 1 | package connectivity_test 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/infraboard/cmdb/provider/txyun/connectivity" 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | func TestClient(t *testing.T) { 12 | should := assert.New(t) 13 | 14 | err := connectivity.LoadClientFromEnv() 15 | if should.NoError(err) { 16 | c := connectivity.C() 17 | fmt.Println(c.Account()) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /provider/txyun/cos/bucket_pager.go: -------------------------------------------------------------------------------- 1 | package cos 2 | 3 | import ( 4 | "context" 5 | 6 | cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312" 7 | 8 | "github.com/infraboard/cmdb/apps/oss" 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/pager" 11 | ) 12 | 13 | func newPager(operator *CosOperator) pager.Pager { 14 | req := cvm.NewDescribeInstancesRequest() 15 | 16 | return &cosPager{ 17 | BasePager: pager.NewBasePager(), 18 | operator: operator, 19 | req: req, 20 | log: operator.log, 21 | } 22 | } 23 | 24 | type cosPager struct { 25 | *pager.BasePager 26 | operator *CosOperator 27 | req *cvm.DescribeInstancesRequest 28 | log logger.Logger 29 | } 30 | 31 | func (p *cosPager) Scan(ctx context.Context, set pager.Set) error { 32 | resp, err := p.operator.queryBucket(ctx) 33 | if err != nil { 34 | return err 35 | } 36 | // 无分页 37 | resp.Items = []*oss.Bucket{} 38 | p.CheckHasNext(resp) 39 | p.log.Debugf("get %d buckets", len(resp.Items)) 40 | 41 | set.Add(resp.ToAny()...) 42 | return nil 43 | } 44 | -------------------------------------------------------------------------------- /provider/txyun/cos/impl.go: -------------------------------------------------------------------------------- 1 | package cos 2 | 3 | import ( 4 | "github.com/tencentyun/cos-go-sdk-v5" 5 | 6 | "github.com/infraboard/cmdb/apps/resource" 7 | "github.com/infraboard/mcube/logger" 8 | "github.com/infraboard/mcube/logger/zap" 9 | ) 10 | 11 | func NewCosOperator(client *cos.Client) *CosOperator { 12 | return &CosOperator{ 13 | client: client, 14 | log: zap.L().Named("tx.cos"), 15 | AccountGetter: &resource.AccountGetter{}, 16 | } 17 | } 18 | 19 | type CosOperator struct { 20 | client *cos.Client 21 | log logger.Logger 22 | *resource.AccountGetter 23 | } 24 | -------------------------------------------------------------------------------- /provider/txyun/cos/impl_test.go: -------------------------------------------------------------------------------- 1 | package cos_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/oss" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/cmdb/provider/txyun" 11 | "github.com/infraboard/mcube/logger/zap" 12 | ) 13 | 14 | var ( 15 | operator provider.OssOperator 16 | ctx = context.Background() 17 | ) 18 | 19 | func TestQuery(t *testing.T) { 20 | pager := operator.QueryBucket(ctx, provider.NewQueryRequestWithRate(5)) 21 | 22 | for pager.Next() { 23 | set := oss.NewBucketSet() 24 | if err := pager.Scan(ctx, set); err != nil { 25 | panic(err) 26 | } 27 | fmt.Println(set) 28 | } 29 | } 30 | 31 | func init() { 32 | zap.DevelopmentSetup() 33 | 34 | err := txyun.LoadOperatorFromEnv() 35 | if err != nil { 36 | panic(err) 37 | } 38 | 39 | operator = txyun.O().OssOperator() 40 | } 41 | -------------------------------------------------------------------------------- /provider/txyun/cvm/cvm_pager.go: -------------------------------------------------------------------------------- 1 | package cvm 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" 7 | cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312" 8 | 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | "github.com/infraboard/mcube/pager" 12 | ) 13 | 14 | func newPager(operator *CVMOperator) pager.Pager { 15 | req := cvm.NewDescribeInstancesRequest() 16 | 17 | return &cvmPager{ 18 | BasePager: pager.NewBasePager(), 19 | operator: operator, 20 | req: req, 21 | log: zap.L().Named("tx.cvm"), 22 | } 23 | } 24 | 25 | type cvmPager struct { 26 | *pager.BasePager 27 | operator *CVMOperator 28 | req *cvm.DescribeInstancesRequest 29 | log logger.Logger 30 | } 31 | 32 | func (p *cvmPager) Scan(ctx context.Context, set pager.Set) error { 33 | resp, err := p.operator.QueryCVM(ctx, p.nextReq()) 34 | if err != nil { 35 | return err 36 | } 37 | p.CheckHasNext(resp) 38 | p.log.Debugf("get %d hosts", len(resp.Items)) 39 | 40 | set.Add(resp.ToAny()...) 41 | return nil 42 | } 43 | 44 | func (p *cvmPager) nextReq() *cvm.DescribeInstancesRequest { 45 | p.log.Debugf("请求第%d页数据", p.PageNumber()) 46 | p.req.Offset = common.Int64Ptr(p.Offset()) 47 | p.req.Limit = common.Int64Ptr(int64(p.PageSize())) 48 | return p.req 49 | } 50 | -------------------------------------------------------------------------------- /provider/txyun/cvm/cvm_price.go: -------------------------------------------------------------------------------- 1 | package cvm 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | 7 | cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312" 8 | ) 9 | 10 | // 创建实例询价 11 | // 创建实例询价 https://cloud.tencent.com/document/api/213/15726 12 | // 参考文档: https://console.cloud.tencent.com/api/explorer?Product=cvm&Version=2017-03-12&Action=InquiryPriceRunInstances&SignVersion= 13 | func (o *CVMOperator) InquiryNewPrice(req *cvm.InquiryPriceRunInstancesRequest) error { 14 | resp, err := o.client.InquiryPriceRunInstances(req) 15 | if err != nil { 16 | return err 17 | } 18 | 19 | v, _ := json.Marshal(resp) 20 | fmt.Println(string(v)) 21 | return nil 22 | } 23 | 24 | // 续费实例询价 25 | // 参考文档: https://console.cloud.tencent.com/api/explorer?Product=cvm&Version=2017-03-12&Action=InquiryPriceRenewInstances&SignVersion= 26 | func (o *CVMOperator) InquiryRenewPrice(req *cvm.InquiryPriceRenewInstancesRequest) error { 27 | resp, err := o.client.InquiryPriceRenewInstances(req) 28 | if err != nil { 29 | return err 30 | } 31 | 32 | v, _ := json.Marshal(resp) 33 | fmt.Println(string(v)) 34 | return nil 35 | } 36 | -------------------------------------------------------------------------------- /provider/txyun/cvm/impl.go: -------------------------------------------------------------------------------- 1 | package cvm 2 | 3 | import ( 4 | cbs "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs/v20170312" 5 | cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312" 6 | vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312" 7 | 8 | "github.com/infraboard/cmdb/apps/resource" 9 | "github.com/infraboard/mcube/logger" 10 | "github.com/infraboard/mcube/logger/zap" 11 | ) 12 | 13 | func NewCVMOperator(client *cvm.Client, cbs *cbs.Client, vpc *vpc.Client) *CVMOperator { 14 | return &CVMOperator{ 15 | cbs: cbs, 16 | client: client, 17 | vpc: vpc, 18 | log: zap.L().Named("tx.cvm"), 19 | AccountGetter: &resource.AccountGetter{}, 20 | } 21 | } 22 | 23 | type CVMOperator struct { 24 | client *cvm.Client 25 | cbs *cbs.Client 26 | vpc *vpc.Client 27 | log logger.Logger 28 | *resource.AccountGetter 29 | } 30 | -------------------------------------------------------------------------------- /provider/txyun/cvm/sample/disk.json: -------------------------------------------------------------------------------- 1 | { 2 | "DeleteWithInstance": false, 3 | "RenewFlag": "NOTIFY_AND_AUTO_RENEW", 4 | "DiskType": "CLOUD_SSD", 5 | "DiskState": "ATTACHED", 6 | "SnapshotCount": 0, 7 | "AutoRenewFlagError": false, 8 | "Rollbacking": false, 9 | "InstanceIdList": [ 10 | "ins-xxxx" 11 | ], 12 | "Encrypt": false, 13 | "DiskName": "xxx", 14 | "BackupDisk": true, 15 | "InstanceId": "ins-xxxx", 16 | "ThroughputPerformance": 0, 17 | "Migrating": false, 18 | "DiskId": "disk-xxxx", 19 | "SnapshotSize": 0, 20 | "Placement": { 21 | "Zone": "ap-shanghai-4", 22 | "CageId": "", 23 | "ProjectId": 1008601, 24 | "CdcName": "", 25 | "CdcId": "" 26 | }, 27 | "IsReturnable": true, 28 | "DeadlineTime": "2022-08-21 14:08:01", 29 | "Attached": true, 30 | "DiskSize": 500, 31 | "MigratePercent": 0, 32 | "DiskUsage": "DATA_DISK", 33 | "DiskChargeType": "PREPAID", 34 | "Portable": true, 35 | "SnapshotAbility": true, 36 | "DeadlineError": false, 37 | "RollbackPercent": 0, 38 | "DifferDaysOfDeadline": 24, 39 | "ReturnFailCode": 0, 40 | "Shareable": false, 41 | "CreateTime": "2022-07-21 14:08:00", 42 | "DeleteSnapshot": 0, 43 | "DiskBackupCount": 0, 44 | "InstanceType": "CVM" 45 | } -------------------------------------------------------------------------------- /provider/txyun/cvm/sample/eip.json: -------------------------------------------------------------------------------- 1 | { 2 | "AddressId": "eip-xxx", 3 | "AddressStatus": "BIND", 4 | "AddressIp": "xxxxx", 5 | "InstanceId": "ins-xxxx", 6 | "CreatedTime": "2018-12-01T03:00:27Z", 7 | "NetworkInterfaceId": "eni-xxx", 8 | "PrivateAddressIp": "xxxxxx", 9 | "IsArrears": false, 10 | "IsBlocked": false, 11 | "IsEipDirectConnection": false, 12 | "AddressType": "EIP", 13 | "CascadeRelease": false, 14 | "EipAlgType": { 15 | "Ftp": true, 16 | "Sip": true 17 | }, 18 | "InternetServiceProvider": "BGP", 19 | "LocalBgp": false 20 | } -------------------------------------------------------------------------------- /provider/txyun/dns/impl.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | "github.com/infraboard/mcube/logger" 5 | "github.com/infraboard/mcube/logger/zap" 6 | dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323" 7 | ) 8 | 9 | func NewDnsOperator(client *dnspod.Client) *DnsOperator { 10 | return &DnsOperator{ 11 | client: client, 12 | log: zap.L().Named("tx.dns"), 13 | } 14 | } 15 | 16 | type DnsOperator struct { 17 | client *dnspod.Client 18 | log logger.Logger 19 | } 20 | -------------------------------------------------------------------------------- /provider/txyun/dns/sample/domain.json: -------------------------------------------------------------------------------- 1 | { 2 | "DomainId": 80000000, 3 | "Name": "xxxxx.com", 4 | "Status": "ENABLE", 5 | "TTL": 600, 6 | "CNAMESpeedup": "DISABLE", 7 | "DNSStatus": "", 8 | "Grade": "DP_FREE", 9 | "GroupId": 1, 10 | "SearchEnginePush": "NO", 11 | "Remark": "", 12 | "Punycode": "xxxxxx.com", 13 | "EffectiveDNS": [ 14 | "dana.dnspod.net", 15 | "lena.dnspod.net" 16 | ], 17 | "GradeLevel": 2, 18 | "GradeTitle": "免费版", 19 | "IsVip": "NO", 20 | "VipStartAt": "0000-00-00 00:00:00", 21 | "VipEndAt": "0000-00-00 00:00:00", 22 | "VipAutoRenew": "NO", 23 | "RecordCount": 4, 24 | "CreatedOn": "2021-09-10 15:58:02", 25 | "UpdatedOn": "2021-09-10 16:08:06", 26 | "Owner": "xxxxxxxxx.com" 27 | } -------------------------------------------------------------------------------- /provider/txyun/dns/sample/record.json: -------------------------------------------------------------------------------- 1 | { 2 | "RecordId": 30111111, 3 | "Value": "131.1.1.1", 4 | "Status": "DISABLE", 5 | "UpdatedOn": "2017-05-31 22:08:38", 6 | "Name": "mall", 7 | "Line": "境外", 8 | "LineId": "3=0", 9 | "Type": "A", 10 | "MonitorStatus": "", 11 | "Remark": "", 12 | "TTL": 3600, 13 | "MX": 0 14 | } -------------------------------------------------------------------------------- /provider/txyun/mongo/impl.go: -------------------------------------------------------------------------------- 1 | package mongo 2 | 3 | import ( 4 | mongodb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb/v20190725" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewMongoOperator(client *mongodb.Client) *MongoOperator { 11 | return &MongoOperator{ 12 | client: client, 13 | log: zap.L().Named("tx.mongodb"), 14 | } 15 | } 16 | 17 | type MongoOperator struct { 18 | client *mongodb.Client 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/txyun/mongo/impl_test.go: -------------------------------------------------------------------------------- 1 | package mongo_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/mongodb" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/cmdb/provider/txyun/connectivity" 11 | op "github.com/infraboard/cmdb/provider/txyun/mongo" 12 | "github.com/infraboard/mcube/logger/zap" 13 | ) 14 | 15 | var ( 16 | operator *op.MongoOperator 17 | ctx = context.Background() 18 | ) 19 | 20 | func TestPageQueryMongoDB(t *testing.T) { 21 | req := provider.NewQueryRequestWithRate(5) 22 | pager := operator.PageQueryMongoDB(req) 23 | 24 | for pager.Next() { 25 | set := mongodb.NewMongoDBSet() 26 | if err := pager.Scan(ctx, set); err != nil { 27 | panic(err) 28 | } 29 | for i := range set.Items { 30 | fmt.Println(set.Items[i]) 31 | } 32 | } 33 | } 34 | 35 | func init() { 36 | zap.DevelopmentSetup() 37 | err := connectivity.LoadClientFromEnv() 38 | if err != nil { 39 | panic(err) 40 | } 41 | 42 | client := connectivity.C() 43 | operator = op.NewMongoOperator(client.MongoClient()) 44 | } 45 | -------------------------------------------------------------------------------- /provider/txyun/mongo/mapping.go: -------------------------------------------------------------------------------- 1 | package mongo 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/infraboard/cmdb/apps/mongodb" 7 | ) 8 | 9 | var ( 10 | // 0-待初始化,1-流程执行中,2-实例有效,-2-已隔离(包年包月实例),-3-已隔离(按量计费实例) 11 | // 参考文档: https://console.cloud.tencent.com/api/explorer?Product=mongodb&Version=2019-07-25&Action=DescribeDBInstances&SignVersion= 12 | STATUS_MAP = map[int64]mongodb.STATUS{ 13 | 0: mongodb.STATUS_PENDING, 14 | 1: mongodb.STATUS_PENDING, 15 | 2: mongodb.STATUS_RUNNING, 16 | -2: mongodb.STATUS_ISOLATIONED, 17 | -3: mongodb.STATUS_ISOLATIONED, 18 | } 19 | ) 20 | 21 | func praseStatus(s int64) string { 22 | if v, ok := STATUS_MAP[s]; ok { 23 | return v.String() 24 | } 25 | 26 | return fmt.Sprintf("%d", s) 27 | } 28 | -------------------------------------------------------------------------------- /provider/txyun/mongo/sample/list_connectons.json: -------------------------------------------------------------------------------- 1 | { 2 | "Response": { 3 | "Clients": [ 4 | { 5 | "Count": 6, 6 | "IP": "xxxx", 7 | "InternalService": true 8 | }, 9 | { 10 | "Count": 3, 11 | "IP": "xxxx", 12 | "InternalService": true 13 | }, 14 | { 15 | "Count": 1, 16 | "IP": "xxx", 17 | "InternalService": true 18 | } 19 | ], 20 | "RequestId": "xxxx", 21 | "TotalCount": 3 22 | } 23 | } -------------------------------------------------------------------------------- /provider/txyun/redis/impl.go: -------------------------------------------------------------------------------- 1 | package redis 2 | 3 | import ( 4 | redis "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/redis/v20180412" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewRedisOperator(client *redis.Client) *RedisOperator { 11 | return &RedisOperator{ 12 | client: client, 13 | log: zap.L().Named("tx.redis"), 14 | } 15 | } 16 | 17 | type RedisOperator struct { 18 | client *redis.Client 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/txyun/redis/impl_test.go: -------------------------------------------------------------------------------- 1 | package redis_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/redis" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/cmdb/provider/txyun/connectivity" 11 | op "github.com/infraboard/cmdb/provider/txyun/redis" 12 | "github.com/infraboard/mcube/logger/zap" 13 | ) 14 | 15 | var ( 16 | operator *op.RedisOperator 17 | ctx = context.Background() 18 | ) 19 | 20 | func TestPageQueryRedis(t *testing.T) { 21 | req := provider.NewQueryRequestWithRate(5) 22 | pager := operator.PageQueryRedis(req) 23 | 24 | for pager.Next() { 25 | set := redis.NewSet() 26 | if err := pager.Scan(context.Background(), set); err != nil { 27 | panic(err) 28 | } 29 | for i := range set.Items { 30 | fmt.Println(set.Items[i]) 31 | } 32 | } 33 | } 34 | 35 | func TestDescribeRedis(t *testing.T) { 36 | req := provider.NewDescribeRequest("xxx") 37 | ins, err := operator.DescribeRedis(ctx, req) 38 | if err != nil { 39 | t.Fatal(err) 40 | } 41 | t.Log(ins) 42 | } 43 | 44 | func init() { 45 | zap.DevelopmentSetup() 46 | err := connectivity.LoadClientFromEnv() 47 | if err != nil { 48 | panic(err) 49 | } 50 | 51 | client := connectivity.C() 52 | operator = op.NewRedisOperator(client.RedisClient()) 53 | } 54 | -------------------------------------------------------------------------------- /provider/txyun/sqlserver/impl.go: -------------------------------------------------------------------------------- 1 | package sqlserver 2 | 3 | import ( 4 | sqlserver "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sqlserver/v20180328" 5 | 6 | "github.com/infraboard/mcube/logger" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func NewSQLServerOperator(client *sqlserver.Client) *SQLServerOperator { 11 | return &SQLServerOperator{ 12 | client: client, 13 | log: zap.L().Named("tx.cdb"), 14 | } 15 | } 16 | 17 | type SQLServerOperator struct { 18 | client *sqlserver.Client 19 | log logger.Logger 20 | } 21 | -------------------------------------------------------------------------------- /provider/txyun/sqlserver/impl_test.go: -------------------------------------------------------------------------------- 1 | package sqlserver_test 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "testing" 7 | 8 | "github.com/infraboard/cmdb/apps/rds" 9 | "github.com/infraboard/cmdb/provider" 10 | "github.com/infraboard/cmdb/provider/txyun/connectivity" 11 | op "github.com/infraboard/cmdb/provider/txyun/sqlserver" 12 | "github.com/infraboard/mcube/logger/zap" 13 | ) 14 | 15 | var ( 16 | operator *op.SQLServerOperator 17 | ctx = context.Background() 18 | ) 19 | 20 | func TestPageQueryRds(t *testing.T) { 21 | req := provider.NewQueryRequest() 22 | pager := operator.PageQueryRds(req) 23 | 24 | for pager.Next() { 25 | set := rds.NewSet() 26 | if err := pager.Scan(ctx, set); err != nil { 27 | panic(err) 28 | } 29 | for i := range set.Items { 30 | fmt.Println(set.Items[i]) 31 | } 32 | } 33 | } 34 | 35 | func init() { 36 | zap.DevelopmentSetup() 37 | err := connectivity.LoadClientFromEnv() 38 | if err != nil { 39 | panic(err) 40 | } 41 | 42 | client := connectivity.C() 43 | operator = op.NewSQLServerOperator(client.SQLServerClient()) 44 | } 45 | -------------------------------------------------------------------------------- /provider/txyun/sqlserver/mapping.go: -------------------------------------------------------------------------------- 1 | package sqlserver 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/infraboard/cmdb/apps/rds" 7 | ) 8 | 9 | // 实例状态,可取值: 10 | // 1:申请中 11 | // 2:运行中 12 | // 3:受限运行中 (主备切换中) 13 | // 4:已隔离 14 | // 5:回收中 15 | // 6:已回收 16 | // 7:任务执行中 (实例做备份、回档等操作) 17 | // 8:已下线 18 | // 9:实例扩容中 19 | // 10:实例迁移中 20 | // 11:只读 21 | // 12:重启中 22 | var ( 23 | STATUS_MAP = map[int64]rds.STATUS{ 24 | 1: rds.STATUS_PENDING, 25 | 2: rds.STATUS_RUNNING, 26 | 3: rds.STATUS_SWITCHOVER, 27 | 4: rds.STATUS_ISOLATIONED, 28 | 5: rds.STATUS_DELETING, 29 | 6: rds.STATUS_DESTROYED, 30 | 7: rds.STATUS_RUNNING, 31 | 8: rds.STATUS_SHUTDOWN, 32 | 9: rds.STATUS_RUNNING, 33 | 10: rds.STATUS_TRANSING, 34 | 11: rds.STATUS_RUNNING, 35 | 12: rds.STATUS_REBOOTING, 36 | } 37 | ) 38 | 39 | func praseStatus(s *int64) string { 40 | if s == nil { 41 | return "" 42 | } 43 | 44 | if v, ok := STATUS_MAP[*s]; ok { 45 | return v.String() 46 | } 47 | 48 | return fmt.Sprintf("%d", *s) 49 | } 50 | -------------------------------------------------------------------------------- /provider/vsphere/connectivity/client_test.go: -------------------------------------------------------------------------------- 1 | package connectivity_test 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/infraboard/cmdb/provider/vsphere/connectivity" 8 | "github.com/stretchr/testify/assert" 9 | ) 10 | 11 | func TestClient(t *testing.T) { 12 | should := assert.New(t) 13 | 14 | err := connectivity.LoadClientFromEnv() 15 | if should.NoError(err) { 16 | vim, err := connectivity.C().VimClient() 17 | if err != nil { 18 | t.Fatal(err) 19 | } 20 | fmt.Println(vim.Client.URL().Host) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /provider/vsphere/operator.go: -------------------------------------------------------------------------------- 1 | package vsphere 2 | 3 | import ( 4 | "github.com/caarlos0/env/v6" 5 | "github.com/infraboard/cmdb/provider/vsphere/connectivity" 6 | "github.com/infraboard/cmdb/provider/vsphere/vm" 7 | ) 8 | 9 | var ( 10 | operator *Operator 11 | ) 12 | 13 | func O() *Operator { 14 | if operator == nil { 15 | panic("please load config first") 16 | } 17 | return operator 18 | } 19 | 20 | func LoadOperatorFromEnv() error { 21 | client := &connectivity.VsphereClient{} 22 | if err := env.Parse(client); err != nil { 23 | return err 24 | } 25 | operator = NewOperator(client) 26 | return nil 27 | } 28 | 29 | func NewOperator(client *connectivity.VsphereClient) *Operator { 30 | return &Operator{ 31 | client: client, 32 | } 33 | } 34 | 35 | type Operator struct { 36 | client *connectivity.VsphereClient 37 | } 38 | 39 | func (o *Operator) VmOperator() *vm.VMOperator { 40 | c, err := o.client.VimClient() 41 | if err != nil { 42 | panic(err) 43 | } 44 | return vm.NewVMOperator(c) 45 | } 46 | -------------------------------------------------------------------------------- /provider/vsphere/vm/mapping.go: -------------------------------------------------------------------------------- 1 | package vm 2 | 3 | import "github.com/infraboard/cmdb/apps/host" 4 | 5 | var ( 6 | STATUS_MAP = map[string]host.STATUS{ 7 | "poweredOff": host.STATUS_STOPPED, 8 | "poweredOn": host.STATUS_RUNNING, 9 | "suspended": host.STATUS_SUSPENDED, 10 | } 11 | ) 12 | 13 | func praseStatus(s string) string { 14 | if v, ok := STATUS_MAP[s]; ok { 15 | return v.String() 16 | } 17 | 18 | return s 19 | } 20 | -------------------------------------------------------------------------------- /provider/vsphere/vm/vm_test.go: -------------------------------------------------------------------------------- 1 | package vm_test 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/infraboard/cmdb/apps/host" 8 | "github.com/infraboard/cmdb/provider/vsphere/connectivity" 9 | "github.com/infraboard/mcube/logger/zap" 10 | 11 | op "github.com/infraboard/cmdb/provider/vsphere/vm" 12 | ) 13 | 14 | var ( 15 | operator *op.VMOperator 16 | ) 17 | 18 | func TestQuery(t *testing.T) { 19 | err := operator.QueryHost(func(h *host.Host) { 20 | fmt.Println(h) 21 | }) 22 | if err != nil { 23 | t.Fatal(err) 24 | } 25 | } 26 | 27 | func TestRangeString(t *testing.T) { 28 | str := "architecture='X86' bitness='64' distroName='CentOS Stream' distroVersion='8' familyName='Linux' kernelVersion='4.18.0-365.el8.x86_64' prettyName='CentOS Stream 8'" 29 | m := op.ParseExtraConfigValue(str) 30 | for k, v := range m { 31 | fmt.Println(k, v) 32 | } 33 | } 34 | 35 | func init() { 36 | zap.DevelopmentSetup() 37 | 38 | err := connectivity.LoadClientFromEnv() 39 | if err != nil { 40 | panic(err) 41 | } 42 | 43 | vim, err := connectivity.C().VimClient() 44 | if err != nil { 45 | panic(err) 46 | } 47 | 48 | operator = op.NewVMOperator(vim) 49 | } 50 | -------------------------------------------------------------------------------- /swagger/docs.go: -------------------------------------------------------------------------------- 1 | package swagger 2 | 3 | import ( 4 | "github.com/go-openapi/spec" 5 | "github.com/infraboard/cmdb/version" 6 | ) 7 | 8 | func Docs(swo *spec.Swagger) { 9 | swo.Info = &spec.Info{ 10 | InfoProps: spec.InfoProps{ 11 | Title: "CMDB", 12 | Description: "资源管理中心", 13 | Contact: &spec.ContactInfo{ 14 | ContactInfoProps: spec.ContactInfoProps{ 15 | Name: "john", 16 | Email: "john@doe.rp", 17 | URL: "http://johndoe.org", 18 | }, 19 | }, 20 | License: &spec.License{ 21 | LicenseProps: spec.LicenseProps{ 22 | Name: "MIT", 23 | URL: "http://mit.org", 24 | }, 25 | }, 26 | Version: version.Short(), 27 | }, 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /test/data/README.md: -------------------------------------------------------------------------------- 1 | # 测试模拟数据 -------------------------------------------------------------------------------- /test/tools/setup.go: -------------------------------------------------------------------------------- 1 | package tools 2 | 3 | import ( 4 | "os" 5 | 6 | "github.com/infraboard/cmdb/conf" 7 | "github.com/infraboard/mcube/app" 8 | "github.com/infraboard/mcube/logger/zap" 9 | 10 | // 注册所有服务 11 | _ "github.com/infraboard/cmdb/apps" 12 | ) 13 | 14 | func AccessToken() string { 15 | return os.Getenv("MCENTER_ACCESS_TOKEN") 16 | } 17 | 18 | func DevelopmentSetup() { 19 | 20 | // 初始化日志实例 21 | zap.DevelopmentSetup() 22 | 23 | // 初始化配置, 提前配置好/etc/unit_test.env 24 | err := conf.LoadConfigFromEnv() 25 | if err != nil { 26 | panic(err) 27 | } 28 | 29 | // 初始化全局app 30 | if err := app.InitAllApp(); err != nil { 31 | panic(err) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /utils/enum.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | func ParamType(t string) map[string]string { 4 | return map[string]string{"type": t} 5 | } 6 | 7 | type EnumDescribe struct { 8 | Name string `json:"name"` 9 | Value string `json:"value"` 10 | Describe string `json:"describe"` 11 | Meta map[string]string `json:"meta"` 12 | SubItems []*EnumDescribe `json:"sub_items"` 13 | } 14 | -------------------------------------------------------------------------------- /utils/hash.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "crypto/sha1" 5 | "encoding/json" 6 | "fmt" 7 | 8 | "github.com/infraboard/mcube/logger/zap" 9 | ) 10 | 11 | func Hash(x interface{}) string { 12 | hash := sha1.New() 13 | b, err := json.Marshal(x) 14 | if err != nil { 15 | zap.L().Errorf("hash %v error, %s", x, err) 16 | return "" 17 | } 18 | hash.Write(b) 19 | return fmt.Sprintf("%x", hash.Sum(nil)) 20 | } 21 | -------------------------------------------------------------------------------- /utils/ptr_value.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import "github.com/shopspring/decimal" 4 | 5 | func Float32ToFloat64(v *float32) float64 { 6 | if v == nil { 7 | return 0 8 | } 9 | dv := decimal.NewFromFloat32(*v) 10 | t, _ := dv.Float64() 11 | return t 12 | } 13 | 14 | func StringToFloat64(v *string) float64 { 15 | if v == nil { 16 | return 0 17 | } 18 | 19 | dv, err := decimal.NewFromString(*v) 20 | if err != nil { 21 | return 0 22 | } 23 | t, _ := dv.Float64() 24 | return t 25 | } 26 | 27 | func PtrStrV(v *string) string { 28 | if v == nil { 29 | return "" 30 | } 31 | 32 | return *v 33 | } 34 | 35 | func PtrInt64(v *int64) int64 { 36 | if v == nil { 37 | return 0 38 | } 39 | 40 | return *v 41 | } 42 | 43 | func PtrInt32(v *int32) int32 { 44 | if v == nil { 45 | return 0 46 | } 47 | 48 | return *v 49 | } 50 | 51 | func PtrFloat64(v *float64) float64 { 52 | if v == nil { 53 | return 0 54 | } 55 | 56 | return *v 57 | } 58 | 59 | func SlicePtrStrv(items []*string) []string { 60 | vs := []string{} 61 | for i := range items { 62 | v := PtrStrV(items[i]) 63 | if v != "" { 64 | vs = append(vs, v) 65 | } 66 | } 67 | 68 | return vs 69 | } 70 | -------------------------------------------------------------------------------- /utils/time.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "strings" 5 | "time" 6 | 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | const ( 11 | ISO8601_FORMAT = "2006-01-02T15:04:05Z" 12 | DEFAULT_TIME_MINITE_FORMAT = "2006-01-02T15:04Z" 13 | TIME_SECOND_FORMAT_MOD1 = "2006-01-02 15:04:05" 14 | ) 15 | 16 | func ParseDefaultSecondTime(t string) int64 { 17 | return ParseTime(ISO8601_FORMAT, t) 18 | } 19 | 20 | func ParseDefaultMiniteTime(t string) int64 { 21 | return ParseTime(DEFAULT_TIME_MINITE_FORMAT, t) 22 | } 23 | 24 | func ParseSecondMod1Time(t string) int64 { 25 | if t == "0000-00-00 00:00:00" { 26 | return 0 27 | } 28 | return ParseTime(TIME_SECOND_FORMAT_MOD1, t) 29 | } 30 | 31 | func ParseTime(format, t string) int64 { 32 | t = strings.TrimSpace(t) 33 | if t == "" { 34 | return 0 35 | } 36 | 37 | ts, err := time.Parse(format, t) 38 | if err != nil { 39 | zap.L().Errorf("parse time %s error, %s", t, err) 40 | return 0 41 | } 42 | 43 | return ts.Unix() 44 | } 45 | -------------------------------------------------------------------------------- /utils/time_test.go: -------------------------------------------------------------------------------- 1 | package utils_test 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/infraboard/cmdb/utils" 7 | "github.com/infraboard/mcube/logger/zap" 8 | ) 9 | 10 | func TestParseTime(t *testing.T) { 11 | utils.ParseDefaultSecondTime("") 12 | } 13 | 14 | func init() { 15 | zap.DevelopmentSetup() 16 | } 17 | -------------------------------------------------------------------------------- /utils/value_ptr.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | func Int32Ptr(v int32) *int32 { 4 | return &v 5 | } 6 | 7 | func StringPtr(v string) *string { 8 | return &v 9 | } 10 | -------------------------------------------------------------------------------- /version/version.go: -------------------------------------------------------------------------------- 1 | package version 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | const ( 8 | // ServiceName 服务名称 9 | ServiceName = "cmdb-api" 10 | 11 | // Description 服务描述 12 | Description = "资源中心" 13 | ) 14 | 15 | var ( 16 | GIT_COMMIT string 17 | GIT_BRANCH string 18 | BUILD_TIME string 19 | GO_VERSION string 20 | ) 21 | 22 | // FullVersion show the version info 23 | func FullVersion() string { 24 | version := fmt.Sprintf("Build Time: %s\nGit Branch: %s\nGit Commit: %s\nGo Version: %s\n", BUILD_TIME, GIT_BRANCH, GIT_COMMIT, GO_VERSION) 25 | return version 26 | } 27 | 28 | // Short 版本缩写 29 | func Short() string { 30 | commit := "" 31 | if len(GIT_COMMIT) > 8 { 32 | commit = GIT_COMMIT[:8] 33 | } 34 | return fmt.Sprintf("%s[%s]", GIT_BRANCH, commit) 35 | } 36 | --------------------------------------------------------------------------------