diff --git a/pkg/apis/compute/host.go b/pkg/apis/compute/host.go index 9935a58ad5..51d80a5c26 100644 --- a/pkg/apis/compute/host.go +++ b/pkg/apis/compute/host.go @@ -70,6 +70,44 @@ type HostListInput struct { IsEmpty *bool `json:"is_empty"` // filter host that is baremetal Baremetal *bool `json:"baremetal"` + + // 机架 + Rack []string `json:"rack"` + // 机位 + Slots []string `json:"slots"` + // 管理口MAC + AccessMac []string `json:"access_mac"` + // 管理口Ip地址 + AccessIp []string `json:"access_ip"` + // 物理机序列号信息 + SN []string `json:"sn"` + // CPU大小 + CpuCount []int `json:"cpu_count"` + // 内存大小,单位Mb + MemSize []int `json:"mem_size"` + // 存储类型 + StorageType []string `json:"storage_type"` + // IPMI地址 + IpmiIp []string `json:"ipmi_ip"` + // 宿主机状态 + // example: online + HostStatus []string `json:"host_status"` + // 宿主机类型 + HostType []string `json:"host_type"` + // host服务软件版本 + Version []string `json:"version"` + // OVN软件版本 + OvnVersion []string `json:"ovn_version"` + // 是否处于维护状态 + IsMaintenance *bool `json:"is_maintenance"` + // 是否为导入的宿主机 + IsImport *bool `json:"is_import"` + // 是否允许PXE启动 + EnablePxeBoot *bool `json:"enable_pxe_boot"` + // 主机UUID + Uuid []string `json:"uuid"` + // 主机启动模式, 可能值位PXE和ISO + BootMode []string `json:"boot_mode"` } type HostDetails struct { diff --git a/pkg/apis/compute/hostjoin.go b/pkg/apis/compute/hostjoin.go index e3586fe941..1056f3e647 100644 --- a/pkg/apis/compute/hostjoin.go +++ b/pkg/apis/compute/hostjoin.go @@ -29,3 +29,9 @@ type HostJointResourceDetails struct { HostJointResourceDetailsBase } + +type HostJointsListInput struct { + apis.JointResourceBaseListInput + + HostFilterListInput +} diff --git a/pkg/apis/compute/hostnetwork.go b/pkg/apis/compute/hostnetwork.go index 4e9b7f6dee..2eab4eac14 100644 --- a/pkg/apis/compute/hostnetwork.go +++ b/pkg/apis/compute/hostnetwork.go @@ -24,3 +24,13 @@ type HostnetworkDetails struct { NicType string `json:"nic_type"` } + +type HostnetworkListInput struct { + HostJointsListInput + NetworkFilterListInput + + // IP地址 + IpAddr []string `json:"ip_addr"` + // MAC地址 + MacAddr []string `json:"mac_addr"` +} diff --git a/pkg/apis/compute/hostschedtag.go b/pkg/apis/compute/hostschedtag.go index 1b34ea90d6..0a738d5858 100644 --- a/pkg/apis/compute/hostschedtag.go +++ b/pkg/apis/compute/hostschedtag.go @@ -21,3 +21,8 @@ type HostschedtagDetails struct { SHostschedtag } + +type HostschedtagListInput struct { + SchedtagJointsListInput + HostFilterListInput +} \ No newline at end of file diff --git a/pkg/apis/compute/hoststorage.go b/pkg/apis/compute/hoststorage.go index be283eb53e..581f804cb1 100644 --- a/pkg/apis/compute/hoststorage.go +++ b/pkg/apis/compute/hoststorage.go @@ -52,3 +52,9 @@ type HoststorageDetails struct { GuestDiskCount int `json:"guest_disk_count,allowempty"` } + +type HoststorageListInput struct { + HostJointsListInput + + StorageFilterListInput +} diff --git a/pkg/apis/compute/hostwire.go b/pkg/apis/compute/hostwire.go index d1530469db..c76dad5d67 100644 --- a/pkg/apis/compute/hostwire.go +++ b/pkg/apis/compute/hostwire.go @@ -25,3 +25,20 @@ type HostwireDetails struct { // 带宽大小 Bandwidth int `json:"bandwidth"` } + +type HostwireListInput struct { + HostJointsListInput + WireFilterListInput + + // 网桥名称 + Bridge []string `json:"bridge"` + + // 接口名称 + Interface []string `json:"interface"` + + // 是否是主网口 + IsMaster *bool `json:"is_master"` + + // MAC地址 + MacAddr []string `json:"mac_addr"` +} diff --git a/pkg/apis/compute/instance_snapshot.go b/pkg/apis/compute/instance_snapshot.go index 36457e69f7..fbc2f0bc66 100644 --- a/pkg/apis/compute/instance_snapshot.go +++ b/pkg/apis/compute/instance_snapshot.go @@ -47,3 +47,12 @@ type InstanceSnapshotDetails struct { Snapshots []SimpleSnapshot `json:"snapshots"` Properties map[string]string `json:"properties"` } + +type InstanceSnapshotListInput struct { + apis.VirtualResourceListInput + + ServerFilterListInput + + // 操作系统类型 + OsType []string `json:"os_type"` +} diff --git a/pkg/apis/compute/isolated_device.go b/pkg/apis/compute/isolated_device.go index 40c6c07a59..41590bff97 100644 --- a/pkg/apis/compute/isolated_device.go +++ b/pkg/apis/compute/isolated_device.go @@ -27,3 +27,30 @@ type IsolateDeviceDetails struct { // 云主机状态 GuestStatus string `json:"guest_status"` } + +type IsolatedDeviceListInput struct { + apis.StandaloneResourceListInput + apis.DomainizedResourceListInput + + HostFilterListInput + + // 只列出GPU直通设备 + Gpu *bool `json:"gpu"` + // 只列出USB直通设备 + Usb *bool `json:"usb"` + // 只列出未使用的直通设备 + Unused *bool `json:"unused"` + + // # PCI / GPU-HPC / GPU-VGA / USB / NIC + // 设备类型 + DevType []string `json:"dev_type"` + + // # Specific device name read from lspci command, e.g. `Tesla K40m` ... + Model []string `json:"model"` + + // # pci address of `Bus:Device.Function` format, or usb bus address of `bus.addr` + Addr []string `json:"addr"` + + // 设备VENDOE编号 + VendorDeviceId []string `json:"vendor_device_id"` +} diff --git a/pkg/apis/compute/isolated_device_const.go b/pkg/apis/compute/isolated_device_const.go index eb6365956f..37efc9433b 100644 --- a/pkg/apis/compute/isolated_device_const.go +++ b/pkg/apis/compute/isolated_device_const.go @@ -14,10 +14,6 @@ package compute -import ( - "yunion.io/x/onecloud/pkg/apis" -) - const ( DIRECT_PCI_TYPE = "PCI" GPU_HPC_TYPE = "GPU-HPC" // # for compute @@ -42,17 +38,3 @@ var VENDOR_ID_MAP = map[string]string{ "NVIDIA": NVIDIA_VENDOR_ID, "AMD": AMD_VENDOR_ID, } - -type IsolatedDeviceListInput struct { - apis.StandaloneResourceListInput - apis.DomainizedResourceListInput - - HostFilterListInput - - // 只列出GPU直通设备 - Gpu *bool `json:"gpu"` - // 只列出USB直通设备 - Usb *bool `json:"usb"` - // 只列出未使用的直通设备 - Unused *bool `json:"unused"` -} diff --git a/pkg/apis/compute/schedtag.go b/pkg/apis/compute/schedtag.go index 9800773a6f..dacf240438 100644 --- a/pkg/apis/compute/schedtag.go +++ b/pkg/apis/compute/schedtag.go @@ -98,3 +98,8 @@ type SchedtagJointResourceDetails struct { // 调度标签管理的资源类型 ResourceType string `json:"resource_type"` } + +type SchedtagJointsListInput struct { + apis.JointResourceBaseListInput + SchedtagFilterListInput +} diff --git a/pkg/apis/compute/snapshot.go b/pkg/apis/compute/snapshot.go index efce2baf11..6df6277101 100644 --- a/pkg/apis/compute/snapshot.go +++ b/pkg/apis/compute/snapshot.go @@ -82,12 +82,6 @@ type SnapshotListInput struct { IsInstanceSnapshot *bool `json:"is_instance_snapshot"` } -type InstanceSnapshotListInput struct { - apis.VirtualResourceListInput - - ServerFilterListInput -} - type SnapshotDetails struct { apis.VirtualResourceDetails ManagedResourceInfo diff --git a/pkg/apis/compute/storage_const.go b/pkg/apis/compute/storage_const.go index 4c1de6f346..5057f07652 100644 --- a/pkg/apis/compute/storage_const.go +++ b/pkg/apis/compute/storage_const.go @@ -172,10 +172,3 @@ type StorageListInput struct { UsableResourceListInput StorageShareFilterListInput } - -type StoragecacheListInput struct { - apis.StandaloneResourceListInput - apis.DomainizedResourceListInput - - ManagedResourceListInput -} diff --git a/pkg/apis/compute/storagecache.go b/pkg/apis/compute/storagecache.go index dbc8bc03c1..6a04ab4e81 100644 --- a/pkg/apis/compute/storagecache.go +++ b/pkg/apis/compute/storagecache.go @@ -35,3 +35,13 @@ type StoragecacheDetails struct { // 通过一致性哈希获取的一个管理宿主机信息 Host *jsonutils.JSONDict `json:"host"` } + +type StoragecacheListInput struct { + apis.StandaloneResourceListInput + apis.ExternalizedResourceBaseListInput + + ManagedResourceListInput + + // 路径过滤 + Path []string `json:"path"` +} diff --git a/pkg/apis/list.go b/pkg/apis/list.go index 58e0514731..05125c714b 100644 --- a/pkg/apis/list.go +++ b/pkg/apis/list.go @@ -222,3 +222,8 @@ type JointResourceBaseListInput struct { type VirtualJointResourceBaseListInput struct { JointResourceBaseListInput } + +type ExternalizedResourceBaseListInput struct { + // 以资源外部ID过滤 + ExternalId string `json:"external_id"` +} diff --git a/pkg/cloudcommon/db/external.go b/pkg/cloudcommon/db/external.go index 350abc30c4..3c8f8b702b 100644 --- a/pkg/cloudcommon/db/external.go +++ b/pkg/cloudcommon/db/external.go @@ -15,10 +15,12 @@ package db import ( + "context" "database/sql" "yunion.io/x/sqlchemy" + "yunion.io/x/onecloud/pkg/apis" "yunion.io/x/onecloud/pkg/mcclient" ) @@ -27,6 +29,8 @@ type SExternalizedResourceBase struct { ExternalId string `width:"256" charset:"utf8" index:"true" list:"user" create:"admin_optional" update:"admin" json:"external_id"` } +type SExternalizedResourceBaseManager struct{} + func (model SExternalizedResourceBase) GetExternalId() string { return model.ExternalId } @@ -84,3 +88,15 @@ func FetchByExternalId(manager IModelManager, idStr string) (IExternalizedModel, return nil, sql.ErrNoRows } } + +func (manager *SExternalizedResourceBaseManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query apis.ExternalizedResourceBaseListInput, +) (*sqlchemy.SQuery, error) { + if len(query.ExternalId) > 0 { + q = q.Equals("external_id", query.ExternalId) + } + return q, nil +} diff --git a/pkg/compute/models/hostjoints.go b/pkg/compute/models/hostjoints.go index 7c14d9bc01..4bc0bf7947 100644 --- a/pkg/compute/models/hostjoints.go +++ b/pkg/compute/models/hostjoints.go @@ -16,6 +16,8 @@ package models import ( "context" + "yunion.io/x/pkg/errors" + "yunion.io/x/sqlchemy" "yunion.io/x/jsonutils" @@ -27,9 +29,10 @@ import ( type SHostJointsManager struct { db.SJointResourceBaseManager + SHostResourceBaseManager } -func NewHostJointsManager(dt interface{}, tableName string, keyword string, keywordPlural string, slave db.IStandaloneModelManager) SHostJointsManager { +func NewHostJointsManager(hostIdFieldName string, dt interface{}, tableName string, keyword string, keywordPlural string, slave db.IStandaloneModelManager) SHostJointsManager { return SHostJointsManager{ SJointResourceBaseManager: db.NewJointResourceBaseManager( dt, @@ -39,6 +42,9 @@ func NewHostJointsManager(dt interface{}, tableName string, keyword string, keyw HostManager, slave, ), + SHostResourceBaseManager: SHostResourceBaseManager{ + hostIdFieldName:hostIdFieldName, + }, } } @@ -103,3 +109,43 @@ func (manager *SHostJointsManager) FetchCustomizeColumns( return rows } + +func (manager *SHostJointsManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HostJointsListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SJointResourceBaseManager.ListItemFilter(ctx, q, userCred, query.JointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SJointResourceBaseManager.ListItemFilter") + } + q, err = manager.SHostResourceBaseManager.ListItemFilter(ctx, q, userCred, query.HostFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.ListItemFilter") + } + + return q, nil +} + +func (manager *SHostJointsManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HostJointsListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SJointResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.JointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SJointResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SHostResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.HostFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} diff --git a/pkg/compute/models/hostnetworks.go b/pkg/compute/models/hostnetworks.go index 6d16700781..f92fd2e7e6 100644 --- a/pkg/compute/models/hostnetworks.go +++ b/pkg/compute/models/hostnetworks.go @@ -16,6 +16,7 @@ package models import ( "context" + "yunion.io/x/pkg/errors" "yunion.io/x/jsonutils" "yunion.io/x/log" @@ -29,6 +30,7 @@ import ( type SHostnetworkManager struct { SHostJointsManager + SNetworkResourceBaseManager } var HostnetworkManager *SHostnetworkManager @@ -37,6 +39,7 @@ func init() { db.InitManager(func() { HostnetworkManager = &SHostnetworkManager{ SHostJointsManager: NewHostJointsManager( + "baremetal_id", SHostnetwork{}, "baremetalnetworks_tbl", "baremetalnetwork", @@ -51,14 +54,18 @@ func init() { type SHostnetwork struct { SHostJointsBase - BaremetalId string `width:"36" charset:"ascii" nullable:"false" list:"admin"` // Column(VARCHAR(36, charset='ascii'), nullable=False) - NetworkId string `width:"36" charset:"ascii" nullable:"false" list:"admin"` // Column(VARCHAR(36, charset='ascii'), nullable=False) - IpAddr string `width:"16" charset:"ascii" list:"admin"` // Column(VARCHAR(16, charset='ascii')) - MacAddr string `width:"18" charset:"ascii" list:"admin"` // Column(VARCHAR(18, charset='ascii')) + // 宿主机ID + BaremetalId string `width:"36" charset:"ascii" nullable:"false" list:"admin"` + // 网络ID + NetworkId string `width:"36" charset:"ascii" nullable:"false" list:"admin"` + // IP地址 + IpAddr string `width:"16" charset:"ascii" list:"admin"` + // MAC地址 + MacAddr string `width:"18" charset:"ascii" list:"admin"` } func (manager *SHostnetworkManager) GetMasterFieldName() string { - return "baremetal_id" + return manager.getHostIdFieldName() } func (manager *SHostnetworkManager) GetSlaveFieldName() string { @@ -207,3 +214,50 @@ func (man *SHostnetworkManager) GetHostByAddress(addr string) *SHost { } return nil } + +func (manager *SHostnetworkManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HostnetworkListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SHostJointsManager.ListItemFilter(ctx, q, userCred, query.HostJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.ListItemFilter") + } + q, err = manager.SNetworkResourceBaseManager.ListItemFilter(ctx, q, userCred, query.NetworkFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SNetworkResourceBaseManager.ListItemFilter") + } + + if len(query.IpAddr) > 0 { + q = q.In("ip_addr", query.IpAddr) + } + if len(query.MacAddr) > 0 { + q = q.In("mac_addr", query.MacAddr) + } + + return q, nil +} + +func (manager *SHostnetworkManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HostnetworkListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SHostJointsManager.OrderByExtraFields(ctx, q, userCred, query.HostJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SNetworkResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.NetworkFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SNetworkResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} \ No newline at end of file diff --git a/pkg/compute/models/hostresource.go b/pkg/compute/models/hostresource.go index 4bb98bea2b..cefb128e6e 100644 --- a/pkg/compute/models/hostresource.go +++ b/pkg/compute/models/hostresource.go @@ -38,6 +38,14 @@ type SHostResourceBase struct { type SHostResourceBaseManager struct { SZoneResourceBaseManager SManagedResourceBaseManager + hostIdFieldName string +} + +func (manager *SHostResourceBaseManager) getHostIdFieldName() string { + if len(manager.hostIdFieldName) > 0 { + return manager.hostIdFieldName + } + return "host_id" } func (self *SHostResourceBase) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) api.HostResourceInfo { @@ -113,11 +121,11 @@ func (manager *SHostResourceBaseManager) ListItemFilter( return nil, errors.Wrap(err, "HostManager.FetchByIdOrName") } } - q = q.Equals("host_id", hostObj.GetId()) + q = q.Equals(manager.getHostIdFieldName(), hostObj.GetId()) } if len(query.HostSN) > 0 { sq := HostManager.Query("id").Equals("sn", query.HostSN).SubQuery() - q = q.In("host_id", sq) + q = q.In(manager.getHostIdFieldName(), sq) } subq := HostManager.Query("id").Snapshot() subq, err := manager.SZoneResourceBaseManager.ListItemFilter(ctx, subq, userCred, query.ZonalFilterListInput) @@ -129,7 +137,7 @@ func (manager *SHostResourceBaseManager) ListItemFilter( return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") } if subq.IsAltered() { - q = q.Filter(sqlchemy.In(q.Field("host_id"), subq.SubQuery())) + q = q.Filter(sqlchemy.In(q.Field(manager.getHostIdFieldName()), subq.SubQuery())) } return q, nil } @@ -139,22 +147,22 @@ func (manager *SHostResourceBaseManager) QueryDistinctExtraField(q *sqlchemy.SQu case "host": hostQuery := HostManager.Query("name", "id").Distinct().SubQuery() q.AppendField(hostQuery.Field("name", field)) - q = q.Join(hostQuery, sqlchemy.Equals(q.Field("host_id"), hostQuery.Field("id"))) + q = q.Join(hostQuery, sqlchemy.Equals(q.Field(manager.getHostIdFieldName()), hostQuery.Field("id"))) q.GroupBy(hostQuery.Field("name")) return q, nil case "host_type": hostQuery := HostManager.Query(field, "id").Distinct().SubQuery() q.AppendField(hostQuery.Field(field)) - q = q.Join(hostQuery, sqlchemy.Equals(q.Field("host_id"), hostQuery.Field("id"))) + q = q.Join(hostQuery, sqlchemy.Equals(q.Field(manager.getHostIdFieldName()), hostQuery.Field("id"))) q.GroupBy(hostQuery.Field(field)) return q, nil case "manager", "account", "provider", "brand": hosts := HostManager.Query("id", "manager_id").SubQuery() - q = q.LeftJoin(hosts, sqlchemy.Equals(q.Field("host_id"), hosts.Field("id"))) + q = q.LeftJoin(hosts, sqlchemy.Equals(q.Field(manager.getHostIdFieldName()), hosts.Field("id"))) return manager.SManagedResourceBaseManager.QueryDistinctExtraField(q, field) default: hosts := HostManager.Query("id", "zone_id").SubQuery() - q = q.LeftJoin(hosts, sqlchemy.Equals(q.Field("host_id"), hosts.Field("id"))) + q = q.LeftJoin(hosts, sqlchemy.Equals(q.Field(manager.getHostIdFieldName()), hosts.Field("id"))) q, err := manager.SZoneResourceBaseManager.QueryDistinctExtraField(q, field) if err == nil { return q, nil @@ -205,7 +213,7 @@ func (manager *SHostResourceBaseManager) GetOrderBySubQuery( } if db.NeedOrderQuery(manager.GetOrderByFields(query)) { subq := hostQ.SubQuery() - q = q.LeftJoin(subq, sqlchemy.Equals(q.Field("host_id"), subq.Field("id"))) + q = q.LeftJoin(subq, sqlchemy.Equals(q.Field(manager.getHostIdFieldName()), subq.Field("id"))) if db.NeedOrderQuery([]string{query.OrderByHost, query.OrderByHostSN}) { orders = append(orders, query.OrderByHost, query.OrderByHostSN) fields = append(fields, subq.Field("name"), subq.Field("sn")) diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 641df3f8e7..dd6d3088e3 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -86,12 +86,14 @@ type SHost struct { SBillingResourceBase // 机架 - Rack string `width:"16" charset:"ascii" nullable:"true" get:"admin" update:"admin" create:"admin_optional"` + Rack string `width:"16" charset:"ascii" nullable:"true" get:"admin" update:"admin" create:"admin_optional"` + // 机位 Slots string `width:"16" charset:"ascii" nullable:"true" get:"admin" update:"admin" create:"admin_optional"` + // 管理口MAC AccessMac string `width:"32" charset:"ascii" nullable:"false" index:"true" list:"admin" update:"admin"` - // Ip地址 + // 管理口Ip地址 AccessIp string `width:"16" charset:"ascii" nullable:"true" list:"admin"` // 管理地址 @@ -99,7 +101,7 @@ type SHost struct { // 系统信息 SysInfo jsonutils.JSONObject `nullable:"true" search:"admin" list:"admin" update:"admin" create:"admin_optional"` - // SN信息 + // 物理机序列号信息 SN string `width:"128" charset:"ascii" nullable:"true" list:"admin" update:"admin" create:"admin_optional"` // CPU大小 @@ -154,7 +156,9 @@ type SHost struct { // 宿主机类型 HostType string `width:"36" charset:"ascii" nullable:"false" list:"admin" update:"admin" create:"admin_required"` - Version string `width:"64" charset:"ascii" list:"admin" update:"admin" create:"admin_optional"` + // host服务软件版本 + Version string `width:"64" charset:"ascii" list:"admin" update:"admin" create:"admin_optional"` + // OVN软件版本 OvnVersion string `width:"64" charset:"ascii" list:"admin" update:"admin" create:"admin_optional"` IsBaremetal bool `nullable:"true" default:"false" list:"admin" update:"admin" create:"admin_optional"` @@ -164,15 +168,20 @@ type SHost struct { LastPingAt time.Time `` - ResourceType string `width:"36" charset:"ascii" nullable:"false" list:"admin" update:"admin" create:"admin_optional" default:"shared"` // Column(VARCHAR(36, charset='ascii'), nullable=False) + ResourceType string `width:"36" charset:"ascii" nullable:"false" list:"admin" update:"admin" create:"admin_optional" default:"shared"` RealExternalId string `width:"256" charset:"utf8" get:"admin"` + // 是否为导入的宿主机 IsImport bool `nullable:"true" default:"false" list:"admin" create:"admin_optional"` + // 是否允许PXE启动 EnablePxeBoot tristate.TriState `nullable:"false" default:"true" list:"admin" create:"admin_optional" update:"admin"` - Uuid string `width:"64" nullable:"true" list:"admin" update:"admin" create:"admin_optional"` + // 主机UUID + Uuid string `width:"64" nullable:"true" list:"admin" update:"admin" create:"admin_optional"` + + // 主机启动模式, 可能值位PXE和ISO BootMode string `width:"8" nullable:"true" list:"admin" update:"admin" create:"admin_optional"` } @@ -348,6 +357,73 @@ func (manager *SHostManager) ListItemFilter( } } + if len(query.Rack) > 0 { + q = q.In("rack", query.Rack) + } + if len(query.Slots) > 0 { + q = q.In("slots", query.Slots) + } + if len(query.AccessMac) > 0 { + q = q.In("access_mac", query.AccessMac) + } + if len(query.AccessIp) > 0 { + q = q.In("access_ip", query.AccessIp) + } + if len(query.SN) > 0 { + q = q.In("sn", query.SN) + } + if len(query.CpuCount) > 0 { + q = q.In("cpu_count", query.CpuCount) + } + if len(query.MemSize) > 0 { + q = q.In("mem_size", query.MemSize) + } + if len(query.StorageType) > 0 { + q = q.In("storage_type", query.StorageType) + } + if len(query.IpmiIp) > 0 { + q = q.In("ipmi_ip", query.IpmiIp) + } + if len(query.HostStatus) > 0 { + q = q.In("host_status", query.HostStatus) + } + if len(query.HostType) > 0 { + q = q.In("host_type", query.HostType) + } + if len(query.Version) > 0 { + q = q.In("version", query.Version) + } + if len(query.OvnVersion) > 0 { + q = q.In("ovn_version", query.OvnVersion) + } + if query.IsMaintenance != nil { + if *query.IsMaintenance { + q = q.IsTrue("is_maintenance") + } else { + q = q.IsFalse("is_maintenance") + } + } + if query.IsImport != nil { + if *query.IsImport { + q = q.IsTrue("is_import") + } else { + q = q.IsFalse("is_import") + } + } + if query.EnablePxeBoot != nil { + if *query.EnablePxeBoot { + q = q.IsTrue("enable_pxe_boot") + } else { + q = q.IsFalse("enable_pxe_boot") + } + } + if len(query.Uuid) > 0 { + q = q.In("uuid", query.Uuid) + } + if len(query.BootMode) > 0 { + q = q.In("boot_mode", query.BootMode) + } + return q, nil } diff --git a/pkg/compute/models/hostschedtags.go b/pkg/compute/models/hostschedtags.go index 39146de855..1e02a08c32 100644 --- a/pkg/compute/models/hostschedtags.go +++ b/pkg/compute/models/hostschedtags.go @@ -16,6 +16,8 @@ package models import ( "context" + "yunion.io/x/pkg/errors" + "yunion.io/x/sqlchemy" "yunion.io/x/jsonutils" "yunion.io/x/log" @@ -28,6 +30,7 @@ import ( type SHostschedtagManager struct { *SSchedtagJointsManager + SHostResourceBaseManager } var HostschedtagManager *SHostschedtagManager @@ -123,3 +126,43 @@ func (self *SHostschedtag) Delete(ctx context.Context, userCred mcclient.TokenCr func (self *SHostschedtag) Detach(ctx context.Context, userCred mcclient.TokenCredential) error { return self.SSchedtagJointsBase.detach(self, ctx, userCred) } + +func (manager *SHostschedtagManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HostschedtagListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SSchedtagJointsManager.ListItemFilter(ctx, q, userCred, query.SchedtagJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagJointsManager.ListItemFilter") + } + q, err = manager.SHostResourceBaseManager.ListItemFilter(ctx, q, userCred, query.HostFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.ListItemFilter") + } + + return q, nil +} + +func (manager *SHostschedtagManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HostschedtagListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SSchedtagJointsManager.OrderByExtraFields(ctx, q, userCred, query.SchedtagJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagJointsManager.OrderByExtraFields") + } + q, err = manager.SHostResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.HostFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} \ No newline at end of file diff --git a/pkg/compute/models/hoststorages.go b/pkg/compute/models/hoststorages.go index 0b2125ee87..633416cdaf 100644 --- a/pkg/compute/models/hoststorages.go +++ b/pkg/compute/models/hoststorages.go @@ -37,6 +37,7 @@ const ErrStorageInUse = errors.Error("StorageInUse") type SHoststorageManager struct { SHostJointsManager + SStorageResourceBaseManager } var HoststorageManager *SHoststorageManager @@ -45,6 +46,7 @@ func init() { db.InitManager(func() { HoststorageManager = &SHoststorageManager{ SHostJointsManager: NewHostJointsManager( + "host_id", SHoststorage{}, "hoststorages_tbl", "hoststorage", @@ -59,14 +61,14 @@ func init() { type SHoststorage struct { SHostJointsBase - // 挂载点 - MountPoint string `width:"256" charset:"ascii" nullable:"false" list:"admin" update:"admin" create:"required" json:"mount_point"` - // 宿主机Id HostId string `width:"36" charset:"ascii" nullable:"false" list:"admin" create:"required" json:"host_id"` // 存储Id StorageId string `width:"36" charset:"ascii" nullable:"false" list:"admin" create:"required" json:"storage_id"` + // 挂载点 + MountPoint string `width:"256" charset:"ascii" nullable:"false" list:"admin" update:"admin" create:"required" json:"mount_point"` + // 配置信息 Config *jsonutils.JSONArray `nullable:"true" get:"admin" json:"config"` // 真实容量大小 @@ -327,3 +329,43 @@ func (self *SHoststorage) syncWithCloudHostStorage(userCred mcclient.TokenCreden db.OpsLog.LogSyncUpdate(self, diff, userCred) return nil } + +func (manager *SHoststorageManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HoststorageListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SHostJointsManager.ListItemFilter(ctx, q, userCred, query.HostJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.ListItemFilter") + } + q, err = manager.SStorageResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StorageFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SStorageResourceBaseManager.ListItemFilter") + } + + return q, nil +} + +func (manager *SHoststorageManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HoststorageListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SHostJointsManager.OrderByExtraFields(ctx, q, userCred, query.HostJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SStorageResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.StorageFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SStorageResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} \ No newline at end of file diff --git a/pkg/compute/models/hostwires.go b/pkg/compute/models/hostwires.go index 06f49b096b..b7407d82c8 100644 --- a/pkg/compute/models/hostwires.go +++ b/pkg/compute/models/hostwires.go @@ -16,6 +16,7 @@ package models import ( "context" + "yunion.io/x/pkg/errors" "yunion.io/x/jsonutils" "yunion.io/x/log" @@ -30,6 +31,7 @@ import ( type SHostwireManager struct { SHostJointsManager + SWireResourceBaseManager } var HostwireManager *SHostwireManager @@ -38,6 +40,7 @@ func init() { db.InitManager(func() { HostwireManager = &SHostwireManager{ SHostJointsManager: NewHostJointsManager( + "host_id", SHostwire{}, "hostwires_tbl", "hostwire", @@ -194,3 +197,60 @@ func (manager *SHostwireManager) FetchByHostIdAndMac(hostId string, mac string) } return hw.(*SHostwire), nil } + +func (manager *SHostwireManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HostwireListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SHostJointsManager.ListItemFilter(ctx, q, userCred, query.HostJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.ListItemFilter") + } + q, err = manager.SWireResourceBaseManager.ListItemFilter(ctx, q, userCred, query.WireFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SWireResourceBaseManager.ListItemFilter") + } + + if len(query.Bridge) > 0 { + q = q.In("bridge", query.Bridge) + } + if len(query.Interface) > 0 { + q = q.In("interface", query.Interface) + } + if query.IsMaster != nil { + if *query.IsMaster { + q = q.IsTrue("is_master") + } else { + q = q.IsFalse("is_master") + } + } + if len(query.MacAddr) > 0 { + q = q.In("mac_addr", query.MacAddr) + } + + return q, nil +} + +func (manager *SHostwireManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.HostwireListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SHostJointsManager.OrderByExtraFields(ctx, q, userCred, query.HostJointsListInput) + if err != nil { + return nil, errors.Wrap(err, "SHostResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SWireResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.WireFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SWireResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} \ No newline at end of file diff --git a/pkg/compute/models/instance_snapshots.go b/pkg/compute/models/instance_snapshots.go index b68fc324ba..a8b1b0b387 100644 --- a/pkg/compute/models/instance_snapshots.go +++ b/pkg/compute/models/instance_snapshots.go @@ -105,6 +105,10 @@ func (manager *SInstanceSnapshotManager) ListItemFilter( q = q.Equals("guest_id", guestObj.GetId()) } + if len(query.OsType) > 0 { + q = q.In("os_type", query.OsType) + } + return q, nil } diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index 5880bba605..3c30af841d 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -166,6 +166,19 @@ func (manager *SIsolatedDeviceManager) ListItemFilter( q = q.IsEmpty("guest_id") } + if len(query.DevType) > 0 { + q = q.In("dev_type", query.DevType) + } + if len(query.Model) > 0 { + q = q.In("model", query.Model) + } + if len(query.Addr) > 0 { + q = q.In("addr", query.Addr) + } + if len(query.VendorDeviceId) > 0 { + q = q.In("vendor_device_id", query.VendorDeviceId) + } + return q, nil } diff --git a/pkg/compute/models/schedtagjoint.go b/pkg/compute/models/schedtagjoint.go index fefe67861c..4e1ec930d8 100644 --- a/pkg/compute/models/schedtagjoint.go +++ b/pkg/compute/models/schedtagjoint.go @@ -17,6 +17,8 @@ package models import ( "context" "fmt" + "yunion.io/x/pkg/errors" + "yunion.io/x/sqlchemy" "yunion.io/x/jsonutils" "yunion.io/x/log" @@ -33,6 +35,7 @@ import ( type SSchedtagJointsManager struct { db.SJointResourceBaseManager + SSchedtagResourceBaseManager } func NewSchedtagJointsManager( @@ -217,3 +220,43 @@ func (joint *SSchedtagJointsBase) Detach(ctx context.Context, userCred mcclient. func (joint *SSchedtagJointsBase) detach(obj db.IJointModel, ctx context.Context, userCred mcclient.TokenCredential) error { return db.DetachJoint(ctx, userCred, obj) } + +func (manager *SSchedtagJointsManager) ListItemFilter( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SchedtagJointsListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SJointResourceBaseManager.ListItemFilter(ctx, q, userCred, query.JointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SJointResourceBaseManager.ListItemFilter") + } + q, err = manager.SSchedtagResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SchedtagFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagResourceBaseManager.ListItemFilter") + } + + return q, nil +} + +func (manager *SSchedtagJointsManager) OrderByExtraFields( + ctx context.Context, + q *sqlchemy.SQuery, + userCred mcclient.TokenCredential, + query api.SchedtagJointsListInput, +) (*sqlchemy.SQuery, error) { + var err error + + q, err = manager.SJointResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.JointResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SJointResourceBaseManager.OrderByExtraFields") + } + q, err = manager.SSchedtagResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SchedtagFilterListInput) + if err != nil { + return nil, errors.Wrap(err, "SSchedtagResourceBaseManager.OrderByExtraFields") + } + + return q, nil +} \ No newline at end of file diff --git a/pkg/compute/models/storagecaches.go b/pkg/compute/models/storagecaches.go index a89beb3ba7..313ef8eeac 100644 --- a/pkg/compute/models/storagecaches.go +++ b/pkg/compute/models/storagecaches.go @@ -40,6 +40,7 @@ import ( type SStoragecacheManager struct { db.SStandaloneResourceBaseManager + db.SExternalizedResourceBaseManager SManagedResourceBaseManager } @@ -418,11 +419,20 @@ func (manager *SStoragecacheManager) ListItemFilter( return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter") } + q, err = manager.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput) + if err != nil { + return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter") + } + q, err = manager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ManagedResourceListInput) if err != nil { return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter") } + if len(query.Path) > 0 { + q = q.In("path", query.Path) + } + return q, nil }