package oci import ( "crypto/rand" "crypto/sha256" "encoding/hex" "fmt" ) // 日志回传链路资源命名与描述文案的集中定义。 // 目标:让每租户派生互异的中性资源名,避免跨租户恒定字面量成为「共用同一套 oci-portal」的指纹。 // relayNames 是按 tenancy 派生的一组资源名。 type relayNames struct { TopicPrefix string // 例: "c3f2a1b0-audit",Topic 最终名再加短随机后缀 PolicyName string // 例: "c3f2a1b0-audit-p" ConnectorName string // 例: "c3f2a1b0-audit" } // relayResourceNames 由 tenancyOCID 派生一组稳定的中性资源名。 // SHA-256 前 4 字节做前缀,同 tenancy 每次调用结果一致(幂等查找依赖此性质)。 func relayResourceNames(tenancyOCID string) relayNames { sum := sha256.Sum256([]byte(tenancyOCID)) prefix := hex.EncodeToString(sum[:4]) return relayNames{ TopicPrefix: prefix + "-audit", PolicyName: prefix + "-audit-p", ConnectorName: prefix + "-audit", } } // relayTopicNewName 按给定前缀 + 4 字节随机后缀生成 Topic 名,规避 ONS 删除保留期。 func relayTopicNewName(prefix string) (string, error) { buf := make([]byte, 4) if _, err := rand.Read(buf); err != nil { return "", fmt.Errorf("topic name suffix: %w", err) } return prefix + "-" + hex.EncodeToString(buf), nil } // 描述文案:中性英文,不含品牌明文;集中于此便于后续再调整。 const ( relayTopicDescNew = "Audit event relay endpoint" relayPolicyDescNew = "Allow Service Connector to publish audit events to notification topic" ) // legacyRelay* 仅用于识别旧版本(硬编码 ociportal-logs*)创建的存量资源,不用于新建。 // 新租户完全走 relayResourceNames 派生;存量租户 fallback 命中后描述会一次性刷新为中性文案。 const ( legacyRelayTopicPrefix = "ociportal-logs" legacyRelayPolicyName = "ociportal-logs-sch" legacyRelayConnectorName = "ociportal-logs" )