Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | /** * Read-API für die OpenStack-Resourcen des aktuellen Users. * * Wird vom ``OpenStackResourcePicker`` genutzt, damit Wizard-User * keine UUIDs aus Horizon abtippen müssen. Backend cached die Antworten * 60 s — Frontend sollte daher unbedacht aufrufen können, ohne * Keystone-Token-Sturm auszulösen. * * Fehlerstrategie: das Backend antwortet 412 (Credentials fehlen) / * 502 (OpenStack-API down) / 200 (mit Daten) — der Picker wertet das * Status-Feld aus und rendert entsprechende Fallbacks. */ import api from './axios' // ---------------------------------------------------------------- // Resource-Shapes — flach gehalten, nur was die UI braucht. // ---------------------------------------------------------------- export interface OsResourceBase { id: string name: string } export interface OsNetwork extends OsResourceBase { description: string shared: boolean external: boolean status: string } export interface OsSubnet extends OsResourceBase { cidr: string ip_version: number network_id: string gateway_ip: string } export interface OsFlavor extends OsResourceBase { vcpus: number ram: number // MB disk: number // GB is_public: boolean } export interface OsImage extends OsResourceBase { status: string visibility: string size: number disk_format: string } export interface OsKeypair extends OsResourceBase { fingerprint: string type: string } export interface OsSecurityGroup extends OsResourceBase { description: string } export interface OsFloatingIpPool extends OsResourceBase { description: string } export interface OsVolume extends OsResourceBase { size: number status: string volume_type: string bootable: boolean } export interface OsRouter extends OsResourceBase { status: string external_gateway_info: any } export interface OsAvailabilityZone extends OsResourceBase { state: string } // Discriminated Union der unterstützten Resource-Typen — bleibt // EXAKT synchron mit ``backend/app/routers/apps.py:_OS_TYPES``. export type OsResourceType = | 'network' | 'subnet' | 'flavor' | 'image' | 'keypair' | 'security_group' | 'floating_ip_pool' | 'volume' | 'router' | 'availability_zone' // ---------------------------------------------------------------- // Endpoints // ---------------------------------------------------------------- export const openstackResourcesApi = { listNetworks: () => api.get<OsNetwork[]>('/me/openstack/resources/networks'), listSubnets: (networkId?: string) => api.get<OsSubnet[]>('/me/openstack/resources/subnets', { params: networkId ? { network_id: networkId } : undefined, }), listFlavors: () => api.get<OsFlavor[]>('/me/openstack/resources/flavors'), listImages: (statusFilter: string = 'active') => api.get<OsImage[]>('/me/openstack/resources/images', { params: { status: statusFilter }, }), listKeypairs: () => api.get<OsKeypair[]>('/me/openstack/resources/keypairs'), listSecurityGroups: () => api.get<OsSecurityGroup[]>('/me/openstack/resources/security-groups'), listFloatingIpPools: () => api.get<OsFloatingIpPool[]>('/me/openstack/resources/floating-ip-pools'), listVolumes: () => api.get<OsVolume[]>('/me/openstack/resources/volumes'), listRouters: () => api.get<OsRouter[]>('/me/openstack/resources/routers'), listAvailabilityZones: (service: 'compute' | 'network' | 'volume' = 'compute') => api.get<OsAvailabilityZone[]>('/me/openstack/resources/availability-zones', { params: { service }, }), /** Cache-Bust für den User. ``kind`` optional, sonst alles. */ refresh: (kind?: OsResourceType) => api.post('/me/openstack/resources/refresh', null, { params: kind ? { kind } : undefined, }), } |