From 6da67d29ad6b8fa7625faf0c883a654c7215cb85 Mon Sep 17 00:00:00 2001 From: "denys.kostynchuk" Date: Wed, 11 Mar 2026 06:52:09 +1300 Subject: [PATCH 1/2] Add Publish operation for platform hub policy Use single instance of validator for policy validations --- .../platform_hub_policy.go | 17 ++++++- .../platform_hub_policy_version_service.go | 45 +++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 pkg/platformhubpolicies/platform_hub_policy_version_service.go diff --git a/pkg/platformhubpolicies/platform_hub_policy.go b/pkg/platformhubpolicies/platform_hub_policy.go index c5638e93..062f23f1 100644 --- a/pkg/platformhubpolicies/platform_hub_policy.go +++ b/pkg/platformhubpolicies/platform_hub_policy.go @@ -1,6 +1,8 @@ package platformhubpolicies import ( + "sync" + "github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10/non-standard/validators" ) @@ -107,11 +109,22 @@ func (p *PlatformHubPolicy) SetViolationAction(violationAction string) { // Validate checks the state of the policy and returns an error if invalid. func (p *PlatformHubPolicy) Validate() error { + validate, err := getValidator() + if err != nil { + return err + } + + return validate.Struct(p) +} + +var getValidator = sync.OnceValues(buildValidator) + +func buildValidator() (*validator.Validate, error) { v := validator.New() err := v.RegisterValidation("notblank", validators.NotBlank) if err != nil { - return err + return nil, err } - return v.Struct(p) + return v, nil } diff --git a/pkg/platformhubpolicies/platform_hub_policy_version_service.go b/pkg/platformhubpolicies/platform_hub_policy_version_service.go new file mode 100644 index 00000000..9674a2b2 --- /dev/null +++ b/pkg/platformhubpolicies/platform_hub_policy_version_service.go @@ -0,0 +1,45 @@ +package platformhubpolicies + +import ( + "time" + + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/newclient" +) + +const publishTemplate = "/api/platformhub/{gitRef}/policies/{slug}/publish" + +// PlatformHubPolicyVersion represents an immutable published version of a Platform Hub policy. +type PlatformHubPolicyVersion struct { + ID string `json:"Id"` + Slug string `json:"Slug"` + Version string `json:"Version"` + PublishedDate time.Time `json:"PublishedDate"` + GitRef string `json:"GitRef"` + GitCommit string `json:"GitCommit"` + Name string `json:"Name"` + Description string `json:"Description,omitempty"` + ViolationReason string `json:"ViolationReason,omitempty"` + ViolationAction string `json:"ViolationAction"` + RegoScope string `json:"RegoScope"` + RegoConditions string `json:"RegoConditions"` + IsActive bool `json:"IsActive"` +} + +// Publish publishes a Platform Hub policy version. +func Publish(client newclient.Client, gitRef string, slug string, version string) (PlatformHubPolicyVersion, error) { + path, pathError := client.URITemplateCache().Expand(publishTemplate, map[string]any{"gitRef": gitRef, "slug": slug}) + if pathError != nil { + return PlatformHubPolicyVersion{}, pathError + } + + body := struct { + Version string `json:"Version"` + }{Version: version} + + publishedVersion, err := newclient.Post[PlatformHubPolicyVersion](client.HttpSession(), path, body) + if err != nil { + return PlatformHubPolicyVersion{}, err + } + + return *publishedVersion, nil +} From ec9750bdeb2a6423a3b8849eff203246304266c2 Mon Sep 17 00:00:00 2001 From: "denys.kostynchuk" Date: Wed, 11 Mar 2026 07:28:04 +1300 Subject: [PATCH 2/2] Add Activate and Deactivate operations to platform hub policy versions --- .../platform_hub_policy_version_service.go | 57 ++++++++++++++++++- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/pkg/platformhubpolicies/platform_hub_policy_version_service.go b/pkg/platformhubpolicies/platform_hub_policy_version_service.go index 9674a2b2..ee74ae30 100644 --- a/pkg/platformhubpolicies/platform_hub_policy_version_service.go +++ b/pkg/platformhubpolicies/platform_hub_policy_version_service.go @@ -6,8 +6,6 @@ import ( "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/newclient" ) -const publishTemplate = "/api/platformhub/{gitRef}/policies/{slug}/publish" - // PlatformHubPolicyVersion represents an immutable published version of a Platform Hub policy. type PlatformHubPolicyVersion struct { ID string `json:"Id"` @@ -27,7 +25,7 @@ type PlatformHubPolicyVersion struct { // Publish publishes a Platform Hub policy version. func Publish(client newclient.Client, gitRef string, slug string, version string) (PlatformHubPolicyVersion, error) { - path, pathError := client.URITemplateCache().Expand(publishTemplate, map[string]any{"gitRef": gitRef, "slug": slug}) + path, pathError := client.URITemplateCache().Expand("/api/platformhub/{gitRef}/policies/{slug}/publish", map[string]any{"gitRef": gitRef, "slug": slug}) if pathError != nil { return PlatformHubPolicyVersion{}, pathError } @@ -43,3 +41,56 @@ func Publish(client newclient.Client, gitRef string, slug string, version string return *publishedVersion, nil } + +// VersionsQuery represents query parameters for listing policy versions. +type VersionsQuery struct { + Slug string `uri:"slug"` + Skip int `uri:"skip,omitempty"` + Take int `uri:"take,omitempty"` +} + +// GetVersions returns published versions of a Platform Hub policy. +func GetVersions(client newclient.Client, query VersionsQuery) ([]PlatformHubPolicyVersion, error) { + path, pathError := client.URITemplateCache().Expand("/api/platformhub/policies/{slug}/versions{?skip,take}", query) + if pathError != nil { + return nil, pathError + } + + versions, err := newclient.Get[[]PlatformHubPolicyVersion](client.HttpSession(), path) + if err != nil { + return nil, err + } + + return *versions, nil +} + +// ActivateVersion activates a published Platform Hub policy version. +func ActivateVersion(client newclient.Client, version PlatformHubPolicyVersion) (PlatformHubPolicyVersion, error) { + return modifyVersionStatus(client, version, true) +} + +// DeactivateVersion deactivates a published Platform Hub policy version. +func DeactivateVersion(client newclient.Client, version PlatformHubPolicyVersion) (PlatformHubPolicyVersion, error) { + return modifyVersionStatus(client, version, false) +} + +func modifyVersionStatus(client newclient.Client, version PlatformHubPolicyVersion, isActive bool) (PlatformHubPolicyVersion, error) { + path, pathError := client.URITemplateCache().Expand("/api/platformhub/policies/{slug}/versions/{version}/modify-status", map[string]any{ + "slug": version.Slug, + "version": version.Version, + }) + if pathError != nil { + return version, pathError + } + + body := struct { + IsActive bool `json:"IsActive"` + }{IsActive: isActive} + + modifiedVersion, err := newclient.Post[PlatformHubPolicyVersion](client.HttpSession(), path, body) + if err != nil { + return version, err + } + + return *modifiedVersion, nil +}