Skip to content

Commit

Permalink
feat: sg 环境离岸账号支持邮件通知渠道 --story=119720848 (#4750)
Browse files Browse the repository at this point in the history
  • Loading branch information
SevenDreamer authored Jan 17, 2025
1 parent 049fa95 commit 740331a
Show file tree
Hide file tree
Showing 2 changed files with 212 additions and 6 deletions.
16 changes: 10 additions & 6 deletions bkmonitor/api/cmsi/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ def send_request(self, validated_request_data: Dict, receivers: List[str]): # s
try:
super(CMSIBaseResource, self).perform_request(validated_request_data)

response_data["message_detail"] = self.message_detail
return response_data

except BKAPIError as e:
Expand All @@ -109,8 +108,6 @@ def send_request(self, validated_request_data: Dict, receivers: List[str]): # s
response_data["username_check"]["invalid"] = invalid
# 失败原因
response_data["message"] = str(e)
# 记录失败的具体原因 {username: reason}, 仅失败才有
response_data["message_detail"] = self.message_detail

return response_data

Expand Down Expand Up @@ -141,7 +138,7 @@ def get_external_receiver_info(cls, receivers_username: List[str]) -> Dict[str,
```
"""
fields = "email,phone"
param = {"usernames": receivers_username, "fields": fields}
param = {"usernames": ",".join(receivers_username), "fields": fields}

receivers_info = api.bk_login.get_user_sensitive_info(**param)["data"]

Expand Down Expand Up @@ -418,6 +415,13 @@ def perform_request(self, validated_request_data: Dict[str, Union[List[str], any
else:
response = external_send_response

# 更新 message_detail
if self.message_detail:
if response:
response["message_detail"].update(self.message_detail)
else:
default_response_data["message_detail"].update(self.message_detail)

return response or default_response_data

def get_receivers_with_external_users(self, external_users: List[str]) -> List[str]:
Expand All @@ -437,7 +441,7 @@ def get_receivers_with_external_users(self, external_users: List[str]) -> List[s
if username not in receivers_info:
not_exist_usernames.append(username)
continue
if not receivers_info[username]["mail"]:
if not receivers_info[username]["email"]:
not_email_usernames.append(username)
continue
exist_usernames.append(username)
Expand All @@ -447,7 +451,7 @@ def get_receivers_with_external_users(self, external_users: List[str]) -> List[s
# 提前获取失败原因为 "邮箱不存在" 的用户,并且不会对他们进行发送
self.rich_message_detail_with_usernames(not_email_usernames, "user email not exists")
# 获取最终的 receivers
return [receivers_info[username]["mail"] for username in exist_usernames]
return [receivers_info[username]["email"] for username in exist_usernames]

def rich_message_detail_with_usernames(self, usernames: List[str], message_detail):
"""
Expand Down
202 changes: 202 additions & 0 deletions bkmonitor/tests/api/cmsi/test_send_mail.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
import mock

from api.cmsi.default import SendMail


class TestSendMail:
def test_external_exist(self):
"""一个外部用户存在"""
validated_request_data = {
"receiver__username": "jiananzhang_bkci@tai",
"title": "this is title",
"content": "this is content",
}

external_receiver_info = {"jiananzhang_bkci@tai": {"email": "[email protected]", "phone": ""}}
request_response = {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {},
}
with mock.patch(
"api.cmsi.default.SendMail.get_external_receiver_info", mock.Mock(return_value=external_receiver_info)
), mock.patch("api.cmsi.default.SendMail.send_request", mock.Mock(return_value=request_response)):
assert SendMail()(validated_request_data) == {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {},
}

def test_external_users_partially_exist(self):
"""两个外部用户,一个存在,一个不存在"""
validated_request_data = {
"receiver__username": "jiananzhang_bkci@tai,jiananzhang_bkci1@tai",
"title": "this is title",
"content": "this is content",
}

external_receiver_info = {"jiananzhang_bkci@tai": {"email": "[email protected]", "phone": ""}}
external_send_request_response = {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {}, # 在调用父类的send_request中,会将self.message_detail赋值给response_data 然后返回
}
with mock.patch(
"api.cmsi.default.SendMail.get_external_receiver_info", mock.Mock(return_value=external_receiver_info)
), mock.patch("api.cmsi.default.SendMail.send_request", mock.Mock(return_value=external_send_request_response)):
assert SendMail()(validated_request_data) == {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {"jiananzhang_bkci1@tai": "user not exists"},
}

def test_external_users_none_exist(self):
"""一个外部用户 不存在"""
validated_request_data = {
"receiver__username": "jiananzhang_bkci@tai",
"title": "this is title",
"content": "this is content",
}

external_receiver_info = {}
with mock.patch(
"api.cmsi.default.SendMail.get_external_receiver_info", mock.Mock(return_value=external_receiver_info)
):
assert SendMail()(validated_request_data) == {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {"jiananzhang_bkci@tai": "user not exists"},
}

def test_external_users_email_none_exist(self):
"""一个外部用户邮箱不存在"""
validated_request_data = {
"receiver__username": "jiananzhang_bkci@tai",
"title": "this is title",
"content": "this is content",
}

external_receiver_info = {"jiananzhang_bkci@tai": {"email": "", "phone": ""}}
with mock.patch(
"api.cmsi.default.SendMail.get_external_receiver_info", mock.Mock(return_value=external_receiver_info)
):
assert SendMail()(validated_request_data) == {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {"jiananzhang_bkci@tai": "user email not exists"},
}

# 以下为一个内部用户+一个外部用户的情况
def test_all_exist(self):
"""内外部用户都存在"""
validated_request_data = {
"receiver__username": "jiananzhang_bkci@tai,jiananzhang_bkci",
"title": "this is title",
"content": "this is content",
}

internal_send_request_response = {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {},
}
external_send_request_response = {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {},
}
external_receiver_info = {"jiananzhang_bkci@tai": {"email": "[email protected]", "phone": ""}}
with mock.patch(
"api.cmsi.default.SendMail.get_external_receiver_info", mock.Mock(return_value=external_receiver_info)
), mock.patch(
"api.cmsi.default.SendMail.send_request",
mock.Mock(side_effect=[internal_send_request_response, external_send_request_response]),
):
assert SendMail()(validated_request_data) == {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {},
}

def test_only_external_user_none_exist(self):
"""内部用户存在,外部用户不存在"""
validated_request_data = {
"receiver__username": "jiananzhang_bkci@tai,jiananzhang_bkci",
"title": "this is title",
"content": "this is content",
}

internal_send_request_response = {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {},
}

external_receiver_info = {}
with mock.patch(
"api.cmsi.default.SendMail.get_external_receiver_info", mock.Mock(return_value=external_receiver_info)
), mock.patch(
"api.cmsi.default.SendMail.send_request", mock.Mock(side_effect=[internal_send_request_response])
):
assert SendMail()(validated_request_data) == {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {"jiananzhang_bkci@tai": "user not exists"},
}

def test_internal_user_error(self):
"""内部用户报错,外部用户存在"""
validated_request_data = {
"receiver__username": "jiananzhang_bkci@tai,jiananzhang_bkci",
"title": "this is title",
"content": "this is content",
}

internal_send_request_response = {
"username_check": {"invalid": ["jiananzhang_bkci"]},
"message": "发送失败",
"message_detail": {},
}
external_send_request_response = {
"username_check": {"invalid": []},
"message": "发送成功",
"message_detail": {},
}
external_receiver_info = {"jiananzhang_bkci@tai": {"email": "[email protected]", "phone": ""}}
with mock.patch(
"api.cmsi.default.SendMail.get_external_receiver_info", mock.Mock(return_value=external_receiver_info)
), mock.patch(
"api.cmsi.default.SendMail.send_request",
mock.Mock(side_effect=[internal_send_request_response, external_send_request_response]),
):
assert SendMail()(validated_request_data) == {
"username_check": {"invalid": ["jiananzhang_bkci"]},
"message": "发送失败",
"message_detail": {},
}

def test_all_users_none_exist(self):
"""内部用户报错,外部用户不存在"""
validated_request_data = {
"receiver__username": "jiananzhang_bkci@tai,jiananzhang_bkci",
"title": "this is title",
"content": "this is content",
}

internal_send_request_response = {
"username_check": {"invalid": ["jiananzhang_bkci"]},
"message": "发送失败",
"message_detail": {},
}

external_receiver_info = {}
with mock.patch(
"api.cmsi.default.SendMail.get_external_receiver_info", mock.Mock(return_value=external_receiver_info)
), mock.patch(
"api.cmsi.default.SendMail.send_request", mock.Mock(side_effect=[internal_send_request_response])
):
assert SendMail()(validated_request_data) == {
"username_check": {"invalid": ["jiananzhang_bkci"]},
"message": "发送失败",
"message_detail": {"jiananzhang_bkci@tai": "user not exists"},
}

0 comments on commit 740331a

Please sign in to comment.