From a7899b3a98779770fdf98adc67e57e6d1c5b421e Mon Sep 17 00:00:00 2001 From: Michael Quigley Date: Fri, 30 May 2025 12:59:10 -0400 Subject: [PATCH] ham-fisted, manually wired... but working (#967) --- controller/agentStatus.go | 40 +++++++++++++++++++ controller/controller.go | 1 + .../agent/agent_status_responses.go | 3 ++ rest_server_zrok/embedded_spec.go | 6 +++ .../operations/agent/agent_status.go | 3 ++ .../src/api/models/AgentStatus200Response.ts | 8 ++++ sdk/python/src/docs/AgentStatus200Response.md | 1 + .../src/test/test_agent_status200_response.py | 1 + .../models/agent_status200_response.py | 6 ++- specs/zrok.yml | 2 + ui/src/api/models/AgentStatus200Response.ts | 8 ++++ 11 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 controller/agentStatus.go diff --git a/controller/agentStatus.go b/controller/agentStatus.go new file mode 100644 index 00000000..fa8a80d3 --- /dev/null +++ b/controller/agentStatus.go @@ -0,0 +1,40 @@ +package controller + +import ( + "context" + "github.com/go-openapi/runtime/middleware" + "github.com/openziti/zrok/agent/agentGrpc" + "github.com/openziti/zrok/controller/agentController" + "github.com/openziti/zrok/controller/config" + "github.com/openziti/zrok/rest_model_zrok" + "github.com/openziti/zrok/rest_server_zrok/operations/agent" + "github.com/sirupsen/logrus" +) + +type agentStatusHandler struct { + cfg *config.Config +} + +func newAgentStatusHandler(cfg *config.Config) *agentStatusHandler { + return &agentStatusHandler{cfg: cfg} +} + +func (h *agentStatusHandler) Handle(params agent.AgentStatusParams, principal *rest_model_zrok.Principal) middleware.Responder { + if h.cfg.AgentController != nil { + acli, aconn, err := agentController.NewAgentClient(params.Body.EnvZID, h.cfg.AgentController) + if err != nil { + logrus.Errorf("error creating agent client for '%v' (%v): %v", params.Body.EnvZID, principal.Email, err) + return agent.NewAgentStatusInternalServerError() + } + defer aconn.Close() + + resp, err := acli.Version(context.Background(), &agentGrpc.VersionRequest{}) + if err != nil { + logrus.Errorf("error retrieving agent version for '%v' (%v): %v", params.Body.EnvZID, principal.Email, err) + return agent.NewAgentStatusInternalServerError() + } + + return agent.NewAgentStatusOK().WithPayload(&agent.AgentStatusOKBody{Version: resp.V}) + } + return agent.NewAgentStatusUnauthorized() +} diff --git a/controller/controller.go b/controller/controller.go index 94c7b3ae..1f423b5f 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -65,6 +65,7 @@ func Run(inCfg *config.Config) error { api.AdminListOrganizationsHandler = newListOrganizationsHandler() api.AdminRemoveOrganizationMemberHandler = newRemoveOrganizationMemberHandler() api.AdminUpdateFrontendHandler = newUpdateFrontendHandler() + api.AgentAgentStatusHandler = newAgentStatusHandler(cfg) api.EnvironmentEnableHandler = newEnableHandler() api.EnvironmentDisableHandler = newDisableHandler() api.MetadataConfigurationHandler = newConfigurationHandler(cfg) diff --git a/rest_client_zrok/agent/agent_status_responses.go b/rest_client_zrok/agent/agent_status_responses.go index 835c4cc3..476516d6 100644 --- a/rest_client_zrok/agent/agent_status_responses.go +++ b/rest_client_zrok/agent/agent_status_responses.go @@ -279,6 +279,9 @@ type AgentStatusOKBody struct { // shares Shares []*rest_model_zrok.Share `json:"shares"` + + // version + Version string `json:"version,omitempty"` } // Validate validates this agent status o k body diff --git a/rest_server_zrok/embedded_spec.go b/rest_server_zrok/embedded_spec.go index b88f2f8f..d4db9ab9 100644 --- a/rest_server_zrok/embedded_spec.go +++ b/rest_server_zrok/embedded_spec.go @@ -219,6 +219,9 @@ func init() { "items": { "$ref": "#/definitions/share" } + }, + "version": { + "type": "string" } } } @@ -2577,6 +2580,9 @@ func init() { "items": { "$ref": "#/definitions/share" } + }, + "version": { + "type": "string" } } } diff --git a/rest_server_zrok/operations/agent/agent_status.go b/rest_server_zrok/operations/agent/agent_status.go index cae83c0f..f9888e77 100644 --- a/rest_server_zrok/operations/agent/agent_status.go +++ b/rest_server_zrok/operations/agent/agent_status.go @@ -119,6 +119,9 @@ type AgentStatusOKBody struct { // shares Shares []*rest_model_zrok.Share `json:"shares"` + + // version + Version string `json:"version,omitempty"` } // Validate validates this agent status o k body diff --git a/sdk/nodejs/sdk/src/api/models/AgentStatus200Response.ts b/sdk/nodejs/sdk/src/api/models/AgentStatus200Response.ts index a8fa0894..66f9f511 100644 --- a/sdk/nodejs/sdk/src/api/models/AgentStatus200Response.ts +++ b/sdk/nodejs/sdk/src/api/models/AgentStatus200Response.ts @@ -27,6 +27,12 @@ import { * @interface AgentStatus200Response */ export interface AgentStatus200Response { + /** + * + * @type {string} + * @memberof AgentStatus200Response + */ + version?: string; /** * * @type {Array} @@ -52,6 +58,7 @@ export function AgentStatus200ResponseFromJSONTyped(json: any, ignoreDiscriminat } return { + 'version': json['version'] == null ? undefined : json['version'], 'shares': json['shares'] == null ? undefined : ((json['shares'] as Array).map(ShareFromJSON)), }; } @@ -67,6 +74,7 @@ export function AgentStatus200ResponseToJSONTyped(value?: AgentStatus200Response return { + 'version': value['version'], 'shares': value['shares'] == null ? undefined : ((value['shares'] as Array).map(ShareToJSON)), }; } diff --git a/sdk/python/src/docs/AgentStatus200Response.md b/sdk/python/src/docs/AgentStatus200Response.md index 361f872d..52b3f3b9 100644 --- a/sdk/python/src/docs/AgentStatus200Response.md +++ b/sdk/python/src/docs/AgentStatus200Response.md @@ -5,6 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- +**version** | **str** | | [optional] **shares** | [**List[Share]**](Share.md) | | [optional] ## Example diff --git a/sdk/python/src/test/test_agent_status200_response.py b/sdk/python/src/test/test_agent_status200_response.py index 821c4da8..85cf6361 100644 --- a/sdk/python/src/test/test_agent_status200_response.py +++ b/sdk/python/src/test/test_agent_status200_response.py @@ -35,6 +35,7 @@ class TestAgentStatus200Response(unittest.TestCase): model = AgentStatus200Response() if include_optional: return AgentStatus200Response( + version = '', shares = [ zrok_api.models.share.share( share_token = '', diff --git a/sdk/python/src/zrok_api/models/agent_status200_response.py b/sdk/python/src/zrok_api/models/agent_status200_response.py index c2c30b3d..9ef34d81 100644 --- a/sdk/python/src/zrok_api/models/agent_status200_response.py +++ b/sdk/python/src/zrok_api/models/agent_status200_response.py @@ -17,7 +17,7 @@ import pprint import re # noqa: F401 import json -from pydantic import BaseModel, ConfigDict +from pydantic import BaseModel, ConfigDict, StrictStr from typing import Any, ClassVar, Dict, List, Optional from zrok_api.models.share import Share from typing import Optional, Set @@ -27,8 +27,9 @@ class AgentStatus200Response(BaseModel): """ AgentStatus200Response """ # noqa: E501 + version: Optional[StrictStr] = None shares: Optional[List[Share]] = None - __properties: ClassVar[List[str]] = ["shares"] + __properties: ClassVar[List[str]] = ["version", "shares"] model_config = ConfigDict( populate_by_name=True, @@ -88,6 +89,7 @@ class AgentStatus200Response(BaseModel): return cls.model_validate(obj) _obj = cls.model_validate({ + "version": obj.get("version"), "shares": [Share.from_dict(_item) for _item in obj["shares"]] if obj.get("shares") is not None else None }) return _obj diff --git a/specs/zrok.yml b/specs/zrok.yml index 4b7f0ad2..d626a76b 100644 --- a/specs/zrok.yml +++ b/specs/zrok.yml @@ -635,6 +635,8 @@ paths: description: ok schema: properties: + version: + type: string shares: type: array items: diff --git a/ui/src/api/models/AgentStatus200Response.ts b/ui/src/api/models/AgentStatus200Response.ts index a8fa0894..66f9f511 100644 --- a/ui/src/api/models/AgentStatus200Response.ts +++ b/ui/src/api/models/AgentStatus200Response.ts @@ -27,6 +27,12 @@ import { * @interface AgentStatus200Response */ export interface AgentStatus200Response { + /** + * + * @type {string} + * @memberof AgentStatus200Response + */ + version?: string; /** * * @type {Array} @@ -52,6 +58,7 @@ export function AgentStatus200ResponseFromJSONTyped(json: any, ignoreDiscriminat } return { + 'version': json['version'] == null ? undefined : json['version'], 'shares': json['shares'] == null ? undefined : ((json['shares'] as Array).map(ShareFromJSON)), }; } @@ -67,6 +74,7 @@ export function AgentStatus200ResponseToJSONTyped(value?: AgentStatus200Response return { + 'version': value['version'], 'shares': value['shares'] == null ? undefined : ((value['shares'] as Array).map(ShareToJSON)), }; }