mirror of
https://github.com/k8sgpt-ai/k8sgpt.git
synced 2025-08-18 07:47:05 +00:00
feat: refactoring to the new schema (#1219)
* feat: refactoring to the new schema Signed-off-by: AlexsJones <alexsimonjones@gmail.com> * chore: updated readme with grpc commands Signed-off-by: AlexsJones <alexsimonjones@gmail.com> * chore: updated deps Signed-off-by: AlexsJones <alexsimonjones@gmail.com> --------- Signed-off-by: AlexsJones <alexsimonjones@gmail.com> Co-authored-by: Matthis <matthish29@gmail.com> Signed-off-by: AlexsJones <alexsimonjones@gmail.com>
This commit is contained in:
parent
92ecb4dcf1
commit
803806e747
155
README.md
155
README.md
@ -27,7 +27,6 @@ _Out of the box integration with OpenAI, Azure, Cohere, Amazon Bedrock, Google G
|
|||||||
|
|
||||||
# CLI Installation
|
# CLI Installation
|
||||||
|
|
||||||
|
|
||||||
### Linux/Mac via brew
|
### Linux/Mac via brew
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@ -44,14 +43,16 @@ brew install k8sgpt
|
|||||||
<details>
|
<details>
|
||||||
<summary>RPM-based installation (RedHat/CentOS/Fedora)</summary>
|
<summary>RPM-based installation (RedHat/CentOS/Fedora)</summary>
|
||||||
|
|
||||||
**32 bit:**
|
**32 bit:**
|
||||||
|
|
||||||
<!---x-release-please-start-version-->
|
<!---x-release-please-start-version-->
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo rpm -ivh https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_386.rpm
|
sudo rpm -ivh https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_386.rpm
|
||||||
```
|
```
|
||||||
<!---x-release-please-end-->
|
<!---x-release-please-end-->
|
||||||
|
|
||||||
**64 bit:**
|
**64 bit:**
|
||||||
|
|
||||||
<!---x-release-please-start-version-->
|
<!---x-release-please-start-version-->
|
||||||
```
|
```
|
||||||
@ -63,20 +64,26 @@ brew install k8sgpt
|
|||||||
<details>
|
<details>
|
||||||
<summary>DEB-based installation (Ubuntu/Debian)</summary>
|
<summary>DEB-based installation (Ubuntu/Debian)</summary>
|
||||||
|
|
||||||
**32 bit:**
|
**32 bit:**
|
||||||
<!---x-release-please-start-version-->
|
|
||||||
```
|
|
||||||
curl -LO https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_386.deb
|
|
||||||
sudo dpkg -i k8sgpt_386.deb
|
|
||||||
```
|
|
||||||
<!---x-release-please-end-->
|
|
||||||
**64 bit:**
|
|
||||||
|
|
||||||
<!---x-release-please-start-version-->
|
<!---x-release-please-start-version-->
|
||||||
```
|
|
||||||
curl -LO https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_amd64.deb
|
```
|
||||||
sudo dpkg -i k8sgpt_amd64.deb
|
curl -LO https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_386.deb
|
||||||
```
|
sudo dpkg -i k8sgpt_386.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---x-release-please-end-->
|
||||||
|
|
||||||
|
**64 bit:**
|
||||||
|
|
||||||
|
<!---x-release-please-start-version-->
|
||||||
|
|
||||||
|
```
|
||||||
|
curl -LO https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_amd64.deb
|
||||||
|
sudo dpkg -i k8sgpt_amd64.deb
|
||||||
|
```
|
||||||
|
|
||||||
<!---x-release-please-end-->
|
<!---x-release-please-end-->
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
@ -84,14 +91,17 @@ brew install k8sgpt
|
|||||||
|
|
||||||
<summary>APK-based installation (Alpine)</summary>
|
<summary>APK-based installation (Alpine)</summary>
|
||||||
|
|
||||||
**32 bit:**
|
**32 bit:**
|
||||||
|
|
||||||
<!---x-release-please-start-version-->
|
<!---x-release-please-start-version-->
|
||||||
```
|
```
|
||||||
wget https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_386.apk
|
wget https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_386.apk
|
||||||
apk add --allow-untrusted k8sgpt_386.apk
|
apk add --allow-untrusted k8sgpt_386.apk
|
||||||
```
|
```
|
||||||
<!---x-release-please-end-->
|
<!---x-release-please-end-->
|
||||||
**64 bit:**
|
|
||||||
|
**64 bit:**
|
||||||
|
|
||||||
<!---x-release-please-start-version-->
|
<!---x-release-please-start-version-->
|
||||||
```
|
```
|
||||||
wget https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_amd64.apk
|
wget https://github.com/k8sgpt-ai/k8sgpt/releases/download/v0.3.40/k8sgpt_amd64.apk
|
||||||
@ -104,24 +114,25 @@ brew install k8sgpt
|
|||||||
<summary>Failing Installation on WSL or Linux (missing gcc)</summary>
|
<summary>Failing Installation on WSL or Linux (missing gcc)</summary>
|
||||||
When installing Homebrew on WSL or Linux, you may encounter the following error:
|
When installing Homebrew on WSL or Linux, you may encounter the following error:
|
||||||
|
|
||||||
```
|
```
|
||||||
==> Installing k8sgpt from k8sgpt-ai/k8sgpt Error: The following formula cannot be installed from a bottle and must be
|
==> Installing k8sgpt from k8sgpt-ai/k8sgpt Error: The following formula cannot be installed from a bottle and must be
|
||||||
built from the source. k8sgpt Install Clang or run brew install gcc.
|
built from the source. k8sgpt Install Clang or run brew install gcc.
|
||||||
```
|
```
|
||||||
|
|
||||||
If you install gcc as suggested, the problem will persist. Therefore, you need to install the build-essential package.
|
If you install gcc as suggested, the problem will persist. Therefore, you need to install the build-essential package.
|
||||||
```
|
|
||||||
|
```
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install build-essential
|
sudo apt-get install build-essential
|
||||||
```
|
```
|
||||||
</details>
|
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
* Download the latest Windows binaries of **k8sgpt** from the [Release](https://github.com/k8sgpt-ai/k8sgpt/releases)
|
- Download the latest Windows binaries of **k8sgpt** from the [Release](https://github.com/k8sgpt-ai/k8sgpt/releases)
|
||||||
tab based on your system architecture.
|
tab based on your system architecture.
|
||||||
* Extract the downloaded package to your desired location. Configure the system *path* variable with the binary location
|
- Extract the downloaded package to your desired location. Configure the system _path_ variable with the binary location
|
||||||
|
|
||||||
## Operator Installation
|
## Operator Installation
|
||||||
|
|
||||||
@ -129,17 +140,16 @@ To install within a Kubernetes cluster please use our `k8sgpt-operator` with ins
|
|||||||
|
|
||||||
_This mode of operation is ideal for continuous monitoring of your cluster and can integrate with your existing monitoring such as Prometheus and Alertmanager._
|
_This mode of operation is ideal for continuous monitoring of your cluster and can integrate with your existing monitoring such as Prometheus and Alertmanager._
|
||||||
|
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
* Currently, the default AI provider is OpenAI, you will need to generate an API key from [OpenAI](https://openai.com)
|
- Currently, the default AI provider is OpenAI, you will need to generate an API key from [OpenAI](https://openai.com)
|
||||||
* You can do this by running `k8sgpt generate` to open a browser link to generate it
|
- You can do this by running `k8sgpt generate` to open a browser link to generate it
|
||||||
* Run `k8sgpt auth add` to set it in k8sgpt.
|
- Run `k8sgpt auth add` to set it in k8sgpt.
|
||||||
* You can provide the password directly using the `--password` flag.
|
- You can provide the password directly using the `--password` flag.
|
||||||
* Run `k8sgpt filters` to manage the active filters used by the analyzer. By default, all filters are executed during analysis.
|
- Run `k8sgpt filters` to manage the active filters used by the analyzer. By default, all filters are executed during analysis.
|
||||||
* Run `k8sgpt analyze` to run a scan.
|
- Run `k8sgpt analyze` to run a scan.
|
||||||
* And use `k8sgpt analyze --explain` to get a more detailed explanation of the issues.
|
- And use `k8sgpt analyze --explain` to get a more detailed explanation of the issues.
|
||||||
* You also run `k8sgpt analyze --with-doc` (with or without the explain flag) to get the official documentation from Kubernetes.
|
- You also run `k8sgpt analyze --with-doc` (with or without the explain flag) to get the official documentation from Kubernetes.
|
||||||
|
|
||||||
## Analyzers
|
## Analyzers
|
||||||
|
|
||||||
@ -191,6 +201,7 @@ k8sgpt analyze --explain --filter=Service
|
|||||||
```
|
```
|
||||||
|
|
||||||
_Filter by namespace_
|
_Filter by namespace_
|
||||||
|
|
||||||
```
|
```
|
||||||
k8sgpt analyze --explain --filter=Pod --namespace=default
|
k8sgpt analyze --explain --filter=Pod --namespace=default
|
||||||
```
|
```
|
||||||
@ -295,7 +306,10 @@ k8sgpt serve
|
|||||||
_Analysis with serve mode_
|
_Analysis with serve mode_
|
||||||
|
|
||||||
```
|
```
|
||||||
grpcurl -plaintext -d '{"namespace": "k8sgpt", "explain": false}' localhost:8080 schema.v1.ServerService/Analyze
|
grpcurl -plaintext -d '{"namespace": "k8sgpt", "explain" : "true"}' localhost:8080 schema.v1.ServerAnalyzerService/Analyze
|
||||||
|
{
|
||||||
|
"status": "OK"
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
_Analysis with custom headers_
|
_Analysis with custom headers_
|
||||||
@ -303,6 +317,7 @@ _Analysis with custom headers_
|
|||||||
```
|
```
|
||||||
k8sgpt analyze --explain --custom-headers CustomHeaderKey:CustomHeaderValue
|
k8sgpt analyze --explain --custom-headers CustomHeaderKey:CustomHeaderValue
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## LLM AI Backends
|
## LLM AI Backends
|
||||||
@ -348,21 +363,25 @@ With this option, the data is anonymized before being sent to the AI Backend. Du
|
|||||||
<summary> Anonymization </summary>
|
<summary> Anonymization </summary>
|
||||||
|
|
||||||
1. Error reported during analysis:
|
1. Error reported during analysis:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
Error: HorizontalPodAutoscaler uses StatefulSet/fake-deployment as ScaleTargetRef which does not exist.
|
Error: HorizontalPodAutoscaler uses StatefulSet/fake-deployment as ScaleTargetRef which does not exist.
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Payload sent to the AI backend:
|
2. Payload sent to the AI backend:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
Error: HorizontalPodAutoscaler uses StatefulSet/tGLcCRcHa1Ce5Rs as ScaleTargetRef which does not exist.
|
Error: HorizontalPodAutoscaler uses StatefulSet/tGLcCRcHa1Ce5Rs as ScaleTargetRef which does not exist.
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Payload returned by the AI:
|
3. Payload returned by the AI:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
The Kubernetes system is trying to scale a StatefulSet named tGLcCRcHa1Ce5Rs using the HorizontalPodAutoscaler, but it cannot find the StatefulSet. The solution is to verify that the StatefulSet name is spelled correctly and exists in the same namespace as the HorizontalPodAutoscaler.
|
The Kubernetes system is trying to scale a StatefulSet named tGLcCRcHa1Ce5Rs using the HorizontalPodAutoscaler, but it cannot find the StatefulSet. The solution is to verify that the StatefulSet name is spelled correctly and exists in the same namespace as the HorizontalPodAutoscaler.
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Payload returned to the user:
|
4. Payload returned to the user:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
The Kubernetes system is trying to scale a StatefulSet named fake-deployment using the HorizontalPodAutoscaler, but it cannot find the StatefulSet. The solution is to verify that the StatefulSet name is spelled correctly and exists in the same namespace as the HorizontalPodAutoscaler.
|
The Kubernetes system is trying to scale a StatefulSet named fake-deployment using the HorizontalPodAutoscaler, but it cannot find the StatefulSet. The solution is to verify that the StatefulSet name is spelled correctly and exists in the same namespace as the HorizontalPodAutoscaler.
|
||||||
```
|
```
|
||||||
@ -373,7 +392,7 @@ Note: **Anonymization does not currently apply to events.**
|
|||||||
|
|
||||||
**Anonymization does not currently apply to events.**
|
**Anonymization does not currently apply to events.**
|
||||||
|
|
||||||
*In a few analysers like Pod, we feed to the AI backend the event messages which are not known beforehand thus we are not masking them for the **time being**.*
|
_In a few analysers like Pod, we feed to the AI backend the event messages which are not known beforehand thus we are not masking them for the **time being**._
|
||||||
|
|
||||||
- The following is the list of analysers in which data is **being masked**:-
|
- The following is the list of analysers in which data is **being masked**:-
|
||||||
|
|
||||||
@ -393,11 +412,12 @@ Note: **Anonymization does not currently apply to events.**
|
|||||||
- PersistentVolumeClaim
|
- PersistentVolumeClaim
|
||||||
- Pod
|
- Pod
|
||||||
- Log
|
- Log
|
||||||
- **_*Events_**
|
- **_\*Events_**
|
||||||
|
|
||||||
***Note**:
|
**\*Note**:
|
||||||
- k8gpt will not mask the above analysers because they do not send any identifying information except **Events** analyser.
|
|
||||||
- Masking for **Events** analyzer is scheduled in the near future as seen in this [issue](https://github.com/k8sgpt-ai/k8sgpt/issues/560). _Further research has to be made to understand the patterns and be able to mask the sensitive parts of an event like pod name, namespace etc._
|
- k8gpt will not mask the above analysers because they do not send any identifying information except **Events** analyser.
|
||||||
|
- Masking for **Events** analyzer is scheduled in the near future as seen in this [issue](https://github.com/k8sgpt-ai/k8sgpt/issues/560). _Further research has to be made to understand the patterns and be able to mask the sensitive parts of an event like pod name, namespace etc._
|
||||||
|
|
||||||
- The following is the list of fields which are not **being masked**:-
|
- The following is the list of fields which are not **being masked**:-
|
||||||
|
|
||||||
@ -405,18 +425,18 @@ Note: **Anonymization does not currently apply to events.**
|
|||||||
- ObjectStatus
|
- ObjectStatus
|
||||||
- Replicas
|
- Replicas
|
||||||
- ContainerStatus
|
- ContainerStatus
|
||||||
- **_*Event Message_**
|
- **_\*Event Message_**
|
||||||
- ReplicaStatus
|
- ReplicaStatus
|
||||||
- Count (Pod)
|
- Count (Pod)
|
||||||
|
|
||||||
***Note**:
|
**\*Note**:
|
||||||
- It is quite possible the payload of the event message might have something like "super-secret-project-pod-X crashed" which we don't currently redact _(scheduled in the near future as seen in this [issue](https://github.com/k8sgpt-ai/k8sgpt/issues/560))_.
|
|
||||||
|
- It is quite possible the payload of the event message might have something like "super-secret-project-pod-X crashed" which we don't currently redact _(scheduled in the near future as seen in this [issue](https://github.com/k8sgpt-ai/k8sgpt/issues/560))_.
|
||||||
|
|
||||||
### Proceed with care
|
### Proceed with care
|
||||||
|
|
||||||
- The K8gpt team recommends using an entirely different backend **(a local model) in critical production environments**. By using a local model, you can rest assured that everything stays within your DMZ, and nothing is leaked.
|
- The K8gpt team recommends using an entirely different backend **(a local model) in critical production environments**. By using a local model, you can rest assured that everything stays within your DMZ, and nothing is leaked.
|
||||||
- If there is any uncertainty about the possibility of sending data to a public LLM (open AI, Azure AI) and it poses a risk to business-critical operations, then, in such cases, the use of public LLM should be avoided based on personal assessment and the jurisdiction of risks involved.
|
- If there is any uncertainty about the possibility of sending data to a public LLM (open AI, Azure AI) and it poses a risk to business-critical operations, then, in such cases, the use of public LLM should be avoided based on personal assessment and the jurisdiction of risks involved.
|
||||||
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
@ -431,6 +451,7 @@ Config file locations:
|
|||||||
| MacOS | ~/Library/Application Support/k8sgpt/k8sgpt.yaml |
|
| MacOS | ~/Library/Application Support/k8sgpt/k8sgpt.yaml |
|
||||||
| Linux | ~/.config/k8sgpt/k8sgpt.yaml |
|
| Linux | ~/.config/k8sgpt/k8sgpt.yaml |
|
||||||
| Windows | %LOCALAPPDATA%/k8sgpt/k8sgpt.yaml |
|
| Windows | %LOCALAPPDATA%/k8sgpt/k8sgpt.yaml |
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -442,38 +463,42 @@ In these scenarios K8sGPT supports AWS S3 or Azure Blob storage Integration.
|
|||||||
|
|
||||||
_Adding a remote cache_
|
_Adding a remote cache_
|
||||||
|
|
||||||
* AWS S3
|
- AWS S3
|
||||||
* _As a prerequisite `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are required as environmental variables._
|
- _As a prerequisite `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are required as environmental variables._
|
||||||
* Configuration, ``` k8sgpt cache add s3 --region <aws region> --bucket <name> ```
|
- Configuration, `k8sgpt cache add s3 --region <aws region> --bucket <name>`
|
||||||
* Minio Configuration with HTTP endpoint ``` k8sgpt cache add s3 --bucket <name> --endpoint <http://localhost:9000>```
|
- Minio Configuration with HTTP endpoint ` k8sgpt cache add s3 --bucket <name> --endpoint <http://localhost:9000>`
|
||||||
* Minio Configuration with HTTPs endpoint, skipping TLS verification ``` k8sgpt cache add s3 --bucket <name> --endpoint <https://localhost:9000> --insecure```
|
- Minio Configuration with HTTPs endpoint, skipping TLS verification ` k8sgpt cache add s3 --bucket <name> --endpoint <https://localhost:9000> --insecure`
|
||||||
* K8sGPT will create the bucket if it does not exist
|
- K8sGPT will create the bucket if it does not exist
|
||||||
* Azure Storage
|
- Azure Storage
|
||||||
* We support a number of [techniques](https://learn.microsoft.com/en-us/azure/developer/go/azure-sdk-authentication?tabs=bash#2-authenticate-with-azure) to authenticate against Azure
|
- We support a number of [techniques](https://learn.microsoft.com/en-us/azure/developer/go/azure-sdk-authentication?tabs=bash#2-authenticate-with-azure) to authenticate against Azure
|
||||||
* Configuration, ``` k8sgpt cache add azure --storageacc <storage account name> --container <container name> ```
|
- Configuration, `k8sgpt cache add azure --storageacc <storage account name> --container <container name>`
|
||||||
* K8sGPT assumes that the storage account already exist and it will create the container if it does not exist
|
- K8sGPT assumes that the storage account already exist and it will create the container if it does not exist
|
||||||
* It is the **user** responsibility have to grant specific permissions to their identity in order to be able to upload blob files and create SA containers (e.g Storage Blob Data Contributor)
|
- It is the **user** responsibility have to grant specific permissions to their identity in order to be able to upload blob files and create SA containers (e.g Storage Blob Data Contributor)
|
||||||
* Google Cloud Storage
|
- Google Cloud Storage
|
||||||
* _As a prerequisite `GOOGLE_APPLICATION_CREDENTIALS` are required as environmental variables._
|
- _As a prerequisite `GOOGLE_APPLICATION_CREDENTIALS` are required as environmental variables._
|
||||||
* Configuration, ``` k8sgpt cache add gcs --region <gcp region> --bucket <name> --projectid <project id>```
|
- Configuration, ` k8sgpt cache add gcs --region <gcp region> --bucket <name> --projectid <project id>`
|
||||||
* K8sGPT will create the bucket if it does not exist
|
- K8sGPT will create the bucket if it does not exist
|
||||||
|
|
||||||
_Listing cache items_
|
_Listing cache items_
|
||||||
|
|
||||||
```
|
```
|
||||||
k8sgpt cache list
|
k8sgpt cache list
|
||||||
```
|
```
|
||||||
|
|
||||||
_Purging an object from the cache_
|
_Purging an object from the cache_
|
||||||
Note: purging an object using this command will delete upstream files, so it requires appropriate permissions.
|
Note: purging an object using this command will delete upstream files, so it requires appropriate permissions.
|
||||||
|
|
||||||
```
|
```
|
||||||
k8sgpt cache purge $OBJECT_NAME
|
k8sgpt cache purge $OBJECT_NAME
|
||||||
```
|
```
|
||||||
|
|
||||||
_Removing the remote cache_
|
_Removing the remote cache_
|
||||||
Note: this will not delete the upstream S3 bucket or Azure storage container
|
Note: this will not delete the upstream S3 bucket or Azure storage container
|
||||||
|
|
||||||
```
|
```
|
||||||
k8sgpt cache remove
|
k8sgpt cache remove
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -483,6 +508,7 @@ There may be scenarios where you wish to write your own analyzer in a language o
|
|||||||
K8sGPT now supports the ability to do so by abiding by the [schema](https://github.com/k8sgpt-ai/schemas/blob/main/protobuf/schema/v1/analyzer.proto) and serving the analyzer for consumption.
|
K8sGPT now supports the ability to do so by abiding by the [schema](https://github.com/k8sgpt-ai/schemas/blob/main/protobuf/schema/v1/analyzer.proto) and serving the analyzer for consumption.
|
||||||
To do so, define the analyzer within the K8sGPT configuration and it will add it into the scanning process.
|
To do so, define the analyzer within the K8sGPT configuration and it will add it into the scanning process.
|
||||||
In addition to this you will need to enable the following flag on analysis:
|
In addition to this you will need to enable the following flag on analysis:
|
||||||
|
|
||||||
```
|
```
|
||||||
k8sgpt analyze --custom-analysis
|
k8sgpt analyze --custom-analysis
|
||||||
```
|
```
|
||||||
@ -523,17 +549,18 @@ k8sgpt custom-analyzer remove --names "my-custom-analyzer,my-custom-analyzer-2"
|
|||||||
|
|
||||||
Find our official documentation available [here](https://docs.k8sgpt.ai)
|
Find our official documentation available [here](https://docs.k8sgpt.ai)
|
||||||
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Please read our [contributing guide](./CONTRIBUTING.md).
|
Please read our [contributing guide](./CONTRIBUTING.md).
|
||||||
|
|
||||||
## Community
|
## Community
|
||||||
|
|
||||||
Find us on [Slack](https://join.slack.com/t/k8sgpt/shared_invite/zt-276pa9uyq-pxAUr4TCVHubFxEvLZuT1Q)
|
Find us on [Slack](https://join.slack.com/t/k8sgpt/shared_invite/zt-276pa9uyq-pxAUr4TCVHubFxEvLZuT1Q)
|
||||||
|
|
||||||
<a href="https://github.com/k8sgpt-ai/k8sgpt/graphs/contributors">
|
<a href="https://github.com/k8sgpt-ai/k8sgpt/graphs/contributors">
|
||||||
<img src="https://contrib.rocks/image?repo=k8sgpt-ai/k8sgpt" />
|
<img src="https://contrib.rocks/image?repo=k8sgpt-ai/k8sgpt" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fk8sgpt-ai%2Fk8sgpt?ref=badge_large)
|
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fk8sgpt-ai%2Fk8sgpt?ref=badge_large)
|
||||||
|
@ -14,12 +14,12 @@ limitations under the License.
|
|||||||
package serve
|
package serve
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
k8sgptserver "github.com/k8sgpt-ai/k8sgpt/pkg/server"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
"github.com/k8sgpt-ai/k8sgpt/pkg/ai"
|
"github.com/k8sgpt-ai/k8sgpt/pkg/ai"
|
||||||
k8sgptserver "github.com/k8sgpt-ai/k8sgpt/pkg/server"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
33
go.mod
33
go.mod
@ -1,8 +1,8 @@
|
|||||||
module github.com/k8sgpt-ai/k8sgpt
|
module github.com/k8sgpt-ai/k8sgpt
|
||||||
|
|
||||||
go 1.22.0
|
go 1.22.1
|
||||||
|
|
||||||
toolchain go1.22.4
|
toolchain go1.22.5
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/aquasecurity/trivy-operator v0.17.1
|
github.com/aquasecurity/trivy-operator v0.17.1
|
||||||
@ -16,7 +16,7 @@ require (
|
|||||||
github.com/spf13/cobra v1.8.1
|
github.com/spf13/cobra v1.8.1
|
||||||
github.com/spf13/viper v1.18.2
|
github.com/spf13/viper v1.18.2
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.9.0
|
||||||
golang.org/x/term v0.22.0
|
golang.org/x/term v0.23.0
|
||||||
helm.sh/helm/v3 v3.15.2
|
helm.sh/helm/v3 v3.15.2
|
||||||
k8s.io/api v0.30.2
|
k8s.io/api v0.30.2
|
||||||
k8s.io/apimachinery v0.30.2
|
k8s.io/apimachinery v0.30.2
|
||||||
@ -28,9 +28,9 @@ require (
|
|||||||
require github.com/adrg/xdg v0.4.0
|
require github.com/adrg/xdg v0.4.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc-ecosystem/gateway/v2 v2.20.0-20240406062209-1cc152efbf5c.1
|
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc-ecosystem/gateway/v2 v2.21.0-20240807134501-ea98c104104d.1
|
||||||
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go v1.4.0-20240720172138-1b9bcd834f17.2
|
buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go v1.5.1-20240807134501-ea98c104104d.1
|
||||||
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.2-20240720172138-1b9bcd834f17.2
|
buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go v1.34.2-20240807134501-ea98c104104d.2
|
||||||
cloud.google.com/go/storage v1.43.0
|
cloud.google.com/go/storage v1.43.0
|
||||||
cloud.google.com/go/vertexai v0.7.1
|
cloud.google.com/go/vertexai v0.7.1
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0
|
||||||
@ -40,7 +40,7 @@ require (
|
|||||||
github.com/cohere-ai/cohere-go/v2 v2.7.3
|
github.com/cohere-ai/cohere-go/v2 v2.7.3
|
||||||
github.com/go-logr/zapr v1.3.0
|
github.com/go-logr/zapr v1.3.0
|
||||||
github.com/google/generative-ai-go v0.11.0
|
github.com/google/generative-ai-go v0.11.0
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.21.0
|
||||||
github.com/hupe1980/go-huggingface v0.0.15
|
github.com/hupe1980/go-huggingface v0.0.15
|
||||||
github.com/kyverno/policy-reporter-kyverno-plugin v1.6.3
|
github.com/kyverno/policy-reporter-kyverno-plugin v1.6.3
|
||||||
github.com/olekukonko/tablewriter v0.0.5
|
github.com/olekukonko/tablewriter v0.0.5
|
||||||
@ -80,7 +80,7 @@ require (
|
|||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
github.com/go-kit/log v0.2.1 // indirect
|
github.com/go-kit/log v0.2.1 // indirect
|
||||||
github.com/go-logfmt/logfmt v0.6.0 // indirect
|
github.com/go-logfmt/logfmt v0.6.0 // indirect
|
||||||
github.com/gofrs/flock v0.8.1 // indirect
|
github.com/gofrs/flock v0.12.1 // indirect
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect
|
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect
|
||||||
@ -108,10 +108,11 @@ require (
|
|||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.27.0 // indirect
|
go.opentelemetry.io/otel/metric v1.27.0 // indirect
|
||||||
|
golang.org/x/tools v0.24.0 // indirect
|
||||||
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
|
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d // indirect
|
google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4 // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20240723171418-e6d459c13d2a // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20240723171418-e6d459c13d2a // indirect
|
||||||
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
|
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
knative.dev/pkg v0.0.0-20230616134650-eb63a40adfb0 // indirect
|
knative.dev/pkg v0.0.0-20230616134650-eb63a40adfb0 // indirect
|
||||||
@ -120,7 +121,7 @@ require (
|
|||||||
require (
|
require (
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
|
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
|
||||||
github.com/BurntSushi/toml v1.4.0 // indirect
|
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect
|
||||||
github.com/MakeNowJust/heredoc v1.0.0 // indirect
|
github.com/MakeNowJust/heredoc v1.0.0 // indirect
|
||||||
github.com/Masterminds/goutils v1.1.1 // indirect
|
github.com/Masterminds/goutils v1.1.1 // indirect
|
||||||
github.com/Masterminds/semver/v3 v3.2.1 // indirect
|
github.com/Masterminds/semver/v3 v3.2.1 // indirect
|
||||||
@ -231,13 +232,13 @@ require (
|
|||||||
go.starlark.net v0.0.0-20240520160348-046347dcd104 // indirect
|
go.starlark.net v0.0.0-20240520160348-046347dcd104 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
go.uber.org/zap v1.27.0
|
go.uber.org/zap v1.27.0
|
||||||
golang.org/x/crypto v0.24.0 // indirect
|
golang.org/x/crypto v0.26.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect
|
golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect
|
||||||
golang.org/x/net v0.26.0
|
golang.org/x/net v0.28.0
|
||||||
golang.org/x/oauth2 v0.21.0 // indirect
|
golang.org/x/oauth2 v0.21.0 // indirect
|
||||||
golang.org/x/sync v0.7.0 // indirect
|
golang.org/x/sync v0.8.0 // indirect
|
||||||
golang.org/x/sys v0.22.0 // indirect
|
golang.org/x/sys v0.23.0 // indirect
|
||||||
golang.org/x/text v0.16.0 // indirect
|
golang.org/x/text v0.17.0 // indirect
|
||||||
golang.org/x/time v0.5.0 // indirect
|
golang.org/x/time v0.5.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
|
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
|
||||||
google.golang.org/grpc v1.64.1
|
google.golang.org/grpc v1.64.1
|
||||||
|
@ -12,7 +12,7 @@ import (
|
|||||||
|
|
||||||
type Client struct {
|
type Client struct {
|
||||||
c *grpc.ClientConn
|
c *grpc.ClientConn
|
||||||
analyzerClient rpc.AnalyzerServiceClient
|
analyzerClient rpc.CustomAnalyzerServiceClient
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewClient(c Connection) (*Client, error) {
|
func NewClient(c Connection) (*Client, error) {
|
||||||
@ -22,7 +22,7 @@ func NewClient(c Connection) (*Client, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
client := rpc.NewAnalyzerServiceClient(conn)
|
client := rpc.NewCustomAnalyzerServiceClient(conn)
|
||||||
return &Client{
|
return &Client{
|
||||||
c: conn,
|
c: conn,
|
||||||
analyzerClient: client,
|
analyzerClient: client,
|
||||||
@ -31,7 +31,7 @@ func NewClient(c Connection) (*Client, error) {
|
|||||||
|
|
||||||
func (cli *Client) Run() (common.Result, error) {
|
func (cli *Client) Run() (common.Result, error) {
|
||||||
var result common.Result
|
var result common.Result
|
||||||
req := &schemav1.AnalyzerRunRequest{}
|
req := &schemav1.RunRequest{}
|
||||||
res, err := cli.analyzerClient.Run(context.Background(), req)
|
res, err := cli.analyzerClient.Run(context.Background(), req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return result, err
|
return result, err
|
||||||
|
@ -12,11 +12,11 @@ It allows you to form curl like requests that are http2
|
|||||||
e.g.
|
e.g.
|
||||||
|
|
||||||
```
|
```
|
||||||
grpcurl -plaintext -d '{"namespace": "k8sgpt", "explain" : "true"}' localhost:8080 schema.v1.ServerService/Analyze
|
grpcurl -plaintext -d '{"namespace": "k8sgpt", "explain" : "true"}' localhost:8080 schema.v1.ServiceAnalyzeService/Analyze
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
grpcurl -plaintext localhost:8080 schema.v1.ServerService/ListIntegrations
|
grpcurl -plaintext localhost:8080 schema.v1.ServiceConfigService/ListIntegrations
|
||||||
{
|
{
|
||||||
"integrations": [
|
"integrations": [
|
||||||
"trivy"
|
"trivy"
|
||||||
@ -26,5 +26,5 @@ grpcurl -plaintext localhost:8080 schema.v1.ServerService/ListIntegrations
|
|||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
grpcurl -plaintext -d '{"integrations":{"trivy":{"enabled":"true","namespace":"default","skipInstall":"false"}}}' localhost:8080 schema.v1.ServerService/AddConfig
|
grpcurl -plaintext -d '{"integrations":{"trivy":{"enabled":"true","namespace":"default","skipInstall":"false"}}}' localhost:8080 schema.v1.ServiceConfigService/AddConfig
|
||||||
```
|
```
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package server
|
package analyze
|
||||||
|
|
||||||
import (
|
import (
|
||||||
schemav1 "buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go/schema/v1"
|
schemav1 "buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go/schema/v1"
|
||||||
@ -7,7 +7,7 @@ import (
|
|||||||
"github.com/k8sgpt-ai/k8sgpt/pkg/analysis"
|
"github.com/k8sgpt-ai/k8sgpt/pkg/analysis"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (h *handler) Analyze(ctx context.Context, i *schemav1.AnalyzeRequest) (
|
func (h *Handler) Analyze(ctx context.Context, i *schemav1.AnalyzeRequest) (
|
||||||
*schemav1.AnalyzeResponse,
|
*schemav1.AnalyzeResponse,
|
||||||
error,
|
error,
|
||||||
) {
|
) {
|
7
pkg/server/analyze/handler.go
Normal file
7
pkg/server/analyze/handler.go
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package analyze
|
||||||
|
|
||||||
|
import rpc "buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go/schema/v1/schemav1grpc"
|
||||||
|
|
||||||
|
type Handler struct {
|
||||||
|
rpc.UnimplementedServerAnalyzerServiceServer
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package server
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
`log`
|
`log`
|
||||||
@ -21,7 +21,7 @@ const (
|
|||||||
notUsedInsecure = false
|
notUsedInsecure = false
|
||||||
)
|
)
|
||||||
|
|
||||||
func (h *handler) AddConfig(ctx context.Context, i *schemav1.AddConfigRequest) (*schemav1.AddConfigResponse, error,
|
func (h *Handler) AddConfig(ctx context.Context, i *schemav1.AddConfigRequest) (*schemav1.AddConfigResponse, error,
|
||||||
) {
|
) {
|
||||||
if i == nil {
|
if i == nil {
|
||||||
log.Println("Error: AddConfigRequest is nil")
|
log.Println("Error: AddConfigRequest is nil")
|
||||||
@ -91,7 +91,7 @@ func (h *handler) AddConfig(ctx context.Context, i *schemav1.AddConfigRequest) (
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *handler) RemoveConfig(ctx context.Context, i *schemav1.RemoveConfigRequest) (*schemav1.RemoveConfigResponse, error,
|
func (h *Handler) RemoveConfig(ctx context.Context, i *schemav1.RemoveConfigRequest) (*schemav1.RemoveConfigResponse, error,
|
||||||
) {
|
) {
|
||||||
err := cache.RemoveRemoteCache()
|
err := cache.RemoveRemoteCache()
|
||||||
if err != nil {
|
if err != nil {
|
16
pkg/server/config/handler.go
Normal file
16
pkg/server/config/handler.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
rpc "buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go/schema/v1/schemav1grpc"
|
||||||
|
schemav1 "buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go/schema/v1"
|
||||||
|
"context"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Handler struct {
|
||||||
|
rpc.UnimplementedServerConfigServiceServer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handler) Shutdown(ctx context.Context, request *schemav1.ShutdownRequest) (*schemav1.ShutdownResponse, error) {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package server
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
schemav1 "buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go/schema/v1"
|
schemav1 "buf.build/gen/go/k8sgpt-ai/k8sgpt/protocolbuffers/go/schema/v1"
|
||||||
@ -18,7 +18,7 @@ const (
|
|||||||
// syncIntegration is aware of the following events
|
// syncIntegration is aware of the following events
|
||||||
// A new integration added
|
// A new integration added
|
||||||
// An integration removed from the Integration block
|
// An integration removed from the Integration block
|
||||||
func (h *handler) syncIntegration(ctx context.Context,
|
func (h *Handler) syncIntegration(ctx context.Context,
|
||||||
i *schemav1.AddConfigRequest) (*schemav1.AddConfigResponse, error,
|
i *schemav1.AddConfigRequest) (*schemav1.AddConfigResponse, error,
|
||||||
) {
|
) {
|
||||||
response := &schemav1.AddConfigResponse{}
|
response := &schemav1.AddConfigResponse{}
|
||||||
@ -90,7 +90,7 @@ func (h *handler) syncIntegration(ctx context.Context,
|
|||||||
return response, err
|
return response, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*handler) ListIntegrations(ctx context.Context, req *schemav1.ListIntegrationsRequest) (*schemav1.ListIntegrationsResponse, error) {
|
func (*Handler) ListIntegrations(ctx context.Context, req *schemav1.ListIntegrationsRequest) (*schemav1.ListIntegrationsResponse, error) {
|
||||||
|
|
||||||
integrationProvider := integration.NewIntegration()
|
integrationProvider := integration.NewIntegration()
|
||||||
// Update the requester with the status of Trivy
|
// Update the requester with the status of Trivy
|
||||||
@ -122,7 +122,7 @@ func (*handler) ListIntegrations(ctx context.Context, req *schemav1.ListIntegrat
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*handler) deactivateAllIntegrations(integrationProvider *integration.Integration) error {
|
func (*Handler) deactivateAllIntegrations(integrationProvider *integration.Integration) error {
|
||||||
integrations := integrationProvider.List()
|
integrations := integrationProvider.List()
|
||||||
for _, i := range integrations {
|
for _, i := range integrations {
|
||||||
b, _ := integrationProvider.IsActivate(i)
|
b, _ := integrationProvider.IsActivate(i)
|
@ -1,9 +0,0 @@
|
|||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
rpc "buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go/schema/v1/schemav1grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
type handler struct {
|
|
||||||
rpc.UnimplementedServerServiceServer
|
|
||||||
}
|
|
@ -11,7 +11,7 @@ import (
|
|||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
func logInterceptor(logger *zap.Logger) grpc.UnaryServerInterceptor {
|
func LogInterceptor(logger *zap.Logger) grpc.UnaryServerInterceptor {
|
||||||
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
|
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|
||||||
|
@ -17,16 +17,19 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
|
||||||
|
"github.com/k8sgpt-ai/k8sgpt/pkg/server/analyze"
|
||||||
|
"github.com/k8sgpt-ai/k8sgpt/pkg/server/config"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
gw "buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc-ecosystem/gateway/v2/schema/v1/server-service/schemav1gateway"
|
gw2 "buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc-ecosystem/gateway/v2/schema/v1/server_analyzer_service/schemav1gateway"
|
||||||
|
gw "buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc-ecosystem/gateway/v2/schema/v1/server_config_service/schemav1gateway"
|
||||||
rpc "buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go/schema/v1/schemav1grpc"
|
rpc "buf.build/gen/go/k8sgpt-ai/k8sgpt/grpc/go/schema/v1/schemav1grpc"
|
||||||
"github.com/go-logr/zapr"
|
"github.com/go-logr/zapr"
|
||||||
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
|
|
||||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"golang.org/x/net/http2"
|
"golang.org/x/net/http2"
|
||||||
@ -45,7 +48,8 @@ type Config struct {
|
|||||||
Key string
|
Key string
|
||||||
Token string
|
Token string
|
||||||
Output string
|
Output string
|
||||||
Handler *handler
|
ConfigHandler *config.Handler
|
||||||
|
AnalyzeHandler *analyze.Handler
|
||||||
Logger *zap.Logger
|
Logger *zap.Logger
|
||||||
metricsServer *http.Server
|
metricsServer *http.Server
|
||||||
listener net.Listener
|
listener net.Listener
|
||||||
@ -92,17 +96,26 @@ func (s *Config) Serve() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.ConfigHandler = &config.Handler{}
|
||||||
|
s.AnalyzeHandler = &analyze.Handler{}
|
||||||
s.listener = lis
|
s.listener = lis
|
||||||
s.Logger.Info(fmt.Sprintf("binding api to %s", s.Port))
|
s.Logger.Info(fmt.Sprintf("binding api to %s", s.Port))
|
||||||
grpcServerUnaryInterceptor := grpc.UnaryInterceptor(logInterceptor(s.Logger))
|
grpcServerUnaryInterceptor := grpc.UnaryInterceptor(LogInterceptor(s.Logger))
|
||||||
grpcServer := grpc.NewServer(grpcServerUnaryInterceptor)
|
grpcServer := grpc.NewServer(grpcServerUnaryInterceptor)
|
||||||
reflection.Register(grpcServer)
|
reflection.Register(grpcServer)
|
||||||
rpc.RegisterServerServiceServer(grpcServer, s.Handler)
|
rpc.RegisterServerConfigServiceServer(grpcServer, s.ConfigHandler)
|
||||||
|
rpc.RegisterServerAnalyzerServiceServer(grpcServer, s.AnalyzeHandler)
|
||||||
|
|
||||||
if s.EnableHttp {
|
if s.EnableHttp {
|
||||||
s.Logger.Info("enabling rest/http api")
|
s.Logger.Info("enabling rest/http api")
|
||||||
gwmux := runtime.NewServeMux()
|
gwmux := runtime.NewServeMux()
|
||||||
err = gw.RegisterServerServiceHandlerFromEndpoint(context.Background(), gwmux, fmt.Sprintf("localhost:%s", s.Port), []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())})
|
err = gw.RegisterServerConfigServiceHandlerFromEndpoint(context.Background(), gwmux, fmt.Sprintf("localhost:%s", s.Port),
|
||||||
|
[]grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Failed to register gateway:", err)
|
||||||
|
}
|
||||||
|
err = gw2.RegisterServerAnalyzerServiceHandlerFromEndpoint(context.Background(), gwmux, fmt.Sprintf("localhost:%s", s.Port),
|
||||||
|
[]grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln("Failed to register gateway:", err)
|
log.Fatalln("Failed to register gateway:", err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user