{"id":25437224,"url":"https://github.com/starbops/kubevirtbmc","last_synced_at":"2025-11-01T05:30:34.917Z","repository":{"id":206443298,"uuid":"716654968","full_name":"starbops/kubevirtbmc","owner":"starbops","description":"IPMI/Redfish service for KubeVirt virtual machines","archived":false,"fork":false,"pushed_at":"2025-02-03T14:23:26.000Z","size":2305,"stargazers_count":22,"open_issues_count":15,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-14T08:48:21.527Z","etag":null,"topics":["ipmi","kubernetes","kubevirt","redfish","virtual-machine"],"latest_commit_sha":null,"homepage":"https://charts.zespre.com/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/starbops.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-11-09T15:36:10.000Z","updated_at":"2025-02-06T16:13:10.000Z","dependencies_parsed_at":"2024-02-20T08:25:01.302Z","dependency_job_id":"53ae771c-5535-4a22-97b7-4851d5d7f196","html_url":"https://github.com/starbops/kubevirtbmc","commit_stats":{"total_commits":11,"total_committers":2,"mean_commits":5.5,"dds":0.09090909090909094,"last_synced_commit":"7a122d0461c0604716a707609816a8b0c660c274"},"previous_names":["starbops/kubebmc","starbops/kubevirtbmc"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starbops%2Fkubevirtbmc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starbops%2Fkubevirtbmc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starbops%2Fkubevirtbmc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starbops%2Fkubevirtbmc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/starbops","download_url":"https://codeload.github.com/starbops/kubevirtbmc/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239260504,"owners_count":19609306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ipmi","kubernetes","kubevirt","redfish","virtual-machine"],"created_at":"2025-02-17T08:33:00.018Z","updated_at":"2025-11-01T05:30:34.872Z","avatar_url":"https://github.com/starbops.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KubeVirtBMC\n\n[![main build and publish workflow](https://github.com/starbops/kubevirtbmc/actions/workflows/main.yml/badge.svg)](https://github.com/starbops/kubevirtbmc/actions/workflows/main.yml)\n[![release](https://img.shields.io/github/v/release/starbops/kubevirtbmc)](https://github.com/starbops/kubevirtbmc/releases)\n\nKubeVirtBMC unleashes the out-of-band management for virtual machines on Kubernetes in a traditional way, i.e., [IPMI](https://www.intel.com.tw/content/www/tw/zh/products/docs/servers/ipmi/ipmi-second-gen-interface-spec-v2-rev1-1.html) and [Redfish](https://www.dmtf.org/standards/redfish). This allows users to power on/off/reset and set the boot device for virtual machines. It was initially designed for [Tinkerbell](https://github.com/tinkerbell/tink)/[Seeder](https://github.com/harvester/seeder) to provision [KubeVirt](https://github.com/kubevirt/kubevirt) virtual machines, but as long as your provisioning tools play nicely with IPMI/Redfish, you can use KubeVirtBMC to manage your virtual machines on Kubernetes clusters.\n\nThe project was born in [SUSE Hack Week 23](https://hackweek.opensuse.org/) and augmented with Redfish in [SUSE Hack Week 24](https://hackweek.opensuse.org/24/projects/extending-kubevirtbmcs-capability-by-adding-redfish-support).\n\n## Quick Start\n\nInstall cert-manager first as it is required for the webhook service and the Redfish API:\n\n```sh\nkubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.2/cert-manager.yaml\n```\n\nInstall KubeVirtBMC with Helm. Optionally, you can specify the image repository and tag, e.g., `--set image.repository=starbops/virtbmc-controller --set image.tag=v0.4.1`:\n\n```sh\n# Install the chart from the remote repository\nhelm repo add kubevirtbmc https://charts.zespre.com/\nhelm repo update\nhelm upgrade --install kubevirtbmc kubevirtbmc/kubevirtbmc --namespace=kubevirtbmc-system --create-namespace\n\n# Or, install the chart locally, with the bleeding-edge image, i.e., `starbops/virtbmc-controller:main-head`\ngit clone https://github.com/starbops/kubevirtbmc.git\ncd kubevirtbmc/\nhelm upgrade --install kubevirtbmc ./deploy/charts/kubevirtbmc --namespace=kubevirtbmc-system --create-namespace --set=image.tag=main-head\n```\n\n## Project Description\n\nKubeVirtBMC was inspired by [VirtualBMC](https://opendev.org/openstack/virtualbmc). The difference between them could be illustrated as below:\n\n```mermaid\nflowchart LR\n    client1[Client]\n    client2[Client]\n    BMC1[BMC]\n    VM[VM]\n    subgraph KubeVirtBMC\n    direction LR\n    client2--\u003e|IPMI/Redfish|virtBMC--\u003e|K8s API|VM\n    end\n    subgraph VirtualBMC\n    direction LR\n    client1--\u003e|IPMI|vBMC--\u003e|libvirt API|BMC1\n    end\n```\n\n**Goals**\n\n- Providing a selective set of BMC functionalities for virtual machines powered by KubeVirt\n- Providing accessibility through the network to the virtual BMCs of the VMs\n\n**Non-goals**\n\n- Providing BMC functionalities for bare-metal machines\n- Providing BMC accessibility outside of the cluster via LoadBalancer or NodePort type of Services\n\nKubeVirtBMC consists of two components:\n\n- **virtbmc-controller**: A Kubernetes controller manager built with kubebuilder that reconciles on the VirtualMachineBMC, VirtualMachine, and Service objects\n- **virtbmc**: A BMC emulator for serving IPMI/Redfish requests and translating them to native Kubernetes API requests\n\nBelow is the workflow of KubeVirtBMC when a VirtualMachine was created and booted up:\n\n```mermaid\nflowchart LR\n    controller[\"virtbmc-controller\"]\n    cr[\"virtualmachinebmc CR\"]\n    virtbmc-pod[\"virtbmc Pod\"]\n    virtbmc-svc[\"virtbmc Service\"]\n    controller-.-\u003e|watches|cr\n    cr-.-\u003e|owns|virtbmc-svc\n    cr-.-\u003e|owns|virtbmc-pod\n    client---\u003e|IPMI/Redfish|virtbmc-svc\n    virtbmc-svc--\u003evirtbmc-pod\n    virtbmc-pod--\u003e|HTTP|apiserver\n    apiserver--\u003e|modifies|vm\n    vm--\u003e|creates|vmi\n```\n\nThe VirtualMachineBMC CR (CustomResource):\n\n```go\ntype VirtualMachineBMCSpec struct {\n\t// To authenticate who the user is.\n\t// +optional\n\tUsername string `json:\"username,omitempty\"`\n\n\t// The credential part of the IPMI service\n\t// +optional\n\tPassword string `json:\"password,omitempty\"`\n\n\t// The namespace where the virtual machine is in\n\tVirtualMachineNamespace string `json:\"vmNamespace\"`\n\n\t// The actual virtual machine that this BMC controls\n\tVirtualMachineName string `json:\"vmName\"`\n}\n\n// VirtualMachineBMCStatus defines the observed state of VirtualMachineBMC\ntype VirtualMachineBMCStatus struct {\n\t// The listen IP address for the IPMI service.\n\tServiceIP string `json:\"serviceIP\"`\n\n\t// The indicator that shows the readiness of the IPMI service for the virtual machine\n\tReady bool `json:\"ready\"`\n}\n```\n\n## Getting Started\n\n### Prerequisites\n\n- go version v1.20.0+\n- docker version 17.03+.\n- kubectl version v1.11.3+.\n- Access to a Kubernetes v1.11.3+ cluster.\n\n### Develop\n\n**Build and push the images:**\n\n```sh\nexport PUSH=true\nmake docker-build\n```\n\n\u003e **NOTE:** These images ought to be published in the personal registry you specified. And it is required to have access to pull the images from the working environment. Make sure you have the proper permission to the registry if the above commands don’t work.\n\n**Install the CRDs into the cluster:**\n\n```sh\nmake install\n```\n\n**Run the controller locally**\n\n```sh\nexport ENABLE_WEBHOOKS=false\nmake run\n```\n\n**Generate the Redfish API and server stubs**\n\n\u003e **NOTE:** This section is only necessary if you want to change the Redfish schema version.\n\nDownload the Redfish schema from the DMTF website:\n\n```sh\nmake download-redfish-schema\n```\n\nNormally, the OpenAPI spec file `hack/\u003cREDFISH_SCHEMA_BUNDLE\u003e/openapi/openapi.yaml` is the one you need. Copy it and modify it, make sure the changes are reflected in the file `hack/redfish/spec/openapi.yaml`. Then generate the code with openapi-generator:\n\n```sh\nmake generate-redfish-api\n```\n\nThe generated code will be placed in the `pkg/generated/redfish` directory.\n\nYou might also need to adjust the adapter and handler code because they are coupled with the Redfish schema at some degree.\n\n### To Deploy on The Cluster\n\n**Deploy cert-manager**\n\n```sh\nkubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.2/cert-manager.yaml\n```\n\n**Deploy the Manager to the cluster with the image specified by `IMG`:**\n\n```sh\n# Use the latest image at main-head\nmake deploy\n# Or checkout to a specific branch/tag\ngit checkout \u003cbranch/tag\u003e\nmake deploy\n# Or specify the custom-built image\nmake deploy IMG=\u003csome-registry\u003e/virtbmc-controller:\u003ctag\u003e\n```\n\n\u003e **NOTE**: If you encounter RBAC errors, you may need to grant yourself cluster-admin privileges or be logged in as admin.\n\n### To Start Using The VirtualMachineBMC\n\nCreate the VirtualMachineBMC object in the cluster:\n\n```sh\nkubectl apply -f config/samples/virtualmachine_v1alpha1_virtualmachinebmc.yaml\n```\n\nAlthough you can manually create the VirtualMachineBMC object, the corresponding VirtualMachineBMC object should be created automatically when the VirtualMachine object exists. It will then scaffold the `*-virtbmc` Pod and Service object.\n\n```sh\n$ kubectl -n kubevirtbmc-system get svc\nNAME                               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE\ndefault-test-vm-virtbmc               ClusterIP   10.53.106.65    \u003cnone\u003e        623/UDP   3h13m\n```\n\n**Access virtual BMC via IPMI**\n\nTo access the virtual BMC via IPMI, you need to be in the cluster network. Run a Pod that comes with `ipmitool` built in:\n\n```sh\nkubectl run -it --rm ipmitool --image=mikeynap/ipmitool --command -- /bin/sh\n```\n\nInside the Pod, you can for example turn on the VM via `ipmitool`:\n\n```sh\n$ ipmitool -I lan -U admin -P password -H default-test-vm-virtbmc.kubevirtbmc-system.svc.cluster.local power status\nChassis Power is off\n$ ipmitool -I lan -U admin -P password -H default-test-vm-virtbmc.kubevirtbmc-system.svc.cluster.local power on\nChassis Power Control: Up/On\n$ ipmitool -I lan -U admin -P password -H default-test-vm-virtbmc.kubevirtbmc-system.svc.cluster.local power status\nChassis Power is on\n```\n\n**Access virtual BMC via Redfish**\n\nTo access the virtual BMC through the Redfish API, you can use `curl`:\n\n```sh\nkubectl run -it --rm curl-redfish --image=curlimages/curl --command -- /bin/sh\n```\n\nInside the Pod, you can operate the VM via Redfish APIs:\n\n```sh\n# Get the Redfish ServiceRoot\n$ curl -L http://default-test-vm-virtbmc.kubevirtbmc-system.svc/redfish/v1\n{\"@odata.context\":\"/redfish/v1/$metadata#ServiceRoot.ServiceRoot\",\"@odata.id\":\"/redfish/v1\",\"@odata.type\":\"#ServiceRoot.v1_16_1.ServiceRoot\",\"AccountService\":{\"@odata.id\":\"/redfish/v1/AccountService\"},\"AggregationService\":{},\"Cables\":{},\"CertificateService\":{},\"Chassis\":{\"@odata.id\":\"/redfish/v1/Chassis\"},\"ComponentIntegrity\":{},\"CompositionService\":{\"@odata.id\":\"/redfish/v1/CompositionService\"},\"Description\":\"ServiceRoot\",\"EventService\":{\"@odata.id\":\"/redfish/v1/EventService\"},\"Fabrics\":{},\"Facilities\":{},\"Id\":\"\",\"JobService\":{},\"JsonSchemas\":{},\"KeyService\":{},\"LicenseService\":{},\"Links\":{\"ManagerProvidingService\":{\"@odata.id\":\"/redfish/v1/Managers/BMC\"},\"Sessions\":{\"@odata.id\":\"/redfish/v1/SessionService/Sessions\"}},\"Managers\":{\"@odata.id\":\"/redfish/v1/Managers\"},\"NVMeDomains\":{},\"Name\":\"ServiceRoot\",\"PowerEquipment\":{},\"ProtocolFeaturesSupported\":{\"DeepOperations\":{},\"ExpandQuery\":{}},\"RedfishVersion\":\"1.16.1\",\"RegisteredClients\":{},\"Registries\":{\"@odata.id\":\"/redfish/v1/Registries\"},\"ResourceBlocks\":{},\"ServiceConditions\":{},\"SessionService\":{\"@odata.id\":\"/redfish/v1/SessionService\"},\"Storage\":{},\"StorageServices\":{},\"StorageSystems\":{},\"Systems\":{\"@odata.id\":\"/redfish/v1/Systems\"},\"Tasks\":{\"@odata.id\":\"/redfish/v1/Tasks\"},\"TelemetryService\":{\"@odata.id\":\"/redfish/v1/TelemetryService\"},\"ThermalEquipment\":{},\"UUID\":\"00000000-0000-0000-0000-000000000000\",\"UpdateService\":{\"@odata.id\":\"/redfish/v1/UpdateService\"}}\n\n# Log in by creating a session\n$ curl -i -X POST -H \"Content-Type: application/json\" http://default-test-vm-virtbmc.kubevirtbmc-system.svc/redfish/v1/SessionService/Sessions -d '{\"UserName\":\"admin\",\"Password\":\"password\"}'\nHTTP/1.1 201 Created\nContent-Type: application/json; charset=UTF-8\nLocation: /redfish/v1/SessionService/Sessions/337bf6b2-e4c7-41c8-bfe4-fe3ee3ce40f2\nX-Auth-Token: 55f88d07289cf1207b7b967f1823f5b28e08c8977f6c742f8175274afb214c93\nDate: Wed, 18 Dec 2024 15:27:04 GMT\nContent-Length: 225\n\n{\"@odata.id\":\"/redfish/v1/SessionService/Sessions/1\",\"@odata.type\":\"Session.v1_7_1.Session\",\"Actions\":{},\"Id\":\"337bf6b2-e4c7-41c8-bfe4-fe3ee3ce40f2\",\"Links\":{\"OutboundConnection\":{}},\"Name\":\"User Session\",\"UserName\":\"admin\"}\n\n# Get the System resource\n$ curl -H \"X-Auth-Token: 55f88d07289cf1207b7b967f1823f5b28e08c8977f6c742f8175274afb214c93\" http://default-test-vm-virtbmc.kubevirtbmc-system.svc/redfish/v1/Systems/1\n{\"@odata.context\":\"/redfish/v1/$metadata#ComputerSystem.ComputerSystem\",\"@odata.id\":\"/redfish/v1/Systems/1\",\"@odata.type\":\"#ComputerSystem.v1_22_0.ComputerSystem\",\"Actions\":{\"#ComputerSystem.AddResourceBlock\":{},\"#ComputerSystem.Decommission\":{},\"#ComputerSystem.RemoveResourceBlock\":{},\"#ComputerSystem.Reset\":{\"target\":\"/redfish/v1/Systems/1/Actions/ComputerSystem.Reset\",\"title\":\"Reset\"},\"#ComputerSystem.SetDefaultBootOrder\":{}},\"AssetTag\":\"\",\"Bios\":{},\"Boot\":{\"BootOptions\":{},\"BootSourceOverrideEnabled\":\"Disabled\",\"BootSourceOverrideMode\":\"Legacy\",\"BootSourceOverrideTarget\":\"Hdd\",\"Certificates\":{}},\"BootProgress\":{},\"Certificates\":{},\"Composition\":{},\"Description\":\"Computer System\",\"EthernetInterfaces\":{},\"FabricAdapters\":{},\"GraphicalConsole\":{},\"GraphicsControllers\":{},\"HostWatchdogTimer\":{\"FunctionEnabled\":false,\"Status\":{},\"TimeoutAction\":\"\"},\"HostedServices\":{\"StorageServices\":{}},\"Id\":\"1\",\"IdlePowerSaver\":{},\"IndicatorLED\":\"Unknown\",\"KeyManagement\":{\"KMIPCertificates\":{}},\"LastResetTime\":\"0001-01-01T00:00:00Z\",\"Links\":{\"HostingComputerSystem\":{}},\"LogServices\":{},\"Manufacturer\":\"KubeVirt\",\"Memory\":{},\"MemoryDomains\":{},\"MemorySummary\":{\"Metrics\":{},\"Status\":{},\"TotalSystemMemoryGiB\":0},\"Model\":\"KubeVirt\",\"Name\":\"default/test-vm\",\"NetworkInterfaces\":{\"@odata.id\":\"/redfish/v1/Systems/1/NetworkInterfaces\"},\"OperatingSystem\":\"/redfish/v1/Systems/1/OperatingSystem\",\"PartNumber\":\"\",\"PowerState\":\"Off\",\"ProcessorSummary\":{\"Count\":0,\"Metrics\":{},\"Status\":{}},\"Processors\":{},\"SKU\":\"\",\"SecureBoot\":{},\"SerialConsole\":{\"IPMI\":{},\"SSH\":{},\"Telnet\":{}},\"SerialNumber\":\"000000000000\",\"SimpleStorage\":{\"@odata.id\":\"/redfish/v1/Systems/1/SimpleStorage\"},\"Status\":{},\"Storage\":{\"@odata.id\":\"/redfish/v1/Systems/1/Storage\"},\"SystemType\":\"Virtual\",\"USBControllers\":{},\"UUID\":\"00000000-0000-0000-0000-000000000000\",\"VirtualMedia\":{\"@odata.id\":\"/redfish/v1/Systems/1/VirtualMedia\"},\"VirtualMediaConfig\":{}}\n\n# Set the boot device to PXE\n$ curl -i -X PATCH -H \"Content-Type: application/json\" -H \"X-Auth-Token: 55f88d07289cf1207b7b967f1823f5b28e08c8977f6c742f8175274afb214c93\" http://default-test-vm-virtbmc.kubevirtbmc-system.svc/redfish/v1/Systems/1 -d '{\"Boot\":{\"BootSourceOverrideTarget\":\"Pxe\",\"BootSourceOverrideEnabled\":\"Continuous\"}}'\nHTTP/1.1 204 No Content\nContent-Type: application/json; charset=UTF-8\nDate: Wed, 18 Dec 2024 15:54:09 GMT\n\n# Start the VM\n$ curl -i -X POST -H \"Content-Type: application/json\" -H \"X-Auth-Token: 55f88d07289cf1207b7b967f1823f5b28e08c8977f6c742f8175274afb214c93\" http://default-test-vm-virtbmc.kubevirtbmc-system.svc/redfish/v1/Systems/1/Actions/ComputerSystem.Reset -d '{\"ResetType\":\"On\"}'\nHTTP/1.1 204 No Content\nContent-Type: application/json; charset=UTF-8\nDate: Wed, 18 Dec 2024 15:59:25 GMT\n\n# Reboot the VM\n$ curl -i -X POST -H \"Content-Type: application/json\" -H \"X-Auth-Token: 55f88d07289cf1207b7b967f1823f5b28e08c8977f6c742f8175274afb214c93\" http://default-test-vm-virtbmc.kubevirtbmc-system.svc/redfish/v1/Systems/1/Actions/ComputerSystem.Reset -d '{\"ResetType\":\"ForceRestart\"}'\nHTTP/1.1 204 No Content\nContent-Type: application/json; charset=UTF-8\nDate: Wed, 18 Dec 2024 16:02:49 GMT\n\n# Stop the VM\n$ curl -i -X POST -H \"Content-Type: application/json\" -H \"X-Auth-Token: 55f88d07289cf1207b7b967f1823f5b28e08c8977f6c742f8175274afb214c93\" http://default-test-vm-virtbmc.kubevirtbmc-system.svc/redfish/v1/Systems/1/Actions/ComputerSystem.Reset -d '{\"ResetType\":\"GracefulShutdown\"}'\nHTTP/1.1 204 No Content\nContent-Type: application/json; charset=UTF-8\nDate: Wed, 18 Dec 2024 16:05:30 GMT\n\n# Log out by deleting the session\n$ curl -i -X DELETE -H \"X-Auth-Token: 55f88d07289cf1207b7b967f1823f5b28e08c8977f6c742f8175274afb214c93\" http://default-test-vm-virtbmc.kubevirtbmc-system.svc/redfish/v1/SessionService/Sessions/337bf6b2-e4c7-41c8-bfe4-fe3ee3ce40f2\nHTTP/1.1 204 No Content\nContent-Type: application/json; charset=UTF-8\nDate: Wed, 18 Dec 2024 16:06:12 GMT\n```\n\n**Expose the Redfish API to external**\n\nDue to the nature of the Redfish API, you can expose the Redfish service to the outside of the cluster with the aid of Ingress controllers. What's more, you can use cert-manager to issue a certificate for the Redfish service. To do so, you need to create an Ingress object (assuming you have an Ingress controller, e.g. `nginx-ingress`, and cert-manager installed) for each of the VirtualMachineBMC objects you want to expose:\n\n```sh\ncat \u003c\u003cEOF | kubectl apply -f -\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  annotations:\n    cert-manager.io/issuer: \"kubevirtbmc-selfsigned-issuer\"\n  name: default-test-vm-virtbmc\n  namespace: kubevirtbmc-system\nspec:\n  ingressClassName: nginx\n  tls:\n  - hosts:\n    - default-test-vm-virtbmc.\u003cingress-nginx-lb-svc-ip\u003e.sslip.io\n    secretName: default-test-vm-virtbmc-tls\n  rules:\n  - host: default-test-vm-virtbmc.\u003cingress-nginx-lb-svc-ip\u003e.sslip.io\n    http:\n      paths:\n      - backend:\n          service:\n            name: default-test-vm-virtbmc\n            port:\n              number: 80\n        path: /\n        pathType: Prefix\nEOF\n```\n\nIn the end, you can access the Redfish service via `https://default-test-vm-virtbmc.\u003cingress-nginx-lb-svc-ip\u003e.sslip.io` from anywhere.\n\n### To Uninstall\n\n**Delete the instances (CRs) from the cluster:**\n\n```sh\nkubectl delete -k config/samples/\n```\n\n**Delete the APIs (CRDs) from the cluster:**\n\n```sh\nmake uninstall\n```\n\n**UnDeploy the controller from the cluster:**\n\n```sh\nmake undeploy\n```\n\n## License\n\nCopyright 2024 Zespre Chang \u003cstarbops@hey.com\u003e\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstarbops%2Fkubevirtbmc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstarbops%2Fkubevirtbmc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstarbops%2Fkubevirtbmc/lists"}