Compare commits

...

37 Commits

Author SHA1 Message Date
Zexi Li
7d9a3c04b1 Merge pull request #8986 from swordqiu/automated-cherry-pick-of-#8968-upstream-release-3.4
Automated cherry pick of #8968: fix(region,esxiagent): allow host behind a nat
2020-11-26 12:11:25 +08:00
Zexi Li
1a2204d146 Merge pull request #8923 from zhaoxiangchun/automated-cherry-pick-of-#8920-upstream-release-3.4
Automated cherry pick of #8920: fix(monitor): modify notify alertInfo and alertOk detach resource
2020-11-26 11:45:32 +08:00
yunion-ci-robot
ed6c42ae37 Merge pull request #8994 from zexi/automated-cherry-pick-of-#8991-upstream-release-3.4
Automated cherry pick of #8991: fix(scheduler): clean expire cache before schedule
2020-11-26 11:43:31 +08:00
Zexi Li
372c9a393f fix(region): wire get vpc releated hosts is empty 2020-11-26 11:03:52 +08:00
Zexi Li
37f648bfb8 fix(region): network clean schedule cache after real deleted 2020-11-26 11:03:52 +08:00
Zexi Li
1818d4853a fix(scheduler): clean expire cache before schedule 2020-11-26 11:03:52 +08:00
zhaoxiangchun
ff5396b909 fix(monitor): modify notify alertInfo and alertOk detach resource
1.修复报警信息中>等被转义的问题
2.针对:host_raid.adapter和smart_device.exit_status
  只能出现alerting和nodata
两种报警状态。在queryCondition的查询逻辑下,nodata情况也进行detach操作
3.修复报警记录中报警策略翻译异常的问题
2020-11-26 09:46:34 +08:00
Zexi Li
b2854aff23 Merge pull request #8956 from tb365/automated-cherry-pick-of-#8955-upstream-release-3.4
Automated cherry pick of #8955: fix(region): allow reset huawei system disk
2020-11-25 22:01:28 +08:00
Zexi Li
da30ae5efd Merge pull request #8964 from ioito/automated-cherry-pick-of-#8961-upstream-release-3.4
Automated cherry pick of #8961: fix(region): valid qcloud hssd for system disk
2020-11-25 21:59:40 +08:00
Zexi Li
17face8f52 Merge pull request #8981 from zhaoxiangchun/automated-cherry-pick-of-#8977-upstream-release-3.4
Automated cherry pick of #8977: fix(monitor): modify monitor serviceType in StartService()
2020-11-25 21:57:11 +08:00
Zexi Li
9a8277ff20 Merge pull request #8990 from rainzm/automated-cherry-pick-of-#8987-upstream-release-3.4
Automated cherry pick of #8987: fix(region): allow delete storagecachedimage with 'cache_failed' status
2020-11-25 21:55:55 +08:00
rainzm
61eaea8099 fix(region): allow delete storagecachedimage with 'cache_failed' status
Having status 'cache_failed' means this storagecachedimage does not actually exist.
2020-11-25 20:48:02 +08:00
Qiu Jian
6f0d6cbeac fix(region,esxiagent): allow host behind a nat
check host by ip may fail if host is behind a nat. ignore this case.
2020-11-25 20:34:42 +08:00
zhaoxiangchun
09ed698ae8 fix(monitor): modify monitor serviceType in StartService()
1.修改monitor服务在service代码中注册的serviceType:
   alerter ===> monitor
2020-11-25 20:31:19 +08:00
TangBin
7bf1bef04a fix(region): update translations 2020-11-25 18:17:40 +08:00
TangBin
024a17de83 fix(region): allow reset huawei system disk 2020-11-25 18:11:26 +08:00
Qu Xuan
0f5a8b6407 fix(region): valid qcloud hssd for system disk 2020-11-25 11:53:04 +08:00
Zexi Li
cd4ce681b0 Merge pull request #8954 from ioito/automated-cherry-pick-of-#8895-upstream-release-3.4
Automated cherry pick of #8895: fix(region): 避免OneCloud密码校验通过,公有云厂商密码校验不通过
2020-11-25 10:06:19 +08:00
Qu Xuan
fc16c37eab fix(region): 避免OneCloud密码校验通过,公有云厂商密码校验不通过 2020-11-25 09:56:37 +08:00
Zexi Li
3dfd086a27 Merge pull request #8950 from yousong/automated-cherry-pick-of-#8947-upstream-release-3.4
Automated cherry pick of #8947: fix(region): change_ipaddr: retain eip_id on detach and attach
2020-11-25 09:28:23 +08:00
yunion-ci-robot
8e2cd5112d Merge pull request #8945 from yousong/automated-cherry-pick-of-#8942-upstream-release-3.4
Automated cherry pick of #8942: feat(cloudcommon): db: jointbase: add list:"user" for RowId
2020-11-25 09:17:18 +08:00
Yousong Zhou
a5d82922bd fix(region): change_ipaddr: retain eip_id on detach and attach 2020-11-24 21:59:33 +08:00
Yousong Zhou
9d19bf34b0 fix(vpcagent): models: guestnetworks: accomodate change_ipaddr
change_ipaddr does detach, then attach of network.  It's not solely an
update of ipaddr, but a combination of deletion then creation.
2020-11-24 21:56:05 +08:00
Yousong Zhou
e4bf0fa8dc feat(cloudcommon): db: jointbase: add list:"user" for RowId 2020-11-24 21:56:05 +08:00
Zexi Li
6bd82d216d Merge pull request #8932 from tb365/bugfix/tb-elasticcache-empty-error-fix
fix(region): elastic cache task fail message fix
2020-11-24 21:31:09 +08:00
Zexi Li
60138f6401 Merge pull request #8927 from zhaoxiangchun/automated-cherry-pick-of-#8926-upstream-release-3.4
Automated cherry pick of #8926: fix(monitor): modify suggestrule  process influxdb data
2020-11-24 21:29:36 +08:00
yunion-ci-robot
a43f747bdc Merge pull request #8936 from ioito/automated-cherry-pick-of-#8933-upstream-release-3.4
Automated cherry pick of #8933: fix(region): avoid public ip bandwidth is zero
2020-11-24 20:25:27 +08:00
Qu Xuan
2560198943 fix(region): avoid public ip bandwidth is zero 2020-11-24 18:11:38 +08:00
zhaoxiangchun
6e0d4cb35c fix(monitor): modify suggestrule process influxdb data
1. 调整与监控相关的时间范围的判断逻辑:不再要求时间范围内必须都有数据
2020-11-24 17:48:05 +08:00
TangBin
71535f670e fix(region): elastic cache task fail message fix
#6399
2020-11-24 17:07:30 +08:00
Zexi Li
5e47566b42 Merge pull request #8900 from wanyaoqi/automated-cherry-pick-of-#8889-upstream-release-3.4
Automated cherry pick of #8889: fix(host): wait put host offline success
2020-11-23 13:04:31 +08:00
wanyaoqi
c325d8355c fix(host): wait put host offline success
Unregister host wait for host offline success,
in case region is in upgrading.

cherrypick: release/3.4
2020-11-22 15:30:56 +08:00
Zexi Li
206dc2a62d Merge pull request #8894 from yousong/automated-cherry-pick-of-#8892-upstream-release-3.4
Automated cherry pick of #8892: fix(locales): fix translation text
2020-11-22 11:00:07 +08:00
yunion-ci-robot
55a7de9ba6 Merge pull request #8867 from swordqiu/automated-cherry-pick-of-#8865-upstream-release-3.4
Automated cherry pick of #8865: fix: allow disk attach to multiple guests
2020-11-21 19:25:00 +08:00
Yousong Zhou
3b2938380a fix(region): elasticcache_instances: fix error fmt 2020-11-21 17:36:36 +08:00
Yousong Zhou
3774549979 fix(locales): fix translation text 2020-11-21 17:35:45 +08:00
Qiu Jian
3d2b24a351 fix: allow disk attach to multiple guests 2020-11-19 13:27:30 +08:00
60 changed files with 3898 additions and 4156 deletions

1
.gitignore vendored
View File

@@ -31,6 +31,7 @@ _output
/structargtest
.idea
.vscode
intellij.yaml
GPATH
GRTAGS
GTAGS

View File

@@ -2,7 +2,7 @@
策略名称: {{.name}}
触发时间: {{.start_time}}
报警级别: {{.level}}
触发条件: {{.description}}
触发条件: {{.description | unescaped}}
资源数量:{{len .matches}}
资源名称:{{.resource_name}}

View File

@@ -2,7 +2,7 @@
AlertName: {{.name}}
Time: {{.start_time}}
Level: {{.level}}
TriggerCondition: {{html .description}}
TriggerCondition: {{.description | unescaped}}
ResourceCount: {{len .matches}}
ResourceName: {{.resource_name}}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -34,7 +34,9 @@ type AlertRecordCreateInput struct {
type AlertRecordRule struct {
Metric string `json:"metric"`
Measurement string `json:"measurement"`
MeasurementDesc string `json:"measurement_desc"`
Field string `json:"field"`
FieldDesc string `json:"field_desc"`
// 比较运算符, 比如: >, <, >=, <=
Comparator string `json:"comparator"`

View File

@@ -34,7 +34,7 @@ import (
type SJointResourceBase struct {
SResourceBase
RowId int64 `primary:"true" auto_increment:"true"`
RowId int64 `primary:"true" auto_increment:"true" list:"user"`
}
type SJointResourceBaseManager struct {

View File

@@ -91,7 +91,9 @@ func getTemplate(ctx context.Context, topic string, contType string, channel npk
if err != nil {
return nil, err
}
tmp, err := template.New(key).Parse(string(cont))
tmp := template.New(key)
tmp.Funcs(template.FuncMap{"unescaped": unescaped})
tmp, err = tmp.Parse(string(cont))
if err != nil {
return nil, err
}
@@ -100,6 +102,10 @@ func getTemplate(ctx context.Context, topic string, contType string, channel npk
return templatesTable[key], nil
}
func unescaped(str string) template.HTML {
return template.HTML(str)
}
func getContent(ctx context.Context, topic string, contType string, channel npk.TNotifyChannel, data jsonutils.JSONObject) (string, error) {
if channel == npk.NotifyByWebhook {
return "", nil

View File

@@ -136,7 +136,7 @@ func (self *SQcloudGuestDriver) ValidateCreateData(ctx context.Context, userCred
if sysDisk.SizeMb > 1024*1024 {
return nil, fmt.Errorf("The %s system disk size must be less than 1024GB", sysDisk.Backend)
}
case api.STORAGE_LOCAL_PRO:
case api.STORAGE_LOCAL_PRO, api.STORAGE_CLOUD_HSSD: //https://cloud.tencent.com/document/product/362/2353
return nil, fmt.Errorf("storage %s can not be system disk", sysDisk.Backend)
}

View File

@@ -59,7 +59,15 @@ func (self *SHuaweiHostDriver) ValidateDiskSize(storage *models.SStorage, sizeGb
func (self *SHuaweiHostDriver) ValidateResetDisk(ctx context.Context, userCred mcclient.TokenCredential, disk *models.SDisk, snapshot *models.SSnapshot, guests []models.SGuest, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
if len(guests) >= 1 {
return nil, httperrors.NewBadRequestError("Disk must be dettached")
if disk.DiskType == api.DISK_TYPE_SYS {
for _, g := range guests {
if g.Status != api.VM_READY {
return nil, httperrors.NewBadRequestError("Server %s must in status ready", g.GetName())
}
}
} else {
return nil, httperrors.NewBadRequestError("Disk must be detached")
}
}
return data, nil
}

View File

@@ -1164,7 +1164,7 @@ func (self *SElasticcache) GetAdminAccount() (*SElasticcacheAccount, error) {
}
}
return nil, fmt.Errorf("no admin account found for elastic cache %s", self.Id)
return nil, httperrors.NewNotFoundError("no admin account found for elastic cache %s", self.Id)
}
func (self *SElasticcache) StartResetPasswordTask(ctx context.Context, userCred mcclient.TokenCredential, params *jsonutils.JSONDict, parentTaskId string) error {

View File

@@ -509,6 +509,7 @@ func (manager *SElasticipManager) newFromCloudEip(ctx context.Context, userCred
eip.ManagerId = provider.Id
eip.CloudregionId = region.Id
eip.ChargeType = extEip.GetInternetChargeType()
eip.Bandwidth = extEip.GetBandwidth()
if networkId := extEip.GetINetworkId(); len(networkId) > 0 {
network, err := db.FetchByExternalIdAndManagerId(NetworkManager, networkId, func(q *sqlchemy.SQuery) *sqlchemy.SQuery {
wire := WireManager.Query().SubQuery()

View File

@@ -654,13 +654,16 @@ func (self *SGuest) ValidateAttachDisk(ctx context.Context, disk *SDisk) error {
}
}
attached, err := disk.isAttached()
if err != nil {
return httperrors.NewInternalServerError("isAttached check failed %s", err)
}
if attached {
return httperrors.NewInputParameterError("Disk %s has been attached", disk.Name)
if disk.IsLocal() {
attached, err := disk.isAttached()
if err != nil {
return httperrors.NewInternalServerError("isAttached check failed %s", err)
}
if attached {
return httperrors.NewInputParameterError("Disk %s has been attached", disk.Name)
}
}
if len(disk.GetPathAtHost(self.GetHost())) == 0 {
return httperrors.NewInputParameterError("Disk %s not belong the guest's host", disk.Name)
}
@@ -2073,6 +2076,12 @@ func (self *SGuest) PerformChangeIpaddr(ctx context.Context, userCred mcclient.T
}
return nil, httperrors.NewBadRequestError("%v", err)
}
if _, err := db.Update(&ngn[0], func() error {
ngn[0].EipId = gn.EipId
return nil
}); err != nil {
return nil, err
}
return ngn, nil
}()

View File

@@ -3703,11 +3703,17 @@ func (self *SGuest) DeleteAllDisksInDB(ctx context.Context, userCred mcclient.To
}
if disk != nil {
db.OpsLog.LogEvent(disk, db.ACT_DELETE, nil, userCred)
db.OpsLog.LogEvent(disk, db.ACT_DELOCATE, nil, userCred)
err = disk.RealDelete(ctx, userCred)
cnt, err := disk.GetGuestDiskCount()
if err != nil {
return err
return errors.Wrap(err, "disk.GetGuestDiskCount")
}
if cnt == 0 {
db.OpsLog.LogEvent(disk, db.ACT_DELETE, nil, userCred)
db.OpsLog.LogEvent(disk, db.ACT_DELOCATE, nil, userCred)
err = disk.RealDelete(ctx, userCred)
if err != nil {
return errors.Wrap(err, "disk.RealDelete")
}
}
}
}

View File

@@ -1719,7 +1719,9 @@ func (self *SNetwork) PostCreate(ctx context.Context, userCred mcclient.TokenCre
}
} else {
self.SetStatus(userCred, api.NETWORK_STATUS_AVAILABLE, "")
self.ClearSchedDescCache()
if err := self.ClearSchedDescCache(); err != nil {
log.Errorf("network post create clear schedcache error: %v", err)
}
}
}
@@ -1750,7 +1752,6 @@ func (self *SNetwork) RealDelete(ctx context.Context, userCred mcclient.TokenCre
DeleteResourceJointSchedtags(self, ctx, userCred)
db.OpsLog.LogEvent(self, db.ACT_DELOCATE, self.GetShortDesc(ctx), userCred)
self.SetStatus(userCred, api.NETWORK_STATUS_DELETED, "real delete")
self.ClearSchedDescCache()
networkinterfaces, err := self.GetNetworkInterfaces()
if err != nil {
return errors.Wrap(err, "GetNetworkInterfaces")
@@ -1771,7 +1772,11 @@ func (self *SNetwork) RealDelete(ctx context.Context, userCred mcclient.TokenCre
return errors.Wrapf(err, "reservedIps.Release %s(%d)", reservedIps[i].IpAddr, reservedIps[i].Id)
}
}
return self.SSharableVirtualResourceBase.Delete(ctx, userCred)
if err := self.SSharableVirtualResourceBase.Delete(ctx, userCred); err != nil {
return err
}
self.ClearSchedDescCache()
return nil
}
func (self *SNetwork) StartDeleteNetworkTask(ctx context.Context, userCred mcclient.TokenCredential) error {
@@ -1807,12 +1812,7 @@ func (self *SNetwork) isManaged() bool {
}
func (self *SNetwork) isOneCloudVpcNetwork() bool {
vpc := self.GetVpc()
region := self.GetRegion()
if region.Provider == api.CLOUD_PROVIDER_ONECLOUD && vpc.Id != api.DEFAULT_VPC_ID {
return true
}
return false
return IsOneCloudVpcResource(self)
}
func parseIpToIntArray(ip string) ([]int, error) {

View File

@@ -273,12 +273,14 @@ func (self *SStoragecachedimage) Detach(ctx context.Context, userCred mcclient.T
}
func (self *SStoragecachedimage) ValidateDeleteCondition(ctx context.Context) error {
cnt, err := self.getReferenceCount()
if err != nil {
return httperrors.NewInternalServerError("getReferenceCount fail %s", err)
}
if cnt > 0 {
return httperrors.NewNotEmptyError("Image is in use")
if self.Status != api.CACHED_IMAGE_STATUS_CACHE_FAILED {
cnt, err := self.getReferenceCount()
if err != nil {
return httperrors.NewInternalServerError("getReferenceCount fail %s", err)
}
if cnt > 0 {
return httperrors.NewNotEmptyError("Image is in use")
}
}
return self.SJointResourceBase.ValidateDeleteCondition(ctx)
}

View File

@@ -32,6 +32,11 @@ import (
"yunion.io/x/onecloud/pkg/util/stringutils2"
)
type IVpcResource interface {
GetVpc() *SVpc
GetRegion() *SCloudregion
}
type SVpcResourceBase struct {
VpcId string `width:"36" charset:"ascii" nullable:"true" list:"user" create:"optional" json:"vpc_id"`
}
@@ -307,3 +312,18 @@ func (self *SVpcResourceBase) GetChangeOwnerCandidateDomainIds() []string {
}
return nil
}
func IsOneCloudVpcResource(res IVpcResource) bool {
vpc := res.GetVpc()
if vpc == nil {
return false
}
region := res.GetRegion()
if region == nil {
return false
}
if region.Provider == api.CLOUD_PROVIDER_ONECLOUD && vpc.Id != api.DEFAULT_VPC_ID {
return true
}
return false
}

View File

@@ -857,6 +857,10 @@ func (manager *SWireManager) InitializeData() error {
return nil
}
func (wire *SWire) isOneCloudVpcWire() bool {
return IsOneCloudVpcResource(wire)
}
func (wire *SWire) getEnabledHosts() []SHost {
hosts := make([]SHost, 0)
@@ -866,9 +870,13 @@ func (wire *SWire) getEnabledHosts() []SHost {
q := hostQuery.Query()
q = q.Join(hostwireQuery, sqlchemy.AND(sqlchemy.Equals(hostQuery.Field("id"), hostwireQuery.Field("host_id")),
sqlchemy.IsFalse(hostwireQuery.Field("deleted"))))
q = q.Filter(sqlchemy.Equals(hostwireQuery.Field("wire_id"), wire.Id))
q = q.Filter(sqlchemy.IsTrue(hostQuery.Field("enabled")))
q = q.Filter(sqlchemy.Equals(hostQuery.Field("host_status"), api.HOST_ONLINE))
if wire.isOneCloudVpcWire() {
q = q.Filter(sqlchemy.NOT(sqlchemy.IsNullOrEmpty(hostQuery.Field("ovn_version"))))
} else {
q = q.Filter(sqlchemy.Equals(hostwireQuery.Field("wire_id"), wire.Id))
}
err := db.FetchModelObjects(HostManager, q, &hosts)
if err != nil {
@@ -883,10 +891,9 @@ func (wire *SWire) clearHostSchedDescCache() error {
hosts := wire.getEnabledHosts()
if hosts != nil {
for i := 0; i < len(hosts); i += 1 {
err := hosts[i].ClearSchedDescCache()
if err != nil {
log.Errorf("%s", err)
return err
host := hosts[i]
if err := host.ClearSchedDescCache(); err != nil {
return errors.Wrapf(err, "wire %s clear host %s sched cache", wire.GetName(), host.GetName())
}
}
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheAccountCreateTask) OnInit(ctx context.Context, obj db.IS
self.SetStage("OnElasticcacheAccountCreateComplete", nil)
if err := region.GetDriver().RequestCreateElasticcacheAccount(ctx, self.GetUserCred(), ea, self); err != nil {
self.taskFail(ctx, ea, jsonutils.Marshal(err))
self.taskFail(ctx, ea, jsonutils.NewString(err.Error()))
return
}
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheAccountDeleteTask) OnInit(ctx context.Context, obj db.IS
self.SetStage("OnElasticcacheAccountDeleteComplete", nil)
if err := region.GetDriver().RequestDeleteElasticcacheAccount(ctx, self.GetUserCred(), ea, self); err != nil {
self.taskFail(ctx, ea, jsonutils.Marshal(err))
self.taskFail(ctx, ea, jsonutils.NewString(err.Error()))
return
} else {
err = db.DeleteModel(ctx, self.GetUserCred(), ea)

View File

@@ -59,7 +59,7 @@ func (self *ElasticcacheAccountResetPasswordTask) OnInit(ctx context.Context, ob
self.SetStage("OnElasticcacheAccountResetPasswordComplete", nil)
if err := region.GetDriver().RequestElasticcacheAccountResetPassword(ctx, self.GetUserCred(), ea, self); err != nil {
self.taskFail(ctx, ea, jsonutils.Marshal(err))
self.taskFail(ctx, ea, jsonutils.NewString(err.Error()))
return
} else {
logclient.AddActionLogWithStartable(self, ea, logclient.ACT_RESET_PASSWORD, nil, self.UserCred, true)

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheAclCreateTask) OnInit(ctx context.Context, obj db.IStand
self.SetStage("OnElasticcacheAclCreateComplete", nil)
if err := region.GetDriver().RequestCreateElasticcacheAcl(ctx, self.GetUserCred(), ea, self); err != nil {
self.taskFail(ctx, ea, jsonutils.Marshal(err))
self.taskFail(ctx, ea, jsonutils.NewString(err.Error()))
return
}
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheAclDeleteTask) OnInit(ctx context.Context, obj db.IStand
self.SetStage("OnElasticcacheAclDeleteComplete", nil)
if err := region.GetDriver().RequestDeleteElasticcacheAcl(ctx, self.GetUserCred(), ea, self); err != nil {
self.taskFail(ctx, ea, jsonutils.Marshal(err))
self.taskFail(ctx, ea, jsonutils.NewString(err.Error()))
return
} else {
err = db.DeleteModel(ctx, self.GetUserCred(), ea)

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheAclUpdateTask) OnInit(ctx context.Context, obj db.IStand
self.SetStage("OnElasticcacheAclUpdateComplete", nil)
if err := region.GetDriver().RequestElasticcacheAclUpdate(ctx, self.GetUserCred(), ea, self); err != nil {
self.taskFail(ctx, ea, jsonutils.Marshal(err))
self.taskFail(ctx, ea, jsonutils.NewString(err.Error()))
return
}
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheAllocatePublicConnectionTask) OnInit(ctx context.Context
self.SetStage("OnElasticcacheAllocatePublicConnectionComplete", nil)
if err := region.GetDriver().RequestElasticcacheAllocatePublicConnection(ctx, self.GetUserCred(), elasticcache, self); err != nil {
self.OnElasticcacheAllocatePublicConnectionCompleteFailed(ctx, elasticcache, jsonutils.Marshal(err))
self.OnElasticcacheAllocatePublicConnectionCompleteFailed(ctx, elasticcache, jsonutils.NewString(err.Error()))
return
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheBackupCreateTask) OnInit(ctx context.Context, obj db.ISt
self.SetStage("OnElasticcacheBackupCreateComplete", nil)
if err := region.GetDriver().RequestCreateElasticcacheBackup(ctx, self.GetUserCred(), eb, self); err != nil {
self.taskFail(ctx, eb, jsonutils.Marshal(err))
self.taskFail(ctx, eb, jsonutils.NewString(err.Error()))
return
}
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheBackupRestoreInstanceTask) OnInit(ctx context.Context, o
self.SetStage("OnElasticcacheBackupRestoreInstanceComplete", nil)
if err := region.GetDriver().RequestElasticcacheBackupRestoreInstance(ctx, self.GetUserCred(), eb, self); err != nil {
self.OnElasticcacheBackupRestoreInstanceCompleteFailed(ctx, eb, jsonutils.Marshal(err))
self.OnElasticcacheBackupRestoreInstanceCompleteFailed(ctx, eb, jsonutils.NewString(err.Error()))
return
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheChangeSpecTask) OnInit(ctx context.Context, obj db.IStan
self.SetStage("OnElasticcacheChangeSpecComplete", nil)
if err := region.GetDriver().RequestElasticcacheChangeSpec(ctx, self.GetUserCred(), elasticcache, self); err != nil {
self.OnElasticcacheChangeSpecCompleteFailed(ctx, elasticcache, jsonutils.Marshal(err))
self.OnElasticcacheChangeSpecCompleteFailed(ctx, elasticcache, jsonutils.NewString(err.Error()))
return
}

View File

@@ -61,7 +61,7 @@ func (self *ElasticcacheCreateTask) OnSyncSecurityGroupComplete(ctx context.Cont
region := elasticcache.GetRegion()
self.SetStage("OnElasticcacheCreateComplete", nil)
if err := region.GetDriver().RequestCreateElasticcache(ctx, self.GetUserCred(), elasticcache, self); err != nil {
self.taskFail(ctx, elasticcache, jsonutils.Marshal(err))
self.taskFail(ctx, elasticcache, jsonutils.Marshal(err.Error()))
return
}
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheFlushInstanceTask) OnInit(ctx context.Context, obj db.IS
self.SetStage("OnElasticcacheFlushInstanceComplete", nil)
if err := region.GetDriver().RequestElasticcacheFlushInstance(ctx, self.GetUserCred(), elasticcache, self); err != nil {
self.OnElasticcacheFlushInstanceCompleteFailed(ctx, elasticcache, jsonutils.Marshal(err))
self.OnElasticcacheFlushInstanceCompleteFailed(ctx, elasticcache, jsonutils.NewString(err.Error()))
return
}

View File

@@ -60,7 +60,7 @@ func (self *ElasticcacheParameterUpdateTask) OnInit(ctx context.Context, obj db.
self.SetStage("OnElasticcacheParameterUpdateComplete", nil)
if err := region.GetDriver().RequestElasticcacheUpdateInstanceParameters(ctx, self.GetUserCred(), iec.(*models.SElasticcache), self); err != nil {
self.OnElasticcacheParameterUpdateCompleteFailed(ctx, ep, jsonutils.Marshal(err))
self.OnElasticcacheParameterUpdateCompleteFailed(ctx, ep, jsonutils.NewString(err.Error()))
return
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheReleasePublicConnectionTask) OnInit(ctx context.Context,
self.SetStage("OnElasticcacheReleasePublicConnectionComplete", nil)
if err := region.GetDriver().RequestElasticcacheReleasePublicConnection(ctx, self.GetUserCred(), elasticcache, self); err != nil {
self.OnElasticcacheReleasePublicConnectionCompleteFailed(ctx, elasticcache, jsonutils.Marshal(err))
self.OnElasticcacheReleasePublicConnectionCompleteFailed(ctx, elasticcache, jsonutils.NewString(err.Error()))
return
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheRestartTask) OnInit(ctx context.Context, obj db.IStandal
self.SetStage("OnElasticcacheRestartComplete", nil)
if err := region.GetDriver().RequestRestartElasticcache(ctx, self.GetUserCred(), ec, self); err != nil {
self.taskFail(ctx, ec, jsonutils.Marshal(err))
self.taskFail(ctx, ec, jsonutils.NewString(err.Error()))
return
} else {
logclient.AddActionLogWithStartable(self, ec, logclient.ACT_VM_RESTART, nil, self.UserCred, true)

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheSetMaintainTimeTask) OnInit(ctx context.Context, obj db.
self.SetStage("OnElasticcacheSetMaintainTimeComplete", nil)
if err := region.GetDriver().RequestElasticcacheSetMaintainTime(ctx, self.GetUserCred(), elasticcache, self); err != nil {
self.OnElasticcacheSetMaintainTimeCompleteFailed(ctx, elasticcache, jsonutils.Marshal(err))
self.OnElasticcacheSetMaintainTimeCompleteFailed(ctx, elasticcache, jsonutils.NewString(err.Error()))
return
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheSyncTask) OnInit(ctx context.Context, obj db.IStandalone
self.SetStage("OnElasticcacheSyncComplete", nil)
if err := region.GetDriver().RequestSyncElasticcache(ctx, self.GetUserCred(), ec, self); err != nil {
self.taskFail(ctx, ec, jsonutils.Marshal(err))
self.taskFail(ctx, ec, jsonutils.NewString(err.Error()))
return
} else {
logclient.AddActionLogWithStartable(self, ec, logclient.ACT_SYNC_CONF, "", self.UserCred, true)

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheSyncstatusTask) OnInit(ctx context.Context, obj db.IStan
self.SetStage("OnElasticcacheSyncStatusComplete", nil)
err := region.GetDriver().RequestSyncElasticcacheStatus(ctx, self.GetUserCred(), cache, self)
if err != nil {
self.taskFailed(ctx, cache, jsonutils.Marshal(err))
self.taskFailed(ctx, cache, jsonutils.NewString(err.Error()))
return
}
}

View File

@@ -54,7 +54,7 @@ func (self *ElasticcacheUpdateAuthModeTask) OnInit(ctx context.Context, obj db.I
self.SetStage("OnElasticcacheUpdateAuthModeComplete", nil)
if err := region.GetDriver().RequestUpdateElasticcacheAuthMode(ctx, self.GetUserCred(), elasticcache, self); err != nil {
self.OnElasticcacheUpdateAuthModeCompleteFailed(ctx, elasticcache, jsonutils.Marshal(err))
self.OnElasticcacheUpdateAuthModeCompleteFailed(ctx, elasticcache, jsonutils.NewString(err.Error()))
return
}

View File

@@ -1578,12 +1578,17 @@ func (h *SHostInfo) stop() {
}
func (h *SHostInfo) unregister() {
h.stopped = true
_, err := modules.Hosts.PerformAction(
h.GetSession(), h.HostId, "offline", nil)
if err != nil {
log.Errorln(err)
for {
_, err := modules.Hosts.PerformAction(
h.GetSession(), h.HostId, "offline", nil)
if err != nil {
log.Errorf("put host offline failed: %s", err)
time.Sleep(time.Second * 1)
} else {
break
}
}
h.stopped = true
}
func (h *SHostInfo) OnCatalogChanged(catalog mcclient.KeystoneServiceCatalogV3) {

View File

@@ -473,6 +473,8 @@ func (opts *ServerCreateOptionalOptions) OptionalParams() (*computeapi.ServerCre
AutoPrepaidRecycle: opts.AutoPrepaidRecycle,
EipBw: opts.EipBw,
EipChargeType: opts.EipChargeType,
PublicIpBw: opts.PublicIpBw,
PublicIpChargeType: opts.PublicIpChargeType,
Eip: opts.Eip,
EnableCloudInit: opts.EnableCloudInit,
OsType: opts.OsType,

View File

@@ -219,11 +219,25 @@ func (c *QueryCondition) NewEvalMatch(context *alerting.EvalContext, series tsdb
evalMatch.Tags = c.filterTags(series.Tags, *alertDetails)
evalMatch.Value = value
evalMatch.ValueStr = c.RationalizeValueFromUnit(*value, alertDetails.FieldDescription.Unit, alertDetails.FieldOpt)
evalMatch.MeasurementDesc = alertDetails.MeasurementDisplayName
evalMatch.FieldDesc = alertDetails.FieldDescription.DisplayName
c.newRuleDescription(context, alertDetails)
return evalMatch, nil
}
func (c *QueryCondition) newRuleDescription(context *alerting.EvalContext, alertDetails *monitor.CommonAlertMetricDetails) {
ruleDes := alerting.RuleDescription{
AlertRecordRule: monitor.AlertRecordRule{
Metric: fmt.Sprintf("%s.%s", alertDetails.Measurement, alertDetails.Field),
Measurement: alertDetails.Measurement,
MeasurementDesc: alertDetails.MeasurementDisplayName,
Field: alertDetails.Field,
FieldDesc: alertDetails.FieldDescription.DisplayName,
Comparator: alertDetails.Comparator,
Threshold: c.RationalizeValueFromUnit(alertDetails.Threshold, alertDetails.FieldDescription.Unit, ""),
},
}
context.RuleDescription = &ruleDes
}
var fileSize = []string{"bps", "Bps", "byte"}
func (c *QueryCondition) RationalizeValueFromUnit(value float64, unit string, opt string) string {

View File

@@ -33,8 +33,8 @@ func NewSuggestRuleReducer(t string, duration time.Duration) Reducer {
}
func (s *suggestRuleReducer) Reduce(series *tsdb.TimeSeries) *float64 {
if int(s.duration.Seconds()) > len(series.Points) {
return nil
}
/*if int(s.duration.Seconds()) > len(series.Points) {
return nil, nil
}*/
return s.queryReducer.Reduce(series)
}

View File

@@ -42,6 +42,7 @@ type EvalContext struct {
StartTime time.Time
EndTime time.Time
Rule *Rule
RuleDescription *RuleDescription
NoDataFound bool
PrevAlertState monitor.AlertStateType
@@ -50,6 +51,10 @@ type EvalContext struct {
UserCred mcclient.TokenCredential
}
type RuleDescription struct {
monitor.AlertRecordRule
}
// NewEvalContext is the EvalContext constructor.
func NewEvalContext(alertCtx context.Context, userCred mcclient.TokenCredential, rule *Rule) *EvalContext {
return &EvalContext{

View File

@@ -17,7 +17,6 @@ package alerting
import (
"database/sql"
"fmt"
"strings"
"time"
"yunion.io/x/jsonutils"
@@ -143,32 +142,47 @@ func (n *notificationService) getNeededNotifiers(nIds []string, evalCtx *EvalCon
}
}
if shouldNotify {
var matches []*monitor.EvalMatch
if evalCtx.Firing {
matches = evalCtx.EvalMatches
} else {
matches = evalCtx.AlertOkEvalMatches
}
recordCreateInput := monitor.AlertRecordCreateInput{
StandaloneResourceCreateInput: apis.StandaloneResourceCreateInput{
GenerateName: evalCtx.Rule.Name,
},
AlertId: evalCtx.Rule.Id,
Level: evalCtx.Rule.Level,
State: string(evalCtx.Rule.State),
EvalData: matches,
AlertRule: newAlertRecordRule(evalCtx),
}
createData := recordCreateInput.JSON(recordCreateInput)
record, err := db.DoCreate(models.AlertRecordManager, evalCtx.Ctx, evalCtx.UserCred, jsonutils.NewDict(), createData, evalCtx.UserCred)
if err != nil {
log.Errorf("create alert record err:%v", err)
}
record.PostCreate(evalCtx.Ctx, evalCtx.UserCred, evalCtx.UserCred, nil, createData)
n.createAlertRecordWhenNotify(evalCtx)
}
if !shouldNotify && evalCtx.shouldUpdateAlertState() && evalCtx.NoDataFound {
n.detachAlertResourceWhenNodata(evalCtx)
}
return result, nil
}
func (n *notificationService) createAlertRecordWhenNotify(evalCtx *EvalContext) {
var matches []*monitor.EvalMatch
if evalCtx.Firing {
matches = evalCtx.EvalMatches
} else {
matches = evalCtx.AlertOkEvalMatches
}
recordCreateInput := monitor.AlertRecordCreateInput{
StandaloneResourceCreateInput: apis.StandaloneResourceCreateInput{
GenerateName: evalCtx.Rule.Name,
},
AlertId: evalCtx.Rule.Id,
Level: evalCtx.Rule.Level,
State: string(evalCtx.Rule.State),
EvalData: matches,
AlertRule: newAlertRecordRule(evalCtx),
}
createData := recordCreateInput.JSON(recordCreateInput)
record, err := db.DoCreate(models.AlertRecordManager, evalCtx.Ctx, evalCtx.UserCred, jsonutils.NewDict(), createData, evalCtx.UserCred)
if err != nil {
log.Errorf("create alert record err:%v", err)
}
record.PostCreate(evalCtx.Ctx, evalCtx.UserCred, evalCtx.UserCred, nil, createData)
}
func (n *notificationService) detachAlertResourceWhenNodata(evalCtx *EvalContext) {
errs := models.CommonAlertManager.DetachAlertResourceByAlertId(evalCtx.Ctx, evalCtx.UserCred, evalCtx.Rule.Id)
if len(errs) != 0 {
log.Errorf("detachAlertResourceWhenNodata err:%#v", errors.NewAggregate(errs))
}
}
type NotifierPlugin struct {
Type string
Factory NotifierFactory
@@ -205,25 +219,14 @@ func InitNotifier(config NotificationConfig) (Notifier, error) {
func newAlertRecordRule(evalCtx *EvalContext) monitor.AlertRecordRule {
alertRule := monitor.AlertRecordRule{}
if evalCtx.RuleDescription != nil {
alertRule = evalCtx.RuleDescription.AlertRecordRule
}
if evalCtx.Rule.Frequency < 60 {
alertRule.Period = fmt.Sprintf("%ds", evalCtx.Rule.Frequency)
} else {
alertRule.Period = fmt.Sprintf("%dm", evalCtx.Rule.Frequency/60)
}
ruleStr := evalCtx.Rule.Message
ruleElementArr := strings.Split(ruleStr, " ")
if len(ruleElementArr) == 3 {
alertRule.Metric = ruleElementArr[0]
alertRule.Comparator = ruleElementArr[1]
alertRule.Threshold = ruleElementArr[2]
}
if len(evalCtx.EvalMatches) != 0 {
alertRule.MeasurementDesc = evalCtx.EvalMatches[0].MeasurementDesc
alertRule.FieldDesc = evalCtx.EvalMatches[0].FieldDesc
}
if len(evalCtx.AlertOkEvalMatches) != 0 {
alertRule.MeasurementDesc = evalCtx.AlertOkEvalMatches[0].MeasurementDesc
alertRule.FieldDesc = evalCtx.AlertOkEvalMatches[0].FieldDesc
}
return alertRule
}

View File

@@ -955,15 +955,20 @@ func (alert *SCommonAlert) StartDetachTask(ctx context.Context, userCred mcclien
func (alert *SCommonAlert) DetachAlertResourceOnDisable(ctx context.Context,
userCred mcclient.TokenCredential) (errs []error) {
resources, err := GetAlertResourceManager().getResourceFromAlertId(alert.Id)
return CommonAlertManager.DetachAlertResourceByAlertId(ctx, userCred, alert.Id)
}
func (manager *SCommonAlertManager) DetachAlertResourceByAlertId(ctx context.Context,
userCred mcclient.TokenCredential, alertId string) (errs []error) {
resources, err := GetAlertResourceManager().getResourceFromAlertId(alertId)
if err != nil {
errs = append(errs, errors.Wrap(err, "getResourceFromAlert error"))
return
}
for _, resource := range resources {
err := resource.DetachAlert(ctx, userCred, alert.Id)
err := resource.DetachAlert(ctx, userCred, alertId)
if err != nil {
errs = append(errs, errors.Wrapf(err, "resource:%s DetachAlert:%s err", resource.Id, alert.Id))
errs = append(errs, errors.Wrapf(err, "resource:%s DetachAlert:%s err", resource.Id, alertId))
}
}
return

View File

@@ -624,19 +624,19 @@ func showDuration(dur string) string {
func showDuration_(dur int64, sign string) string {
var durUp, durSign int64
var upSign, durStr string
if sign == "s" && dur > 60 {
if sign == "s" && dur >= 60 {
upSign = "m"
durUp = dur / 60
durSign = dur % 60
durStr = showDuration_(durUp, upSign)
}
if sign == "m" && dur > 60 {
if sign == "m" && dur >= 60 {
upSign = "h"
durUp = dur / 60
durSign = dur % 60
durStr = showDuration_(durUp, upSign)
}
if sign == "h" && dur > 24 {
if sign == "h" && dur >= 24 {
upSign = "d"
durUp = dur / 24
durSign = dur % 24

View File

@@ -45,7 +45,7 @@ import (
func StartService() {
opts := &options.Options
common_options.ParseOptions(opts, os.Args, "alerter.conf", "alerter")
common_options.ParseOptions(opts, os.Args, "monitor.conf", "monitor")
commonOpts := &opts.CommonOptions
common_app.InitAuth(commonOpts, func() {

View File

@@ -513,7 +513,11 @@ func (cli *SESXiClient) getPrivateId(idStr string) string {
func (cli *SESXiClient) checkHostManagedByVCenter() error {
host, err := cli.FindHostByIp(cli.host)
if err != nil {
return err
if errors.Cause(err) == errors.ErrNotFound {
// host might be behind a NAT
return nil
}
return errors.Wrap(err, "cli.FindHostByIp")
}
if host.IsManagedByVCenter() {
return fmt.Errorf("ESXi host is managed by vcenter %s, please connect to vcenter instead for full management functions!", host.GetManagementServerIp())
@@ -541,18 +545,18 @@ func (cli *SESXiClient) FindHostByIp(hostIp string) (*SHost, error) {
hostRef, err := searchIndex.FindByIp(cli.context, nil, cli.getPrivateId(hostIp), false)
if err != nil {
log.Errorf("searchIndex.FindByIp fail %s", err)
return nil, err
return nil, errors.Wrap(err, "searchIndex.FindByIp")
}
if hostRef == nil {
return nil, fmt.Errorf("cannot find %s", cli.getPrivateId(hostIp))
return nil, errors.Wrapf(errors.ErrNotFound, "cannot find %s", cli.getPrivateId(hostIp))
}
var host mo.HostSystem
err = cli.reference2Object(hostRef.Reference(), HOST_SYSTEM_PROPS, &host)
if err != nil {
log.Errorf("reference2Object fail %s", err)
return nil, err
return nil, errors.Wrap(err, "cli.reference2Object")
}
h := NewHost(cli, &host, nil)

View File

@@ -863,6 +863,7 @@ func (self *SInstance) GetIEIP() (cloudprovider.ICloudEIP, error) {
eip.AddressName = address
eip.AddressType = EIP_TYPE_WANIP
eip.AddressStatus = EIP_STATUS_BIND
eip.Bandwidth = self.InternetAccessible.InternetMaxBandwidthOut
return &eip, nil
}
return nil, nil

View File

@@ -154,5 +154,5 @@ func (self *SStorage) GetMountPoint() string {
}
func (self *SStorage) IsSysDiskStore() bool {
return true
return strings.ToLower(self.storageType) != api.STORAGE_CLOUD_HSSD
}

View File

@@ -156,6 +156,7 @@ func (p *DiskSchedtagPredicate) DoSelect(
res []ISchedtagCandidateResource,
) []ISchedtagCandidateResource {
return p.GetUsedStorages(res, input.(*diskW).Backend)
}
func (p *DiskSchedtagPredicate) GetCandidateResourceSortScore(selectRes ISchedtagCandidateResource) int64 {
@@ -195,8 +196,8 @@ func (p *DiskSchedtagPredicate) GetUsedStorages(res []ISchedtagCandidateResource
} else {
backendStorages = storages
}
if len(backendStorages) == 0 {
/*if len(backendStorages) == 0 {
backendStorages = storages
}
}*/
return backendStorages
}

View File

@@ -97,6 +97,9 @@ func (sm *SchedulerManager) start() {
}
func (sm *SchedulerManager) schedule(info *api.SchedInfo) (*core.ScheduleResult, error) {
// force sync clean expire cache before do schedule
sm.ExpireManager.Trigger()
log.V(10).Infof("SchedulerManager do schedule, input: %#v", info)
task, err := sm.TaskManager.AddTask(sm, info)
if err != nil {

View File

@@ -101,7 +101,7 @@ func AnalyzePasswordStrenth(passwd string) PasswordStrength {
ps.Lowercases += 1
} else if strings.IndexByte(ALL_UPPERS, passwd[i]) >= 0 {
ps.Uppercases += 1
} else if strings.IndexByte(ALL_PUNC, passwd[i]) >= 0 {
} else if strings.IndexByte(PUNC, passwd[i]) >= 0 {
ps.Punctuats += 1
}
}

View File

@@ -31,7 +31,8 @@ func TestMeetComplxity(t *testing.T) {
want bool
}{
{"123456", false},
{"123abcABC!@#", true},
{"123abcABC!@#", false},
{"123abcABC-@=", true},
}
for _, c := range cases {
if c.want != MeetComplxity(c.in) {

View File

@@ -15,6 +15,8 @@
package models
import (
"fmt"
"yunion.io/x/log"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
@@ -33,7 +35,7 @@ type (
SecurityGroupRules map[string]*SecurityGroupRule
Elasticips map[string]*Elasticip
Guestnetworks map[string]*Guestnetwork // key: guestId/ifname
Guestnetworks map[string]*Guestnetwork // key: rowId
Guestsecgroups map[string]*Guestsecgroup // key: guestId/secgroupId
DnsRecords map[string]*DnsRecord
@@ -332,7 +334,8 @@ func (set Guestnetworks) NewModel() db.IModel {
func (set Guestnetworks) AddModel(i db.IModel) {
m := i.(*Guestnetwork)
set[m.GuestId+"/"+m.Ifname] = m
k := fmt.Sprintf("%d", m.RowId)
set[k] = m
}
func (set Guestnetworks) Copy() apihelper.IModelSet {