初始提交:OCI 面板后端(含 GenAI 网关一期)

This commit is contained in:
Wang Defa
2026-07-09 15:31:04 +08:00
commit b9a3e97e84
168 changed files with 31794 additions and 0 deletions
+144
View File
@@ -0,0 +1,144 @@
package oci
import (
"reflect"
"testing"
"time"
"github.com/oracle/oci-go-sdk/v65/audit"
"github.com/oracle/oci-go-sdk/v65/common"
)
func TestToAuditEvent(t *testing.T) {
eventTime := time.Date(2026, 7, 6, 10, 30, 0, 0, time.UTC)
tests := []struct {
name string
ev audit.AuditEvent
want AuditEvent
}{
{
name: "全字段齐全",
ev: audit.AuditEvent{
EventId: common.String("evt-abc"),
Source: common.String("ComputeApi"),
EventTime: &common.SDKTime{Time: eventTime},
Data: &audit.Data{
EventName: common.String("TerminateInstance"),
ResourceName: common.String("web-1"),
CompartmentName: common.String("prod"),
Identity: &audit.Identity{
PrincipalName: common.String("api-admin"),
IpAddress: common.String("1.2.3.4"),
},
Request: &audit.Request{
Action: common.String("DELETE"),
Path: common.String("/20160918/instances/ocid1..."),
},
Response: &audit.Response{Status: common.String("204")},
},
},
want: AuditEvent{
EventId: "evt-abc",
EventTime: &eventTime,
EventName: "TerminateInstance",
Source: "ComputeApi",
ResourceName: "web-1",
CompartmentName: "prod",
PrincipalName: "api-admin",
IPAddress: "1.2.3.4",
Status: "204",
RequestAction: "DELETE",
RequestPath: "/20160918/instances/ocid1...",
},
},
{
name: "Data 为 nil 时只保留信封字段",
ev: audit.AuditEvent{
Source: common.String("VcnApi"),
EventTime: &common.SDKTime{Time: eventTime},
},
want: AuditEvent{EventTime: &eventTime, Source: "VcnApi"},
},
{
name: "嵌套局部 nil 各自安全跳过",
ev: audit.AuditEvent{
Data: &audit.Data{
EventName: common.String("GetInstance"),
Identity: nil,
Request: &audit.Request{Path: common.String("/instances")},
Response: nil,
},
},
want: AuditEvent{EventName: "GetInstance", RequestPath: "/instances"},
},
{
name: "空事件全部零值",
ev: audit.AuditEvent{},
want: AuditEvent{},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := toAuditEvent(tt.ev); !auditEventEqual(got, tt.want) {
t.Errorf("toAuditEvent() = %+v, want %+v", got, tt.want)
}
})
}
}
// auditEventEqual 比较两个 DTOEventTime 按值比较,Raw 不参与,其余反射比较。
func auditEventEqual(a, b AuditEvent) bool {
if (a.EventTime == nil) != (b.EventTime == nil) {
return false
}
if a.EventTime != nil && !a.EventTime.Equal(*b.EventTime) {
return false
}
a.EventTime, b.EventTime = nil, nil
a.Raw, b.Raw = nil, nil
return reflect.DeepEqual(a, b)
}
func TestSortAuditEvents(t *testing.T) {
t1 := time.Date(2026, 7, 6, 8, 0, 0, 0, time.UTC)
t2 := time.Date(2026, 7, 6, 9, 0, 0, 0, time.UTC)
items := []AuditEvent{
{EventName: "old", EventTime: &t1},
{EventName: "no-time", EventTime: nil},
{EventName: "new", EventTime: &t2},
}
sortAuditEvents(items)
got := []string{items[0].EventName, items[1].EventName, items[2].EventName}
want := []string{"new", "old", "no-time"}
for i := range want {
if got[i] != want[i] {
t.Fatalf("sortAuditEvents() order = %v, want %v", got, want)
}
}
}
func TestKeepAuditEvent(t *testing.T) {
cases := []struct {
name string
event AuditEvent
keep bool
}{
{"公网IP的普通事件保留", AuditEvent{EventName: "CreateUser", IPAddress: "203.0.113.7"}, true},
{"SummarizeMetricsData 噪声排除", AuditEvent{EventName: "SummarizeMetricsData", IPAddress: "203.0.113.7"}, false},
{"内网10段发起排除", AuditEvent{EventName: "ListInstances", IPAddress: "10.1.2.3"}, false},
{"内网172.16段发起排除", AuditEvent{EventName: "ListInstances", IPAddress: "172.20.0.1"}, false},
{"172.15不属内网保留", AuditEvent{EventName: "ListInstances", IPAddress: "172.15.0.1"}, true},
{"内网192.168段发起排除", AuditEvent{EventName: "ListInstances", IPAddress: "192.168.1.1"}, false},
{"CGNAT 100.64段排除", AuditEvent{EventName: "ListInstances", IPAddress: "100.100.0.1"}, false},
{"100.128不属CGNAT保留", AuditEvent{EventName: "ListInstances", IPAddress: "100.128.0.1"}, true},
{"IP为空保留(控制面事件)", AuditEvent{EventName: "TerminateInstance", IPAddress: ""}, true},
{"IP不可解析保留", AuditEvent{EventName: "ListInstances", IPAddress: "not-an-ip"}, true},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
if got := keepAuditEvent(tc.event); got != tc.keep {
t.Fatalf("keepAuditEvent(%+v) = %v, want %v", tc.event, got, tc.keep)
}
})
}
}