pcm-openstack/internal/logic/listserversdetailedlogic.go

186 lines
6.9 KiB
Go

package logic
import (
"context"
"fmt"
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils/httputils"
"gitlink.org.cn/JointCloud/pcm-openstack/internal/common"
"gitlink.org.cn/JointCloud/pcm-openstack/internal/svc"
"gitlink.org.cn/JointCloud/pcm-openstack/openstack"
"encoding/json"
"github.com/zeromicro/go-zero/core/logx"
)
type ListServersDetailedLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewListServersDetailedLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ListServersDetailedLogic {
return &ListServersDetailedLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
type ServersDetailedResp struct {
Servers []ServersData `json:"servers"`
Code int32 `json:"code"`
Msg string `json:"msg"`
Error_msg string `json:"error_msg"`
}
type ServersData struct {
OSTaskState string `json:"OS-EXT-STS:task_state"`
VmState string `json:"OS-EXT-STS:vm_state"`
InstanceName string `json:"OS-EXT-SRV-ATTR:instance_name"`
OS_SRV_USG_Launched_At string `json:"OS-SRV-USG:launched_at"`
OS_DCF_DiskConfig string `json:"OS-DCF:diskConfig"`
OS_EXT_STS_Power_State int32 `json:"OS-EXT-SRV-ATTR:power_state"`
OS_EXT_AZ_availability_zone string `json:"OS-EXT-AZ:availability_zone"`
OS_EXT_SRV_ATTR_Host string `json:"OS-EXT-SRV-ATTR:host"`
OS_SRV_USG_Terminated_At string `json:"OS-SRV-USG:terminated_at"`
Os_extended_volumes_volumes_attached []string `json:"os-extended-volumes:volumes_attached"`
OS_EXT_SRV_ATTR_Hypervisor_Hostname string `json:"OS-EXT-SRV-ATTR:hypervisor_hostname"`
AccessIPv4 string `json:"accessIPv4"`
AccessIPv6 string `json:"accessIPv6"`
Addresses Addresses `json:"addresses"`
Config_drive string `json:"config_drive"`
Description string `json:"description"`
Flavor Flavor `json:"flavor"`
HostId string `json:"hostId"`
Host_status string `json:"host_status"`
Id string `json:"id"`
Image Image `json:"image"`
Key_name string `json:"key_name"`
Links Links1 `json:"links"`
Locked bool `json:"locked"`
Locked_reason string `json:"locked_reason"`
Metadata Metadata `json:"metadata"`
Name string `json:"name"`
Created string `json:"created"`
Progress uint32 `json:"progress"`
Security_groups []Security_groups `json:"security_groups"`
Status string `json:"status"`
Tags []string `json:"tags"`
Trusted_image_certificates string `json:"trusted_image_certificates"`
Updated string `json:"updated"`
User_id string `json:"user_id"`
}
// Addresses 结构体表示网络地址的集合
type Addresses map[string][]Address
type Address struct {
OSEXTIPSMACMacAddr string `json:"OS-EXT-IPS-MAC:mac_addr"`
Version int `json:"version"`
Addr string `json:"addr"`
OSEXTIPSType string `json:"OS-EXT-IPS:type"`
}
type Flavor struct {
Id string `json:"id"`
Links []Links1 `json:"links"`
}
type Image struct {
Id string `json:"id"`
Links []Links1 `json:"links"`
}
type Links1 struct {
Href string `json:"href"`
Rel string `json:"rel"`
}
type Metadata struct {
}
type Security_groups struct {
Name string `json:"name"`
}
type Private struct {
}
type ServersWrapper struct {
// 其他字段...
Servers []ServersDetailed `json:"servers"`
// 其他字段...
}
type ServersDetailed struct {
// 其他字段...
OSTaskState string `json:"OSTaskState"`
Status string `json:"status"`
VmState string `json:"VmState"`
OS_EXT_SRV_ATTR_Instance_Name string `json:"OS_EXT_SRV_ATTR_Instance_Name"`
Created string `json:"Created"`
HostId string `json:"HostId"`
Ip string `json:"Ip"`
Image string `json:"Image"`
// 其他字段...
}
func (l *ListServersDetailedLogic) ListServersDetailed(in *openstack.ListServersDetailedReq) (*openstack.ListServersDetailedResp, error) {
// todo: add your logic here and delete this line
var response ServersDetailedResp
var resp openstack.ListServersDetailedResp
platform, err := common.GetOpenstackConfWithPlatform(in.Platform)
openstackUrl := platform.OpenstackComputeUrl
if err != nil {
return nil, err
}
token := common.GetToken(in.Platform)
statusCode, body, err := httputils.HttpClientWithBodyAndCode(httputils.GET, openstackUrl+"/servers/detail", nil, token)
if err != nil {
return nil, err
}
if statusCode == 200 {
err := json.Unmarshal(body, &response)
fmt.Println("返回结果", response)
if err != nil {
fmt.Println(err)
}
var newList []interface{}
for _, server := range response.Servers {
// 假设我们想要提取任务状态(task_state)和状态(status)
newList = append(newList, map[string]interface{}{
"OSTaskState": server.OSTaskState,
"status": server.Status,
"VmState": server.VmState,
"OS_EXT_SRV_ATTR_Instance_Name": server.InstanceName,
"Created": server.Created,
"Updated": server.Updated,
"hostId": server.HostId,
"ip": server.Addresses,
"image": server.Image.Id,
})
}
jsonData, err := json.Marshal(newList)
var serversDetailed []ServersDetailed
err2 := json.Unmarshal(jsonData, &serversDetailed)
if err2 != nil {
fmt.Println("Error parsing JSON array:", err)
}
serversWrapper := ServersWrapper{
Servers: serversDetailed,
}
jsonData2, err := json.Marshal(serversWrapper)
if err != nil {
fmt.Println("Error marshalling JSON:", err)
}
json.Unmarshal(jsonData2, &resp)
resp.Code = 200
resp.Msg = "Success"
} else if statusCode != 200 {
json.Unmarshal(body, &resp)
resp.Code = 400
resp.Msg = "Failure"
}
return &resp, nil
}