go-common/app/admin/ep/merlin/model/paas.go
2019-04-22 18:49:16 +08:00

326 lines
8.7 KiB
Go

package model
import (
"encoding/json"
"net/http"
"go-common/library/ecode"
"go-common/library/log"
)
// PaasConf conf of paas.
type PaasConf struct {
Host string
Token string
MachineTimeout string
MachineLimitRatio float32
}
// PaasMachine machine in paas.
type PaasMachine struct {
PaasMachineSystem
Name string `json:"name"`
Image string `json:"image"`
CPURequest float32 `json:"cpu_request"`
MemoryRequest float32 `json:"memory_request"`
CPULimit float32 `json:"cpu_limit"`
MemoryLimit float32 `json:"memory_limit"`
DiskRequest int `json:"disk_request"`
VolumnMount string `json:"volumn_mount"`
Snapshot bool `json:"snapshot"`
ForcePullImage bool `json:"force_pull_image"`
}
// ToMachine convert PaasMachine to Machine.
func (pm *PaasMachine) ToMachine(u string, gmr *GenMachinesRequest) (m *Machine) {
m = &Machine{
Username: u,
Name: pm.Name,
PodName: pm.Name + MachinePodNameSuffix,
Status: CreatingMachineInMerlin,
}
gmr.Mutator(m)
return
}
// PaasGenMachineRequest create machine request in paas.
type PaasGenMachineRequest struct {
Env
BusinessUnit string `json:"business_unit"`
Project string `json:"project"`
App string `json:"app"`
TreeIDs []int64 `json:"tree_id"`
Machines []PaasMachine `json:"machines"`
}
// ExcludeDataResponse no data field response.
type ExcludeDataResponse struct {
Status int `json:"status"`
Message string `json:"message"`
}
// CheckStatus check status.
func (e *ExcludeDataResponse) CheckStatus() (err error) {
if e.Status >= http.StatusMultipleChoices || e.Status < http.StatusOK {
log.Error("The status(%d) of paas may represent a request error(%s)", e.Status, e.Message)
err = ecode.MerlinPaasRequestErr
}
return
}
// Instance instance.
type Instance struct {
InstanceName string `json:"instance_name"`
}
// CreateInstance create instance.
type CreateInstance struct {
Instance
InstanceCreateStatus int `json:"instance_create_status"`
}
// ReleaseInstance release instance.
type ReleaseInstance struct {
Instance
InstanceReleaseStatus int `json:"instance_release_status"`
}
// PaasGenMachineResponse create machine response in paas.
type PaasGenMachineResponse struct {
ExcludeDataResponse
Data []*CreateInstance `json:"data"`
}
// PaasDelMachineResponse delete machine response in paas.
type PaasDelMachineResponse struct {
ExcludeDataResponse
Data ReleaseInstance `json:"data"`
}
// PaasSnapshotMachineResponse Paas Snapshot Machine Response.
type PaasSnapshotMachineResponse struct {
ExcludeDataResponse
Data string `json:"data"`
}
// DetailCondition detail condition.
type DetailCondition struct {
Initialized string `json:"Initialized"`
PodScheduled string `json:"PodScheduled"`
Ready string `json:"Ready"`
}
// MachineStatus machine status.
type MachineStatus struct {
Condition string `json:"condition"`
Message string `json:"message"`
DetailCondition DetailCondition `json:"detail_conditions"`
InstanceIP string `json:"instance_ip"`
RestartCount int `json:"restart_count"`
Log string `json:"log"`
MachineEvent MachineEvent `json:"events"`
}
// MachineEvent MachineEvent.
type MachineEvent struct {
MachinesItems []*MachinesItem `json:"Items"`
}
// MachinesItem MachinesItem.
type MachinesItem struct {
Kind string `json:"Kind"`
Name string `json:"Name"`
Namespace string `json:"Namespace"`
Reason string `json:"Reason"`
Message string `json:"Message"`
Count int `json:"Count"`
LastTime string `json:"LastTime"`
}
// ToMachineStatusResponse convert MachineStatus to MachineStatusResponse.
func (ms *MachineStatus) ToMachineStatusResponse() (msr *MachineStatusResponse) {
var events []string
for _, item := range ms.MachineEvent.MachinesItems {
mJSON, _ := json.Marshal(item)
events = append(events, string(mJSON))
}
return &MachineStatusResponse{
Initialized: ms.DetailCondition.Initialized,
PodScheduled: ms.DetailCondition.PodScheduled,
Ready: ms.DetailCondition.Ready,
Log: ms.Log,
MachineEvent: events,
}
}
// PaasQueryMachineStatusResponse query machine status response.
type PaasQueryMachineStatusResponse struct {
ExcludeDataResponse
Data MachineStatus `json:"data"`
}
// PaasQueryClustersResponse query cluster response.
type PaasQueryClustersResponse struct {
ExcludeDataResponse
Data Clusters `json:"data"`
}
// PaasQueryClusterResponse query cluster response.
type PaasQueryClusterResponse struct {
ExcludeDataResponse
Data *Cluster `json:"data"`
}
// PaasMachineDetail machine detail.
type PaasMachineDetail struct {
Condition string `json:"condition"`
Name string `json:"name"`
Image string `json:"image"`
CPURequest float32 `json:"cpu_request"`
MemoryRequest float32 `json:"memory_request"`
CPULimit float32 `json:"cpu_limit"`
MemoryLimit float32 `json:"memory_limit"`
DiskRequest int `json:"disk_request"`
VolumnMount string `json:"volumn_mount"`
ClusterName string `json:"cluster_name"`
Env string `json:"env"`
IP string `json:"ip"`
PaasMachineSystem
}
// ConvertUnits convert units of cpu and memory.
func (p PaasMachineDetail) ConvertUnits() PaasMachineDetail {
p.CPURequest = p.CPURequest / CPURatio
p.MemoryRequest = p.MemoryRequest / MemoryRatio
p.CPULimit = p.CPULimit / CPURatio
p.MemoryLimit = p.MemoryLimit / MemoryRatio
return p
}
// PaasQueryMachineResponse query machine response.
type PaasQueryMachineResponse struct {
ExcludeDataResponse
Data PaasMachineDetail `json:"data"`
}
// Clusters clusters.
type Clusters struct {
Items []*Cluster `json:"items"`
}
// Network network.
type Network struct {
ID int64 `json:"id"`
Name string `json:"name"`
Subnet string `json:"subnet"`
Capacity float64 `json:"capacity"`
}
// Resource resource.
type Resource struct {
CPUUsage float64 `json:"cpu_usage"` //集群总体CPU使用率
MemUsage float64 `json:"mem_usage"` //集群总体内存使用率
PodTotal int `json:"pod_total"` //集群实例总数
PodCapacity int `json:"pod_capacity"` //集群实例容量
NodesNum int `json:"nodes_num"` //集群节点数量
}
// Cluster cluster.
type Cluster struct {
ID int64 `json:"id"`
Name string `json:"name"`
IsSupportSnapShot bool `json:"is_support_snapshot"`
Desc string `json:"desc"`
IDc string `json:"idc"`
Networks []Network `json:"networks"`
Resources Resource `json:"resources"`
}
// Verify verify cluster
func (c *Cluster) Verify() error {
if c.Name == "" || len(c.Networks) < 1 || c.Networks[0].Name == "" {
return ecode.MerlinInvalidClusterErr
}
return nil
}
// ToMachine convert CreateInstance to Machine.
func (i *CreateInstance) ToMachine(u string, gmr *GenMachinesRequest) (m *Machine) {
var status int
switch i.InstanceCreateStatus {
case CreateFailedMachineInPaas:
status = ImmediatelyFailedMachineInMerlin
case CreatingMachineInPass:
status = CreatingMachineInMerlin
}
m = &Machine{
Username: u,
Name: i.InstanceName,
PodName: i.InstanceName + MachinePodNameSuffix,
Status: status,
}
gmr.Mutator(m)
return
}
// PaasQueryAndDelMachineRequest query and del machines request.
type PaasQueryAndDelMachineRequest struct {
BusinessUnit string `json:"business_unit"`
Project string `json:"project"`
App string `json:"app"`
ClusterID int64 `json:"cluster_id"`
Name string `json:"name"`
}
// PaasAuthRequest auth request.
type PaasAuthRequest struct {
APIToken string `json:"api_token"`
PlatformID string `json:"platform_id"`
}
// PaasAuthResponse auth response.
type PaasAuthResponse struct {
ExcludeDataResponse
Data PaasAuthInfo `json:"data"`
}
// PaasAuthInfo auth information.
type PaasAuthInfo struct {
Token string `json:"token"`
PlatformID string `json:"platform_id"`
Username string `json:"user_name"`
Secret string `json:"secret"`
Expired int64 `json:"expired"`
Admin bool `json:"admin"`
}
// PaasUpdateMachineNodeRequest update machine request.
type PaasUpdateMachineNodeRequest struct {
PaasQueryAndDelMachineRequest
TreeID []int64 `json:"tree_id"`
}
// NewPaasUpdateMachineNodeRequest new PaasUpdateMachineNodeRequest
func NewPaasUpdateMachineNodeRequest(p *PaasQueryAndDelMachineRequest, ns []*MachineNode) *PaasUpdateMachineNodeRequest {
var treeIDs []int64
for _, n := range ns {
treeIDs = append(treeIDs, n.TreeID)
}
return &PaasUpdateMachineNodeRequest{
TreeID: treeIDs,
PaasQueryAndDelMachineRequest: *p,
}
}
// PaasUpdateMachineNodeResponse update machine response.
type PaasUpdateMachineNodeResponse struct {
ExcludeDataResponse
Data string `json:"data"`
}