268 lines
9.8 KiB
Go
268 lines
9.8 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"
|
||
"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
|
||
}
|