import type { SecuritySetting, AuditEvent, BootVolume, BootVolumeAttachment, Compartment, ComputeShape, ConsoleConnection, CostItem, IamUser, IamUserDetail, IdentityProvider, IdentitySetting, ImageInfo, Instance, InstanceTraffic, Ipv6Report, LimitItem, LogEvent, LogWebhookInfo, NotificationRecipients, NotifyEventsSetting, OciConfig, Overview, PasswordPolicy, RegionInfo, RegionSubscription, SecurityList, SignOnRule, Subnet, SubscriptionDetail, SystemLog, Task, TaskLog, TaskSetting, TelegramSetting, Vcn, Volume, VolumeAttachment, } from '@/types/api' /** mock 数据集:与设计稿展示数据保持一致,便于对照验收 */ function cfg(p: Partial & Pick): OciConfig { return { group: '', userOcid: 'ocid1.user.oc1..aaaa', tenancyOcid: `ocid1.tenancy.oc1..${p.alias}xxxx`, fingerprint: 'e2:d4:00:11:22:33', region: 'eu-frankfurt-1', tenancyName: p.alias ?? '', homeRegionKey: 'FRA', accountType: 'free', subscriptionId: 'ocid1.organizationssubscription.oc1..xxx', paymentModel: 'FREE_TRIAL', subscriptionTier: 'FREE', promotionStatus: 'EXPIRED', promotionAmount: 279, promotionExpires: '2026-02-21T00:00:00Z', aliveStatus: 'alive', lastError: '', lastVerifiedAt: '2026-07-03T15:40:00+08:00', multiRegion: false, multiCompartment: false, proxyId: null, proxyName: '', createdAt: '2026-05-14T10:00:00+08:00', updatedAt: '2026-07-03T15:40:00+08:00', ...p, } } export const mockProxies = [ { id: 1, name: '东京 socks5', type: 'socks5', host: '203.0.113.50', port: 1080, username: 'relay', passwordSet: true, country: '日本', city: '东京', geoAt: '2026-07-05T12:00:00+08:00', usedBy: 1, createdAt: '2026-07-01T10:00:00+08:00', }, { id: 2, name: '本地 http', type: 'http', host: '127.0.0.1', port: 7890, username: '', passwordSet: false, country: '', city: '', geoAt: '2026-07-05T12:00:00+08:00', usedBy: 0, createdAt: '2026-07-03T09:30:00+08:00', }, ] export const mockConfigs: OciConfig[] = [ cfg({ id: 1, alias: 'XXXX主号', group: '生产', tenancyName: 'XXXXmain', accountType: 'paid', paymentModel: 'PAYG', subscriptionTier: 'FREE_AND_PAID', promotionStatus: 'EXPIRED', multiRegion: true, multiCompartment: true, // 与 mockProxies[0].usedBy = 1 呼应:主号经东京 socks5 出站 proxyId: 1, proxyName: '东京 socks5', }), cfg({ id: 2, alias: '试用期', group: '教育', tenancyName: 'trialacct', region: 'us-ashburn-1', homeRegionKey: 'IAD', accountType: 'trial', subscriptionTier: 'FREE_AND_TRIAL', promotionStatus: 'ACTIVE', promotionExpires: '2026-07-31T00:00:00Z', }), cfg({ id: 3, alias: '新加坡备用', tenancyName: 'sgbackup', region: 'ap-singapore-1', homeRegionKey: 'SIN', }), cfg({ id: 4, alias: '首尔小鸡', group: '教育', tenancyName: 'seoulchick', region: 'ap-seoul-1', homeRegionKey: 'ICN', accountType: 'trial', promotionStatus: 'ACTIVE', promotionExpires: '2026-07-18T00:00:00Z', }), cfg({ id: 5, alias: '东京主号', tenancyName: 'tokyomain', region: 'ap-tokyo-1', homeRegionKey: 'NRT', aliveStatus: 'dead', lastError: 'NotAuthenticated: key expired', lastVerifiedAt: '2026-07-03T13:40:00+08:00', }), cfg({ id: 6, alias: '伦敦过期', tenancyName: 'londonold', region: 'uk-london-1', homeRegionKey: 'LHR', aliveStatus: 'dead', lastError: 'NotAuthenticated: tenancy suspended', lastVerifiedAt: '2026-07-02T15:00:00+08:00', }), cfg({ id: 7, alias: '抢机备号', tenancyName: 'snatchbak' }), ] function inst(p: Partial & Pick): Instance { return { lifecycleState: 'RUNNING', shape: 'VM.Standard.A1.Flex', ocpus: 4, memoryInGBs: 24, availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', region: 'eu-frankfurt-1', compartmentId: 'ocid1.compartment.oc1..root', imageId: 'ocid1.image.oc1.eu-frankfurt-1.ubuntu2404', imageName: 'Canonical-Ubuntu-24.04-aarch64-2026.05.15-0', subnetId: 'ocid1.subnet.oc1.eu-frankfurt-1.pub', privateIp: '10.0.1.2', publicIp: '130.61.88.147', ipv6Addresses: ['2603:c020:400d:aa01::1'], freeformTags: { env: 'prod' }, definedTags: { 'Oracle-Tags': { CreatedBy: 'default/admin', CreatedOn: '2026-05-20T14:32:00.000Z' }, }, timeCreated: '2026-05-20T14:32:00Z', ...p, } } /** 按配置 id 组织的实例 mock */ export const mockInstances: Record = { 1: [ inst({ id: 'ocid1.instance.oc1..web-fra-01', displayName: 'web-fra-01', freeformTags: { env: 'prod', RootPassword: 'n^m4#wvErNeESq2K' }, }), inst({ id: 'ocid1.instance.oc1..web-fra-02', displayName: 'web-fra-02', ocpus: 2, memoryInGBs: 12, publicIp: '130.61.92.33', privateIp: '10.0.1.3', ipv6Addresses: [], }), inst({ id: 'ocid1.instance.oc1..app-fra-03', displayName: 'app-fra-03', ocpus: 2, memoryInGBs: 12, publicIp: '141.147.62.190', privateIp: '10.0.1.4', ipv6Addresses: [], }), ], 2: [ inst({ id: 'ocid1.instance.oc1..dev-ash-01', displayName: 'dev-ash-01', shape: 'VM.Standard.E2.1.Micro', ocpus: 1, memoryInGBs: 1, region: 'us-ashburn-1', availabilityDomain: 'RssO:US-ASHBURN-1-AD-2', publicIp: '129.153.44.92', ipv6Addresses: [], }), ], 3: [ inst({ id: 'ocid1.instance.oc1..db-sgp-01', displayName: 'db-sgp-01', shape: 'VM.Standard.E4.Flex', ocpus: 2, memoryInGBs: 16, region: 'ap-singapore-1', availabilityDomain: 'RssO:AP-SINGAPORE-1-AD-1', publicIp: '152.69.204.18', ipv6Addresses: [], }), ], 4: [ inst({ id: 'ocid1.instance.oc1..proxy-icn-01', displayName: 'proxy-icn-01', shape: 'VM.Standard.E2.1.Micro', ocpus: 1, memoryInGBs: 1, lifecycleState: 'STOPPED', region: 'ap-seoul-1', availabilityDomain: 'RssO:AP-SEOUL-1-AD-1', publicIp: '144.24.71.206', ipv6Addresses: [], }), ], 5: [ inst({ id: 'ocid1.instance.oc1..backup-nrt-01', displayName: 'backup-nrt-01', ocpus: 1, memoryInGBs: 6, lifecycleState: 'STOPPED', region: 'ap-tokyo-1', availabilityDomain: 'RssO:AP-TOKYO-1-AD-1', publicIp: '140.238.51.77', ipv6Addresses: [], }), ], 6: [], 7: [ inst({ id: 'ocid1.instance.oc1..snatch-fra-a1', displayName: 'snatch-fra-a1', lifecycleState: 'PROVISIONING', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-2', publicIp: '', ipv6Addresses: [], }), ], } export const mockTasks: Task[] = [ { id: 1, name: '每日全量测活', type: 'health_check', cronExpr: '0 3 * * *', payload: '{"ociConfigIds":[]}', status: 'active', lastRunAt: '2026-07-03T03:00:00+08:00', lastError: '', runCount: 46, createdAt: '2026-05-18T00:00:00+08:00', updatedAt: '2026-07-03T03:00:00+08:00', }, { id: 6, name: '每日成本同步', type: 'cost', cronExpr: '30 3 * * *', payload: '{"ociConfigIds":[]}', status: 'active', lastRunAt: '2026-07-03T03:30:00+08:00', lastError: '', runCount: 21, createdAt: '2026-06-12T00:00:00+08:00', updatedAt: '2026-07-03T03:30:00+08:00', }, { id: 2, name: '法兰克福 A1 抢机 ×2', type: 'snatch', cronExpr: '*/5 * * * *', payload: '{"ociConfigId":7,"count":2}', status: 'active', lastRunAt: '2026-07-03T17:02:00+08:00', lastError: 'Out of host capacity (AD-1)', runCount: 217, createdAt: '2026-06-20T00:00:00+08:00', updatedAt: '2026-07-03T17:02:00+08:00', }, { id: 3, name: '新加坡 A1 抢机', type: 'snatch', cronExpr: '*/10 * * * *', payload: '{"ociConfigId":3,"count":1}', status: 'paused', lastRunAt: '2026-07-02T22:40:00+08:00', lastError: '', runCount: 89, createdAt: '2026-06-25T00:00:00+08:00', updatedAt: '2026-07-02T22:40:00+08:00', }, { id: 4, name: '首尔 E2 抢机', type: 'snatch', cronExpr: '*/5 * * * *', payload: '{"ociConfigId":4,"count":1}', status: 'succeeded', lastRunAt: '2026-07-01T14:25:00+08:00', lastError: '', runCount: 132, createdAt: '2026-06-28T00:00:00+08:00', updatedAt: '2026-07-01T14:25:00+08:00', }, { id: 7, name: '东京 A1 抢机', type: 'snatch', cronExpr: '*/5 * * * *', payload: '{"ociConfigId":5,"count":1,"totalCount":1,"authFailCount":3}', status: 'failed', lastRunAt: '2026-07-03T14:10:00+08:00', lastError: '连续 3 次 NotAuthenticated,任务已熔断停止: NotAuthenticated: key expired', runCount: 58, createdAt: '2026-06-30T00:00:00+08:00', updatedAt: '2026-07-03T14:10:00+08:00', }, { id: 5, name: 'XXXX 每小时测活', type: 'health_check', cronExpr: '7 * * * *', payload: '{"ociConfigIds":[1,2,3,4]}', status: 'active', lastRunAt: '2026-07-03T17:07:00+08:00', lastError: '', runCount: 312, createdAt: '2026-06-01T00:00:00+08:00', updatedAt: '2026-07-03T17:07:00+08:00', }, ] export const mockTaskLogs: Record = { 1: [ { id: 101, taskId: 1, success: true, message: 'checked 21: 21 alive, 0 dead', durationMs: 3912, createdAt: '2026-07-03T03:00:04+08:00', }, ], 6: [ { id: 601, taskId: 6, success: true, message: 'synced usage for 3 tenants, skipped 4 free', durationMs: 5210, createdAt: '2026-07-03T03:30:05+08:00', }, ], 2: [ { id: 201, taskId: 2, success: false, message: 'Out of host capacity (AD-1)', durationMs: 1204, createdAt: '2026-07-03T17:02:01+08:00', }, { id: 200, taskId: 2, success: false, message: 'Out of host capacity (AD-1)', durationMs: 987, createdAt: '2026-07-03T16:57:01+08:00', }, { id: 199, taskId: 2, success: false, message: 'Out of host capacity (AD-2)', durationMs: 1102, createdAt: '2026-07-03T16:52:01+08:00', }, { id: 180, taskId: 2, success: true, message: 'launched 1/2: ocid1.instance.oc1.eu-frankfurt-1.antheljt…mc25a, 1 remaining', durationMs: 42381, createdAt: '2026-07-02T09:15:00+08:00', }, ], 4: [ { id: 401, taskId: 4, success: true, message: 'launched ocid1.instance.oc1.ap-seoul-1.anuwg…7k2ma, task succeeded', durationMs: 38754, createdAt: '2026-07-01T14:25:39+08:00', }, ], 7: [ { id: 703, taskId: 7, success: false, message: '连续 3 次 NotAuthenticated,任务已熔断停止: NotAuthenticated: key expired', durationMs: 842, createdAt: '2026-07-03T14:10:01+08:00', }, { id: 702, taskId: 7, success: false, message: 'no instance created: vm: NotAuthenticated: key expired', durationMs: 913, createdAt: '2026-07-03T14:05:01+08:00', }, { id: 701, taskId: 7, success: false, message: 'no instance created: vm: NotAuthenticated: key expired', durationMs: 887, createdAt: '2026-07-03T14:00:01+08:00', }, ], 5: [ { id: 501, taskId: 5, success: true, message: 'checked 4: 4 alive, 0 dead', durationMs: 1533, createdAt: '2026-07-03T17:07:02+08:00', }, ], } export const mockRegionSubs: RegionSubscription[] = [ { key: 'FRA', name: 'eu-frankfurt-1', status: 'READY', isHomeRegion: true, alias: 'Germany Central (Frankfurt)', }, { key: 'AMS', name: 'eu-amsterdam-1', status: 'READY', isHomeRegion: false, alias: 'Netherlands NW (Amsterdam)', }, { key: 'ICN', name: 'ap-seoul-1', status: 'IN_PROGRESS', isHomeRegion: false, alias: 'South Korea Central (Seoul)', }, ] export const mockLimits: LimitItem[] = [ // A1:三个 AD 均有配额 + 区域总额(镜像真实免费租户形态) { name: 'standard-a1-core-count', scopeType: 'AD', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', value: 4, used: 4, available: 0, }, { name: 'standard-a1-core-count', scopeType: 'AD', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-2', value: 4, }, { name: 'standard-a1-core-count', scopeType: 'AD', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-3', value: 4, }, { name: 'standard-a1-core-regional-count', scopeType: 'REGION', value: 4 }, { name: 'standard-a1-memory-count', scopeType: 'AD', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', value: 24, used: 24, available: 0, }, // Micro:仅 AD-2 有配额(AD 受限 shape,驱动创建表单自动落位) { name: 'standard-e2-micro-core-count', scopeType: 'AD', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', value: 0, }, { name: 'standard-e2-micro-core-count', scopeType: 'AD', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-2', value: 2, used: 1, available: 1, }, { name: 'standard-e2-micro-core-count', scopeType: 'AD', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-3', value: 0, }, { name: 'standard-e4-core-count', scopeType: 'AD', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', value: 6, used: 2, available: 4, }, { name: 'vcn-count', scopeType: 'REGION', value: 50, used: 2, available: 48 }, { name: 'volume-backup-count', scopeType: 'REGION', value: 100, used: 6, available: 94 }, ] export const mockSubscriptions: SubscriptionDetail[] = [ { id: 'ocid1.organizationssubscription.oc1..xxx', serviceName: 'CLOUDCM', classicSubscriptionId: 'xxx', paymentModel: 'FREE_TRIAL', subscriptionTier: 'FREE_AND_TRIAL', lifecycleState: 'ACTIVE', programType: '', customerCountryCode: 'DE', cloudAmountCurrency: 'EUR', csiNumber: '', regionAssignment: '', isGovernmentSubscription: false, promotions: [ { duration: 30, durationUnit: 'DAYS', amount: 279, status: 'ACTIVE', isIntentToPay: false, currencyUnit: 'EUR', timeStarted: '2026-01-22T01:19:25Z', timeExpired: '2026-07-31T00:00:00Z', }, ], startDate: '2026-01-22T01:19:25Z', endDate: null, timeCreated: '2026-01-22T01:19:25.174Z', timeUpdated: '2026-01-22T01:35:51.021Z', }, { id: 'ocid1.organizationssubscription.oc1..yyy', serviceName: 'OCICORP', classicSubscriptionId: 'yyy', paymentModel: 'PAYG', subscriptionTier: 'FREE_AND_PAID', lifecycleState: 'ACTIVE', programType: 'STANDARD', customerCountryCode: 'DE', cloudAmountCurrency: 'EUR', csiNumber: '', regionAssignment: '', isGovernmentSubscription: false, promotions: [], startDate: '2026-03-02T00:00:00Z', endDate: null, timeCreated: '2026-03-02T00:00:00.000Z', timeUpdated: '2026-03-02T00:00:00.000Z', }, { id: 'ocid1.organizationssubscription.oc1..idcs', serviceName: 'IDCS', classicSubscriptionId: 'zzz', paymentModel: '', subscriptionTier: '', lifecycleState: 'ACTIVE', programType: '', customerCountryCode: 'DE', cloudAmountCurrency: '', csiNumber: '', regionAssignment: '', isGovernmentSubscription: false, promotions: [], startDate: '2026-01-22T01:19:25Z', endDate: null, timeCreated: '2026-01-22T01:19:25.174Z', timeUpdated: '2026-01-22T01:19:25.174Z', }, ] export const mockUsers: IamUser[] = [ { id: 'ocid1.user..apiadmin', name: 'api-admin', description: '当前 API Key 签名用户', email: 'admin@XXXX.io', emailVerified: true, mfaActivated: true, lifecycleState: 'ACTIVE', isCurrentUser: true, timeCreated: '2026-05-14T00:00:00Z', lastLoginTime: '2026-07-03T09:00:00Z', }, { id: 'ocid1.user..consoleadmin', name: 'console-admin', description: '控制台管理员', email: 'console-admin@XXXX.io', emailVerified: true, mfaActivated: true, lifecycleState: 'ACTIVE', isCurrentUser: false, timeCreated: '2026-05-20T00:00:00Z', lastLoginTime: null, }, { id: 'ocid1.user..devzhang', name: 'dev-zhang', description: '开发', email: 'zhang@XXXX.io', emailVerified: false, mfaActivated: false, lifecycleState: 'ACTIVE', isCurrentUser: false, timeCreated: '2026-06-02T00:00:00Z', lastLoginTime: null, }, { id: 'ocid1.user..fedwang', name: 'XXXX_fed/wang.defa', description: '联邦用户 · Keycloak', email: '', emailVerified: false, mfaActivated: false, lifecycleState: 'ACTIVE', isCurrentUser: false, timeCreated: '2026-06-11T00:00:00Z', lastLoginTime: '2026-07-02T20:00:00Z', }, ] // 域档案:apiadmin 双管理员,consoleadmin 仅管理员组,devzhang 普通域用户, // fedwang 不在身份域中(演示经典 IAM 用户的禁用态) export const mockUserDetails: Record = { 'ocid1.user..apiadmin': { inDomain: true, givenName: 'API', familyName: 'Admin', isDomainAdmin: true, inAdminGroup: true, }, 'ocid1.user..consoleadmin': { inDomain: true, givenName: 'Console', familyName: 'Admin', isDomainAdmin: false, inAdminGroup: true, }, 'ocid1.user..devzhang': { inDomain: true, givenName: 'Zhang', familyName: 'Dev', isDomainAdmin: false, inAdminGroup: false, }, } // 审计事件按时间倒序,含 401/404 失败事件(状态 >=400 标红演示); // eventId 统一后缀派生,详情接口按它反查 const mockAuditEventsBase: Omit[] = [ { eventTime: '2026-07-07T09:42:00Z', eventName: 'TerminateInstance', source: 'ComputeApi', resourceName: 'web-1', compartmentName: 'XXXX (root)', principalName: 'api-admin', ipAddress: '203.0.113.10', status: '204', requestAction: 'DELETE', requestPath: '/20160918/instances/ocid1.instance.oc1.eu-frankfurt-1.aaaa', }, { eventTime: '2026-07-07T09:40:00Z', eventName: 'LaunchInstance', source: 'ComputeApi', resourceName: 'arm-snatch-1', compartmentName: 'XXXX (root)', principalName: 'api-admin', ipAddress: '203.0.113.10', status: '500', requestAction: 'POST', requestPath: '/20160918/instances', }, { eventTime: '2026-07-07T08:15:00Z', eventName: 'UpdateVcn', source: 'VcnApi', resourceName: 'vcn-20260509-0252', compartmentName: 'network', principalName: 'console-admin', ipAddress: '198.51.100.7', status: '200', requestAction: 'PUT', requestPath: '/20160918/vcns/ocid1.vcn.oc1.eu-frankfurt-1.bbbb', }, { eventTime: '2026-07-07T06:30:00Z', eventName: 'GetUser', source: 'IdentityControlPlane', resourceName: 'dev-zhang', compartmentName: 'XXXX (root)', principalName: 'dev-zhang', ipAddress: '198.51.100.24', status: '404', requestAction: 'GET', requestPath: '/20160918/users/ocid1.user.oc1..missing', }, { eventTime: '2026-07-07T03:12:00Z', eventName: 'InstanceAction', source: 'ComputeApi', resourceName: 'db-1', compartmentName: 'prod', principalName: 'api-admin', ipAddress: '203.0.113.10', status: '200', requestAction: 'POST', requestPath: '/20160918/instances/ocid1.instance.oc1.eu-frankfurt-1.cccc', }, { eventTime: '2026-07-06T22:47:00Z', eventName: 'ListEvents', source: 'Audit', resourceName: '', compartmentName: 'XXXX (root)', principalName: 'console-admin', ipAddress: '198.51.100.7', status: '200', requestAction: 'GET', requestPath: '/20190901/auditEvents', }, { eventTime: '2026-07-06T20:05:00Z', eventName: 'CreateSwiftPassword', source: 'IdentityControlPlane', resourceName: 'dev-zhang', compartmentName: 'XXXX (root)', principalName: 'dev-zhang', ipAddress: '198.51.100.24', status: '401', requestAction: 'POST', requestPath: '/20160918/users/ocid1.user..devzhang/swiftPasswords', }, { eventTime: '2026-07-06T15:58:00Z', eventName: 'UpdateSecurityList', source: 'VcnApi', resourceName: 'Default Security List', compartmentName: 'network', principalName: 'XXXX_fed/wang.defa', ipAddress: '192.0.2.88', status: '200', requestAction: 'PUT', requestPath: '/20160918/securityLists/ocid1.securitylist.oc1.eu-frankfurt-1.dddd', }, { eventTime: '2026-07-06T12:00:00Z', eventName: '', source: 'CloudGuardResponderEngine', resourceName: '', compartmentName: 'XXXX (root)', principalName: '', ipAddress: '', status: '', requestAction: '', requestPath: '', }, ] export const mockAuditEvents: AuditEvent[] = mockAuditEventsBase.map((e, i) => ({ ...e, eventId: `mock-audit-evt-${i + 1}`, })) export const mockIdps: IdentityProvider[] = [ { id: '54a0260f7a75', name: 'XXXX-keycloak', type: 'SAML', enabled: true, partnerProviderId: 'https://auth.example.test/realms/oci', jitEnabled: true, timeCreated: '2026-06-10T00:00:00Z', }, { id: '8800aa11bb22', name: 'test-okta', type: 'SAML', enabled: false, partnerProviderId: 'https://test.okta.example/app/xyz', jitEnabled: true, timeCreated: '2026-06-15T00:00:00Z', }, ] export const mockSignOnRules: SignOnRule[] = [ { id: '873aa3fa1a72', name: 'skip-mfa-keycloak', sequence: 1, authenticationFactor: 'IDP', conditionAttribute: 'subject.authenticatedBy', conditionValue: '["54a0260f7a75"]', builtIn: false, }, { id: 'builtin-default', name: 'Default Rule', sequence: 2, authenticationFactor: 'IDP_PLUS_2FA', conditionAttribute: '', conditionValue: '', builtIn: true, }, ] export const mockPolicies: PasswordPolicy[] = [ { id: 'defaultPasswordPolicy', name: 'defaultPasswordPolicy', priority: 3, passwordStrength: 'Custom', passwordExpiresAfter: 120, minLength: 12, numPasswordsInHistory: 4, }, { id: 'standardPasswordPolicy', name: 'StandardPasswordPolicy', priority: 2, passwordStrength: 'Standard', passwordExpiresAfter: 0, minLength: 8, }, { id: 'simplePasswordPolicy', name: 'SimplePasswordPolicy', priority: 1, passwordStrength: 'Simple', passwordExpiresAfter: 0, minLength: 8, }, ] export const mockRecipients: NotificationRecipients = { recipients: ['admin@XXXX.io', 'ops@XXXX.io'], testModeEnabled: true, } export const mockIdentitySetting: IdentitySetting = { id: 'IdentitySettings', primaryEmailRequired: false, } export const mockCosts: CostItem[] = [ { timeStart: '2026-06-27T00:00:00Z', groupValue: 'COMPUTE', computedAmount: 5.2, computedQuantity: 96, currency: 'USD', unit: 'OCPU_HOURS', }, { timeStart: '2026-06-28T00:00:00Z', groupValue: 'COMPUTE', computedAmount: 5.8, computedQuantity: 96, currency: 'USD', unit: 'OCPU_HOURS', }, { timeStart: '2026-06-29T00:00:00Z', groupValue: 'COMPUTE', computedAmount: 5.4, computedQuantity: 96, currency: 'USD', unit: 'OCPU_HOURS', }, { timeStart: '2026-06-30T00:00:00Z', groupValue: 'COMPUTE', computedAmount: 6.1, computedQuantity: 96, currency: 'USD', unit: 'OCPU_HOURS', }, { timeStart: '2026-07-01T00:00:00Z', groupValue: 'COMPUTE', computedAmount: 6.6, computedQuantity: 96, currency: 'USD', unit: 'OCPU_HOURS', }, { timeStart: '2026-07-02T00:00:00Z', groupValue: 'COMPUTE', computedAmount: 6.3, computedQuantity: 96, currency: 'USD', unit: 'OCPU_HOURS', }, { timeStart: '2026-07-03T00:00:00Z', groupValue: 'COMPUTE', computedAmount: 6.8, computedQuantity: 96, currency: 'USD', unit: 'OCPU_HOURS', }, { timeStart: '2026-07-01T00:00:00Z', groupValue: 'BLOCK_STORAGE', computedAmount: 1.4, computedQuantity: 300, currency: 'USD', unit: 'GB_MONTHS', }, { timeStart: '2026-07-02T00:00:00Z', groupValue: 'BLOCK_STORAGE', computedAmount: 1.4, computedQuantity: 300, currency: 'USD', unit: 'GB_MONTHS', }, ] export const mockTraffic: InstanceTraffic = { instanceId: 'ocid1.instance.oc1..web-fra-01', inboundBytes: 96.2 * 1024 ** 3, outboundBytes: 128.4 * 1024 ** 3, vnics: [ { vnicId: 'ocid1.vnic..main', inbound: [ { timestamp: '2026-06-27T00:00:00Z', bytes: 12.1 * 1024 ** 3 }, { timestamp: '2026-06-28T00:00:00Z', bytes: 13.8 * 1024 ** 3 }, { timestamp: '2026-06-29T00:00:00Z', bytes: 12.9 * 1024 ** 3 }, { timestamp: '2026-06-30T00:00:00Z', bytes: 14.5 * 1024 ** 3 }, { timestamp: '2026-07-01T00:00:00Z', bytes: 15.2 * 1024 ** 3 }, { timestamp: '2026-07-02T00:00:00Z', bytes: 13.4 * 1024 ** 3 }, { timestamp: '2026-07-03T00:00:00Z', bytes: 14.3 * 1024 ** 3 }, ], outbound: [ { timestamp: '2026-06-27T00:00:00Z', bytes: 16.2 * 1024 ** 3 }, { timestamp: '2026-06-28T00:00:00Z', bytes: 18.5 * 1024 ** 3 }, { timestamp: '2026-06-29T00:00:00Z', bytes: 17.1 * 1024 ** 3 }, { timestamp: '2026-06-30T00:00:00Z', bytes: 19.8 * 1024 ** 3 }, { timestamp: '2026-07-01T00:00:00Z', bytes: 21.5 * 1024 ** 3 }, { timestamp: '2026-07-02T00:00:00Z', bytes: 17.9 * 1024 ** 3 }, { timestamp: '2026-07-03T00:00:00Z', bytes: 17.4 * 1024 ** 3 }, ], }, ], } export const mockVcns: Record = { 1: [ { id: 'ocid1.vcn.oc1..autovcn', displayName: 'oci-portal-auto-vcn', lifecycleState: 'AVAILABLE', compartmentId: 'ocid1.compartment.oc1..root', cidrBlocks: ['10.0.0.0/16'], ipv6CidrBlocks: ['2603:c020:8026:9c00::/56'], dnsLabel: 'ociportal', defaultRouteTableId: 'ocid1.routetable..default', defaultSecurityListId: 'ocid1.securitylist..default', timeCreated: '2026-05-20T14:30:00Z', }, { id: 'ocid1.vcn.oc1..webvcn', displayName: 'web-prod-vcn', lifecycleState: 'AVAILABLE', compartmentId: 'ocid1.compartment.oc1..root', cidrBlocks: ['10.10.0.0/16'], ipv6CidrBlocks: [], dnsLabel: 'webprod', defaultRouteTableId: 'ocid1.routetable..web', defaultSecurityListId: 'ocid1.securitylist..web', timeCreated: '2026-06-01T09:00:00Z', }, ], 3: [ { id: 'ocid1.vcn.oc1..sgpvcn', displayName: 'oci-portal-auto-vcn', lifecycleState: 'AVAILABLE', compartmentId: 'ocid1.compartment.oc1..root', cidrBlocks: ['10.0.0.0/16'], ipv6CidrBlocks: ['2603:c020:400d:aa00::/56'], dnsLabel: 'ociportal', defaultRouteTableId: 'ocid1.routetable..sgp', defaultSecurityListId: 'ocid1.securitylist..sgp', timeCreated: '2026-06-10T00:00:00Z', }, ], 4: [ { id: 'ocid1.vcn.oc1..icnvcn', displayName: 'seoul-vcn', lifecycleState: 'AVAILABLE', compartmentId: 'ocid1.compartment.oc1..root', cidrBlocks: ['192.168.0.0/16'], ipv6CidrBlocks: [], dnsLabel: 'seoul', defaultRouteTableId: 'ocid1.routetable..icn', defaultSecurityListId: 'ocid1.securitylist..icn', timeCreated: '2026-06-28T00:00:00Z', }, ], } export const mockSubnets: Subnet[] = [ { id: 'ocid1.subnet.oc1..pub', vcnId: 'ocid1.vcn.oc1..autovcn', displayName: 'public-subnet', lifecycleState: 'AVAILABLE', cidrBlock: '10.0.1.0/24', ipv6CidrBlock: '2603:c020:8026:9c00::/64', dnsLabel: 'pub', prohibitPublicIp: false, availabilityDomain: '', routeTableId: 'ocid1.routetable..default', timeCreated: '2026-05-20T14:31:00Z', }, { id: 'ocid1.subnet.oc1..priv', vcnId: 'ocid1.vcn.oc1..autovcn', displayName: 'private-subnet', lifecycleState: 'AVAILABLE', cidrBlock: '10.0.2.0/24', ipv6CidrBlock: '', dnsLabel: 'priv', prohibitPublicIp: true, availabilityDomain: '', routeTableId: 'ocid1.routetable..default', timeCreated: '2026-05-21T10:00:00Z', }, { id: 'ocid1.subnet.oc1..webpub', vcnId: 'ocid1.vcn.oc1..webvcn', displayName: 'web-public-subnet', lifecycleState: 'AVAILABLE', cidrBlock: '10.10.1.0/24', ipv6CidrBlock: '', dnsLabel: 'webpub', prohibitPublicIp: false, availabilityDomain: '', routeTableId: 'ocid1.routetable..web', timeCreated: '2026-06-01T09:05:00Z', }, ] export const mockSecurityLists: SecurityList[] = [ { id: 'ocid1.securitylist..default', vcnId: 'ocid1.vcn.oc1..autovcn', displayName: 'Default Security List for oci-portal-auto-vcn', lifecycleState: 'AVAILABLE', ingressRules: [ { protocol: 'all', source: '0.0.0.0/0', isStateless: false }, { protocol: 'all', source: '::/0', isStateless: false }, ], egressRules: [ { protocol: 'all', destination: '0.0.0.0/0', isStateless: false }, { protocol: 'all', destination: '::/0', isStateless: false }, ], timeCreated: '2026-05-20T14:30:30Z', }, { id: 'ocid1.securitylist..strictweb', vcnId: 'ocid1.vcn.oc1..autovcn', displayName: 'strict-web', lifecycleState: 'AVAILABLE', ingressRules: [ { protocol: '6', source: '0.0.0.0/0', isStateless: false, portMin: 22, portMax: 22, description: 'ssh', }, { protocol: '6', source: '0.0.0.0/0', isStateless: false, portMin: 80, portMax: 80, description: 'http', }, { protocol: '6', source: '0.0.0.0/0', isStateless: false, portMin: 443, portMax: 443, description: 'https', }, ], egressRules: [{ protocol: 'all', destination: '0.0.0.0/0', isStateless: false }], timeCreated: '2026-06-01T09:10:00Z', }, ] export const mockIpv6Report: Ipv6Report = { steps: [ { step: 'vcn-ipv6-cidr', status: 'done', detail: '2603:c020:8026:9c00::/56' }, { step: 'subnet-ipv6-cidr', status: 'done', detail: 'public-subnet 2603:c020:8026:9c00::/64' }, { step: 'route-ipv6-default', status: 'skipped', detail: '::/0 -> oci-portal-igw 已存在' }, { step: 'seclist-ipv6-egress', status: 'done', detail: 'egress ::/0 allowed' }, ], } export const mockBootVolumes: Record = { 1: [ { id: 'ocid1.bootvolume..webfra01', displayName: 'web-fra-01 (Boot Volume)', lifecycleState: 'AVAILABLE', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', sizeInGBs: 50, vpusPerGB: 10, imageId: 'ocid1.image.oc1.eu-frankfurt-1.ubuntu2404', imageName: 'Canonical-Ubuntu-24.04-aarch64-2026.05.15-0', attachedInstanceId: 'ocid1.instance.oc1..web-fra-02', attachedInstanceName: 'web-fra-02', timeCreated: '2026-05-20T14:32:00Z', }, { id: 'ocid1.bootvolume..webfra02', displayName: 'web-fra-02 (Boot Volume)', lifecycleState: 'AVAILABLE', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', sizeInGBs: 50, vpusPerGB: 10, imageId: 'ocid1.image.oc1.eu-frankfurt-1.ubuntu2404', imageName: 'Canonical-Ubuntu-24.04-aarch64-2026.05.15-0', attachedInstanceId: 'ocid1.instance.oc1..web-fra-02', attachedInstanceName: 'web-fra-02', timeCreated: '2026-05-22T10:00:00Z', }, { id: 'ocid1.bootvolume..oldweb', displayName: 'old-web (Boot Volume)', lifecycleState: 'AVAILABLE', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', sizeInGBs: 47, vpusPerGB: 10, imageId: 'ocid1.image.oc1.eu-frankfurt-1.ubuntu2204', imageName: 'Canonical-Ubuntu-22.04-2026.04.02-0', attachedInstanceId: '', timeCreated: '2026-04-10T00:00:00Z', }, ], 3: [ { id: 'ocid1.bootvolume..dbsgp01', displayName: 'db-sgp-01 (Boot Volume)', lifecycleState: 'AVAILABLE', availabilityDomain: 'RssO:AP-SINGAPORE-1-AD-1', sizeInGBs: 100, vpusPerGB: 20, imageId: 'ocid1.image.oc1.ap-singapore-1.ol9', imageName: 'Oracle-Linux-9.5-2026.06.01-0', attachedInstanceId: 'ocid1.instance.oc1..db-sgp-01', timeCreated: '2026-06-10T00:00:00Z', }, ], 4: [ { id: 'ocid1.bootvolume..proxyicn', displayName: 'proxy-icn-01 (Boot Volume)', lifecycleState: 'AVAILABLE', availabilityDomain: 'RssO:AP-SEOUL-1-AD-1', sizeInGBs: 50, vpusPerGB: 10, imageId: 'ocid1.image.oc1.ap-seoul-1.ubuntu2404', imageName: 'Canonical-Ubuntu-24.04-Minimal-aarch64-2026.06.18-0', attachedInstanceId: 'ocid1.instance.oc1..proxy-icn-01', timeCreated: '2026-06-28T00:00:00Z', }, ], } export const mockBvAttachments: BootVolumeAttachment[] = [ { id: 'ocid1.bootvolumeattachment..a1', instanceId: 'ocid1.instance.oc1..web-fra-01', bootVolumeId: 'ocid1.bootvolume..webfra01', lifecycleState: 'ATTACHED', displayName: '', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', }, ] export const mockVolAttachments: VolumeAttachment[] = [ { id: 'ocid1.volumeattachment..v1', instanceId: 'ocid1.instance.oc1..web-fra-01', volumeId: 'ocid1.volume..datavol01', lifecycleState: 'ATTACHED', displayName: 'data-vol-01', device: '/dev/oracleoci/oraclevdb', isReadOnly: false, availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', }, ] /** 按配置 id 组织的 compartment mock(不含租户根) */ export const mockCompartments: Record = { 1: [ { id: 'ocid1.compartment.oc1..dev', name: 'dev', description: '开发环境资源', parentId: 'ocid1.tenancy.oc1..XXXX主号xxxx', lifecycleState: 'ACTIVE', timeCreated: '2026-05-20T00:00:00Z', }, { id: 'ocid1.compartment.oc1..prodnet', name: 'prod-network', description: '生产网络资源', parentId: 'ocid1.tenancy.oc1..XXXX主号xxxx', lifecycleState: 'ACTIVE', timeCreated: '2026-06-01T00:00:00Z', }, ], } export const mockOverview: Overview = { tenants: { total: 7, alive: 5, dead: 2, byType: { paid: 1, trial: 2, free: 4 } }, check: { hasActiveTask: true, coveredConfigs: 7, totalConfigs: 7, instanceCount: 8, lastCheckedAt: '2026-07-03T03:00:04+08:00', }, cost: { hasActiveTask: true, coveredConfigs: 3, currency: 'USD', total: 43.6, days: [ { day: '2026-06-27', amount: 5.2 }, { day: '2026-06-28', amount: 5.8 }, { day: '2026-06-29', amount: 5.4 }, { day: '2026-06-30', amount: 6.1 }, { day: '2026-07-01', amount: 8.0 }, { day: '2026-07-02', amount: 7.7 }, { day: '2026-07-03', amount: 6.8 }, ], }, tasks: { total: 6, active: 4, healthCheck: 2, cost: 1, snatch: 3 }, } /** OCI 全区域(可订阅列表用,比已订阅的 mockRegionSubs 更全) */ // 与后端一致:全局按 alias 字典序 export const mockRegions: RegionInfo[] = [ { alias: 'Australia East (Sydney)', key: 'SYD', name: 'ap-sydney-1' }, { alias: 'France Central (Paris)', key: 'CDG', name: 'eu-paris-1' }, { alias: 'Germany Central (Frankfurt)', key: 'FRA', name: 'eu-frankfurt-1' }, { alias: 'Japan East (Tokyo)', key: 'NRT', name: 'ap-tokyo-1' }, { alias: 'Netherlands NW (Amsterdam)', key: 'AMS', name: 'eu-amsterdam-1' }, { alias: 'Singapore (Singapore)', key: 'SIN', name: 'ap-singapore-1' }, { alias: 'South Korea Central (Seoul)', key: 'ICN', name: 'ap-seoul-1' }, { alias: 'UK South (London)', key: 'LHR', name: 'uk-london-1' }, { alias: 'US East (Ashburn)', key: 'IAD', name: 'us-ashburn-1' }, { alias: 'US West (Phoenix)', key: 'PHX', name: 'us-phoenix-1' }, { alias: 'US West (San Jose)', key: 'SJC', name: 'us-sanjose-1' }, ] export const mockImages: ImageInfo[] = [ { id: 'ocid1.image.oc1.eu-frankfurt-1.ubuntu2404arm', displayName: 'Canonical-Ubuntu-24.04-aarch64-2026.04.30-1', operatingSystem: 'Canonical Ubuntu', operatingSystemVersion: '24.04', sizeInMBs: 47694, timeCreated: '2026-04-30T00:00:00Z', }, { id: 'ocid1.image.oc1.eu-frankfurt-1.ubuntu2404armold', displayName: 'Canonical-Ubuntu-24.04-aarch64-2026.01.15-0', operatingSystem: 'Canonical Ubuntu', operatingSystemVersion: '24.04', sizeInMBs: 47512, timeCreated: '2026-01-15T00:00:00Z', }, { id: 'ocid1.image.oc1.eu-frankfurt-1.ubuntu2404x86', displayName: 'Canonical-Ubuntu-24.04-2026.04.30-1', operatingSystem: 'Canonical Ubuntu', operatingSystemVersion: '24.04', sizeInMBs: 51230, timeCreated: '2026-04-30T00:00:00Z', }, { id: 'ocid1.image.oc1.eu-frankfurt-1.ol9arm', displayName: 'Oracle-Linux-9.5-aarch64-2026.05.15-0', operatingSystem: 'Oracle Linux', operatingSystemVersion: '9.5', sizeInMBs: 42100, timeCreated: '2026-05-15T00:00:00Z', }, { id: 'ocid1.image.oc1.eu-frankfurt-1.debian12', displayName: 'Debian-12-aarch64-2026.03.20-0', operatingSystem: 'Debian', operatingSystemVersion: '12', sizeInMBs: 38900, timeCreated: '2026-03-20T00:00:00Z', }, ] export const mockAds = [ 'RssO:EU-FRANKFURT-1-AD-1', 'RssO:EU-FRANKFURT-1-AD-2', 'RssO:EU-FRANKFURT-1-AD-3', ] export const mockShapes: ComputeShape[] = [ { name: 'VM.Standard.A1.Flex', billingType: 'LIMITED_FREE', isFlexible: true, ocpusMin: 1, ocpusMax: 80, memoryMinGBs: 1, memoryMaxGBs: 512, processorDescription: '3.0 GHz Ampere® Altra™', quotaNames: [ 'standard-a1-memory-count', 'standard-a1-memory-regional-count', 'standard-a1-core-count', 'standard-a1-core-regional-count', ], }, { name: 'VM.Standard.E2.1.Micro', billingType: 'ALWAYS_FREE', isFlexible: false, ocpus: 1, memoryInGBs: 1, processorDescription: '2.0 GHz AMD EPYC™ 7551', quotaNames: ['standard-e2-micro-core-count'], }, { name: 'VM.Standard.E4.Flex', billingType: 'PAID', isFlexible: true, ocpusMin: 1, ocpusMax: 64, memoryMinGBs: 1, memoryMaxGBs: 1024, processorDescription: '2.55 GHz AMD EPYC™ 7J13', quotaNames: ['standard-e4-core-count', 'standard-e4-memory-count'], }, { name: 'VM.Standard.E5.Flex', billingType: 'PAID', isFlexible: true, ocpusMin: 1, ocpusMax: 94, memoryMinGBs: 1, memoryMaxGBs: 1049, processorDescription: '2.4 GHz AMD EPYC™ 9J14', }, { name: 'VM.Standard3.Flex', billingType: 'PAID', isFlexible: true, ocpusMin: 1, ocpusMax: 32, memoryMinGBs: 1, memoryMaxGBs: 512, processorDescription: '2.6 GHz Intel® Xeon® Platinum 8358', }, { name: 'BM.Standard.E4.128', billingType: 'PAID', isFlexible: false, ocpus: 128, memoryInGBs: 2048, processorDescription: '2.55 GHz AMD EPYC™ 7J13', }, ] export const mockVolumes: Record = { 1: [ { id: 'ocid1.volume..datavol01', displayName: 'data-vol-01', lifecycleState: 'AVAILABLE', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', sizeInGBs: 100, vpusPerGB: 10, timeCreated: '2026-05-25T00:00:00Z', }, { id: 'ocid1.volume..datavol02', displayName: 'data-vol-02', lifecycleState: 'AVAILABLE', availabilityDomain: 'RssO:EU-FRANKFURT-1-AD-1', sizeInGBs: 50, vpusPerGB: 10, timeCreated: '2026-06-15T00:00:00Z', }, ], } export const mockConsoleConns: ConsoleConnection[] = [ { id: 'ocid1.instanceconsoleconnection..c1', instanceId: 'ocid1.instance.oc1..web-fra-01', lifecycleState: 'ACTIVE', connectionString: 'ssh -o ProxyCommand="ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection..c1@instance-console.eu-frankfurt-1.oci.oraclecloud.com" ocid1.instance.oc1..web-fra-01', vncConnectionString: 'ssh -o ProxyCommand="ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection..c1@instance-console.eu-frankfurt-1.oci.oraclecloud.com" -N -L localhost:5900:ocid1.instance.oc1..web-fra-01:5900 ocid1.instance.oc1..web-fra-01', }, // DELETED 终态记录:OCI 会保留一段时间,前端应过滤不展示 { id: 'ocid1.instanceconsoleconnection..c0', instanceId: 'ocid1.instance.oc1..web-fra-01', lifecycleState: 'DELETED', connectionString: 'ssh -o ProxyCommand="ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection..c0@instance-console.eu-frankfurt-1.oci.oraclecloud.com" ocid1.instance.oc1..web-fra-01', vncConnectionString: 'ssh -o ProxyCommand="ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection..c0@instance-console.eu-frankfurt-1.oci.oraclecloud.com" -N -L localhost:5900:ocid1.instance.oc1..web-fra-01:5900 ocid1.instance.oc1..web-fra-01', }, ] // mock 态可变:保存后回读能看到变化,便于演示设置流程 export const mockTelegramSetting: TelegramSetting = { enabled: true, chatId: '123456789', tokenSet: true, tokenTail: 'k9Qw', } // mock 态可变:保存后回读能看到变化;缺省全开与后端语义一致 export const mockNotifyEvents: NotifyEventsSetting = { taskFail: true, taskRecover: true, snatchSuccess: true, tenantDead: true, taskStop: true, loginLock: true, logEventInstance: true, logEventIdentity: true, logEventPolicy: true, logEventRegion: true, logEventLogin: true, } // mock 态可变:保存后回读能看到变化;缺省 3 与后端语义一致 export const mockTaskSetting: TaskSetting = { snatchAuthFailLimit: 3 } export const mockSecuritySetting: SecuritySetting = { loginFailLimit: 5, loginLockMinutes: 15, ipRateRps: 10, ipRateBurst: 30, realIpHeader: '', appUrl: '', } // 系统操作日志:倒序排列;含失败登录(401)与失败写操作,便于验收状态标红 export const mockSystemLogs: SystemLog[] = [ { id: 14, username: 'admin', method: 'POST', path: '/api/v1/oci-configs/:id/instances', status: 200, durationMs: 9572, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-06T15:42:11+08:00', }, { id: 13, username: 'admin', method: 'PUT', path: '/api/v1/settings/telegram', status: 200, durationMs: 12, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-06T15:38:47+08:00', }, { id: 12, username: 'root', method: 'POST', path: '/api/v1/auth/login', status: 401, durationMs: 87, clientIp: '198.51.100.23', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', errMsg: '用户名、密码或验证码错误', createdAt: '2026-07-06T14:03:52+08:00', }, { id: 11, username: 'admin', method: 'POST', path: '/api/v1/auth/login', status: 200, durationMs: 104, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-06T09:15:20+08:00', }, { id: 10, username: 'admin', method: 'DELETE', path: '/api/v1/oci-configs/:id/instances/:instanceId', status: 200, durationMs: 3210, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-05T22:40:05+08:00', }, { id: 9, username: 'admin', method: 'POST', path: '/api/v1/oci-configs/:id/instances/:instanceId/action', status: 502, durationMs: 1840, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', errMsg: '请求失败', createdAt: '2026-07-05T22:31:44+08:00', }, { id: 8, username: 'admin', method: 'POST', path: '/api/v1/tasks', status: 201, durationMs: 9, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-05T20:12:30+08:00', }, { id: 7, username: 'admin', method: 'PUT', path: '/api/v1/tasks/:id', status: 200, durationMs: 8, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-05T20:10:02+08:00', }, { id: 6, username: 'admin', method: 'POST', path: '/api/v1/oci-configs/:id/verify', status: 200, durationMs: 2380, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-04T18:55:19+08:00', }, { id: 5, username: 'admin', method: 'PUT', path: '/api/v1/oci-configs/:id', status: 200, durationMs: 15, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-04T18:52:40+08:00', }, { id: 4, username: 'admin', method: 'POST', path: '/api/v1/oci-configs', status: 400, durationMs: 6, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', errMsg: '请求失败', createdAt: '2026-07-04T18:50:08+08:00', }, { id: 3, username: 'guest', method: 'POST', path: '/api/v1/auth/login', status: 401, durationMs: 92, clientIp: '198.51.100.23', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', errMsg: '用户名、密码或验证码错误', createdAt: '2026-07-04T03:22:37+08:00', }, { id: 2, username: 'admin', method: 'POST', path: '/api/v1/oci-configs/:id/subnets', status: 200, durationMs: 1420, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-03T16:08:59+08:00', }, { id: 1, username: 'admin', method: 'POST', path: '/api/v1/oci-configs/:id/vcns', status: 200, durationMs: 1980, clientIp: '203.0.113.7', userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36', createdAt: '2026-07-03T16:07:12+08:00', }, ] // 日志回传事件:倒序排列;含一条未解析与一条截断样本,便于验收徽标与占位 export const mockLogEvents: LogEvent[] = [ { id: 3, ociConfigId: 1, messageId: 'msg-0003', eventType: '', source: '', sourceIp: '', eventTime: null, payload: 'opaque test message published from console', truncated: false, processed: false, receivedAt: '2026-07-07T10:12:40+08:00', }, { id: 2, ociConfigId: 5, messageId: 'msg-0002', eventType: 'com.oraclecloud.ComputeApi.TerminateInstance', source: 'ComputeApi', sourceIp: '203.0.113.7', eventTime: '2026-07-07T09:58:02+08:00', payload: '{"eventType":"com.oraclecloud.ComputeApi.TerminateInstance","source":"ComputeApi","eventTime":"2026-07-07T01:58:02Z","data":{"compartmentName":"root","resourceName":"tokyo-a1-1"}}', truncated: true, processed: true, receivedAt: '2026-07-07T09:58:10+08:00', }, { id: 1, ociConfigId: 1, messageId: 'msg-0001', eventType: 'com.oraclecloud.identityControlPlane.UpdateUser', source: 'IdentityControlPlane', sourceIp: '198.51.100.23', eventTime: '2026-07-06T22:14:33+08:00', payload: '{"eventType":"com.oraclecloud.identityControlPlane.UpdateUser","source":"IdentityControlPlane","eventTime":"2026-07-06T14:14:33Z","data":{"resourceName":"api.user"}}', truncated: false, processed: true, receivedAt: '2026-07-06T22:14:40+08:00', }, ] // 回传回调地址:mock 态可变,生成 / 撤销后回读可见 export const mockLogWebhooks = new Map() // OCI 侧回传链路:mock 态记录「已一键创建」的租户 export const mockLogRelays = new Map()