extensions_higress_io_v1_api.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from typing import List, Optional, Dict, Any
  2. from pydantic import BaseModel, Field
  3. from kubernetes_asyncio import client
  4. GROUP = "extensions.higress.io"
  5. VERSION = "v1alpha1"
  6. PLURAL = "wasmplugins"
  7. # --- WasmPlugin Data Structures (Pydantic) ---
  8. class WasmPluginMatchRule(BaseModel):
  9. config: Optional[Dict[str, Any]] = Field(default_factory=dict)
  10. configDisable: Optional[bool] = None
  11. domain: Optional[List[str]] = Field(default_factory=list)
  12. ingress: Optional[List[str]] = Field(default_factory=list)
  13. service: Optional[List[str]] = Field(default_factory=list)
  14. class WasmPluginVMEnv(BaseModel):
  15. name: Optional[str] = None
  16. value: Optional[str] = None
  17. valueFrom: Optional[str] = None # INLINE or HOST
  18. class WasmPluginVMConfig(BaseModel):
  19. env: Optional[List[WasmPluginVMEnv]] = Field(default_factory=list)
  20. class WasmPluginSpec(BaseModel):
  21. defaultConfig: Optional[Dict[str, Any]] = Field(default_factory=dict)
  22. defaultConfigDisable: Optional[bool] = None
  23. failStrategy: Optional[str] = None # FAIL_CLOSE, FAIL_OPEN
  24. imagePullPolicy: Optional[str] = None # UNSPECIFIED_POLICY, IfNotPresent, Always
  25. imagePullSecret: Optional[str] = None
  26. matchRules: Optional[List[WasmPluginMatchRule]] = None
  27. phase: Optional[str] = None # UNSPECIFIED_PHASE, AUTHN, AUTHZ, STATS
  28. pluginConfig: Optional[Dict[str, Any]] = None
  29. pluginName: Optional[str] = None
  30. priority: Optional[int] = None
  31. sha256: Optional[str] = None
  32. url: Optional[str] = None
  33. verificationKey: Optional[str] = None
  34. vmConfig: Optional[WasmPluginVMConfig] = None
  35. class WasmPluginStatus(BaseModel):
  36. data: Optional[Dict[str, Any]] = Field(default_factory=dict)
  37. class WasmPlugin(BaseModel):
  38. apiVersion: str = f"{GROUP}/{VERSION}"
  39. kind: str = "WasmPlugin"
  40. metadata: Optional[Dict[str, Any]] = Field(default_factory=dict)
  41. spec: Optional[WasmPluginSpec] = None
  42. status: Optional[WasmPluginStatus] = None
  43. class ExtensionsHigressIoV1Api:
  44. def __init__(self, api_client: client.ApiClient):
  45. self.custom_api = client.CustomObjectsApi(api_client)
  46. async def edit_wasmplugin(
  47. self, namespace: str, name: str, body: WasmPlugin
  48. ) -> Dict[str, Any]:
  49. """Edit (replace) a WasmPlugin resource."""
  50. return await self.custom_api.replace_namespaced_custom_object(
  51. GROUP,
  52. VERSION,
  53. namespace,
  54. PLURAL,
  55. name,
  56. (
  57. body.model_dump(by_alias=True, exclude_none=True)
  58. if isinstance(body, WasmPlugin)
  59. else body
  60. ),
  61. )
  62. async def create_wasmplugin(
  63. self, namespace: str, body: WasmPlugin
  64. ) -> Dict[str, Any]:
  65. """Create a WasmPlugin resource in the given namespace."""
  66. return await self.custom_api.create_namespaced_custom_object(
  67. GROUP,
  68. VERSION,
  69. namespace,
  70. PLURAL,
  71. (
  72. body.model_dump(by_alias=True, exclude_none=True)
  73. if isinstance(body, WasmPlugin)
  74. else body
  75. ),
  76. )
  77. async def get_wasmplugin(self, namespace: str, name: str) -> Dict[str, Any]:
  78. """Get a WasmPlugin resource by name."""
  79. return await self.custom_api.get_namespaced_custom_object(
  80. GROUP, VERSION, namespace, PLURAL, name
  81. )
  82. async def list_wasmplugins(
  83. self, namespace: str, label_selector: Optional[str] = None
  84. ) -> Dict[str, Any]:
  85. """List all WasmPlugin resources in the given namespace."""
  86. return await self.custom_api.list_namespaced_custom_object(
  87. GROUP, VERSION, namespace, PLURAL, label_selector=label_selector
  88. )
  89. async def patch_wasmplugin(
  90. self, namespace: str, name: str, body: Dict[str, Any]
  91. ) -> Dict[str, Any]:
  92. """Patch a WasmPlugin resource."""
  93. return await self.custom_api.patch_namespaced_custom_object(
  94. GROUP, VERSION, namespace, PLURAL, name, body
  95. )
  96. async def delete_wasmplugin(
  97. self, namespace: str, name: str, body: Optional[Dict[str, Any]] = None
  98. ) -> Dict[str, Any]:
  99. """Delete a WasmPlugin resource."""
  100. return await self.custom_api.delete_namespaced_custom_object(
  101. GROUP, VERSION, namespace, PLURAL, name, body=body
  102. )