Remove legacy client-manager platform path

This commit is contained in:
npc0-hue
2026-09-03 16:40:05 +08:00
parent ec2462a312
commit 80cddbf19d
51 changed files with 382 additions and 4271 deletions
-308
View File
@@ -1,308 +0,0 @@
package dto
import (
"time"
"browser.local/platform/domain"
)
type ClientManagerDeployRequest struct {
ProfileKey string `json:"profileKey"`
DistributionID string `json:"distributionId"`
ExpectedDeploymentGeneration int `json:"expectedDeploymentGeneration,omitempty"`
IdempotencyKey string `json:"idempotencyKey"`
}
type ClientManagerControlRequest struct {
ProfileKey string `json:"profileKey"`
Operation string `json:"operation"`
ExpectedDeploymentGeneration int `json:"expectedDeploymentGeneration"`
IdempotencyKey string `json:"idempotencyKey"`
}
type ClientManagerUpdateRequest struct {
ProfileKey string `json:"profileKey"`
DistributionID string `json:"distributionId"`
ExpectedDeploymentGeneration int `json:"expectedDeploymentGeneration"`
Approved bool `json:"approved"`
IdempotencyKey string `json:"idempotencyKey"`
}
type ClientManagerUninstallRequest struct {
ProfileKey string `json:"profileKey"`
ExpectedDeploymentGeneration int `json:"expectedDeploymentGeneration"`
Confirmed bool `json:"confirmed"`
IdempotencyKey string `json:"idempotencyKey"`
}
type ClientManagerRetryRequest struct {
ProfileKey string `json:"profileKey"`
ExpectedDeploymentGeneration int `json:"expectedDeploymentGeneration"`
IdempotencyKey string `json:"idempotencyKey"`
}
type ClientManagerRevokeSessionRequest struct {
ProfileKey string `json:"profileKey"`
Reason string `json:"reason,omitempty"`
}
type ClientManagerLifecycleActionResponse struct {
Operation string `json:"operation"`
Available bool `json:"available"`
Reason string `json:"reason,omitempty"`
}
type ClientManagerLifecycleJobResponse struct {
ID string `json:"id,omitempty"`
State domain.JobState `json:"state,omitempty"`
Progress JobProgressBody `json:"progress,omitempty"`
Attempt int `json:"attempt,omitempty"`
CreatedAt time.Time `json:"createdAt,omitempty"`
UpdatedAt time.Time `json:"updatedAt,omitempty"`
}
type ClientManagerInstallationResponse struct {
ID string `json:"id"`
ServerInstanceID string `json:"serverInstanceId"`
PluginID string `json:"pluginId"`
ProfileKey string `json:"profileKey"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
Status string `json:"status"`
Phase string `json:"phase,omitempty"`
DesiredVersion string `json:"desiredVersion,omitempty"`
ActiveVersion string `json:"activeVersion,omitempty"`
PreviousVersion string `json:"previousVersion,omitempty"`
DesiredRevision string `json:"desiredRevision,omitempty"`
ActiveRevision string `json:"activeRevision,omitempty"`
PreviousRevision string `json:"previousRevision,omitempty"`
DesiredArtifactID string `json:"desiredArtifactId,omitempty"`
ActiveArtifactID string `json:"activeArtifactId,omitempty"`
PreviousArtifactID string `json:"previousArtifactId,omitempty"`
KeyGeneration int `json:"keyGeneration"`
DeploymentGeneration int `json:"deploymentGeneration"`
CurrentJobID string `json:"currentJobId,omitempty"`
LastSuccessfulJobID string `json:"lastSuccessfulJobId,omitempty"`
LastOperation string `json:"lastOperation,omitempty"`
Health string `json:"health"`
HealthReason string `json:"healthReason,omitempty"`
LastSeenAt time.Time `json:"lastSeenAt,omitempty"`
Retryable bool `json:"retryable"`
RequiresRedeploy bool `json:"requiresRedeploy"`
InstalledAt time.Time `json:"installedAt,omitempty"`
UninstalledAt time.Time `json:"uninstalledAt,omitempty"`
UpdatedAt time.Time `json:"updatedAt"`
Distribution *ClientManagerDistributionSummaryResponse `json:"distribution,omitempty"`
Job *ClientManagerLifecycleJobResponse `json:"job,omitempty"`
Actions []ClientManagerLifecycleActionResponse `json:"actions"`
}
type ClientManagerDistributionSummaryResponse struct {
ID string `json:"id"`
ArtifactID string `json:"artifactId"`
SourceRevision string `json:"sourceRevision"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
Checksum string `json:"checksum"`
KeyGeneration int `json:"keyGeneration"`
Status string `json:"status"`
}
type ClientManagerInstallationListResponse struct {
Items []ClientManagerInstallationResponse `json:"items"`
Count int `json:"count"`
}
type ClientManagerLifecycleInputRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
}
type ClientManagerLifecycleInputResponse struct {
InstallationID string `json:"installationId"`
ServerInstanceID string `json:"serverInstanceId"`
ProfileKey string `json:"profileKey"`
Operation string `json:"operation"`
ArtifactID string `json:"artifactId,omitempty"`
Checksum string `json:"checksum,omitempty"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
Version string `json:"version,omitempty"`
SourceRevision string `json:"sourceRevision,omitempty"`
KeyGeneration int `json:"keyGeneration"`
DeploymentGeneration int `json:"deploymentGeneration"`
ExecutableRef string `json:"executableRef"`
Arguments []string `json:"arguments"`
AutoStart bool `json:"autoStart"`
StartupTimeoutSeconds int `json:"startupTimeoutSeconds"`
StopTimeoutSeconds int `json:"stopTimeoutSeconds"`
HealthConfirmationSeconds int `json:"healthConfirmationSeconds"`
IdempotencyKey string `json:"idempotencyKey"`
CompanionConfig *ClientManagerCompanionConfigInputResponse `json:"companionConfig,omitempty"`
}
type ClientManagerCompanionConfigInputResponse struct {
SchemaVersion int `json:"schemaVersion"`
ConfigTemplateKey string `json:"configTemplateKey"`
ConfigTemplateRef string `json:"configTemplateRef"`
ConfigOutputRef string `json:"configOutputRef"`
ConfigSchemaRef string `json:"configSchemaRef"`
ConfigFormat string `json:"configFormat"`
PlatformBaseURLSource string `json:"platformBaseUrlSource"`
InstallationID string `json:"installationId"`
ServerInstanceID string `json:"serverInstanceId"`
PluginID string `json:"pluginId"`
ProfileKey string `json:"profileKey"`
ArtifactID string `json:"artifactId"`
Version string `json:"version"`
SourceRevision string `json:"sourceRevision"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
KeyGeneration int `json:"keyGeneration"`
DeploymentGeneration int `json:"deploymentGeneration"`
Capabilities []string `json:"capabilities"`
RegistrationProof string `json:"registrationProof"`
ProofMaterialSource string `json:"proofMaterialSource"`
ProofMaterialEnv string `json:"proofMaterialEnv"`
SessionMode string `json:"sessionMode"`
TLSPolicy string `json:"tlsPolicy"`
HeartbeatIntervalSeconds int `json:"heartbeatIntervalSeconds"`
CommandPollIntervalSeconds int `json:"commandPollIntervalSeconds"`
RequestTimeoutSeconds int `json:"requestTimeoutSeconds"`
}
type ClientManagerRegisterRequest struct {
InstallationID string `json:"installationId"`
ServerInstanceID string `json:"serverInstanceId"`
ProfileKey string `json:"profileKey"`
ArtifactID string `json:"artifactId"`
Version string `json:"version"`
SourceRevision string `json:"sourceRevision"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
KeyGeneration int `json:"keyGeneration"`
DeploymentGeneration int `json:"deploymentGeneration"`
Capabilities []string `json:"capabilities"`
Timestamp time.Time `json:"timestamp"`
Nonce string `json:"nonce"`
Signature string `json:"signature"`
}
type ClientManagerRegisterResponse struct {
Accepted bool `json:"accepted"`
InstallationID string `json:"installationId"`
SessionToken string `json:"sessionToken"`
ExpiresAt time.Time `json:"expiresAt"`
HeartbeatEvery int `json:"heartbeatEverySeconds"`
ServerTime time.Time `json:"serverTime"`
}
type ClientManagerHeartbeatRequest struct {
InstallationID string `json:"installationId"`
SessionToken string `json:"sessionToken"`
Sequence uint64 `json:"sequence"`
Health string `json:"health"`
HealthReason string `json:"healthReason,omitempty"`
Capabilities []string `json:"capabilities"`
SentAt time.Time `json:"sentAt"`
}
type ClientManagerHeartbeatResponse struct {
Accepted bool `json:"accepted"`
InstallationID string `json:"installationId"`
Status string `json:"status"`
Health string `json:"health"`
NextHeartbeat int `json:"nextHeartbeatSeconds"`
SessionExpiresAt time.Time `json:"sessionExpiresAt"`
ServerTime time.Time `json:"serverTime"`
}
func (request ClientManagerDeployRequest) ToDomain(serverID string) domain.ClientManagerDeployRequest {
return domain.ClientManagerDeployRequest{ServerInstanceID: serverID, ProfileKey: request.ProfileKey, DistributionID: request.DistributionID, ExpectedDeploymentGeneration: request.ExpectedDeploymentGeneration, IdempotencyKey: request.IdempotencyKey}
}
func (request ClientManagerControlRequest) ToDomain(serverID string) domain.ClientManagerControlRequest {
return domain.ClientManagerControlRequest{ServerInstanceID: serverID, ProfileKey: request.ProfileKey, Operation: domain.ClientManagerLifecycleOperation(request.Operation), ExpectedDeploymentGeneration: request.ExpectedDeploymentGeneration, IdempotencyKey: request.IdempotencyKey}
}
func (request ClientManagerUpdateRequest) ToDomain(serverID string) domain.ClientManagerUpdateRequest {
return domain.ClientManagerUpdateRequest{ServerInstanceID: serverID, ProfileKey: request.ProfileKey, DistributionID: request.DistributionID, ExpectedDeploymentGeneration: request.ExpectedDeploymentGeneration, Approved: request.Approved, IdempotencyKey: request.IdempotencyKey}
}
func (request ClientManagerUninstallRequest) ToDomain(serverID string) domain.ClientManagerUninstallRequest {
return domain.ClientManagerUninstallRequest{ServerInstanceID: serverID, ProfileKey: request.ProfileKey, ExpectedDeploymentGeneration: request.ExpectedDeploymentGeneration, Confirmed: request.Confirmed, IdempotencyKey: request.IdempotencyKey}
}
func (request ClientManagerRetryRequest) ToDomain(serverID string) domain.ClientManagerRetryRequest {
return domain.ClientManagerRetryRequest{ServerInstanceID: serverID, ProfileKey: request.ProfileKey, ExpectedDeploymentGeneration: request.ExpectedDeploymentGeneration, IdempotencyKey: request.IdempotencyKey}
}
func (request ClientManagerRevokeSessionRequest) ToDomain(serverID string) domain.ClientManagerRevokeSessionRequest {
return domain.ClientManagerRevokeSessionRequest{ServerInstanceID: serverID, ProfileKey: request.ProfileKey, Reason: request.Reason}
}
func (request ClientManagerLifecycleInputRequest) ToDomain() domain.ClientManagerLifecycleInputRequest {
return domain.ClientManagerLifecycleInputRequest{RunEndpointID: request.RunEndpointID, SessionToken: request.SessionToken, JobID: request.JobID, LeaseToken: request.LeaseToken, Attempt: request.Attempt}
}
func ClientManagerLifecycleInputFromDomain(value domain.ClientManagerLifecycleInput) ClientManagerLifecycleInputResponse {
value = domain.CopyClientManagerLifecycleInput(value)
response := ClientManagerLifecycleInputResponse{InstallationID: value.InstallationID, ServerInstanceID: value.ServerInstanceID, ProfileKey: value.ProfileKey, Operation: string(value.Operation), ArtifactID: value.ArtifactID, Checksum: value.Checksum, TargetOS: value.TargetOS, TargetArch: value.TargetArch, Version: value.Version, SourceRevision: value.SourceRevision, KeyGeneration: value.KeyGeneration, DeploymentGeneration: value.DeploymentGeneration, ExecutableRef: value.ExecutableRef, Arguments: value.Arguments, AutoStart: value.AutoStart, StartupTimeoutSeconds: value.StartupTimeoutSeconds, StopTimeoutSeconds: value.StopTimeoutSeconds, HealthConfirmationSeconds: value.HealthConfirmationSeconds, IdempotencyKey: value.IdempotencyKey}
if value.CompanionConfig != nil {
companion := ClientManagerCompanionConfigInputFromDomain(*value.CompanionConfig)
response.CompanionConfig = &companion
}
return response
}
func ClientManagerCompanionConfigInputFromDomain(value domain.ClientManagerCompanionConfigInput) ClientManagerCompanionConfigInputResponse {
value = domain.CopyClientManagerCompanionConfigInput(value)
return ClientManagerCompanionConfigInputResponse{SchemaVersion: value.SchemaVersion, ConfigTemplateKey: value.ConfigTemplateKey, ConfigTemplateRef: value.ConfigTemplateRef, ConfigOutputRef: value.ConfigOutputRef, ConfigSchemaRef: value.ConfigSchemaRef, ConfigFormat: value.ConfigFormat, PlatformBaseURLSource: value.PlatformBaseURLSource, InstallationID: value.InstallationID, ServerInstanceID: value.ServerInstanceID, PluginID: value.PluginID, ProfileKey: value.ProfileKey, ArtifactID: value.ArtifactID, Version: value.Version, SourceRevision: value.SourceRevision, TargetOS: value.TargetOS, TargetArch: value.TargetArch, KeyGeneration: value.KeyGeneration, DeploymentGeneration: value.DeploymentGeneration, Capabilities: value.Capabilities, RegistrationProof: value.RegistrationProof, ProofMaterialSource: value.ProofMaterialSource, ProofMaterialEnv: value.ProofMaterialEnv, SessionMode: value.SessionMode, TLSPolicy: value.TLSPolicy, HeartbeatIntervalSeconds: value.HeartbeatIntervalSeconds, CommandPollIntervalSeconds: value.CommandPollIntervalSeconds, RequestTimeoutSeconds: value.RequestTimeoutSeconds}
}
func (request ClientManagerRegisterRequest) ToDomain() domain.ClientManagerRegisterRequest {
return domain.ClientManagerRegisterRequest{InstallationID: request.InstallationID, ServerInstanceID: request.ServerInstanceID, ProfileKey: request.ProfileKey, ArtifactID: request.ArtifactID, Version: request.Version, SourceRevision: request.SourceRevision, TargetOS: request.TargetOS, TargetArch: request.TargetArch, KeyGeneration: request.KeyGeneration, DeploymentGeneration: request.DeploymentGeneration, Capabilities: domain.CopyStringSlice(request.Capabilities), Timestamp: request.Timestamp, Nonce: request.Nonce, Signature: request.Signature}
}
func ClientManagerRegisterFromDomain(value domain.ClientManagerRegisterResult) ClientManagerRegisterResponse {
return ClientManagerRegisterResponse{Accepted: value.Accepted, InstallationID: value.InstallationID, SessionToken: value.SessionToken, ExpiresAt: value.ExpiresAt, HeartbeatEvery: value.HeartbeatEvery, ServerTime: value.ServerTime}
}
func (request ClientManagerHeartbeatRequest) ToDomain() domain.ClientManagerHeartbeat {
return domain.ClientManagerHeartbeat{InstallationID: request.InstallationID, SessionToken: request.SessionToken, Sequence: request.Sequence, Health: domain.ClientManagerHealthStatus(request.Health), HealthReason: request.HealthReason, Capabilities: domain.CopyStringSlice(request.Capabilities), SentAt: request.SentAt}
}
func ClientManagerHeartbeatFromDomain(value domain.ClientManagerHeartbeatResult) ClientManagerHeartbeatResponse {
return ClientManagerHeartbeatResponse{Accepted: value.Accepted, InstallationID: value.InstallationID, Status: string(value.Status), Health: string(value.Health), NextHeartbeat: value.NextHeartbeat, SessionExpiresAt: value.SessionExpiresAt, ServerTime: value.ServerTime}
}
func ClientManagerLifecycleViewFromDomain(value domain.ClientManagerLifecycleView) ClientManagerInstallationResponse {
value = domain.CopyClientManagerLifecycleView(value)
installation := value.Installation
response := ClientManagerInstallationResponse{ID: installation.ID, ServerInstanceID: installation.ServerInstanceID, PluginID: installation.PluginID, ProfileKey: installation.ProfileKey, TargetOS: installation.TargetOS, TargetArch: installation.TargetArch, Status: string(installation.Status), Phase: installation.Phase, DesiredVersion: installation.DesiredVersion, ActiveVersion: installation.ActiveVersion, PreviousVersion: installation.PreviousVersion, DesiredRevision: installation.DesiredRevision, ActiveRevision: installation.ActiveRevision, PreviousRevision: installation.PreviousRevision, DesiredArtifactID: installation.DesiredArtifactID, ActiveArtifactID: installation.ActiveArtifactID, PreviousArtifactID: installation.PreviousArtifactID, KeyGeneration: installation.KeyGeneration, DeploymentGeneration: installation.DeploymentGeneration, CurrentJobID: installation.CurrentJobID, LastSuccessfulJobID: installation.LastSuccessfulJobID, LastOperation: string(installation.LastOperation), Health: string(installation.Health), HealthReason: installation.HealthReason, LastSeenAt: installation.LastSeenAt, Retryable: installation.Retryable, RequiresRedeploy: installation.RequiresRedeploy, InstalledAt: installation.InstalledAt, UninstalledAt: installation.UninstalledAt, UpdatedAt: installation.UpdatedAt}
if value.Distribution.ID != "" {
response.Distribution = &ClientManagerDistributionSummaryResponse{ID: value.Distribution.ID, ArtifactID: value.Distribution.ArtifactID, SourceRevision: value.Distribution.SourceRevision, TargetOS: value.Distribution.TargetOS, TargetArch: value.Distribution.TargetArch, Checksum: value.Distribution.Checksum, KeyGeneration: value.Distribution.KeyGeneration, Status: string(value.Distribution.Status)}
}
if value.Job.ID != "" {
response.Job = &ClientManagerLifecycleJobResponse{ID: value.Job.ID, State: value.Job.State, Progress: JobProgressBody{Percent: value.Job.Progress.Percent, Message: value.Job.Progress.Message}, Attempt: value.Job.Attempt, CreatedAt: value.Job.CreatedAt, UpdatedAt: value.Job.UpdatedAt}
}
response.Actions = make([]ClientManagerLifecycleActionResponse, len(value.Actions))
for i, action := range value.Actions {
response.Actions[i] = ClientManagerLifecycleActionResponse{Operation: string(action.Operation), Available: action.Available, Reason: action.Reason}
}
if response.Actions == nil {
response.Actions = []ClientManagerLifecycleActionResponse{}
}
return response
}
func ClientManagerLifecycleViewsFromDomain(values []domain.ClientManagerLifecycleView) ClientManagerInstallationListResponse {
items := make([]ClientManagerInstallationResponse, len(values))
for i, value := range values {
items[i] = ClientManagerLifecycleViewFromDomain(value)
}
return ClientManagerInstallationListResponse{Items: items, Count: len(items)}
}
@@ -1,69 +0,0 @@
package dto
import (
"encoding/json"
"strings"
"testing"
"browser.local/platform/domain"
)
func TestClientManagerLifecycleInputProjectsRunOnlyCompanionConfigWithoutRawMaterial(t *testing.T) {
response := ClientManagerLifecycleInputFromDomain(domain.ClientManagerLifecycleInput{
InstallationID: "installation-1",
ServerInstanceID: "server-1",
ProfileKey: "scum-client-manager",
Operation: domain.ClientManagerOperationDeploy,
DeploymentGeneration: 2,
CompanionConfig: &domain.ClientManagerCompanionConfigInput{
SchemaVersion: 1,
ConfigTemplateKey: "client-config",
ConfigTemplateRef: "config.yaml.example",
ConfigOutputRef: "config.yaml",
ConfigSchemaRef: "schemas/companion/config.schema.json",
ConfigFormat: "yaml",
PlatformBaseURLSource: "run-control",
InstallationID: "installation-1",
ServerInstanceID: "server-1",
PluginID: "game.scum",
ProfileKey: "scum-client-manager",
ArtifactID: "artifact-1",
Version: "1.0.0",
SourceRevision: "revision-1",
TargetOS: "windows",
TargetArch: "amd64",
KeyGeneration: 3,
DeploymentGeneration: 2,
Capabilities: []string{"component.register", "component.heartbeat", "component.health", "game-client.bridge"},
RegistrationProof: "hmac-sha256",
ProofMaterialSource: "component-package",
ProofMaterialEnv: "SCUM_COMPONENT_PROOF",
SessionMode: "component-session",
TLSPolicy: "verify-system-roots",
HeartbeatIntervalSeconds: 30,
CommandPollIntervalSeconds: 5,
RequestTimeoutSeconds: 15,
},
})
if response.CompanionConfig == nil || response.CompanionConfig.ProofMaterialEnv != "SCUM_COMPONENT_PROOF" {
t.Fatalf("expected run-only companion projection, got %+v", response.CompanionConfig)
}
encoded, err := json.Marshal(response)
if err != nil {
t.Fatalf("marshal lifecycle input: %v", err)
}
serialized := string(encoded)
for _, forbidden := range []string{`"proofMaterial":`, `"authKey":`, `"componentKey":`, `"sessionToken":`, `"secretRef":`, "/Users/", "run.socket"} {
if strings.Contains(serialized, forbidden) {
t.Fatalf("run lifecycle input leaked %q: %s", forbidden, serialized)
}
}
browserProjection, err := json.Marshal(ClientManagerLifecycleViewFromDomain(domain.ClientManagerLifecycleView{Installation: domain.ClientManagerInstallation{ID: "installation-1"}}))
if err != nil {
t.Fatalf("marshal browser lifecycle projection: %v", err)
}
if strings.Contains(string(browserProjection), "companionConfig") || strings.Contains(string(browserProjection), "proofMaterialEnv") {
t.Fatalf("browser lifecycle projection exposed run-only config: %s", browserProjection)
}
}
-107
View File
@@ -80,19 +80,6 @@ type LogBackfillRequest struct {
IdempotencyKey string `json:"idempotencyKey,omitempty"`
}
type ClientManagerDownloadRequest struct {
ProfileKey string `json:"profileKey,omitempty"`
}
type ClientManagerBuildRequest struct {
ProfileKey string `json:"profileKey"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
RepositoryURL string `json:"repositoryUrl"`
SourceRevision string `json:"sourceRevision,omitempty"`
IdempotencyKey string `json:"idempotencyKey,omitempty"`
}
type ComponentKeyResetRequest struct {
ComponentKind string `json:"componentKind"`
ComponentKey string `json:"componentKey,omitempty"`
@@ -145,26 +132,6 @@ type RunDistributionResponse struct {
UpdatedAt time.Time `json:"updatedAt"`
}
type ClientManagerDistributionResponse struct {
ID string `json:"id"`
ServerInstanceID string `json:"serverInstanceId"`
PluginID string `json:"pluginId"`
ProfileKey string `json:"profileKey"`
Version string `json:"version,omitempty"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
RepositoryURL string `json:"repositoryUrl"`
SourceRevision string `json:"sourceRevision"`
BuildJobID string `json:"buildJobId"`
ArtifactID string `json:"artifactId"`
Checksum string `json:"checksum"`
KeyGeneration int `json:"keyGeneration"`
SecretRef string `json:"secretRef"`
Status string `json:"status"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type DependencyStatusResponse struct {
ID string `json:"id"`
ServerInstanceID string `json:"serverInstanceId"`
@@ -225,25 +192,6 @@ type DependencyCatalogResponse struct {
UpdatedAt time.Time `json:"updatedAt"`
}
type ClientManagerBuildJobResponse struct {
ID string `json:"id"`
ServerInstanceID string `json:"serverInstanceId"`
PluginID string `json:"pluginId"`
ProfileKey string `json:"profileKey"`
Version string `json:"version,omitempty"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
RepositoryURL string `json:"repositoryUrl"`
SourceRevision string `json:"sourceRevision"`
ArtifactID string `json:"artifactId,omitempty"`
Checksum string `json:"checksum,omitempty"`
KeyGeneration int `json:"keyGeneration,omitempty"`
LogsRef string `json:"logsRef,omitempty"`
Status string `json:"status"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type RunUpdateJobResponse struct {
ID string `json:"id"`
ServerInstanceID string `json:"serverInstanceId"`
@@ -310,18 +258,6 @@ func (request LogBackfillRequest) ToDomain(serverInstanceID string) domain.LogBa
}
}
func (request ClientManagerBuildRequest) ToDomain(serverInstanceID string) domain.ClientManagerBuildRequest {
return domain.ClientManagerBuildRequest{
ServerInstanceID: serverInstanceID,
ProfileKey: request.ProfileKey,
TargetOS: request.TargetOS,
TargetArch: request.TargetArch,
RepositoryURL: request.RepositoryURL,
SourceRevision: request.SourceRevision,
IdempotencyKey: request.IdempotencyKey,
}
}
func (request ComponentKeyResetRequest) ToDomain(serverInstanceID string) domain.ComponentKeyResetRequest {
return domain.ComponentKeyResetRequest{
ServerInstanceID: serverInstanceID,
@@ -381,28 +317,6 @@ func RunDistributionFromDomain(distribution domain.RunDistribution) RunDistribut
}
}
func ClientManagerDistributionFromDomain(distribution domain.ClientManagerDistribution) ClientManagerDistributionResponse {
return ClientManagerDistributionResponse{
ID: distribution.ID,
ServerInstanceID: distribution.ServerInstanceID,
PluginID: distribution.PluginID,
ProfileKey: distribution.ProfileKey,
Version: distribution.Version,
TargetOS: distribution.TargetOS,
TargetArch: distribution.TargetArch,
RepositoryURL: distribution.RepositoryURL,
SourceRevision: distribution.SourceRevision,
BuildJobID: distribution.BuildJobID,
ArtifactID: distribution.ArtifactID,
Checksum: distribution.Checksum,
KeyGeneration: distribution.KeyGeneration,
SecretRef: distribution.SecretRef,
Status: string(distribution.Status),
CreatedAt: distribution.CreatedAt,
UpdatedAt: distribution.UpdatedAt,
}
}
func DependencyStatusFromDomain(status domain.DependencyStatus) DependencyStatusResponse {
return DependencyStatusResponse{
ID: status.ID,
@@ -441,27 +355,6 @@ func DependencyCatalogFromDomain(catalog domain.DependencyCatalog) DependencyCat
return DependencyCatalogResponse{ServerInstanceID: catalog.ServerInstanceID, PluginID: catalog.PluginID, PluginVersion: catalog.PluginVersion, ProfileKey: catalog.ProfileKey, TargetOS: catalog.TargetOS, TargetArch: catalog.TargetArch, Probes: probes, Plans: plans, UpdatedAt: catalog.UpdatedAt}
}
func ClientManagerBuildJobFromDomain(job domain.ClientManagerBuildJob) ClientManagerBuildJobResponse {
return ClientManagerBuildJobResponse{
ID: job.ID,
ServerInstanceID: job.ServerInstanceID,
PluginID: job.PluginID,
ProfileKey: job.ProfileKey,
Version: job.Version,
TargetOS: job.TargetOS,
TargetArch: job.TargetArch,
RepositoryURL: job.RepositoryURL,
SourceRevision: job.SourceRevision,
ArtifactID: job.ArtifactID,
Checksum: job.Checksum,
KeyGeneration: job.KeyGeneration,
LogsRef: job.LogsRef,
Status: string(job.Status),
CreatedAt: job.CreatedAt,
UpdatedAt: job.UpdatedAt,
}
}
func RunUpdateJobFromDomain(job domain.RunUpdateJob) RunUpdateJobResponse {
return RunUpdateJobResponse{
ID: job.ID,
+18 -73
View File
@@ -1,6 +1,8 @@
package dto
import (
"encoding/json"
"fmt"
"net/url"
"path"
@@ -27,7 +29,7 @@ type RuntimeLifecycleProfileBody struct {
Capabilities []string `json:"capabilities"`
ActionRefs PluginLifecycleActionsBody `json:"actionRefs,omitempty"`
TransportKeys []string `json:"transportKeys,omitempty"`
ClientManagerRef string `json:"clientManagerRef,omitempty"`
ClientManagerRef json.RawMessage `json:"clientManagerRef,omitempty"`
DLLExtensionRefs []string `json:"dllExtensionRefs,omitempty"`
Platforms []string `json:"platforms,omitempty"`
}
@@ -148,57 +150,6 @@ type RuntimeConfigTemplateBody struct {
OutputRef string `json:"outputRef"`
}
type RuntimeClientManagerDeploymentBody struct {
Mode string `json:"mode"`
ExecutableRef string `json:"executableRef"`
Arguments []string `json:"arguments,omitempty"`
AutoStart bool `json:"autoStart,omitempty"`
RequiredRunCapabilities []string `json:"requiredRunCapabilities"`
}
type RuntimeClientManagerLifecycleBody struct {
Actions []string `json:"actions"`
StartupTimeoutSeconds int `json:"startupTimeoutSeconds"`
StopTimeoutSeconds int `json:"stopTimeoutSeconds"`
}
type RuntimeClientManagerHealthBody struct {
Mode string `json:"mode"`
IntervalSeconds int `json:"intervalSeconds"`
DegradedAfterSeconds int `json:"degradedAfterSeconds"`
OfflineAfterSeconds int `json:"offlineAfterSeconds"`
RequiredCapabilities []string `json:"requiredCapabilities"`
}
type RuntimeClientManagerCompatibilityBody struct {
MinimumVersion string `json:"minimumVersion,omitempty"`
MaximumVersion string `json:"maximumVersion,omitempty"`
AllowDowngrade bool `json:"allowDowngrade"`
}
type RuntimeClientManagerUpdatePolicyBody struct {
Strategy string `json:"strategy"`
RequireApproval bool `json:"requireApproval"`
HealthConfirmationSeconds int `json:"healthConfirmationSeconds"`
RetainPrevious bool `json:"retainPrevious"`
}
type RuntimeClientManagerProfileBody struct {
Key string `json:"key"`
DisplayName string `json:"displayName,omitempty"`
Version string `json:"version,omitempty"`
Repository RuntimeRepositoryBody `json:"repository"`
SupportedTargets []RuntimeTargetBody `json:"supportedTargets"`
Build RuntimeBuildBody `json:"build"`
ConfigTemplates []RuntimeConfigTemplateBody `json:"configTemplates,omitempty"`
OutputArtifacts []string `json:"outputArtifacts"`
Deployment RuntimeClientManagerDeploymentBody `json:"deployment,omitempty"`
Lifecycle RuntimeClientManagerLifecycleBody `json:"lifecycle,omitempty"`
Health RuntimeClientManagerHealthBody `json:"health,omitempty"`
Compatibility RuntimeClientManagerCompatibilityBody `json:"compatibility,omitempty"`
UpdatePolicy RuntimeClientManagerUpdatePolicyBody `json:"updatePolicy,omitempty"`
}
type RuntimeDLLExtensionProfileBody struct {
Key string `json:"key"`
DisplayName string `json:"displayName"`
@@ -264,10 +215,23 @@ type GamePluginRuntimeProfilesBody struct {
LogSources []RuntimeLogSourceBody `json:"logSources,omitempty"`
TransportProfiles []RuntimeTransportProfileBody `json:"transportProfiles,omitempty"`
DataTargets []RuntimeDataTargetBody `json:"dataTargets,omitempty"`
ClientManagers []RuntimeClientManagerProfileBody `json:"clientManagers,omitempty"`
ClientManagers *[]json.RawMessage `json:"clientManagers,omitempty"`
DLLExtensions []RuntimeDLLExtensionProfileBody `json:"dllExtensions,omitempty"`
}
func (body GamePluginRuntimeProfilesBody) UnsupportedLegacyClientManagerViolations(prefix string) []string {
var violations []string
if body.ClientManagers != nil {
violations = append(violations, prefix+".clientManagers is no longer supported")
}
for i, profile := range body.LifecycleProfiles {
if len(profile.ClientManagerRef) > 0 {
violations = append(violations, fmt.Sprintf("%s.lifecycleProfiles[%d].clientManagerRef is no longer supported", prefix, i))
}
}
return violations
}
// GamePluginRuntimeProfilesResponseBody is intentionally distinct from the
// manifest input shape so browser responses cannot accidentally include
// machine-local DLL placement or RCON activation details.
@@ -289,7 +253,7 @@ func (body GamePluginRuntimeProfilesBody) ToDomain() domain.GamePluginRuntimePro
profiles.Discovery = append(profiles.Discovery, domain.RuntimeDiscoveryProbe{Key: item.Key, Kind: item.Kind, TargetKey: item.TargetKey, Required: item.Required, Expected: item.Expected, Platforms: domain.CopyStringSlice(item.Platforms)})
}
for _, item := range body.LifecycleProfiles {
profiles.LifecycleProfiles = append(profiles.LifecycleProfiles, domain.RuntimeLifecycleProfile{Key: item.Key, Mode: item.Mode, Capabilities: domain.CopyStringSlice(item.Capabilities), ActionRefs: item.ActionRefs.ToDomain(), TransportKeys: domain.CopyStringSlice(item.TransportKeys), ClientManagerRef: item.ClientManagerRef, DLLExtensionRefs: domain.CopyStringSlice(item.DLLExtensionRefs), Platforms: domain.CopyStringSlice(item.Platforms)})
profiles.LifecycleProfiles = append(profiles.LifecycleProfiles, domain.RuntimeLifecycleProfile{Key: item.Key, Mode: item.Mode, Capabilities: domain.CopyStringSlice(item.Capabilities), ActionRefs: item.ActionRefs.ToDomain(), TransportKeys: domain.CopyStringSlice(item.TransportKeys), DLLExtensionRefs: domain.CopyStringSlice(item.DLLExtensionRefs), Platforms: domain.CopyStringSlice(item.Platforms)})
}
for _, item := range body.DependencyProbes {
profiles.DependencyProbes = append(profiles.DependencyProbes, domain.RuntimeDependencyProbe{Key: item.Key, Kind: item.Kind, TargetKey: item.TargetKey, Required: item.Required, MinimumVersion: item.MinimumVersion, Platforms: domain.CopyStringSlice(item.Platforms)})
@@ -329,25 +293,6 @@ func (body GamePluginRuntimeProfilesBody) ToDomain() domain.GamePluginRuntimePro
for _, item := range body.DataTargets {
profiles.DataTargets = append(profiles.DataTargets, domain.RuntimeDataTarget{Key: item.Key, Kind: item.Kind, TransportKey: item.TransportKey, SourceRootKey: item.SourceRootKey, SourcePath: item.SourcePath, WorkspaceKey: item.WorkspaceKey, RefreshPolicy: item.RefreshPolicy, MaxBytes: item.MaxBytes, Platforms: domain.CopyStringSlice(item.Platforms)})
}
for _, item := range body.ClientManagers {
manager := domain.RuntimeClientManagerProfile{
Key: item.Key, DisplayName: item.DisplayName, Version: item.Version,
RepositoryURL: item.Repository.URL, RevisionPolicy: item.Repository.RevisionPolicy, Branch: item.Repository.Branch, Tag: item.Repository.Tag, Revision: item.Repository.Revision,
BuildSystem: item.Build.System, WorkspaceRef: item.Build.WorkspaceRef, EntryRef: item.Build.EntryRef, OutputArtifacts: domain.CopyStringSlice(item.OutputArtifacts),
Deployment: domain.RuntimeClientManagerDeployment{Mode: item.Deployment.Mode, ExecutableRef: item.Deployment.ExecutableRef, Arguments: domain.CopyStringSlice(item.Deployment.Arguments), AutoStart: item.Deployment.AutoStart, RequiredRunCapabilities: domain.CopyStringSlice(item.Deployment.RequiredRunCapabilities)},
Lifecycle: domain.RuntimeClientManagerLifecycle{Actions: domain.CopyStringSlice(item.Lifecycle.Actions), StartupTimeoutSeconds: item.Lifecycle.StartupTimeoutSeconds, StopTimeoutSeconds: item.Lifecycle.StopTimeoutSeconds},
Health: domain.RuntimeClientManagerHealth{Mode: item.Health.Mode, IntervalSeconds: item.Health.IntervalSeconds, DegradedAfterSeconds: item.Health.DegradedAfterSeconds, OfflineAfterSeconds: item.Health.OfflineAfterSeconds, RequiredCapabilities: domain.CopyStringSlice(item.Health.RequiredCapabilities)},
Compatibility: domain.RuntimeClientManagerCompatibility{MinimumVersion: item.Compatibility.MinimumVersion, MaximumVersion: item.Compatibility.MaximumVersion, AllowDowngrade: item.Compatibility.AllowDowngrade},
UpdatePolicy: domain.RuntimeClientManagerUpdatePolicy{Strategy: item.UpdatePolicy.Strategy, RequireApproval: item.UpdatePolicy.RequireApproval, HealthConfirmationSeconds: item.UpdatePolicy.HealthConfirmationSeconds, RetainPrevious: item.UpdatePolicy.RetainPrevious},
}
for _, target := range item.SupportedTargets {
manager.SupportedTargets = append(manager.SupportedTargets, domain.RuntimeTarget{OS: target.OS, Arch: target.Arch})
}
for _, config := range item.ConfigTemplates {
manager.ConfigTemplates = append(manager.ConfigTemplates, domain.RuntimeConfigTemplate{Key: config.Key, TemplateRef: config.TemplateRef, OutputRef: config.OutputRef})
}
profiles.ClientManagers = append(profiles.ClientManagers, manager)
}
for _, item := range body.DLLExtensions {
extension := domain.RuntimeDLLExtensionProfile{Key: item.Key, DisplayName: item.DisplayName, Kind: item.Kind, Activation: item.Activation, Version: item.Version, ReleaseState: item.ReleaseState, ReleaseURL: item.ReleaseURL, Checksum: item.Checksum, SizeBytes: item.SizeBytes, TargetKey: item.TargetKey, ModKey: item.ModKey, DLLRef: item.DLLRef, SCUMExecutableChecksum: item.SCUMExecutableChecksum, UE4SSABI: item.UE4SSABI, UpdateOnStart: item.UpdateOnStart, RCONPort: item.RCONPort}
for _, target := range item.SupportedTargets {