mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-21 14:19:49 +08:00
Merge branch 'release/2.6.0' of ssh://git.yunion.io/~qiujian/onecloud into feature/qj-network-type-pxe-ipmi
Conflicts: cmd/climc/shell/networks.go
This commit is contained in:
@@ -18,6 +18,8 @@ func init() {
|
||||
Vpc string `help:"search networks belongs to a VPC"`
|
||||
Region string `help:"search networks belongs to a CloudRegion" json:"cloudregion"`
|
||||
ServerType string `help:"search networks belongs to a ServerType" choices:"guest|baremetal|container|pxe|ipmi"`
|
||||
Private *bool `help:"show private cloud networks only" json:"is_private"`
|
||||
Public *bool `help:"show public cloud networks only" json:"is_public"`
|
||||
}
|
||||
R(&NetworkListOptions{}, "network-list", "List networks", func(s *mcclient.ClientSession, opts *NetworkListOptions) error {
|
||||
params, err := options.ListStructToParams(opts)
|
||||
|
||||
@@ -9,13 +9,13 @@ import (
|
||||
|
||||
func init() {
|
||||
type NetworkReserveIPOptions struct {
|
||||
NETWORK string `help:"IP or name of network"`
|
||||
IP string `help:"IP to reserve"`
|
||||
NOTES string `help:"Why reserve this IP"`
|
||||
NETWORK string `help:"IP or name of network"`
|
||||
NOTES string `help:"Why reserve this IP"`
|
||||
IPS []string `help:"IPs to reserve"`
|
||||
}
|
||||
R(&NetworkReserveIPOptions{}, "network-reserve-ip", "Reserve an IP address from pool", func(s *mcclient.ClientSession, args *NetworkReserveIPOptions) error {
|
||||
params := jsonutils.NewDict()
|
||||
params.Add(jsonutils.NewString(args.IP), "ip")
|
||||
params.Add(jsonutils.NewStringArray(args.IPS), "ips")
|
||||
params.Add(jsonutils.NewString(args.NOTES), "notes")
|
||||
net, err := modules.Networks.PerformAction(s, args.NETWORK, "reserve-ip", params)
|
||||
if err != nil {
|
||||
|
||||
@@ -192,6 +192,7 @@ func (h *DHCPHandler) findNetworkConf(filterUseIp bool) (*types.SNetworkConfig,
|
||||
"filter.1")
|
||||
params.Add(jsonutils.JSONTrue, "filter_any")
|
||||
}
|
||||
params.Add(jsonutils.JSONTrue, "is_private")
|
||||
session := h.baremetalManager.GetClientSession()
|
||||
ret, err := modules.Networks.List(session, params)
|
||||
if err != nil {
|
||||
|
||||
@@ -113,8 +113,6 @@ func (self *SAliyunGuestDriver) ValidateCreateData(ctx context.Context, userCred
|
||||
if disk.SizeMb < 5*1024 || disk.SizeMb > 800*1024 {
|
||||
return nil, httperrors.NewInputParameterError("The %s disk size must be in the range of 5GB ~ 800GB", disk.Backend)
|
||||
}
|
||||
default:
|
||||
return nil, httperrors.NewInputParameterError("Unkonwn disk type %s", disk.Backend)
|
||||
}
|
||||
}
|
||||
return data, nil
|
||||
|
||||
@@ -128,8 +128,6 @@ func (self *SQcloudGuestDriver) ValidateCreateData(ctx context.Context, userCred
|
||||
if disk.SizeMb < 100*1024 || disk.SizeMb > 16000*1024 {
|
||||
return nil, httperrors.NewInputParameterError("The %s disk size must be in the range of 100GB ~ 16000GB", disk.Backend)
|
||||
}
|
||||
default:
|
||||
return nil, httperrors.NewInputParameterError("Unkonwn disk type %s", disk.Backend)
|
||||
}
|
||||
}
|
||||
return data, nil
|
||||
|
||||
@@ -485,6 +485,23 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ
|
||||
}
|
||||
q = q.Filter(cond(q.Field("id"), sgq))
|
||||
}
|
||||
|
||||
orderByDisk, _ := queryDict.GetString("order_by_disk")
|
||||
if orderByDisk == "asc" {
|
||||
guestdisks := GuestdiskManager.Query().SubQuery()
|
||||
disks := DiskManager.Query().SubQuery()
|
||||
q.AppendField(sqlchemy.SUM("disks_size", disks.Field("disk_size")))
|
||||
q = q.Join(guestdisks, sqlchemy.Equals(q.Field("id"), guestdisks.Field("guest_id"))).
|
||||
Join(disks, sqlchemy.Equals(guestdisks.Field("disk_id"), disks.Field("id"))).
|
||||
Asc(q.Field("disks_size")).GroupBy(q.Field("id"))
|
||||
} else if orderByDisk == "desc" {
|
||||
guestdisks := GuestdiskManager.Query().SubQuery()
|
||||
disks := DiskManager.Query().SubQuery()
|
||||
q.AppendField(sqlchemy.SUM("disks_size", disks.Field("disk_size")))
|
||||
q = q.Join(guestdisks, sqlchemy.Equals(q.Field("id"), guestdisks.Field("guest_id"))).
|
||||
Join(disks, sqlchemy.Equals(guestdisks.Field("disk_id"), disks.Field("id"))).
|
||||
Desc(q.Field("disks_size")).GroupBy(q.Field("id"))
|
||||
}
|
||||
return q, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -187,6 +187,7 @@ func (lbacl *SLoadbalancerAcl) StartLoadBalancerAclCreateTask(ctx context.Contex
|
||||
func (lbacl *SLoadbalancerAcl) GetRegion() *SCloudregion {
|
||||
region, err := CloudregionManager.FetchById(lbacl.CloudregionId)
|
||||
if err != nil {
|
||||
log.Errorf("failed to find region for loadbalancer acl %s", lbacl.Name)
|
||||
return nil
|
||||
}
|
||||
return region.(*SCloudregion)
|
||||
|
||||
@@ -147,12 +147,17 @@ func (man *SLoadbalancerBackendGroupManager) ValidateCreateData(ctx context.Cont
|
||||
}
|
||||
}
|
||||
data.Set("backends", jsonutils.Marshal(backends))
|
||||
return lb.GetRegion().GetDriver().ValidateCreateLoadbalancerBackendGroupData(ctx, userCred, data, lb, backends)
|
||||
region := lb.GetRegion()
|
||||
if region == nil {
|
||||
return nil, httperrors.NewResourceNotFoundError("failed to find region for loadbalancer %s", lb.Name)
|
||||
}
|
||||
return region.GetDriver().ValidateCreateLoadbalancerBackendGroupData(ctx, userCred, data, lb, backends)
|
||||
}
|
||||
|
||||
func (lbbg *SLoadbalancerBackendGroup) GetLoadbalancer() *SLoadbalancer {
|
||||
lb, err := LoadbalancerManager.FetchById(lbbg.LoadbalancerId)
|
||||
if err != nil {
|
||||
fmt.Errorf("failed to find loadbalancer for backendgroup %s", lbbg.Name)
|
||||
return nil
|
||||
}
|
||||
return lb.(*SLoadbalancer)
|
||||
@@ -196,7 +201,11 @@ func (lbbg *SLoadbalancerBackendGroup) ValidateDeleteCondition(ctx context.Conte
|
||||
}
|
||||
}
|
||||
|
||||
return lbbg.GetRegion().GetDriver().ValidateDeleteLoadbalancerBackendGroupCondition(ctx, lbbg)
|
||||
region := lbbg.GetRegion()
|
||||
if region != nil {
|
||||
return nil
|
||||
}
|
||||
return region.GetDriver().ValidateDeleteLoadbalancerBackendGroupCondition(ctx, lbbg)
|
||||
}
|
||||
|
||||
func (lbbg *SLoadbalancerBackendGroup) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict {
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/validators"
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
"yunion.io/x/onecloud/pkg/httperrors"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
)
|
||||
|
||||
@@ -133,7 +134,11 @@ func (man *SLoadbalancerBackendManager) ValidateCreateData(ctx context.Context,
|
||||
if _, err := man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerProjId, query, data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return backendGroup.GetLoadbalancer().GetRegion().GetDriver().ValidateCreateLoadbalancerBackendData(ctx, userCred, data, backendType, lb, backendGroup, backendV.Model)
|
||||
region := lb.GetRegion()
|
||||
if region == nil {
|
||||
return nil, httperrors.NewResourceNotFoundError("failed to find region for loadbalancer %s", lb.Name)
|
||||
}
|
||||
return region.GetDriver().ValidateCreateLoadbalancerBackendData(ctx, userCred, data, backendType, lb, backendGroup, backendV.Model)
|
||||
}
|
||||
|
||||
func (lbb *SLoadbalancerBackend) AllowPerformStatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
|
||||
@@ -143,6 +148,7 @@ func (lbb *SLoadbalancerBackend) AllowPerformStatus(ctx context.Context, userCre
|
||||
func (lbb *SLoadbalancerBackend) GetLoadbalancerBackendGroup() *SLoadbalancerBackendGroup {
|
||||
backendgroup, err := LoadbalancerBackendGroupManager.FetchById(lbb.BackendGroupId)
|
||||
if err != nil {
|
||||
log.Errorf("failed to find backendgroup for backend %s", lbb.Name)
|
||||
return nil
|
||||
}
|
||||
return backendgroup.(*SLoadbalancerBackendGroup)
|
||||
@@ -255,7 +261,11 @@ func (lbb *SLoadbalancerBackend) ValidateDeleteCondition(ctx context.Context) er
|
||||
if err := lbb.SVirtualResourceBase.ValidateDeleteCondition(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
return lbb.GetRegion().GetDriver().ValidateDeleteLoadbalancerBackendCondition(ctx, lbb)
|
||||
region := lbb.GetRegion()
|
||||
if region == nil {
|
||||
return nil
|
||||
}
|
||||
return region.GetDriver().ValidateDeleteLoadbalancerBackendCondition(ctx, lbb)
|
||||
}
|
||||
|
||||
func (man *SLoadbalancerBackendManager) SyncLoadbalancerBackends(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, loadbalancerBackendgroup *SLoadbalancerBackendGroup, lbbs []cloudprovider.ICloudLoadbalancerBackend, syncRange *SSyncRange) compare.SyncResult {
|
||||
|
||||
@@ -194,7 +194,11 @@ func (lbcert *SLoadbalancerCertificate) ValidateUpdateData(ctx context.Context,
|
||||
if _, err := lbcert.SVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return lbcert.GetRegion().GetDriver().ValidateUpdateLoadbalancerCertificateData(ctx, userCred, data)
|
||||
region := lbcert.GetRegion()
|
||||
if region == nil {
|
||||
return nil, httperrors.NewResourceNotFoundError("failed to find region for loadbalancer certificate %s", lbcert.Name)
|
||||
}
|
||||
return region.GetDriver().ValidateUpdateLoadbalancerCertificateData(ctx, userCred, data)
|
||||
}
|
||||
|
||||
func (lbcert *SLoadbalancerCertificate) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerProjId string, query jsonutils.JSONObject, data jsonutils.JSONObject) {
|
||||
@@ -242,6 +246,7 @@ func (lbcert *SLoadbalancerCertificate) Delete(ctx context.Context, userCred mcc
|
||||
func (lbcert *SLoadbalancerCertificate) GetRegion() *SCloudregion {
|
||||
region, err := CloudregionManager.FetchById(lbcert.CloudregionId)
|
||||
if err != nil {
|
||||
log.Errorf("failed to find region for loadbalancer certificate %s", lbcert.Name)
|
||||
return nil
|
||||
}
|
||||
return region.(*SCloudregion)
|
||||
|
||||
@@ -128,7 +128,12 @@ func (man *SLoadbalancerListenerRuleManager) ValidateCreateData(ctx context.Cont
|
||||
if _, err := man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerProjId, query, data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return listener.GetRegion().GetDriver().ValidateCreateLoadbalancerListenerRuleData(ctx, userCred, data, backendGroupV.Model)
|
||||
region := listener.GetRegion()
|
||||
if region == nil {
|
||||
return nil, httperrors.NewResourceNotFoundError("failed to find region for loadbalancer listener %s", listener.Name)
|
||||
}
|
||||
|
||||
return region.GetDriver().ValidateCreateLoadbalancerListenerRuleData(ctx, userCred, data, backendGroupV.Model)
|
||||
}
|
||||
|
||||
func (lbr *SLoadbalancerListenerRule) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerProjId string, query jsonutils.JSONObject, data jsonutils.JSONObject) {
|
||||
@@ -229,6 +234,7 @@ func (lbr *SLoadbalancerListenerRule) GetExtraDetails(ctx context.Context, userC
|
||||
func (lbr *SLoadbalancerListenerRule) GetLoadbalancerListener() *SLoadbalancerListener {
|
||||
listener, err := LoadbalancerListenerManager.FetchById(lbr.ListenerId)
|
||||
if err != nil {
|
||||
log.Errorf("failed to find listener for loadbalancer listener rule %s", lbr.Name)
|
||||
return nil
|
||||
}
|
||||
return listener.(*SLoadbalancerListener)
|
||||
|
||||
@@ -271,7 +271,11 @@ func (man *SLoadbalancerListenerManager) ValidateCreateData(ctx context.Context,
|
||||
if _, err := man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerProjId, query, data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return lb.GetRegion().GetDriver().ValidateCreateLoadbalancerListenerData(ctx, userCred, data, backendGroupV.Model)
|
||||
region := lb.GetRegion()
|
||||
if region == nil {
|
||||
return nil, httperrors.NewResourceNotFoundError("failed to find region for loadbalancer %s", lb.Name)
|
||||
}
|
||||
return region.GetDriver().ValidateCreateLoadbalancerListenerData(ctx, userCred, data, backendGroupV.Model)
|
||||
}
|
||||
|
||||
func (man *SLoadbalancerListenerManager) checkTypeV(listenerType string) validators.IValidator {
|
||||
@@ -426,7 +430,13 @@ func (lblis *SLoadbalancerListener) ValidateUpdateData(ctx context.Context, user
|
||||
if _, err := lblis.SVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, data); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return lblis.GetRegion().GetDriver().ValidateUpdateLoadbalancerListenerData(ctx, userCred, data, backendGroupV.Model)
|
||||
|
||||
region := lblis.GetRegion()
|
||||
if region == nil {
|
||||
return nil, httperrors.NewResourceNotFoundError("failed to find region for loadbalancer listener %s", lblis.Name)
|
||||
}
|
||||
|
||||
return region.GetDriver().ValidateUpdateLoadbalancerListenerData(ctx, userCred, data, backendGroupV.Model)
|
||||
}
|
||||
|
||||
func (lblis *SLoadbalancerListener) PostUpdate(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) {
|
||||
@@ -621,6 +631,7 @@ func (lblis *SLoadbalancerListener) GetLoadbalancerBackendGroup() *SLoadbalancer
|
||||
func (lblis *SLoadbalancerListener) GetLoadbalancer() *SLoadbalancer {
|
||||
loadbalancer, err := LoadbalancerManager.FetchById(lblis.LoadbalancerId)
|
||||
if err != nil {
|
||||
log.Errorf("failed to find loadbalancer for loadbalancer listener %s", lblis.Name)
|
||||
return nil
|
||||
}
|
||||
return loadbalancer.(*SLoadbalancer)
|
||||
|
||||
@@ -256,6 +256,7 @@ func (lb *SLoadbalancer) GetCloudprovider() *SCloudprovider {
|
||||
func (lb *SLoadbalancer) GetRegion() *SCloudregion {
|
||||
region, err := CloudregionManager.FetchById(lb.CloudregionId)
|
||||
if err != nil {
|
||||
log.Errorf("failed to find region for loadbalancer %s", lb.Name)
|
||||
return nil
|
||||
}
|
||||
return region.(*SCloudregion)
|
||||
|
||||
@@ -917,24 +917,35 @@ func (self *SNetwork) AllowPerformReserveIp(ctx context.Context, userCred mcclie
|
||||
}
|
||||
|
||||
func (self *SNetwork) PerformReserveIp(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
ipstr, _ := data.GetString("ip")
|
||||
notes, _ := data.GetString("notes")
|
||||
if len(ipstr) == 0 || len(notes) == 0 {
|
||||
return nil, httperrors.NewInputParameterError("both reserved ip and notes should be provided")
|
||||
}
|
||||
ipAddr, err := netutils.NewIPV4Addr(ipstr)
|
||||
ips, err := data.GetArray("ips")
|
||||
if err != nil {
|
||||
return nil, httperrors.NewInputParameterError("not a valid ip address %s: %s", ipstr, err)
|
||||
if data.Contains("ip") {
|
||||
ip, _ := data.Get("ip")
|
||||
ips = []jsonutils.JSONObject{ip}
|
||||
} else {
|
||||
return nil, httperrors.NewMissingParameterError("ips")
|
||||
}
|
||||
}
|
||||
if !self.isAddressInRange(ipAddr) {
|
||||
return nil, httperrors.NewInputParameterError("Address %s not in network", ipstr)
|
||||
}
|
||||
if self.isAddressUsed(ipstr) {
|
||||
return nil, httperrors.NewConflictError("Address %s has been used", ipstr)
|
||||
}
|
||||
err = ReservedipManager.ReserveIP(userCred, self, ipstr, notes)
|
||||
notes, err := data.GetString("notes")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, httperrors.NewMissingParameterError("ips")
|
||||
}
|
||||
for _, ip := range ips {
|
||||
ipstr, _ := ip.GetString()
|
||||
ipAddr, err := netutils.NewIPV4Addr(ipstr)
|
||||
if err != nil {
|
||||
return nil, httperrors.NewInputParameterError("not a valid ip address %s: %s", ipstr, err)
|
||||
}
|
||||
if !self.isAddressInRange(ipAddr) {
|
||||
return nil, httperrors.NewInputParameterError("Address %s not in network", ipstr)
|
||||
}
|
||||
if self.isAddressUsed(ipstr) {
|
||||
return nil, httperrors.NewConflictError("Address %s has been used", ipstr)
|
||||
}
|
||||
err = ReservedipManager.ReserveIP(userCred, self, ipstr, notes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
@@ -1475,6 +1486,24 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy.
|
||||
q = q.Filter(sqlchemy.In(q.Field("wire_id"), subq.SubQuery()))
|
||||
}
|
||||
|
||||
if query.Contains("is_private") && jsonutils.QueryBoolean(query, "is_private", false) {
|
||||
wires := WireManager.Query().SubQuery()
|
||||
vpcs := VpcManager.Query().SubQuery()
|
||||
subq := wires.Query(wires.Field("id"))
|
||||
subq = subq.Join(vpcs, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id")))
|
||||
subq = subq.Filter(sqlchemy.IsNullOrEmpty(vpcs.Field("manager_id")))
|
||||
q = q.Filter(sqlchemy.In(q.Field("wire_id"), subq.SubQuery()))
|
||||
}
|
||||
|
||||
if query.Contains("is_public") && jsonutils.QueryBoolean(query, "is_public", false) {
|
||||
wires := WireManager.Query().SubQuery()
|
||||
vpcs := VpcManager.Query().SubQuery()
|
||||
subq := wires.Query(wires.Field("id"))
|
||||
subq = subq.Join(vpcs, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id")))
|
||||
subq = subq.Filter(sqlchemy.IsNotEmpty(vpcs.Field("manager_id")))
|
||||
q = q.Filter(sqlchemy.In(q.Field("wire_id"), subq.SubQuery()))
|
||||
}
|
||||
|
||||
return q, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
package regiondrivers // import "yunion.io/x/onecloud/pkg/compute/regiondrivers"
|
||||
@@ -1,4 +1,4 @@
|
||||
package storageman
|
||||
package diskhandlers
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -10,7 +10,9 @@ import (
|
||||
|
||||
"yunion.io/x/onecloud/pkg/appsrv"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/workmanager"
|
||||
"yunion.io/x/onecloud/pkg/hostman/guestman"
|
||||
"yunion.io/x/onecloud/pkg/hostman/hostutils"
|
||||
"yunion.io/x/onecloud/pkg/hostman/storageman"
|
||||
"yunion.io/x/onecloud/pkg/httperrors"
|
||||
"yunion.io/x/onecloud/pkg/mcclient/auth"
|
||||
)
|
||||
@@ -28,7 +30,7 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
type actionFunc func(context.Context, IStorage, string, IDisk, jsonutils.JSONObject) (interface{}, error)
|
||||
type actionFunc func(context.Context, storageman.IStorage, string, storageman.IDisk, jsonutils.JSONObject) (interface{}, error)
|
||||
|
||||
func AddDiskHandler(prefix string, app *appsrv.Application) {
|
||||
for _, keyWord := range keyWords {
|
||||
@@ -70,7 +72,7 @@ func performImageCache(
|
||||
httperrors.MissingParameterError(w, "disk")
|
||||
return
|
||||
}
|
||||
storagecache := storageManager.GetStoragecacheById(scId)
|
||||
storagecache := storageman.GetManager().GetStoragecacheById(scId)
|
||||
if storagecache == nil {
|
||||
httperrors.NotFoundError(w, "Storagecache %s not found", scId)
|
||||
return
|
||||
@@ -102,7 +104,7 @@ func saveToGlance(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
storageId = params["<storageId>"]
|
||||
diskInfo, _ = body.Get("disk")
|
||||
)
|
||||
storage := storageManager.GetStorage(storageId)
|
||||
storage := storageman.GetManager().GetStorage(storageId)
|
||||
if storage == nil {
|
||||
hostutils.Response(ctx, w, httperrors.NewNotFoundError("Storage %s not found", storageId))
|
||||
return
|
||||
@@ -131,7 +133,7 @@ func perfomrDiskActions(ctx context.Context, w http.ResponseWriter, r *http.Requ
|
||||
hostutils.Response(ctx, w, httperrors.NewNotFoundError("Not found"))
|
||||
return
|
||||
}
|
||||
storage := storageManager.GetStorage(storageId)
|
||||
storage := storageman.GetManager().GetStorage(storageId)
|
||||
if storage == nil {
|
||||
hostutils.Response(ctx, w, httperrors.NewNotFoundError("Storage %s not found", storageId))
|
||||
return
|
||||
@@ -152,17 +154,17 @@ func perfomrDiskActions(ctx context.Context, w http.ResponseWriter, r *http.Requ
|
||||
}
|
||||
}
|
||||
|
||||
func diskCreate(ctx context.Context, storage IStorage, diskId string, disk IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
func diskCreate(ctx context.Context, storage storageman.IStorage, diskId string, disk storageman.IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
diskInfo, err := body.Get("disk")
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("disk")
|
||||
}
|
||||
hostutils.DelayTask(ctx, storage.CreateDiskByDiskinfo,
|
||||
&SDiskCreateByDiskinfo{diskId, disk, diskInfo, storage})
|
||||
&storageman.SDiskCreateByDiskinfo{diskId, disk, diskInfo, storage})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func diskDelete(ctx context.Context, storage IStorage, diskId string, disk IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
func diskDelete(ctx context.Context, storage storageman.IStorage, diskId string, disk storageman.IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if disk != nil {
|
||||
hostutils.DelayTask(ctx, disk.Delete, nil)
|
||||
} else {
|
||||
@@ -171,16 +173,22 @@ func diskDelete(ctx context.Context, storage IStorage, diskId string, disk IDisk
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func diskResize(ctx context.Context, storage IStorage, diskId string, disk IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
func diskResize(ctx context.Context, storage storageman.IStorage, diskId string, disk storageman.IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
diskInfo, err := body.Get("disk")
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("disk")
|
||||
}
|
||||
hostutils.DelayTask(ctx, disk.Resize, diskInfo)
|
||||
return nil, nil
|
||||
serverId, _ := diskInfo.GetString("server_id")
|
||||
if len(serverId) > 0 && guestman.GetGuestManager().Status(serverId) == "running" {
|
||||
sizeMb, _ := diskInfo.Int("size")
|
||||
return guestman.GetGuestManager().OnlineResizeDisk(ctx, serverId, diskId, sizeMb)
|
||||
} else {
|
||||
hostutils.DelayTask(ctx, disk.Resize, diskInfo)
|
||||
return nil, nil
|
||||
}
|
||||
}
|
||||
|
||||
func diskSavePrepare(ctx context.Context, storage IStorage, diskId string, disk IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
func diskSavePrepare(ctx context.Context, storage storageman.IStorage, diskId string, disk storageman.IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
diskInfo, err := body.Get("disk")
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("disk")
|
||||
@@ -189,7 +197,7 @@ func diskSavePrepare(ctx context.Context, storage IStorage, diskId string, disk
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func diskReset(ctx context.Context, storage IStorage, diskId string, disk IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
func diskReset(ctx context.Context, storage storageman.IStorage, diskId string, disk storageman.IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
snapshotId, err := body.GetString("snapshot_id")
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("snapshot_id")
|
||||
@@ -198,7 +206,7 @@ func diskReset(ctx context.Context, storage IStorage, diskId string, disk IDisk,
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("out_of_chain")
|
||||
}
|
||||
hostutils.DelayTask(ctx, disk.ResetFromSnapshot, &SDiskReset{snapshotId, outOfChain})
|
||||
hostutils.DelayTask(ctx, disk.ResetFromSnapshot, &storageman.SDiskReset{snapshotId, outOfChain})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -211,7 +219,7 @@ func diskReset(ctx context.Context, storage IStorage, diskId string, disk IDisk,
|
||||
// return nil, nil
|
||||
// }
|
||||
|
||||
func diskCleanupSnapshots(ctx context.Context, storage IStorage, diskId string, disk IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
func diskCleanupSnapshots(ctx context.Context, storage storageman.IStorage, diskId string, disk storageman.IDisk, body jsonutils.JSONObject) (interface{}, error) {
|
||||
convertSnapshots, err := body.GetArray("convert_snapshots")
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("convert_snapshots")
|
||||
@@ -220,6 +228,6 @@ func diskCleanupSnapshots(ctx context.Context, storage IStorage, diskId string,
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("delete_snapshots")
|
||||
}
|
||||
hostutils.DelayTask(ctx, disk.CleanupSnapshots, &SDiskCleanupSnapshots{convertSnapshots, deleteSnapshots})
|
||||
hostutils.DelayTask(ctx, disk.CleanupSnapshots, &storageman.SDiskCleanupSnapshots{convertSnapshots, deleteSnapshots})
|
||||
return nil, nil
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package guestman
|
||||
package guesthandlers
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -8,7 +8,9 @@ import (
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/appsrv"
|
||||
"yunion.io/x/onecloud/pkg/hostman/guestman"
|
||||
"yunion.io/x/onecloud/pkg/hostman/hostutils"
|
||||
"yunion.io/x/onecloud/pkg/hostman/storageman"
|
||||
"yunion.io/x/onecloud/pkg/httperrors"
|
||||
@@ -88,12 +90,12 @@ func guestActions(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
func getStatus(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
params, _, _ := appsrv.FetchEnv(ctx, w, r)
|
||||
var status = guestManger.Status(params["<sid>"])
|
||||
var status = guestman.GetGuestManager().Status(params["<sid>"])
|
||||
appsrv.SendStruct(w, strDict{"status": status})
|
||||
}
|
||||
|
||||
func cpusetBalance(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
hostutils.DelayTask(ctx, guestManger.CpusetBalance, nil)
|
||||
hostutils.DelayTask(ctx, guestman.GetGuestManager().CpusetBalance, nil)
|
||||
hostutils.ResponseOk(ctx, w)
|
||||
}
|
||||
|
||||
@@ -101,7 +103,7 @@ func deleteGuest(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
params, _, body := appsrv.FetchEnv(ctx, w, r)
|
||||
var sid = params["<sid>"]
|
||||
var migrated = jsonutils.QueryBoolean(body, "migrated", false)
|
||||
guest, err := guestManger.Delete(sid)
|
||||
guest, err := guestman.GetGuestManager().Delete(sid)
|
||||
if err != nil {
|
||||
hostutils.Response(ctx, w, err)
|
||||
} else {
|
||||
@@ -111,25 +113,25 @@ func deleteGuest(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
func guestCreate(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
err := guestManger.PrepareCreate(sid)
|
||||
err := guestman.GetGuestManager().PrepareCreate(sid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
hostutils.DelayTask(ctx, guestManger.GuestDeploy, &SGuestDeploy{sid, body, true})
|
||||
hostutils.DelayTask(ctx, guestman.GetGuestManager().GuestDeploy, &guestman.SGuestDeploy{sid, body, true})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func guestDeploy(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
err := guestManger.PrepareDeploy(sid)
|
||||
err := guestman.GetGuestManager().PrepareDeploy(sid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
hostutils.DelayTask(ctx, guestManger.GuestDeploy, &SGuestDeploy{sid, body, false})
|
||||
hostutils.DelayTask(ctx, guestman.GetGuestManager().GuestDeploy, &guestman.SGuestDeploy{sid, body, false})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func guestStart(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
return guestManger.GuestStart(ctx, sid, body)
|
||||
return guestman.GetGuestManager().GuestStart(ctx, sid, body)
|
||||
}
|
||||
|
||||
func guestStop(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
@@ -137,11 +139,11 @@ func guestStop(ctx context.Context, sid string, body jsonutils.JSONObject) (inte
|
||||
if err != nil {
|
||||
timeout = 30
|
||||
}
|
||||
return nil, guestManger.GuestStop(ctx, sid, timeout)
|
||||
return nil, guestman.GetGuestManager().GuestStop(ctx, sid, timeout)
|
||||
}
|
||||
|
||||
func guestMonitor(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.IsGuestExist(sid) {
|
||||
if !guestman.GetGuestManager().IsGuestExist(sid) {
|
||||
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
|
||||
}
|
||||
|
||||
@@ -151,7 +153,7 @@ func guestMonitor(ctx context.Context, sid string, body jsonutils.JSONObject) (i
|
||||
c <- res
|
||||
}
|
||||
cmd, _ := body.GetString("cmd")
|
||||
err := guestManger.Monitor(sid, cmd, cb)
|
||||
err := guestman.GetGuestManager().Monitor(sid, cmd, cb)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
@@ -169,33 +171,33 @@ func guestMonitor(ctx context.Context, sid string, body jsonutils.JSONObject) (i
|
||||
}
|
||||
|
||||
func guestSync(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.IsGuestExist(sid) {
|
||||
if !guestman.GetGuestManager().IsGuestExist(sid) {
|
||||
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
|
||||
}
|
||||
hostutils.DelayTask(ctx, guestManger.GuestSync, &SBaseParms{sid, body})
|
||||
hostutils.DelayTask(ctx, guestman.GetGuestManager().GuestSync, &guestman.SBaseParms{sid, body})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func guestSuspend(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.IsGuestExist(sid) {
|
||||
if !guestman.GetGuestManager().IsGuestExist(sid) {
|
||||
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
|
||||
}
|
||||
hostutils.DelayTaskWithoutReqctx(ctx, guestManger.GuestSuspend, sid)
|
||||
hostutils.DelayTaskWithoutReqctx(ctx, guestman.GetGuestManager().GuestSuspend, sid)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func guestSrcPrepareMigrate(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.IsGuestExist(sid) {
|
||||
if !guestman.GetGuestManager().IsGuestExist(sid) {
|
||||
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
|
||||
}
|
||||
liveMigrate := jsonutils.QueryBoolean(body, "live_migrate", false)
|
||||
hostutils.DelayTask(ctx, guestManger.SrcPrepareMigrate,
|
||||
&SSrcPrepareMigrate{sid, liveMigrate})
|
||||
hostutils.DelayTask(ctx, guestman.GetGuestManager().SrcPrepareMigrate,
|
||||
&guestman.SSrcPrepareMigrate{sid, liveMigrate})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func guestDestPrepareMigrate(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.CanMigrate(sid) {
|
||||
if !guestman.GetGuestManager().CanMigrate(sid) {
|
||||
return nil, httperrors.NewBadRequestError("Guest exist")
|
||||
}
|
||||
desc, err := body.Get("desc")
|
||||
@@ -211,7 +213,7 @@ func guestDestPrepareMigrate(ctx context.Context, sid string, body jsonutils.JSO
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("is_local_storage")
|
||||
}
|
||||
var params = &SDestPrepareMigrate{}
|
||||
var params = &guestman.SDestPrepareMigrate{}
|
||||
params.Sid = sid
|
||||
params.Desc = desc
|
||||
params.QemuVersion = qemuVersion
|
||||
@@ -258,12 +260,12 @@ func guestDestPrepareMigrate(ctx context.Context, sid string, body jsonutils.JSO
|
||||
params.TargetStorageId = targetStorageId
|
||||
}
|
||||
}
|
||||
hostutils.DelayTask(ctx, guestManger.DestPrepareMigrate, params)
|
||||
hostutils.DelayTask(ctx, guestman.GetGuestManager().DestPrepareMigrate, params)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func guestLiveMigrate(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.IsGuestExist(sid) {
|
||||
if !guestman.GetGuestManager().IsGuestExist(sid) {
|
||||
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
|
||||
}
|
||||
destPort, err := body.Int("live_migrate_dest_port")
|
||||
@@ -278,18 +280,18 @@ func guestLiveMigrate(ctx context.Context, sid string, body jsonutils.JSONObject
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("is_local_storage")
|
||||
}
|
||||
hostutils.DelayTaskWithoutReqctx(ctx, guestManger.LiveMigrate, &SLiveMigrate{
|
||||
hostutils.DelayTaskWithoutReqctx(ctx, guestman.GetGuestManager().LiveMigrate, &guestman.SLiveMigrate{
|
||||
Sid: sid, DestPort: int(destPort), DestIp: destIp, IsLocal: isLocal,
|
||||
})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func guestResume(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.IsGuestExist(sid) {
|
||||
if !guestman.GetGuestManager().IsGuestExist(sid) {
|
||||
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
|
||||
}
|
||||
isLiveMigrate := jsonutils.QueryBoolean(body, "live_migrate", false)
|
||||
guestManger.Resume(ctx, sid, isLiveMigrate)
|
||||
guestman.GetGuestManager().Resume(ctx, sid, isLiveMigrate)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -302,20 +304,20 @@ func guestResume(ctx context.Context, sid string, body jsonutils.JSONObject) (in
|
||||
// }
|
||||
|
||||
func guestDriveMirror(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.IsGuestExist(sid) {
|
||||
if !guestman.GetGuestManager().IsGuestExist(sid) {
|
||||
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
|
||||
}
|
||||
backupNbdServerUri, err := body.GetString("backup_ndb_server_uri")
|
||||
if err != nil {
|
||||
return nil, httperrors.NewMissingParameterError("backup_ndb_server_uri")
|
||||
}
|
||||
hostutils.DelayTaskWithoutReqctx(ctx, guestManger.StartDriveMirror,
|
||||
&SDriverMirror{sid, backupNbdServerUri})
|
||||
hostutils.DelayTaskWithoutReqctx(ctx, guestman.GetGuestManager().StartDriveMirror,
|
||||
&guestman.SDriverMirror{sid, backupNbdServerUri})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func guestReloadDiskSnapshot(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.IsGuestExist(sid) {
|
||||
if !guestman.GetGuestManager().IsGuestExist(sid) {
|
||||
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
|
||||
}
|
||||
diskId, err := body.GetString("disk_id")
|
||||
@@ -324,7 +326,7 @@ func guestReloadDiskSnapshot(ctx context.Context, sid string, body jsonutils.JSO
|
||||
}
|
||||
|
||||
var disk storageman.IDisk
|
||||
guest := guestManger.Servers[sid]
|
||||
guest := guestman.GetGuestManager().Servers[sid]
|
||||
disks, _ := guest.Desc.GetArray("disks")
|
||||
for _, d := range disks {
|
||||
id, _ := d.GetString("disk_id")
|
||||
@@ -338,12 +340,12 @@ func guestReloadDiskSnapshot(ctx context.Context, sid string, body jsonutils.JSO
|
||||
return nil, httperrors.NewNotFoundError("Disk not found")
|
||||
}
|
||||
|
||||
hostutils.DelayTaskWithoutReqctx(ctx, guestManger.ReloadDiskSnapshot, &SReloadDisk{sid, disk})
|
||||
hostutils.DelayTaskWithoutReqctx(ctx, guestman.GetGuestManager().ReloadDiskSnapshot, &guestman.SReloadDisk{sid, disk})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func guestSnapshot(ctx context.Context, sid string, body jsonutils.JSONObject) (interface{}, error) {
|
||||
if !guestManger.IsGuestExist(sid) {
|
||||
if !guestman.GetGuestManager().IsGuestExist(sid) {
|
||||
return nil, httperrors.NewNotFoundError("Guest %s not found", sid)
|
||||
}
|
||||
snapshotId, err := body.GetString("snapshot_id")
|
||||
@@ -356,7 +358,7 @@ func guestSnapshot(ctx context.Context, sid string, body jsonutils.JSONObject) (
|
||||
}
|
||||
|
||||
var disk storageman.IDisk
|
||||
guest := guestManger.Servers[sid]
|
||||
guest := guestman.GetGuestManager().Servers[sid]
|
||||
disks, _ := guest.Desc.GetArray("disks")
|
||||
for _, d := range disks {
|
||||
id, _ := d.GetString("disk_id")
|
||||
@@ -370,7 +372,7 @@ func guestSnapshot(ctx context.Context, sid string, body jsonutils.JSONObject) (
|
||||
return nil, httperrors.NewNotFoundError("Disk not found")
|
||||
}
|
||||
|
||||
hostutils.DelayTask(ctx, guestManger.DoSnapshot, &SDiskSnapshot{sid, snapshotId, disk})
|
||||
hostutils.DelayTask(ctx, guestman.GetGuestManager().DoSnapshot, &guestman.SDiskSnapshot{sid, snapshotId, disk})
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -385,7 +387,7 @@ func guestDeleteSnapshot(ctx context.Context, sid string, body jsonutils.JSONObj
|
||||
}
|
||||
|
||||
var disk storageman.IDisk
|
||||
guest := guestManger.Servers[sid]
|
||||
guest := guestman.GetGuestManager().Servers[sid]
|
||||
disks, _ := guest.Desc.GetArray("disks")
|
||||
for _, d := range disks {
|
||||
id, _ := d.GetString("disk_id")
|
||||
@@ -399,7 +401,7 @@ func guestDeleteSnapshot(ctx context.Context, sid string, body jsonutils.JSONObj
|
||||
return nil, httperrors.NewNotFoundError("Disk not found")
|
||||
}
|
||||
|
||||
params := &SDeleteDiskSnapshot{
|
||||
params := &guestman.SDeleteDiskSnapshot{
|
||||
Sid: sid,
|
||||
DeleteSnapshot: deleteSnapshot,
|
||||
Disk: disk,
|
||||
@@ -417,6 +419,6 @@ func guestDeleteSnapshot(ctx context.Context, sid string, body jsonutils.JSONObj
|
||||
}
|
||||
params.PendingDelete = pendingDelete
|
||||
}
|
||||
hostutils.DelayTask(ctx, guestManger.DeleteSnapshot, params)
|
||||
hostutils.DelayTask(ctx, guestman.GetGuestManager().DeleteSnapshot, params)
|
||||
return nil, nil
|
||||
}
|
||||
@@ -257,7 +257,7 @@ func (m *SGuestManager) PrepareDeploy(sid string) error {
|
||||
func (m *SGuestManager) Monitor(sid, cmd string, callback func(string)) error {
|
||||
if guest, ok := m.Servers[sid]; ok {
|
||||
if guest.IsRunning() {
|
||||
guest.Monitor.HumanMonirotCommand(cmd, callback)
|
||||
guest.Monitor.HumanMonitorCommand(cmd, callback)
|
||||
return nil
|
||||
} else {
|
||||
return httperrors.NewBadRequestError("Server stopped??")
|
||||
@@ -611,6 +611,19 @@ func (m *SGuestManager) Resume(ctx context.Context, sid string, isLiveMigrate bo
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (m *SGuestManager) OnlineResizeDisk(ctx context.Context, sid string, diskId string, sizeMb int64) (jsonutils.JSONObject, error) {
|
||||
guest, ok := guestManger.Servers[sid]
|
||||
if !ok {
|
||||
return nil, httperrors.NewNotFoundError("guest %s not found", sid)
|
||||
}
|
||||
if guest.IsRunning() {
|
||||
guest.onlineResizeDisk(ctx, diskId, sizeMb)
|
||||
return nil, nil
|
||||
} else {
|
||||
return nil, httperrors.NewInvalidStatusError("guest is not runnign")
|
||||
}
|
||||
}
|
||||
|
||||
// func (m *SGuestManager) StartNbdServer(ctx context.Context, params interface{}) (jsonutils.JSONObject, error) {
|
||||
// sid, ok := params.(string)
|
||||
// if !ok {
|
||||
|
||||
@@ -954,3 +954,49 @@ func (s *SDriveMirrorTask) startMirror(res string) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GuestOnlineResizeDiskTask
|
||||
**/
|
||||
|
||||
type SGuestOnlineResizeDiskTask struct {
|
||||
*SKVMGuestInstance
|
||||
|
||||
ctx context.Context
|
||||
diskId string
|
||||
sizeMB int64
|
||||
}
|
||||
|
||||
func NewGuestOnlineResizeDiskTask(
|
||||
ctx context.Context, s *SKVMGuestInstance, diskId string, sizeMB int64,
|
||||
) *SGuestOnlineResizeDiskTask {
|
||||
return &SGuestOnlineResizeDiskTask{
|
||||
SKVMGuestInstance: s,
|
||||
ctx: ctx,
|
||||
diskId: diskId,
|
||||
sizeMB: sizeMB,
|
||||
}
|
||||
}
|
||||
|
||||
func (task *SGuestOnlineResizeDiskTask) Start() {
|
||||
task.Monitor.GetBlocks(task.OnGetBlocksSucc)
|
||||
}
|
||||
|
||||
func (task *SGuestOnlineResizeDiskTask) OnGetBlocksSucc(results *jsonutils.JSONArray) {
|
||||
for i := 0; i < results.Size(); i += 1 {
|
||||
result, _ := results.GetAt(i)
|
||||
fileStr, _ := result.GetString("inserted", "file")
|
||||
if len(fileStr) > 0 && strings.HasSuffix(fileStr, task.diskId) {
|
||||
driveName, _ := result.GetString("device")
|
||||
task.Monitor.ResizeDisk(driveName, task.sizeMB, task.OnResizeSucc)
|
||||
return
|
||||
}
|
||||
}
|
||||
hostutils.TaskFailed(task.ctx, fmt.Sprintf("disk %s not found on this guest", task.diskId))
|
||||
}
|
||||
|
||||
func (task *SGuestOnlineResizeDiskTask) OnResizeSucc(result string) {
|
||||
params := jsonutils.NewDict()
|
||||
params.Add(jsonutils.NewInt(task.sizeMB), "disk_size")
|
||||
hostutils.TaskComplete(task.ctx, params)
|
||||
}
|
||||
|
||||
@@ -1169,3 +1169,8 @@ func (s *SKVMGuestInstance) PrepareMigrate(liveMigrage bool) (*jsonutils.JSONDic
|
||||
}
|
||||
return disksBackFile, nil
|
||||
}
|
||||
|
||||
func (s *SKVMGuestInstance) onlineResizeDisk(ctx context.Context, diskId string, sizeMB int64) {
|
||||
task := NewGuestOnlineResizeDiskTask(ctx, s, diskId, sizeMB)
|
||||
task.Start()
|
||||
}
|
||||
|
||||
@@ -10,7 +10,9 @@ import (
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/cronman"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/service"
|
||||
"yunion.io/x/onecloud/pkg/hostman/diskhandlers"
|
||||
"yunion.io/x/onecloud/pkg/hostman/downloader"
|
||||
"yunion.io/x/onecloud/pkg/hostman/guesthandlers"
|
||||
"yunion.io/x/onecloud/pkg/hostman/guestman"
|
||||
"yunion.io/x/onecloud/pkg/hostman/hostinfo"
|
||||
"yunion.io/x/onecloud/pkg/hostman/hostmetrics"
|
||||
@@ -84,9 +86,9 @@ func (host *SHostService) StartService() {
|
||||
}
|
||||
|
||||
func (host *SHostService) initHandlers(app *appsrv.Application) {
|
||||
guestman.AddGuestTaskHandler("", app)
|
||||
guesthandlers.AddGuestTaskHandler("", app)
|
||||
storageman.AddStorageHandler("", app)
|
||||
storageman.AddDiskHandler("", app)
|
||||
diskhandlers.AddDiskHandler("", app)
|
||||
downloader.AddDownloadHandler("", app)
|
||||
addKubeAgentHandler("", app)
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
package hostmetrics // import "yunion.io/x/onecloud/pkg/hostman/hostmetrics"
|
||||
@@ -175,7 +175,7 @@ func (m *HmpMonitor) SimpleCommand(cmd string, callback StringCallback) {
|
||||
m.Query(cmd, callback)
|
||||
}
|
||||
|
||||
func (m *HmpMonitor) HumanMonirotCommand(cmd string, callback StringCallback) {
|
||||
func (m *HmpMonitor) HumanMonitorCommand(cmd string, callback StringCallback) {
|
||||
m.Query(cmd, callback)
|
||||
}
|
||||
|
||||
@@ -351,3 +351,8 @@ func (m *HmpMonitor) StartNbdServer(port int, exportAllDevice, writable bool, ca
|
||||
cmd += fmt.Sprintf(" 0.0.0.0:%d", port)
|
||||
m.Query(cmd, callback)
|
||||
}
|
||||
|
||||
func (m *HmpMonitor) ResizeDisk(driveName string, sizeMB int64, callback StringCallback) {
|
||||
cmd := fmt.Sprintf("block_resize %s %d", driveName, sizeMB)
|
||||
m.Query(cmd, callback)
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ type Monitor interface {
|
||||
|
||||
// The callback function will be called in another goroutine
|
||||
SimpleCommand(cmd string, callback StringCallback)
|
||||
HumanMonirotCommand(cmd string, callback StringCallback)
|
||||
HumanMonitorCommand(cmd string, callback StringCallback)
|
||||
|
||||
QueryStatus(StringCallback)
|
||||
GetVersion(StringCallback)
|
||||
@@ -45,6 +45,8 @@ type Monitor interface {
|
||||
ReloadDiskBlkdev(device, path string, callback StringCallback)
|
||||
SetVncPassword(proto, password string, callback StringCallback)
|
||||
StartNbdServer(port int, exportAllDevice, writable bool, callback StringCallback)
|
||||
|
||||
ResizeDisk(driveName string, sizeMB int64, callback StringCallback)
|
||||
}
|
||||
|
||||
type MonitorErrorFunc func(error)
|
||||
|
||||
@@ -297,7 +297,7 @@ func (m *QmpMonitor) SimpleCommand(cmd string, callback StringCallback) {
|
||||
m.Query(c, cb)
|
||||
}
|
||||
|
||||
func (m *QmpMonitor) HumanMonirotCommand(cmd string, callback StringCallback) {
|
||||
func (m *QmpMonitor) HumanMonitorCommand(cmd string, callback StringCallback) {
|
||||
var (
|
||||
c = &Command{
|
||||
Execute: "human-monitor-command",
|
||||
@@ -382,7 +382,7 @@ func (m *QmpMonitor) GetBlocks(callback func(*jsonutils.JSONArray)) {
|
||||
}
|
||||
|
||||
func (m *QmpMonitor) ChangeCdrom(dev string, path string, callback StringCallback) {
|
||||
m.HumanMonirotCommand(fmt.Sprintf("change %s %s", dev, path), callback)
|
||||
m.HumanMonitorCommand(fmt.Sprintf("change %s %s", dev, path), callback)
|
||||
// var (
|
||||
// args = map[string]interface{}{
|
||||
// "arguments": map[string]interface{}{
|
||||
@@ -404,7 +404,7 @@ func (m *QmpMonitor) ChangeCdrom(dev string, path string, callback StringCallbac
|
||||
}
|
||||
|
||||
func (m *QmpMonitor) EjectCdrom(dev string, callback StringCallback) {
|
||||
m.HumanMonirotCommand(fmt.Sprintf("eject -f %s", dev), callback)
|
||||
m.HumanMonitorCommand(fmt.Sprintf("eject -f %s", dev), callback)
|
||||
// XXX: 同下
|
||||
// var (
|
||||
// args = map[string]interface{}{
|
||||
@@ -427,7 +427,7 @@ func (m *QmpMonitor) EjectCdrom(dev string, callback StringCallback) {
|
||||
}
|
||||
|
||||
func (m *QmpMonitor) DriveDel(idstr string, callback StringCallback) {
|
||||
m.HumanMonirotCommand(fmt.Sprintf("drive_del %s", idstr), callback)
|
||||
m.HumanMonitorCommand(fmt.Sprintf("drive_del %s", idstr), callback)
|
||||
// XXX: 同下
|
||||
// var (
|
||||
// args = map[string]interface{}{
|
||||
@@ -449,7 +449,7 @@ func (m *QmpMonitor) DriveDel(idstr string, callback StringCallback) {
|
||||
}
|
||||
|
||||
func (m *QmpMonitor) DeviceDel(idstr string, callback StringCallback) {
|
||||
m.HumanMonirotCommand(fmt.Sprintf("device_del %s", idstr), callback)
|
||||
m.HumanMonitorCommand(fmt.Sprintf("device_del %s", idstr), callback)
|
||||
// XXX: 同下
|
||||
// var (
|
||||
// args = map[string]interface{}{
|
||||
@@ -476,7 +476,7 @@ func (m *QmpMonitor) DriveAdd(bus string, params map[string]string, callback Str
|
||||
paramsKvs = append(paramsKvs, fmt.Sprintf("%s=%s", k, v))
|
||||
}
|
||||
cmd := fmt.Sprintf("drive_add %s %s", bus, strings.Join(paramsKvs, ","))
|
||||
m.HumanMonirotCommand(cmd, callback)
|
||||
m.HumanMonitorCommand(cmd, callback)
|
||||
// XXX: 同下
|
||||
// var (
|
||||
// args = map[string]interface{}{
|
||||
@@ -504,7 +504,7 @@ func (m *QmpMonitor) DeviceAdd(dev string, params map[string]interface{}, callba
|
||||
paramsKvs = append(paramsKvs, fmt.Sprintf("%s=%v", k, v))
|
||||
}
|
||||
cmd := fmt.Sprintf("device_add %s,%s", dev, strings.Join(paramsKvs, ","))
|
||||
m.HumanMonirotCommand(cmd, callback)
|
||||
m.HumanMonitorCommand(cmd, callback)
|
||||
|
||||
// XXX: 参数不对,之后再调,先用着hmp的参数
|
||||
// var (
|
||||
@@ -696,5 +696,10 @@ func (m *QmpMonitor) StartNbdServer(port int, exportAllDevice, writable bool, ca
|
||||
cmd += " -w"
|
||||
}
|
||||
cmd += fmt.Sprintf(" 0.0.0.0:%d", port)
|
||||
m.HumanMonirotCommand(cmd, callback)
|
||||
m.HumanMonitorCommand(cmd, callback)
|
||||
}
|
||||
|
||||
func (m *QmpMonitor) ResizeDisk(driveName string, sizeMB int64, callback StringCallback) {
|
||||
cmd := fmt.Sprintf("block_resize %s %d", driveName, sizeMB)
|
||||
m.HumanMonitorCommand(cmd, callback)
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ type SImageOptions struct {
|
||||
|
||||
pending_delete.SPendingDeleteOptions
|
||||
|
||||
DefaultImageQuota int `default:"5" help:"Common image quota per tenant, default 5"`
|
||||
DefaultImageQuota int `default:"10" help:"Common image quota per tenant, default 10"`
|
||||
|
||||
PortV2 int `help:"Listening port for region V2"`
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@ func (this *JointResourceManager) Attach(s *mcclient.ClientSession, mid, sid str
|
||||
return this.filterSingleResult(s, result, nil)
|
||||
}
|
||||
|
||||
/*func (this *JointResourceManager) BatchAttach(s *mcclient.ClientSession, mid string, sids []string, params jsonutils.JSONObject) []SubmitResult {
|
||||
func (this *JointResourceManager) BatchAttach(s *mcclient.ClientSession, mid string, sids []string, params jsonutils.JSONObject) []SubmitResult {
|
||||
return BatchDo(sids, func(sid string) (jsonutils.JSONObject, error) {
|
||||
return this.Attach(s, mid, sid, params)
|
||||
})
|
||||
@@ -114,7 +114,7 @@ func (this *JointResourceManager) BatchAttach2(s *mcclient.ClientSession, mid st
|
||||
return BatchDo(sids, func(sid string) (jsonutils.JSONObject, error) {
|
||||
return this.Attach(s, sid, mid, params)
|
||||
})
|
||||
}*/
|
||||
}
|
||||
|
||||
func (this *JointResourceManager) Detach(s *mcclient.ClientSession, mid, sid string) (jsonutils.JSONObject, error) {
|
||||
path := fmt.Sprintf("/%s/%s/%s/%s", this.Master.KeyString(), url.PathEscape(mid), this.Slave.KeyString(), url.PathEscape(sid))
|
||||
@@ -125,7 +125,7 @@ func (this *JointResourceManager) Detach(s *mcclient.ClientSession, mid, sid str
|
||||
return this.filterSingleResult(s, result, nil)
|
||||
}
|
||||
|
||||
/*func (this *JointResourceManager) BatchDetach(s *mcclient.ClientSession, mid string, sids []string) []SubmitResult {
|
||||
func (this *JointResourceManager) BatchDetach(s *mcclient.ClientSession, mid string, sids []string) []SubmitResult {
|
||||
return BatchDo(sids, func(sid string) (jsonutils.JSONObject, error) {
|
||||
return this.Detach(s, mid, sid)
|
||||
})
|
||||
@@ -135,7 +135,7 @@ func (this *JointResourceManager) BatchDetach2(s *mcclient.ClientSession, mid st
|
||||
return BatchDo(sids, func(sid string) (jsonutils.JSONObject, error) {
|
||||
return this.Detach(s, sid, mid)
|
||||
})
|
||||
}*/
|
||||
}
|
||||
|
||||
func (this *JointResourceManager) Update(s *mcclient.ClientSession, mid, sid string, query jsonutils.JSONObject, params jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
path := fmt.Sprintf("/%s/%s/%s/%s", this.Master.KeyString(), url.PathEscape(mid), this.Slave.KeyString(), url.PathEscape(sid))
|
||||
|
||||
@@ -132,11 +132,11 @@ type JointManager interface {
|
||||
ListDescendent2(s *mcclient.ClientSession, sid string, params jsonutils.JSONObject) (*ListResult, error)
|
||||
ListAscendent(s *mcclient.ClientSession, mid string, params jsonutils.JSONObject) (*ListResult, error)
|
||||
Attach(s *mcclient.ClientSession, mid, sid string, params jsonutils.JSONObject) (jsonutils.JSONObject, error)
|
||||
// BatchAttach(s *mcclient.ClientSession, mid string, sids []string, params jsonutils.JSONObject) []SubmitResult
|
||||
// BatchAttach2(s *mcclient.ClientSession, mid string, sids []string, params jsonutils.JSONObject) []SubmitResult
|
||||
BatchAttach(s *mcclient.ClientSession, mid string, sids []string, params jsonutils.JSONObject) []SubmitResult
|
||||
BatchAttach2(s *mcclient.ClientSession, mid string, sids []string, params jsonutils.JSONObject) []SubmitResult
|
||||
Detach(s *mcclient.ClientSession, mid, sid string, query jsonutils.JSONObject) (jsonutils.JSONObject, error)
|
||||
// BatchDetach(s *mcclient.ClientSession, mid string, sids []string) []SubmitResult
|
||||
// BatchDetach2(s *mcclient.ClientSession, mid string, sids []string) []SubmitResult
|
||||
BatchDetach(s *mcclient.ClientSession, mid string, sids []string) []SubmitResult
|
||||
BatchDetach2(s *mcclient.ClientSession, mid string, sids []string) []SubmitResult
|
||||
Update(s *mcclient.ClientSession, mid, sid string, query jsonutils.JSONObject, params jsonutils.JSONObject) (jsonutils.JSONObject, error)
|
||||
Patch(s *mcclient.ClientSession, mid, sid string, query jsonutils.JSONObject, params jsonutils.JSONObject) (jsonutils.JSONObject, error)
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ type ServerListOptions struct {
|
||||
WithEip *bool `help:"Show Servers with EIP"`
|
||||
WithoutEip *bool `help:"Show Servers without EIP"`
|
||||
OsType string `help:"OS Type" choices:"linux|windows|vmware"`
|
||||
OrderByDisk string `help:"Order by disk" choices:"asc|desc"`
|
||||
|
||||
ResourceType string `help:"Resource type" choices:"shared|prepaid|dedicated"`
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ func (self *SSecurityGroup) GetSecurityRule(ruleId string, withRuleId bool) (sec
|
||||
}
|
||||
// todo: icmp 可能不兼容
|
||||
rule := secrules.SecurityRule{
|
||||
Priority: 0,
|
||||
Priority: 1,
|
||||
Action: secrules.SecurityRuleAllow,
|
||||
IPNet: ipNet,
|
||||
Protocol: protocol,
|
||||
|
||||
Reference in New Issue
Block a user