diff --git a/catalog/folding.go b/catalog/folding.go index 4991961..85dec0c 100644 --- a/catalog/folding.go +++ b/catalog/folding.go @@ -2,6 +2,29 @@ package catalog const volunteerSciencePluginID = "workflow-plugin-volunteer-science" +func FoldingProviderContract(id, version, configSchemaDigest string) ProviderContract { + runtimeProfile := DefaultProviderRuntimeProfile("service-sandboxed-container", ExecutionSandboxedContainer, ProofArtifactHash) + runtimeProfile.UpstreamClientConformance = UpstreamClientConformanceShapeOnly + return ProviderContract{ + ProtocolVersion: Version, + ID: id, + DisplayName: "Folding@home client", + PluginID: volunteerSciencePluginID, + ProviderID: "folding-at-home", + ContractID: "folding-at-home.client.v1", + Version: version, + ConfigSchemaRef: "schema://providers/workflow-plugin-volunteer-science/folding-at-home/v1", + ConfigSchemaDigest: configSchemaDigest, + OperatingModes: []NetworkOperatingMode{NetworkModeWarmService}, + WorkloadKinds: []string{string(WorkloadService)}, + ExecutorProviders: []string{"service-sandboxed-container"}, + ExecutionSecurityTiers: []ExecutionSecurityTier{ExecutionSandboxedContainer}, + ProofTiers: []ProofTier{ProofArtifactHash}, + NetworkModes: []NetworkMode{NetworkModeDirect}, + RuntimeContract: ProviderRuntimeContract{Profiles: []ProviderRuntimeProfile{runtimeProfile}}, + } +} + func FoldingUpstreamClientRequirement() ProviderUpstreamClientRequirement { runtime := DefaultProviderRuntimeProfile("service-sandboxed-container", ExecutionSandboxedContainer, ProofArtifactHash) return ProviderUpstreamClientRequirement{ diff --git a/catalog/protocol_aliases.go b/catalog/protocol_aliases.go index 5d5a32a..729a283 100644 --- a/catalog/protocol_aliases.go +++ b/catalog/protocol_aliases.go @@ -5,6 +5,11 @@ import core "github.com/GoCodeAlone/workflow-plugin-compute-core/protocol" const ( Version = core.Version + NetworkModeWarmService = core.NetworkModeWarmService + NetworkModeDirect = core.NetworkModeDirect + + WorkloadService = core.WorkloadService + ExecutionSandboxedContainer = core.ExecutionSandboxedContainer ProofArtifactHash = core.ProofArtifactHash @@ -13,6 +18,17 @@ const ( ) type ( + NetworkOperatingMode = core.NetworkOperatingMode + NetworkMode = core.NetworkMode + WorkloadKind = core.WorkloadKind + + ExecutionSecurityTier = core.ExecutionSecurityTier + ProofTier = core.ProofTier + + ProviderContract = core.ProviderContract + ProviderRuntimeContract = core.ProviderRuntimeContract + ProviderRuntimeProfile = core.ProviderRuntimeProfile + ProviderUpstreamClientRequirement = core.ProviderUpstreamClientRequirement ProviderUpstreamImagePolicy = core.ProviderUpstreamImagePolicy ) diff --git a/go.mod b/go.mod index 036c446..d308e54 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.26.0 require ( github.com/GoCodeAlone/workflow v0.62.0 - github.com/GoCodeAlone/workflow-plugin-compute-core v0.0.0-20260524080452-6589b503feb7 + github.com/GoCodeAlone/workflow-plugin-compute-core v0.0.0-20260524205339-f65771b2647b ) require ( diff --git a/go.sum b/go.sum index fd162be..05fd15f 100644 --- a/go.sum +++ b/go.sum @@ -16,6 +16,8 @@ github.com/GoCodeAlone/workflow v0.62.0 h1:emFkTomDpVmBcEfw7quRO4V/J4qDsWNx/CrBd github.com/GoCodeAlone/workflow v0.62.0/go.mod h1:659GGDrw3QJ7b625y9rf8QhKIpt1VCoEG0MxKu5tGQs= github.com/GoCodeAlone/workflow-plugin-compute-core v0.0.0-20260524080452-6589b503feb7 h1:xO0Gf//l3iDEgaw/7ihn2k4js2djvUNB7fVsxtzsbDM= github.com/GoCodeAlone/workflow-plugin-compute-core v0.0.0-20260524080452-6589b503feb7/go.mod h1:1T6uCpUWPCNk6XPYgKq5CL/7LkD24MphKYsYVzF4jnI= +github.com/GoCodeAlone/workflow-plugin-compute-core v0.0.0-20260524205339-f65771b2647b h1:6nW+IJ4l2i7XXqoqYGR7+yAZ3/65fF+/Y63pas3YUKg= +github.com/GoCodeAlone/workflow-plugin-compute-core v0.0.0-20260524205339-f65771b2647b/go.mod h1:1T6uCpUWPCNk6XPYgKq5CL/7LkD24MphKYsYVzF4jnI= github.com/GoCodeAlone/yaegi v0.17.2 h1:WK6Y6e0t1a6U7r+S2dN3CGWW1PizYD3zO0zneToZPxM= github.com/GoCodeAlone/yaegi v0.17.2/go.mod h1:z5Pr6Wse6QJcQvpgxTxzMAevFarH0N37TG88Y9dprx0= github.com/IBM/sarama v1.47.0 h1:GcQFEd12+KzfPYeLgN69Fh7vLCtYRhVIx0rO4TZO318= diff --git a/internal/plugin_test.go b/internal/plugin_test.go index 13b1955..792f184 100644 --- a/internal/plugin_test.go +++ b/internal/plugin_test.go @@ -92,3 +92,37 @@ func TestFoldingUpstreamClientRequirement_DocumentsImagePolicy(t *testing.T) { t.Fatalf("folding upstream requirement should include CPU/GPU image-family guidance: %+v", req.ImagePolicy) } } + +func TestFoldingProviderContract_DocumentsWarmServiceRuntime(t *testing.T) { + contract := catalog.FoldingProviderContract( + "folding-at-home-client-v1", + "v1.0.0", + "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + ) + if err := contract.Validate(); err != nil { + t.Fatalf("folding provider contract invalid: %v", err) + } + if contract.ProtocolVersion != catalog.Version || + contract.PluginID != "workflow-plugin-volunteer-science" || + contract.ProviderID != "folding-at-home" || + contract.ContractID != "folding-at-home.client.v1" || + contract.Version != "v1.0.0" { + t.Fatalf("folding provider contract identity: %+v", contract) + } + if contract.OperatingModes[0] != catalog.NetworkModeWarmService || + contract.WorkloadKinds[0] != string(catalog.WorkloadService) || + contract.ExecutorProviders[0] != "service-sandboxed-container" || + contract.NetworkModes[0] != catalog.NetworkModeDirect { + t.Fatalf("folding provider contract runtime envelope: %+v", contract) + } + if len(contract.RuntimeContract.Profiles) != 1 { + t.Fatalf("runtime profiles: %+v", contract.RuntimeContract) + } + runtime := contract.RuntimeContract.Profiles[0] + if runtime.ExecutorProvider != "service-sandboxed-container" || + runtime.ExecutionSecurityTier != catalog.ExecutionSandboxedContainer || + runtime.ProofTier != catalog.ProofArtifactHash || + runtime.UpstreamClientConformance != catalog.UpstreamClientConformanceShapeOnly { + t.Fatalf("folding runtime profile: %+v", runtime) + } +}