From 2d7766dc4c0dc62f7172c570ddbdcb89c4f2988e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E9=B8=BF=E9=A3=9E?= Date: Wed, 11 Oct 2023 20:16:01 +0800 Subject: [PATCH] feat(notify): support db_dispatcher notify --- pkg/apis/notify/template.go | 6 ++--- pkg/cloudcommon/db/db_dispatcher.go | 2 ++ pkg/cloudcommon/db/notify_hook.go | 32 ++++++++++++++++++++++++++ pkg/cloudcommon/notifyclient/notify.go | 22 ++++++++++++++++++ pkg/compute/models/hosts.go | 3 ++- pkg/notify/models/event_template.go | 5 ++++ pkg/notify/models/topic.go | 3 +++ 7 files changed, 69 insertions(+), 4 deletions(-) diff --git a/pkg/apis/notify/template.go b/pkg/apis/notify/template.go index 20db7ab430..6aee08d27a 100644 --- a/pkg/apis/notify/template.go +++ b/pkg/apis/notify/template.go @@ -226,7 +226,7 @@ const ( ,请尽快前往控制台进行处理 {{- end -}}` COMMON_CONTENT_EN = `{{- $d := .resource_details -}} - Your {{ if $d.brand -}} {{ $d.brand }} {{ end -}} {{ .resource_type_display }} {{ $d.name }} {{ if $d.project -}} in project {{ $d.project }} {{ end -}} has been {{ .action_display }} {{ .result_display }} + Your {{- if $d.brand -}} {{ $d.brand }} {{ end -}} {{ .resource_type_display }} {{ $d.name }} {{ if $d.project -}} in project {{ $d.project }} {{ end -}} has been {{ .action_display }} {{ .result_display }} {{- if eq .result "failed" -}} . And please go to the console as soon as possible to process. {{- end -}}` @@ -432,7 +432,7 @@ const ( // 资源变更通知 const ( UPDATE_TITLE_CN = `{{- $d := .resource_details -}} - if {{ $d.project }} + {{- if $d.project -}} {{ $d.project }}项目的 {{- end -}} {{ .resource_type_display }}{{ $d.name }}{{ .action_display }}成功` @@ -440,7 +440,7 @@ const ( The {{ .resource_type }} {{ $d.name }} {{ if $d.project -}} in project {{ $d.project }} {{ end -}} {{ .action_display }} successfully` UPDATE_CONTENT_CN = `{{- $d := .resource_details -}} 您 - if {{$d.project }} + {{- if $d.project -}} 在{{ $d.project }}项目 {{- end -}} {{- if $d.brand -}} diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 9864548d3a..4d0e6de043 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -1427,6 +1427,7 @@ func (dispatcher *DBModelDispatcher) Create(ctx context.Context, query jsonutils notes := model.GetShortDesc(ctx) OpsLog.LogEvent(model, ACT_CREATE, notes, userCred) logclient.AddActionLogWithContext(ctx, model, logclient.ACT_CREATE, notes, userCred, true) + CallCreateNotifyHook(ctx, userCred, model) } manager.OnCreateComplete(ctx, []IModel{model}, userCred, ownerId, query, []jsonutils.JSONObject{data}) return getItemDetails(manager, model, ctx, userCred, query) @@ -1877,6 +1878,7 @@ func DeleteModel(ctx context.Context, userCred mcclient.TokenCredential, item IM if userCred != nil { OpsLog.LogEvent(item, ACT_DELETE, item.GetShortDesc(ctx), userCred) logclient.AddSimpleActionLog(item, logclient.ACT_DELETE, item.GetShortDesc(ctx), userCred, true) + CallDeleteNotifyHook(ctx, userCred, item) } if _, ok := item.(IStandaloneModel); ok && len(item.GetId()) > 0 { err := Metadata.RemoveAll(ctx, item, userCred) diff --git a/pkg/cloudcommon/db/notify_hook.go b/pkg/cloudcommon/db/notify_hook.go index a31eadece1..bcce5e27be 100644 --- a/pkg/cloudcommon/db/notify_hook.go +++ b/pkg/cloudcommon/db/notify_hook.go @@ -22,9 +22,13 @@ import ( var ( updateNotifyHook updateNotifyHookFunc + createNotifyHook createNotifyHookFunc + deleteNotifyHook deleteNotifyHookFunc ) type updateNotifyHookFunc func(ctx context.Context, userCred mcclient.TokenCredential, obj IModel) +type createNotifyHookFunc func(ctx context.Context, userCred mcclient.TokenCredential, obj IModel) +type deleteNotifyHookFunc func(ctx context.Context, userCred mcclient.TokenCredential, obj IModel) func SetUpdateNotifyHook(f updateNotifyHookFunc) { if updateNotifyHook != nil { @@ -33,9 +37,37 @@ func SetUpdateNotifyHook(f updateNotifyHookFunc) { updateNotifyHook = f } +func SetCreateNotifyHook(f createNotifyHookFunc) { + if createNotifyHook != nil { + panic("createNotifyHook already set") + } + createNotifyHook = f +} + +func SetDeleteNotifyHook(f deleteNotifyHookFunc) { + if deleteNotifyHook != nil { + panic("deleteNotifyHook already set") + } + deleteNotifyHook = f +} + func CallUpdateNotifyHook(ctx context.Context, userCred mcclient.TokenCredential, obj IModel) { if updateNotifyHook == nil { return } updateNotifyHook(ctx, userCred, obj) } + +func CallCreateNotifyHook(ctx context.Context, userCred mcclient.TokenCredential, obj IModel) { + if createNotifyHook == nil { + return + } + createNotifyHook(ctx, userCred, obj) +} + +func CallDeleteNotifyHook(ctx context.Context, userCred mcclient.TokenCredential, obj IModel) { + if deleteNotifyHook == nil { + return + } + deleteNotifyHook(ctx, userCred, obj) +} diff --git a/pkg/cloudcommon/notifyclient/notify.go b/pkg/cloudcommon/notifyclient/notify.go index b0841940a1..9e7c5849cc 100644 --- a/pkg/cloudcommon/notifyclient/notify.go +++ b/pkg/cloudcommon/notifyclient/notify.go @@ -55,6 +55,28 @@ func init() { Action: ActionUpdate, }) }) + + db.SetCreateNotifyHook(func(ctx context.Context, userCred mcclient.TokenCredential, obj db.IModel) { + _, ok := notifyDBHookResources.Load(obj.KeywordPlural()) + if !ok { + return + } + EventNotify(ctx, userCred, SEventNotifyParam{ + Obj: obj, + Action: ActionCreate, + }) + }) + + db.SetDeleteNotifyHook(func(ctx context.Context, userCred mcclient.TokenCredential, obj db.IModel) { + _, ok := notifyDBHookResources.Load(obj.KeywordPlural()) + if !ok { + return + } + EventNotify(ctx, userCred, SEventNotifyParam{ + Obj: obj, + Action: ActionDelete, + }) + }) } func AddNotifyDBHookResources(keywordPlurals ...string) { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 89b2947619..ba1c75b886 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -90,7 +90,8 @@ func init() { } HostManager.SetVirtualObject(HostManager) HostManager.SetAlias("baremetal", "baremetals") - HostManager.NameRequireAscii = false + notifyclient.AddNotifyDBHookResources(HostManager.KeywordPlural(), GuestManager.AliasPlural()) + GuestManager.NameRequireAscii = false } type SHost struct { diff --git a/pkg/notify/models/event_template.go b/pkg/notify/models/event_template.go index a1d2e11517..63d60e9bd2 100644 --- a/pkg/notify/models/event_template.go +++ b/pkg/notify/models/event_template.go @@ -114,6 +114,11 @@ func init() { api.TEMPLATE_LANG_EN, api.TEMPLATE_LANG_CN, }, + sI18nElme{ + api.TOPIC_RESOURCE_HOST, + "host", + "宿主机", + }, sI18nElme{ api.TOPIC_RESOURCE_SERVER, "virtual machine", diff --git a/pkg/notify/models/topic.go b/pkg/notify/models/topic.go index 6ca84f8b05..919a4d2249 100644 --- a/pkg/notify/models/topic.go +++ b/pkg/notify/models/topic.go @@ -159,6 +159,7 @@ func (sm *STopicManager) InitializeData() error { switch name { case DefaultResourceCreateDelete: t.addResources( + notify.TOPIC_RESOURCE_HOST, notify.TOPIC_RESOURCE_SERVER, notify.TOPIC_RESOURCE_SCALINGGROUP, notify.TOPIC_RESOURCE_IMAGE, @@ -202,6 +203,7 @@ func (sm *STopicManager) InitializeData() error { t.TitleEn = api.COMMON_TITLE_EN case DefaultResourceChangeConfig: t.addResources( + notify.TOPIC_RESOURCE_HOST, notify.TOPIC_RESOURCE_SERVER, notify.TOPIC_RESOURCE_DBINSTANCE, notify.TOPIC_RESOURCE_ELASTICCACHE, @@ -219,6 +221,7 @@ func (sm *STopicManager) InitializeData() error { notify.TOPIC_RESOURCE_DBINSTANCE, notify.TOPIC_RESOURCE_ELASTICCACHE, notify.TOPIC_RESOURCE_USER, + notify.TOPIC_RESOURCE_HOST, ) t.addAction(notify.ActionUpdate) t.addAction(notify.ActionRebuildRoot)