pcm-openstack/internal/logic/listserversdetailedlogic.go

268 lines
9.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"
"time"
"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 []Links `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 []Links `json:"links"`
}
type Image struct {
Id string `json:"id"`
Links []Link `json:"links"`
}
type Links struct {
Href string `json:"href"`
Rel string `json:"rel"`
}
type Link 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"`
Updated string `json:"Updated"`
HostId string `json:"HostId"`
Ip string `json:"Ip"`
Image string `json:"Image"`
Flavor string `json:"Flavor"`
Id string `json:"Id"`
Name string `json:"Name"`
Key_name string `json:"Key_name"`
Survival_time int32 `json:"Survival_time"`
// 其他字段...
}
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)
fmt.Println("集群名", 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)
fmt.Println("返回openstack结果", body)
if err != nil {
return nil, err
}
if statusCode == 200 {
err := json.Unmarshal(body, &response)
if err != nil {
fmt.Println("错误结果", err)
}
fmt.Println("错误结果1", "aaaaaaaaaaaa")
var newList []interface{}
fmt.Println("错误结果2", "bbbbbbbbbb")
var days int32
for _, server := range response.Servers {
fmt.Println("错误结果3", response.Servers)
if len(server.Addresses) > 0 {
for _, network := range server.Addresses {
fmt.Println("错误结果4", server.Addresses)
for _, addr := range network {
fmt.Println("错误结果5", addr.Addr)
ip := addr.Addr
fmt.Println("addr:", addr.Addr)
//computing time
now := time.Now()
// 获取当前时间的Unix时间戳
unixTimestampSeconds := now.Unix()
fmt.Println("Unix时间戳:", unixTimestampSeconds)
// 解析ISO 8601格式的字符串为time.Time对象
t, err := time.Parse(time.RFC3339, server.Created)
if err != nil {
panic(err) // 如果解析出错这里使用panic来演示实际应用中应做适当的错误处理
}
// 获取Unix时间戳
unixTimestampSecondsCreated := t.Unix()
fmt.Println("Unix时间戳:", unixTimestampSecondsCreated)
timestamp1 := int64(unixTimestampSecondsCreated)
timestamp2 := int64(unixTimestampSeconds)
// 将时间戳转换为time.Time对象
time1 := time.Unix(timestamp1, 0)
time2 := time.Unix(timestamp2, 0)
// 计算时间差
diff := time2.Sub(time1)
// 将时间差转换为天数
days := int(diff.Hours() / 24)
fmt.Println("相差天数:", days)
// 假设我们想要提取任务状态(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": ip,
"Image": server.Image.Id,
"Flavor": server.Flavor.Id,
"Id": server.Id,
"Name": server.Name,
"Key_name": server.Key_name,
"Survival_time": days,
})
}
}
} else {
// 假设我们想要提取任务状态(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": ip,
"Image": server.Image.Id,
"Flavor": server.Flavor.Id,
"Id": server.Id,
"Name": server.Name,
"Key_name": server.Key_name,
"Survival_time": days,
})
}
}
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
}