All files / src/api openstack-resources.api.ts

0% Statements 0/28
100% Branches 1/1
100% Functions 1/1
0% Lines 0/28

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,
    }),
}