From 167c8f29ed99c0f8afb1886661da72e28c5d00fd Mon Sep 17 00:00:00 2001 From: zhouqunjie Date: Thu, 31 Aug 2023 17:08:11 +0800 Subject: [PATCH] feature: vm overview api service Former-commit-id: aff2077cf031e94a892cf4de67d7a8fc5416f9a2 --- api/desc/pcm.api | 5 ++ api/desc/vm/pcm-vm.api | 77 ++++++++++++++++++- api/etc/pcm.yaml | 2 +- api/internal/handler/routes.go | 10 +++ .../handler/vm/getcomputelimitshandler.go | 28 +++++++ .../handler/vm/getvolumelimitshandler.go | 28 +++++++ .../logic/vm/getcomputelimitslogic.go | 47 +++++++++++ api/internal/logic/vm/getvolumelimitslogic.go | 47 +++++++++++ api/internal/types/types.go | 75 ++++++++++++++++++ 9 files changed, 317 insertions(+), 2 deletions(-) create mode 100644 api/internal/handler/vm/getcomputelimitshandler.go create mode 100644 api/internal/handler/vm/getvolumelimitshandler.go create mode 100644 api/internal/logic/vm/getcomputelimitslogic.go create mode 100644 api/internal/logic/vm/getvolumelimitslogic.go diff --git a/api/desc/pcm.api b/api/desc/pcm.api index 12b02ddc..3cd07cca 100644 --- a/api/desc/pcm.api +++ b/api/desc/pcm.api @@ -236,6 +236,11 @@ service pcm { group : vm ) service pcm { + + @handler GetComputeLimitsHandler + get /vm/getComputeLimits (GetComputeLimitsReq) returns (GetComputeLimitsResp) + @handler GetVolumeLimitsHandler + get /vm/getVolumeLimits (GetVolumeLimitsReq) returns (GetVolumeLimitsResp) @handler ListServerHandler get /vm/listServer (ListServersReq) returns (ListServersResp) @handler ListServersDetailedHandler diff --git a/api/desc/vm/pcm-vm.api b/api/desc/vm/pcm-vm.api index 8c5a884b..2aa1e661 100644 --- a/api/desc/vm/pcm-vm.api +++ b/api/desc/vm/pcm-vm.api @@ -7,8 +7,83 @@ info( email: "1364512070@qq.com" ) -/****************** servers start*************************/ +type ( + Rate{ + } + Absolute{ + maxServerMeta int64 `form:"maxServerMeta,optional"` + maxPersonality int64 `form:"maxPersonality,optional"` + totalServerGroupsUsed int64 `form:"totalServerGroupsUsed,optional"` + maxImageMeta int64 `form:"maxImageMeta,optional"` + maxPersonalitySize int64 `form:"maxPersonalitySize,optional"` + maxTotalKeypairs int64 `form:"maxTotalKeypairs,optional"` + maxSecurityGroupRules int64 `form:"maxSecurityGroupRules,optional"` + maxServerGroups int64 `form:"maxServerGroups,optional"` + totalCoresUsed int64 `form:"totalCoresUsed,optional"` + totalRAMUsed int64 `form:"totalRAMUsed,optional"` + totalInstancesUsed int64 `form:"totalInstancesUsed,optional"` + maxSecurityGroups int64 `form:"maxSecurityGroups,optional"` + totalFloatingIpsUsed int64 `form:"totalFloatingIpsUsed,optional"` + maxTotalCores int64 `form:"maxTotalCores,optional"` + maxServerGroupMembers int64 `form:"maxServerGroupMembers,optional"` + maxTotalFloatingIps int64 `form:"maxTotalFloatingIps,optional"` + totalSecurityGroupsUsed int64 `form:"totalSecurityGroupsUsed,optional"` + maxTotalInstances int64 `form:"maxTotalInstances,optional"` + maxTotalRAMSize int64 `form:"maxTotalRAMSize,optional"` + } + Limits{ + rate Rate `form:"rate,optional"` + absolute Absolute`form:"absolute,optional"` + } + GetComputeLimitsReq{ + Limit int32 `form:"limit,optional"` + OffSet int32 `form:"offSet,optional"` + } + + GetComputeLimitsResp{ + limits Limits `form:"limits,optional"` + Code int32 `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + ErrorMsg string `json:"errorMsg,omitempty"` + } +) + + +type ( + VolumeRate{ + } + VolumeAbsolute{ + totalSnapshotsUsed int32 `form:"totalSnapshotsUsed,optional"` + maxTotalBackups int32 `form:"maxTotalBackups,optional"` + maxTotalVolumeGigabytes int32 `form:"maxTotalVolumeGigabytes,optional"` + maxTotalSnapshots int32 `form:"maxTotalSnapshots,optional"` + maxTotalBackupGigabytes int32 `form:"maxTotalBackupGigabytes,optional"` + totalBackupGigabytesUsed int32 `form:"totalBackupGigabytesUsed,optional"` + maxTotalVolumes int32 `form:"maxTotalVolumes,optional"` + totalVolumesUsed int32 `form:"totalVolumesUsed,optional"` + totalBackupsUsed int32 `form:"totalBackupsUsed,optional"` + totalGigabytesUsed int32 `form:"totalGigabytesUsed,optional"` + } + VolumeLimits{ + rate VolumeRate `form:"rate,optional"` + absolute VolumeAbsolute`form:"absolute,optional"` + } + GetVolumeLimitsReq{ + Limit int32 `form:"limit,optional"` + OffSet int32 `form:"offSet,optional"` + } + + GetVolumeLimitsResp{ + limits VolumeLimits `form:"limits,optional"` + Code int32 `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + ErrorMsg string `json:"errorMsg,omitempty"` + } +) + + +/****************** servers start*************************/ type ( ListServersReq { Limit int32 `form:"limit,optional"` diff --git a/api/etc/pcm.yaml b/api/etc/pcm.yaml index 169e9e35..2ce0e83e 100644 --- a/api/etc/pcm.yaml +++ b/api/etc/pcm.yaml @@ -7,7 +7,7 @@ NacosConfig: - IpAddr: nacos.jcce.dev Port: 8848 ClientConfig: - NamespaceId: test + NamespaceId: zhouqj TimeoutMs: 5000 NotLoadCacheAtStart: true LogDir: diff --git a/api/internal/handler/routes.go b/api/internal/handler/routes.go index c2c4eb17..3fcd6343 100644 --- a/api/internal/handler/routes.go +++ b/api/internal/handler/routes.go @@ -340,6 +340,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( []rest.Route{ + { + Method: http.MethodGet, + Path: "/vm/getComputeLimits", + Handler: vm.GetComputeLimitsHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/vm/getVolumeLimits", + Handler: vm.GetVolumeLimitsHandler(serverCtx), + }, { Method: http.MethodGet, Path: "/vm/listServer", diff --git a/api/internal/handler/vm/getcomputelimitshandler.go b/api/internal/handler/vm/getcomputelimitshandler.go new file mode 100644 index 00000000..25602430 --- /dev/null +++ b/api/internal/handler/vm/getcomputelimitshandler.go @@ -0,0 +1,28 @@ +package vm + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/vm" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" +) + +func GetComputeLimitsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetComputeLimitsReq + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + + l := vm.NewGetComputeLimitsLogic(r.Context(), svcCtx) + resp, err := l.GetComputeLimits(&req) + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.OkJsonCtx(r.Context(), w, resp) + } + } +} diff --git a/api/internal/handler/vm/getvolumelimitshandler.go b/api/internal/handler/vm/getvolumelimitshandler.go new file mode 100644 index 00000000..ac7b44ba --- /dev/null +++ b/api/internal/handler/vm/getvolumelimitshandler.go @@ -0,0 +1,28 @@ +package vm + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/vm" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" +) + +func GetVolumeLimitsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetVolumeLimitsReq + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + + l := vm.NewGetVolumeLimitsLogic(r.Context(), svcCtx) + resp, err := l.GetVolumeLimits(&req) + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.OkJsonCtx(r.Context(), w, resp) + } + } +} diff --git a/api/internal/logic/vm/getcomputelimitslogic.go b/api/internal/logic/vm/getcomputelimitslogic.go new file mode 100644 index 00000000..281ef050 --- /dev/null +++ b/api/internal/logic/vm/getcomputelimitslogic.go @@ -0,0 +1,47 @@ +package vm + +import ( + "context" + "encoding/json" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "gitlink.org.cn/jcce-pcm/pcm-participant-openstack/openstack" + "gitlink.org.cn/jcce-pcm/utils/result" + "gitlink.org.cn/jcce-pcm/utils/tool" + "gitlink.org.cn/jcce-pcm/utils/xerr" + + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetComputeLimitsLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetComputeLimitsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetComputeLimitsLogic { + return &GetComputeLimitsLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetComputeLimitsLogic) GetComputeLimits(req *types.GetComputeLimitsReq) (resp *types.GetComputeLimitsResp, err error) { + GetComputeLimitsReq := &openstack.GetComputeLimitsReq{} + err = copier.CopyWithOption(GetComputeLimitsReq, req, copier.Option{Converters: tool.Converters}) + GetComputeLimitsResp, err := l.svcCtx.OpenstackRpc.GetComputeLimits(l.ctx, GetComputeLimitsReq) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("Failed to get Servers list"), "Failed to get db Servers list err : %v ,req:%+v", err, req) + } + marshal, err := json.Marshal(&GetComputeLimitsResp) + if err != nil { + return nil, result.NewDefaultError(err.Error()) + } + json.Unmarshal(marshal, &resp) + err = copier.CopyWithOption(&resp, &GetComputeLimitsResp, copier.Option{Converters: tool.Converters}) + return resp, err +} diff --git a/api/internal/logic/vm/getvolumelimitslogic.go b/api/internal/logic/vm/getvolumelimitslogic.go new file mode 100644 index 00000000..f54d523a --- /dev/null +++ b/api/internal/logic/vm/getvolumelimitslogic.go @@ -0,0 +1,47 @@ +package vm + +import ( + "context" + "encoding/json" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "gitlink.org.cn/jcce-pcm/pcm-participant-openstack/openstack" + "gitlink.org.cn/jcce-pcm/utils/result" + "gitlink.org.cn/jcce-pcm/utils/tool" + "gitlink.org.cn/jcce-pcm/utils/xerr" + + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetVolumeLimitsLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetVolumeLimitsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetVolumeLimitsLogic { + return &GetVolumeLimitsLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetVolumeLimitsLogic) GetVolumeLimits(req *types.GetVolumeLimitsReq) (resp *types.GetVolumeLimitsResp, err error) { + GetVolumeLimitsReq := &openstack.GetVolumeLimitsReq{} + err = copier.CopyWithOption(GetVolumeLimitsReq, req, copier.Option{Converters: tool.Converters}) + GetVolumeLimitsResp, err := l.svcCtx.OpenstackRpc.GetVolumeLimits(l.ctx, GetVolumeLimitsReq) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("Failed to get Servers list"), "Failed to get db Servers list err : %v ,req:%+v", err, req) + } + marshal, err := json.Marshal(&GetVolumeLimitsResp) + if err != nil { + return nil, result.NewDefaultError(err.Error()) + } + json.Unmarshal(marshal, &resp) + err = copier.CopyWithOption(&resp, &GetVolumeLimitsResp, copier.Option{Converters: tool.Converters}) + return resp, err +} diff --git a/api/internal/types/types.go b/api/internal/types/types.go index 5ec2425f..6525602e 100644 --- a/api/internal/types/types.go +++ b/api/internal/types/types.go @@ -2102,6 +2102,81 @@ type CheckResp struct { Exist bool `json:"exist"` } +type Rate struct { +} + +type Absolute struct { + MaxServerMeta int64 `form:"maxServerMeta,optional"` + MaxPersonality int64 `form:"maxPersonality,optional"` + TotalServerGroupsUsed int64 `form:"totalServerGroupsUsed,optional"` + MaxImageMeta int64 `form:"maxImageMeta,optional"` + MaxPersonalitySize int64 `form:"maxPersonalitySize,optional"` + MaxTotalKeypairs int64 `form:"maxTotalKeypairs,optional"` + MaxSecurityGroupRules int64 `form:"maxSecurityGroupRules,optional"` + MaxServerGroups int64 `form:"maxServerGroups,optional"` + TotalCoresUsed int64 `form:"totalCoresUsed,optional"` + TotalRAMUsed int64 `form:"totalRAMUsed,optional"` + TotalInstancesUsed int64 `form:"totalInstancesUsed,optional"` + MaxSecurityGroups int64 `form:"maxSecurityGroups,optional"` + TotalFloatingIpsUsed int64 `form:"totalFloatingIpsUsed,optional"` + MaxTotalCores int64 `form:"maxTotalCores,optional"` + MaxServerGroupMembers int64 `form:"maxServerGroupMembers,optional"` + MaxTotalFloatingIps int64 `form:"maxTotalFloatingIps,optional"` + TotalSecurityGroupsUsed int64 `form:"totalSecurityGroupsUsed,optional"` + MaxTotalInstances int64 `form:"maxTotalInstances,optional"` + MaxTotalRAMSize int64 `form:"maxTotalRAMSize,optional"` +} + +type Limits struct { + Rate Rate `form:"rate,optional"` + Absolute Absolute `form:"absolute,optional"` +} + +type GetComputeLimitsReq struct { + Limit int32 `form:"limit,optional"` + OffSet int32 `form:"offSet,optional"` +} + +type GetComputeLimitsResp struct { + Limits Limits `form:"limits,optional"` + Code int32 `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + ErrorMsg string `json:"errorMsg,omitempty"` +} + +type VolumeRate struct { +} + +type VolumeAbsolute struct { + TotalSnapshotsUsed int32 `form:"totalSnapshotsUsed,optional"` + MaxTotalBackups int32 `form:"maxTotalBackups,optional"` + MaxTotalVolumeGigabytes int32 `form:"maxTotalVolumeGigabytes,optional"` + MaxTotalSnapshots int32 `form:"maxTotalSnapshots,optional"` + MaxTotalBackupGigabytes int32 `form:"maxTotalBackupGigabytes,optional"` + TotalBackupGigabytesUsed int32 `form:"totalBackupGigabytesUsed,optional"` + MaxTotalVolumes int32 `form:"maxTotalVolumes,optional"` + TotalVolumesUsed int32 `form:"totalVolumesUsed,optional"` + TotalBackupsUsed int32 `form:"totalBackupsUsed,optional"` + TotalGigabytesUsed int32 `form:"totalGigabytesUsed,optional"` +} + +type VolumeLimits struct { + Rate VolumeRate `form:"rate,optional"` + Absolute VolumeAbsolute `form:"absolute,optional"` +} + +type GetVolumeLimitsReq struct { + Limit int32 `form:"limit,optional"` + OffSet int32 `form:"offSet,optional"` +} + +type GetVolumeLimitsResp struct { + Limits VolumeLimits `form:"limits,optional"` + Code int32 `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + ErrorMsg string `json:"errorMsg,omitempty"` +} + type ListServersReq struct { Limit int32 `form:"limit,optional"` OffSet int32 `form:"offSet,optional"`