From fa9cfe9ec34ab4cf556ac25ae2fb6a13ca233d37 Mon Sep 17 00:00:00 2001 From: Hideaki Murakami Date: Fri, 31 Oct 2025 11:22:09 +1300 Subject: [PATCH 01/15] Create retention base class --- pkg/retention/retention_type.go | 8 +++++++ .../space_default_retention_policy.go | 23 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 pkg/retention/retention_type.go create mode 100644 pkg/retention/space_default_retention_policy.go diff --git a/pkg/retention/retention_type.go b/pkg/retention/retention_type.go new file mode 100644 index 00000000..21513ba2 --- /dev/null +++ b/pkg/retention/retention_type.go @@ -0,0 +1,8 @@ +package retention + +type RetentionType string + +const ( + LifecycleReleaseRetentionType = RetentionType("LifecycleRelease") + LifecycleTentacleRetentionType = RetentionType("LifecycleTentacle") +) \ No newline at end of file diff --git a/pkg/retention/space_default_retention_policy.go b/pkg/retention/space_default_retention_policy.go new file mode 100644 index 00000000..843d19f7 --- /dev/null +++ b/pkg/retention/space_default_retention_policy.go @@ -0,0 +1,23 @@ +package retention + +import ( + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" +) + +type SpaceDefaultRetentionPolicy struct { + SpaceId string `json:"SpaceId"` + Id string `json:"Id"` + Name string `json:"Name"` + RetentionType RetentionType `json:"RetentionType"` + resources.Resource +} + +const ( + RetentionStrategyForever string = "Forever" + RetentionStrategyCount string = "Count" +) + +const ( + RetentionUnitDays string = "Days" + RetentionUnitItems string = "Items" +) From e8c342d11225fe5f2fc0a3a45265462bb03d631c Mon Sep 17 00:00:00 2001 From: Hideaki Murakami Date: Fri, 31 Oct 2025 11:22:33 +1300 Subject: [PATCH 02/15] Create lifecycle retention types --- .../space_default_lifecycle_release_retention_policy.go | 9 +++++++++ .../space_default_lifecycle_tentacle_retention_policy.go | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 pkg/retention/space_default_lifecycle_release_retention_policy.go create mode 100644 pkg/retention/space_default_lifecycle_tentacle_retention_policy.go diff --git a/pkg/retention/space_default_lifecycle_release_retention_policy.go b/pkg/retention/space_default_lifecycle_release_retention_policy.go new file mode 100644 index 00000000..7cf70c21 --- /dev/null +++ b/pkg/retention/space_default_lifecycle_release_retention_policy.go @@ -0,0 +1,9 @@ +package retention + + +type LifecycleReleaseRetentionPolicy struct { + QuantityToKeep int `json:"QuantityToKeep"` + Strategy string `json:"Strategy"` + Unit string `json:"Unit"` + SpaceDefaultRetentionPolicy +} diff --git a/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go new file mode 100644 index 00000000..1fb4e65f --- /dev/null +++ b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go @@ -0,0 +1,9 @@ +package retention + + +type LifecycleTentacleRetentionPolicy struct { + QuantityToKeep int `json:"QuantityToKeep"` + Strategy string `json:"Strategy"` + Unit string `json:"Unit"` + SpaceDefaultRetentionPolicy +} \ No newline at end of file From db5365c766b09b7e8718a0bce46276080ac421ce Mon Sep 17 00:00:00 2001 From: Hideaki Murakami Date: Fri, 31 Oct 2025 11:22:45 +1300 Subject: [PATCH 03/15] Add constructor for lifecycle release retention --- ...default_lifecycle_release_retention_policy.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pkg/retention/space_default_lifecycle_release_retention_policy.go b/pkg/retention/space_default_lifecycle_release_retention_policy.go index 7cf70c21..e0fda62a 100644 --- a/pkg/retention/space_default_lifecycle_release_retention_policy.go +++ b/pkg/retention/space_default_lifecycle_release_retention_policy.go @@ -7,3 +7,19 @@ type LifecycleReleaseRetentionPolicy struct { Unit string `json:"Unit"` SpaceDefaultRetentionPolicy } + +func CountBasedLifecycleReleaseRetentionPolicy(quantityToKeep int, unit string) *LifecycleReleaseRetentionPolicy { + return &LifecycleReleaseRetentionPolicy{ + QuantityToKeep: quantityToKeep, + Strategy: RetentionStrategyCount, + Unit: unit, + } +} + +func KeepForeverLifecycleReleaseRetentionPolicy() *LifecycleReleaseRetentionPolicy { + return &LifecycleReleaseRetentionPolicy{ + QuantityToKeep: 0, + Strategy: RetentionStrategyForever, + Unit: RetentionUnitItems, + } +} From 3364f349337cf1859205a0895c755079510252a2 Mon Sep 17 00:00:00 2001 From: Hideaki Murakami Date: Fri, 31 Oct 2025 11:22:56 +1300 Subject: [PATCH 04/15] WIP retention service --- pkg/retention/space_default_retention_policy_service.go | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pkg/retention/space_default_retention_policy_service.go diff --git a/pkg/retention/space_default_retention_policy_service.go b/pkg/retention/space_default_retention_policy_service.go new file mode 100644 index 00000000..e69de29b From e813fa082786518b3175b2325bfa27d98fefd007 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Mon, 3 Nov 2025 17:00:02 +1300 Subject: [PATCH 05/15] add untested go client for update and get --- pkg/constants/constants_services.go | 1 + ...ault_lifecycle_release_retention_policy.go | 9 +++-- ...ult_lifecycle_tentacle_retention_policy.go | 7 ++-- .../space_default_retention_policy.go | 11 +++++-- .../space_default_retention_policy_service.go | 33 +++++++++++++++++++ ...e_default_retention_policy_service_test.go | 1 + 6 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 pkg/retention/space_default_retention_policy_service_test.go diff --git a/pkg/constants/constants_services.go b/pkg/constants/constants_services.go index 4f48d04d..b43ad653 100644 --- a/pkg/constants/constants_services.go +++ b/pkg/constants/constants_services.go @@ -64,6 +64,7 @@ const ( ServiceServerConfigurationService string = "ServerConfigurationService" ServiceServerStatusService string = "ServerStatusService" ServiceSpaceService string = "SpaceService" + ServiceSpaceDefaultRetentionPolicyService string = "SpaceDefaultRetentionPolicyService" ServiceSMTPConfigurationService string = "SMTPConfigurationService" ServiceSubscriptionService string = "SubscriptionService" ServiceTagSetService string = "TagSetService" diff --git a/pkg/retention/space_default_lifecycle_release_retention_policy.go b/pkg/retention/space_default_lifecycle_release_retention_policy.go index e0fda62a..a186359c 100644 --- a/pkg/retention/space_default_lifecycle_release_retention_policy.go +++ b/pkg/retention/space_default_lifecycle_release_retention_policy.go @@ -1,10 +1,9 @@ package retention - type LifecycleReleaseRetentionPolicy struct { - QuantityToKeep int `json:"QuantityToKeep"` + QuantityToKeep int `json:"QuantityToKeep"` Strategy string `json:"Strategy"` - Unit string `json:"Unit"` + Unit string `json:"Unit"` SpaceDefaultRetentionPolicy } @@ -12,7 +11,7 @@ func CountBasedLifecycleReleaseRetentionPolicy(quantityToKeep int, unit string) return &LifecycleReleaseRetentionPolicy{ QuantityToKeep: quantityToKeep, Strategy: RetentionStrategyCount, - Unit: unit, + Unit: unit, } } @@ -20,6 +19,6 @@ func KeepForeverLifecycleReleaseRetentionPolicy() *LifecycleReleaseRetentionPoli return &LifecycleReleaseRetentionPolicy{ QuantityToKeep: 0, Strategy: RetentionStrategyForever, - Unit: RetentionUnitItems, + Unit: RetentionUnitItems, } } diff --git a/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go index 1fb4e65f..8251e962 100644 --- a/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go +++ b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go @@ -1,9 +1,8 @@ package retention - type LifecycleTentacleRetentionPolicy struct { - QuantityToKeep int `json:"QuantityToKeep"` + QuantityToKeep int `json:"QuantityToKeep"` Strategy string `json:"Strategy"` - Unit string `json:"Unit"` + Unit string `json:"Unit"` SpaceDefaultRetentionPolicy -} \ No newline at end of file +} diff --git a/pkg/retention/space_default_retention_policy.go b/pkg/retention/space_default_retention_policy.go index 843d19f7..310468e4 100644 --- a/pkg/retention/space_default_retention_policy.go +++ b/pkg/retention/space_default_retention_policy.go @@ -5,9 +5,9 @@ import ( ) type SpaceDefaultRetentionPolicy struct { - SpaceId string `json:"SpaceId"` - Id string `json:"Id"` - Name string `json:"Name"` + SpaceId string `json:"SpaceId"` + Id string `json:"Id"` + Name string `json:"Name"` RetentionType RetentionType `json:"RetentionType"` resources.Resource } @@ -21,3 +21,8 @@ const ( RetentionUnitDays string = "Days" RetentionUnitItems string = "Items" ) + +// PolicyResource contains all possible fields whereas Policy just contains +func (policy *SpaceDefaultRetentionPolicy) GetSpaceID() string { + return policy.SpaceId +} diff --git a/pkg/retention/space_default_retention_policy_service.go b/pkg/retention/space_default_retention_policy_service.go index e69de29b..9b5bfd09 100644 --- a/pkg/retention/space_default_retention_policy_service.go +++ b/pkg/retention/space_default_retention_policy_service.go @@ -0,0 +1,33 @@ +package retention + +import ( + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/newclient" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/services" +) + +type SpaceDefaultRetentionPolicyService struct { + services.Service +} + +type SpaceDefaultRetentionPolicyQuery struct { + RetentionType string `url:"type"` + SpaceID string `url:"spaceId"` +} + +const template = "/api/{spaceId}/retentionpolicies{?type}}" + +func Get(client newclient.Client, spaceDefaultRetentionPolicyQuery SpaceDefaultRetentionPolicyQuery) (*SpaceDefaultRetentionPolicy, error) { + res, err := newclient.GetResourceByQuery[SpaceDefaultRetentionPolicy](client, template, spaceDefaultRetentionPolicyQuery) + if err != nil { + return nil, err + } + return res, nil +} + +func Update(client newclient.Client, spaceDefaultRetentionPolicy SpaceDefaultRetentionPolicy) (*SpaceDefaultRetentionPolicy, error) { + res, err := newclient.Update[SpaceDefaultRetentionPolicy](client, template, spaceDefaultRetentionPolicy.GetSpaceID(), spaceDefaultRetentionPolicy.ID, spaceDefaultRetentionPolicy) + if err != nil { + return nil, err + } + return res, err +} diff --git a/pkg/retention/space_default_retention_policy_service_test.go b/pkg/retention/space_default_retention_policy_service_test.go new file mode 100644 index 00000000..4d6b2f1d --- /dev/null +++ b/pkg/retention/space_default_retention_policy_service_test.go @@ -0,0 +1 @@ +package retention From 4a6384a574d7f5af94eedf6927699b77ac4db9ab Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Wed, 5 Nov 2025 10:59:04 +1300 Subject: [PATCH 06/15] add testing for getting and modifying default lifecycle retention policies --- ...e_default_retention_policy_service_test.go | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 test/e2e/space_default_retention_policy_service_test.go diff --git a/test/e2e/space_default_retention_policy_service_test.go b/test/e2e/space_default_retention_policy_service_test.go new file mode 100644 index 00000000..15af38b2 --- /dev/null +++ b/test/e2e/space_default_retention_policy_service_test.go @@ -0,0 +1,107 @@ +package e2e + +import ( + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/retention" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/spaces" + "github.com/stretchr/testify/require" + "testing" +) + +func TestReadLifecycleReleaseRetentionDefaultPolicy(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + + defaultSpace, _ := spaces.GetDefaultSpace(client) + query := retention.SpaceDefaultRetentionPolicyQuery{ + retention.LifecycleReleaseRetentionType, + defaultSpace.ID, + } + res, err := retention.Get(client, query) + + require.NoError(t, err) + require.NotNil(t, res) + require.Equal(t, res.RetentionType, retention.LifecycleReleaseRetentionType) +} + +func TestReadLifecycleTentacleRetentionDefaultPolicy(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + + defaultSpace, _ := spaces.GetDefaultSpace(client) + query := retention.SpaceDefaultRetentionPolicyQuery{ + retention.LifecycleTentacleRetentionType, + defaultSpace.ID, + } + res, err := retention.Get(client, query) + + require.NoError(t, err) + require.NotNil(t, res) + require.Equal(t, res.RetentionType, retention.LifecycleTentacleRetentionType) +} + +func TestModifyLifecycleReleaseRetentionDefaultPolicy(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + defaultSpace, _ := spaces.GetDefaultSpace(client) + query := retention.SpaceDefaultRetentionPolicyQuery{ + retention.LifecycleReleaseRetentionType, + defaultSpace.ID, + } + defaultSpaceLifecycleReleasePolicy, err := retention.Get(client, query) + if err != nil { + t.Fatal(err) + } + + policy := retention.LifecycleReleaseRetentionPolicy{ + Unit: retention.RetentionUnitItems, + QuantityToKeep: 4, + Strategy: retention.RetentionStrategyCount, + SpaceDefaultRetentionPolicy: retention.SpaceDefaultRetentionPolicy{ + SpaceId: defaultSpace.ID, + RetentionType: retention.LifecycleReleaseRetentionType, + Resource: resources.Resource{ + ID: defaultSpaceLifecycleReleasePolicy.ID, + }, + }, + } + res, err := retention.Update(client, &policy) + require.NoError(t, err) + require.NotNil(t, res) + require.Equal(t, res.QuantityToKeep, 4) + require.Equal(t, res.Strategy, retention.RetentionStrategyCount) + require.Equal(t, res.Unit, retention.RetentionUnitItems) +} + +func TestModifyLifecycleTentacleRetentionDefaultPolicy(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + defaultSpace, _ := spaces.GetDefaultSpace(client) + query := retention.SpaceDefaultRetentionPolicyQuery{ + retention.LifecycleTentacleRetentionType, + defaultSpace.ID, + } + defaultSpaceLifecycleReleasePolicy, err := retention.Get(client, query) + if err != nil { + t.Fatal(err) + } + + policy := retention.LifecycleTentacleRetentionPolicy{ + Unit: retention.RetentionUnitDays, + QuantityToKeep: 3, + Strategy: retention.RetentionStrategyCount, + SpaceDefaultRetentionPolicy: retention.SpaceDefaultRetentionPolicy{ + SpaceId: defaultSpace.ID, + RetentionType: retention.LifecycleTentacleRetentionType, + Resource: resources.Resource{ + ID: defaultSpaceLifecycleReleasePolicy.ID, + }, + }, + } + res, err := retention.Update(client, &policy) + require.NoError(t, err) + require.NotNil(t, res) + require.Equal(t, res.QuantityToKeep, 3) + require.Equal(t, res.Strategy, retention.RetentionStrategyCount) + require.Equal(t, res.Unit, retention.RetentionUnitDays) +} From e3359535a222032d4a9fd5d6a4a8de7edcc38d46 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Wed, 5 Nov 2025 10:59:33 +1300 Subject: [PATCH 07/15] edit get and modify lifecycle default retention policies --- pkg/retention/space_default_retention_policy.go | 13 ++++++++++++- .../space_default_retention_policy_service.go | 10 +++++----- .../space_default_retention_policy_service_test.go | 1 - 3 files changed, 17 insertions(+), 7 deletions(-) delete mode 100644 pkg/retention/space_default_retention_policy_service_test.go diff --git a/pkg/retention/space_default_retention_policy.go b/pkg/retention/space_default_retention_policy.go index 310468e4..a6aecace 100644 --- a/pkg/retention/space_default_retention_policy.go +++ b/pkg/retention/space_default_retention_policy.go @@ -6,7 +6,6 @@ import ( type SpaceDefaultRetentionPolicy struct { SpaceId string `json:"SpaceId"` - Id string `json:"Id"` Name string `json:"Name"` RetentionType RetentionType `json:"RetentionType"` resources.Resource @@ -26,3 +25,15 @@ const ( func (policy *SpaceDefaultRetentionPolicy) GetSpaceID() string { return policy.SpaceId } + +type SpaceDefaultRetentionPolicyResource struct { + SpaceDefaultRetentionPolicy + QuantityToKeep int `json:"QuantityToKeep"` + Strategy string `json:"Strategy"` + Unit string `json:"Unit"` +} + +type ISpaceDefaultRetentionPolicy interface { + GetSpaceID() string + resources.IResource +} diff --git a/pkg/retention/space_default_retention_policy_service.go b/pkg/retention/space_default_retention_policy_service.go index 9b5bfd09..4c205c0e 100644 --- a/pkg/retention/space_default_retention_policy_service.go +++ b/pkg/retention/space_default_retention_policy_service.go @@ -10,11 +10,11 @@ type SpaceDefaultRetentionPolicyService struct { } type SpaceDefaultRetentionPolicyQuery struct { - RetentionType string `url:"type"` - SpaceID string `url:"spaceId"` + RetentionType RetentionType `uri:"RetentionType"` + SpaceID string `uri:"spaceId"` } -const template = "/api/{spaceId}/retentionpolicies{?type}}" +const template = "/api/{spaceId}/retentionpolicies{/id}{?RetentionType}" func Get(client newclient.Client, spaceDefaultRetentionPolicyQuery SpaceDefaultRetentionPolicyQuery) (*SpaceDefaultRetentionPolicy, error) { res, err := newclient.GetResourceByQuery[SpaceDefaultRetentionPolicy](client, template, spaceDefaultRetentionPolicyQuery) @@ -24,8 +24,8 @@ func Get(client newclient.Client, spaceDefaultRetentionPolicyQuery SpaceDefaultR return res, nil } -func Update(client newclient.Client, spaceDefaultRetentionPolicy SpaceDefaultRetentionPolicy) (*SpaceDefaultRetentionPolicy, error) { - res, err := newclient.Update[SpaceDefaultRetentionPolicy](client, template, spaceDefaultRetentionPolicy.GetSpaceID(), spaceDefaultRetentionPolicy.ID, spaceDefaultRetentionPolicy) +func Update(client newclient.Client, spaceDefaultRetentionPolicy ISpaceDefaultRetentionPolicy) (*SpaceDefaultRetentionPolicyResource, error) { + res, err := newclient.Update[SpaceDefaultRetentionPolicyResource](client, template, spaceDefaultRetentionPolicy.GetSpaceID(), spaceDefaultRetentionPolicy.GetID(), spaceDefaultRetentionPolicy) if err != nil { return nil, err } diff --git a/pkg/retention/space_default_retention_policy_service_test.go b/pkg/retention/space_default_retention_policy_service_test.go deleted file mode 100644 index 4d6b2f1d..00000000 --- a/pkg/retention/space_default_retention_policy_service_test.go +++ /dev/null @@ -1 +0,0 @@ -package retention From 504e0edb6ff949dad3a31a475ff4228ce1d9616c Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Wed, 5 Nov 2025 11:40:07 +1300 Subject: [PATCH 08/15] update count based policy functions --- ...ault_lifecycle_release_retention_policy.go | 20 ++++++++++-- ...ult_lifecycle_tentacle_retention_policy.go | 32 +++++++++++++++++++ .../space_default_retention_policy.go | 9 +++--- ...e_default_retention_policy_service_test.go | 32 +++---------------- 4 files changed, 59 insertions(+), 34 deletions(-) diff --git a/pkg/retention/space_default_lifecycle_release_retention_policy.go b/pkg/retention/space_default_lifecycle_release_retention_policy.go index a186359c..3b12cb7b 100644 --- a/pkg/retention/space_default_lifecycle_release_retention_policy.go +++ b/pkg/retention/space_default_lifecycle_release_retention_policy.go @@ -1,5 +1,7 @@ package retention +import "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" + type LifecycleReleaseRetentionPolicy struct { QuantityToKeep int `json:"QuantityToKeep"` Strategy string `json:"Strategy"` @@ -7,18 +9,32 @@ type LifecycleReleaseRetentionPolicy struct { SpaceDefaultRetentionPolicy } -func CountBasedLifecycleReleaseRetentionPolicy(quantityToKeep int, unit string) *LifecycleReleaseRetentionPolicy { +func CountBasedLifecycleReleaseRetentionPolicy(quantityToKeep int, unit string, spaceId string, policyId string) *LifecycleReleaseRetentionPolicy { return &LifecycleReleaseRetentionPolicy{ QuantityToKeep: quantityToKeep, Strategy: RetentionStrategyCount, Unit: unit, + SpaceDefaultRetentionPolicy: SpaceDefaultRetentionPolicy{ + SpaceId: spaceId, + RetentionType: LifecycleReleaseRetentionType, + Resource: resources.Resource{ + ID: policyId, + }, + }, } } -func KeepForeverLifecycleReleaseRetentionPolicy() *LifecycleReleaseRetentionPolicy { +func KeepForeverLifecycleReleaseRetentionPolicy(spaceId string, policyId string) *LifecycleReleaseRetentionPolicy { return &LifecycleReleaseRetentionPolicy{ QuantityToKeep: 0, Strategy: RetentionStrategyForever, Unit: RetentionUnitItems, + SpaceDefaultRetentionPolicy: SpaceDefaultRetentionPolicy{ + SpaceId: spaceId, + RetentionType: LifecycleReleaseRetentionType, + Resource: resources.Resource{ + ID: policyId, + }, + }, } } diff --git a/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go index 8251e962..1162bb28 100644 --- a/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go +++ b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go @@ -1,8 +1,40 @@ package retention +import "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" + type LifecycleTentacleRetentionPolicy struct { QuantityToKeep int `json:"QuantityToKeep"` Strategy string `json:"Strategy"` Unit string `json:"Unit"` SpaceDefaultRetentionPolicy } + +func CountBasedLifecycleTentacleRetentionPolicy(quantityToKeep int, unit string, spaceId string, policyId string) *LifecycleTentacleRetentionPolicy { + return &LifecycleTentacleRetentionPolicy{ + QuantityToKeep: quantityToKeep, + Strategy: RetentionStrategyCount, + Unit: unit, + SpaceDefaultRetentionPolicy: SpaceDefaultRetentionPolicy{ + SpaceId: spaceId, + RetentionType: LifecycleTentacleRetentionType, + Resource: resources.Resource{ + ID: policyId, + }, + }, + } +} + +func KeepForeverLifecycleTentacleRetentionPolicy(spaceId string, policyId string) *LifecycleTentacleRetentionPolicy { + return &LifecycleTentacleRetentionPolicy{ + QuantityToKeep: 0, + Strategy: RetentionStrategyForever, + Unit: RetentionUnitItems, + SpaceDefaultRetentionPolicy: SpaceDefaultRetentionPolicy{ + SpaceId: spaceId, + RetentionType: LifecycleTentacleRetentionType, + Resource: resources.Resource{ + ID: policyId, + }, + }, + } +} diff --git a/pkg/retention/space_default_retention_policy.go b/pkg/retention/space_default_retention_policy.go index a6aecace..e84aae1c 100644 --- a/pkg/retention/space_default_retention_policy.go +++ b/pkg/retention/space_default_retention_policy.go @@ -21,11 +21,6 @@ const ( RetentionUnitItems string = "Items" ) -// PolicyResource contains all possible fields whereas Policy just contains -func (policy *SpaceDefaultRetentionPolicy) GetSpaceID() string { - return policy.SpaceId -} - type SpaceDefaultRetentionPolicyResource struct { SpaceDefaultRetentionPolicy QuantityToKeep int `json:"QuantityToKeep"` @@ -37,3 +32,7 @@ type ISpaceDefaultRetentionPolicy interface { GetSpaceID() string resources.IResource } + +func (policy *SpaceDefaultRetentionPolicy) GetSpaceID() string { + return policy.SpaceId +} diff --git a/test/e2e/space_default_retention_policy_service_test.go b/test/e2e/space_default_retention_policy_service_test.go index 15af38b2..af0e1649 100644 --- a/test/e2e/space_default_retention_policy_service_test.go +++ b/test/e2e/space_default_retention_policy_service_test.go @@ -1,7 +1,6 @@ package e2e import ( - "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/retention" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/spaces" "github.com/stretchr/testify/require" @@ -53,19 +52,9 @@ func TestModifyLifecycleReleaseRetentionDefaultPolicy(t *testing.T) { t.Fatal(err) } - policy := retention.LifecycleReleaseRetentionPolicy{ - Unit: retention.RetentionUnitItems, - QuantityToKeep: 4, - Strategy: retention.RetentionStrategyCount, - SpaceDefaultRetentionPolicy: retention.SpaceDefaultRetentionPolicy{ - SpaceId: defaultSpace.ID, - RetentionType: retention.LifecycleReleaseRetentionType, - Resource: resources.Resource{ - ID: defaultSpaceLifecycleReleasePolicy.ID, - }, - }, - } - res, err := retention.Update(client, &policy) + policy := retention.CountBasedLifecycleReleaseRetentionPolicy(4, retention.RetentionUnitItems, defaultSpace.ID, defaultSpaceLifecycleReleasePolicy.ID) + + res, err := retention.Update(client, policy) require.NoError(t, err) require.NotNil(t, res) require.Equal(t, res.QuantityToKeep, 4) @@ -86,19 +75,8 @@ func TestModifyLifecycleTentacleRetentionDefaultPolicy(t *testing.T) { t.Fatal(err) } - policy := retention.LifecycleTentacleRetentionPolicy{ - Unit: retention.RetentionUnitDays, - QuantityToKeep: 3, - Strategy: retention.RetentionStrategyCount, - SpaceDefaultRetentionPolicy: retention.SpaceDefaultRetentionPolicy{ - SpaceId: defaultSpace.ID, - RetentionType: retention.LifecycleTentacleRetentionType, - Resource: resources.Resource{ - ID: defaultSpaceLifecycleReleasePolicy.ID, - }, - }, - } - res, err := retention.Update(client, &policy) + policy := retention.CountBasedLifecycleTentacleRetentionPolicy(3, retention.RetentionUnitDays, defaultSpace.ID, defaultSpaceLifecycleReleasePolicy.ID) + res, err := retention.Update(client, policy) require.NoError(t, err) require.NotNil(t, res) require.Equal(t, res.QuantityToKeep, 3) From 4f5bf60daff71e46dbeed0d70e7db15887bf50a8 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Wed, 5 Nov 2025 11:56:47 +1300 Subject: [PATCH 09/15] refactor --- pkg/retention/retention_policy.go | 18 ++++++++++++++++++ pkg/retention/retention_type.go | 8 -------- .../space_default_retention_policy.go | 10 ---------- .../space_default_retention_policy_query.go | 6 ++++++ .../space_default_retention_policy_service.go | 5 ----- 5 files changed, 24 insertions(+), 23 deletions(-) create mode 100644 pkg/retention/retention_policy.go delete mode 100644 pkg/retention/retention_type.go create mode 100644 pkg/retention/space_default_retention_policy_query.go diff --git a/pkg/retention/retention_policy.go b/pkg/retention/retention_policy.go new file mode 100644 index 00000000..1e5873cb --- /dev/null +++ b/pkg/retention/retention_policy.go @@ -0,0 +1,18 @@ +package retention + +type RetentionType string + +const ( + LifecycleReleaseRetentionType = RetentionType("LifecycleRelease") + LifecycleTentacleRetentionType = RetentionType("LifecycleTentacle") +) + +const ( + RetentionStrategyForever string = "Forever" + RetentionStrategyCount string = "Count" +) + +const ( + RetentionUnitDays string = "Days" + RetentionUnitItems string = "Items" +) diff --git a/pkg/retention/retention_type.go b/pkg/retention/retention_type.go deleted file mode 100644 index 21513ba2..00000000 --- a/pkg/retention/retention_type.go +++ /dev/null @@ -1,8 +0,0 @@ -package retention - -type RetentionType string - -const ( - LifecycleReleaseRetentionType = RetentionType("LifecycleRelease") - LifecycleTentacleRetentionType = RetentionType("LifecycleTentacle") -) \ No newline at end of file diff --git a/pkg/retention/space_default_retention_policy.go b/pkg/retention/space_default_retention_policy.go index e84aae1c..e903d0fe 100644 --- a/pkg/retention/space_default_retention_policy.go +++ b/pkg/retention/space_default_retention_policy.go @@ -11,16 +11,6 @@ type SpaceDefaultRetentionPolicy struct { resources.Resource } -const ( - RetentionStrategyForever string = "Forever" - RetentionStrategyCount string = "Count" -) - -const ( - RetentionUnitDays string = "Days" - RetentionUnitItems string = "Items" -) - type SpaceDefaultRetentionPolicyResource struct { SpaceDefaultRetentionPolicy QuantityToKeep int `json:"QuantityToKeep"` diff --git a/pkg/retention/space_default_retention_policy_query.go b/pkg/retention/space_default_retention_policy_query.go new file mode 100644 index 00000000..5b34dbbc --- /dev/null +++ b/pkg/retention/space_default_retention_policy_query.go @@ -0,0 +1,6 @@ +package retention + +type SpaceDefaultRetentionPolicyQuery struct { + RetentionType RetentionType `uri:"RetentionType"` + SpaceID string `uri:"spaceId"` +} diff --git a/pkg/retention/space_default_retention_policy_service.go b/pkg/retention/space_default_retention_policy_service.go index 4c205c0e..e462d8c2 100644 --- a/pkg/retention/space_default_retention_policy_service.go +++ b/pkg/retention/space_default_retention_policy_service.go @@ -9,11 +9,6 @@ type SpaceDefaultRetentionPolicyService struct { services.Service } -type SpaceDefaultRetentionPolicyQuery struct { - RetentionType RetentionType `uri:"RetentionType"` - SpaceID string `uri:"spaceId"` -} - const template = "/api/{spaceId}/retentionpolicies{/id}{?RetentionType}" func Get(client newclient.Client, spaceDefaultRetentionPolicyQuery SpaceDefaultRetentionPolicyQuery) (*SpaceDefaultRetentionPolicy, error) { From 87d35707a153629acded80a7fe11c7ef89955da0 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Wed, 5 Nov 2025 13:38:19 +1300 Subject: [PATCH 10/15] add keys to the queries --- ...pace_default_retention_policy_service_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/e2e/space_default_retention_policy_service_test.go b/test/e2e/space_default_retention_policy_service_test.go index af0e1649..5edd18f4 100644 --- a/test/e2e/space_default_retention_policy_service_test.go +++ b/test/e2e/space_default_retention_policy_service_test.go @@ -13,8 +13,8 @@ func TestReadLifecycleReleaseRetentionDefaultPolicy(t *testing.T) { defaultSpace, _ := spaces.GetDefaultSpace(client) query := retention.SpaceDefaultRetentionPolicyQuery{ - retention.LifecycleReleaseRetentionType, - defaultSpace.ID, + RetentionType: retention.LifecycleReleaseRetentionType, + SpaceID: defaultSpace.ID, } res, err := retention.Get(client, query) @@ -29,8 +29,8 @@ func TestReadLifecycleTentacleRetentionDefaultPolicy(t *testing.T) { defaultSpace, _ := spaces.GetDefaultSpace(client) query := retention.SpaceDefaultRetentionPolicyQuery{ - retention.LifecycleTentacleRetentionType, - defaultSpace.ID, + RetentionType: retention.LifecycleTentacleRetentionType, + SpaceID: defaultSpace.ID, } res, err := retention.Get(client, query) @@ -44,8 +44,8 @@ func TestModifyLifecycleReleaseRetentionDefaultPolicy(t *testing.T) { require.NotNil(t, client) defaultSpace, _ := spaces.GetDefaultSpace(client) query := retention.SpaceDefaultRetentionPolicyQuery{ - retention.LifecycleReleaseRetentionType, - defaultSpace.ID, + RetentionType: retention.LifecycleReleaseRetentionType, + SpaceID: defaultSpace.ID, } defaultSpaceLifecycleReleasePolicy, err := retention.Get(client, query) if err != nil { @@ -67,8 +67,8 @@ func TestModifyLifecycleTentacleRetentionDefaultPolicy(t *testing.T) { require.NotNil(t, client) defaultSpace, _ := spaces.GetDefaultSpace(client) query := retention.SpaceDefaultRetentionPolicyQuery{ - retention.LifecycleTentacleRetentionType, - defaultSpace.ID, + RetentionType: retention.LifecycleTentacleRetentionType, + SpaceID: defaultSpace.ID, } defaultSpaceLifecycleReleasePolicy, err := retention.Get(client, query) if err != nil { From 8e4ae30804b38402a0ee00cf1521ac9ad7f43902 Mon Sep 17 00:00:00 2001 From: Rose-Northey <132635605+Rose-Northey@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:58:51 +1300 Subject: [PATCH 11/15] Update pkg/retention/space_default_lifecycle_release_retention_policy.go Co-authored-by: Ben Pearce --- .../space_default_lifecycle_release_retention_policy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/retention/space_default_lifecycle_release_retention_policy.go b/pkg/retention/space_default_lifecycle_release_retention_policy.go index 3b12cb7b..0700a45b 100644 --- a/pkg/retention/space_default_lifecycle_release_retention_policy.go +++ b/pkg/retention/space_default_lifecycle_release_retention_policy.go @@ -9,7 +9,7 @@ type LifecycleReleaseRetentionPolicy struct { SpaceDefaultRetentionPolicy } -func CountBasedLifecycleReleaseRetentionPolicy(quantityToKeep int, unit string, spaceId string, policyId string) *LifecycleReleaseRetentionPolicy { +func NewCountBasedLifecycleReleaseRetentionPolicy(quantityToKeep int, unit string, spaceId string, policyId string) *LifecycleReleaseRetentionPolicy { return &LifecycleReleaseRetentionPolicy{ QuantityToKeep: quantityToKeep, Strategy: RetentionStrategyCount, From e82834ff7c3fccec948e20b901d320a0cc59fcc5 Mon Sep 17 00:00:00 2001 From: Rose-Northey <132635605+Rose-Northey@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:59:03 +1300 Subject: [PATCH 12/15] Update pkg/retention/space_default_lifecycle_tentacle_retention_policy.go Co-authored-by: Ben Pearce --- .../space_default_lifecycle_tentacle_retention_policy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go index 1162bb28..ce028643 100644 --- a/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go +++ b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go @@ -9,7 +9,7 @@ type LifecycleTentacleRetentionPolicy struct { SpaceDefaultRetentionPolicy } -func CountBasedLifecycleTentacleRetentionPolicy(quantityToKeep int, unit string, spaceId string, policyId string) *LifecycleTentacleRetentionPolicy { +func NewCountBasedLifecycleTentacleRetentionPolicy(quantityToKeep int, unit string, spaceId string, policyId string) *LifecycleTentacleRetentionPolicy { return &LifecycleTentacleRetentionPolicy{ QuantityToKeep: quantityToKeep, Strategy: RetentionStrategyCount, From 56d4880daca6e097a0c05d99d073c3693785a023 Mon Sep 17 00:00:00 2001 From: Rose-Northey <132635605+Rose-Northey@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:59:12 +1300 Subject: [PATCH 13/15] Update pkg/retention/space_default_lifecycle_release_retention_policy.go Co-authored-by: Ben Pearce --- .../space_default_lifecycle_release_retention_policy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/retention/space_default_lifecycle_release_retention_policy.go b/pkg/retention/space_default_lifecycle_release_retention_policy.go index 0700a45b..e010caf6 100644 --- a/pkg/retention/space_default_lifecycle_release_retention_policy.go +++ b/pkg/retention/space_default_lifecycle_release_retention_policy.go @@ -24,7 +24,7 @@ func NewCountBasedLifecycleReleaseRetentionPolicy(quantityToKeep int, unit strin } } -func KeepForeverLifecycleReleaseRetentionPolicy(spaceId string, policyId string) *LifecycleReleaseRetentionPolicy { +func NewKeepForeverLifecycleReleaseRetentionPolicy(spaceId string, policyId string) *LifecycleReleaseRetentionPolicy { return &LifecycleReleaseRetentionPolicy{ QuantityToKeep: 0, Strategy: RetentionStrategyForever, From 23c7b2516904a0d42d5002b38f6f3cbe42201207 Mon Sep 17 00:00:00 2001 From: Rose-Northey <132635605+Rose-Northey@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:59:22 +1300 Subject: [PATCH 14/15] Update pkg/retention/space_default_lifecycle_tentacle_retention_policy.go Co-authored-by: Ben Pearce --- .../space_default_lifecycle_tentacle_retention_policy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go index ce028643..30aaa348 100644 --- a/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go +++ b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go @@ -24,7 +24,7 @@ func NewCountBasedLifecycleTentacleRetentionPolicy(quantityToKeep int, unit stri } } -func KeepForeverLifecycleTentacleRetentionPolicy(spaceId string, policyId string) *LifecycleTentacleRetentionPolicy { +func NewKeepForeverLifecycleTentacleRetentionPolicy(spaceId string, policyId string) *LifecycleTentacleRetentionPolicy { return &LifecycleTentacleRetentionPolicy{ QuantityToKeep: 0, Strategy: RetentionStrategyForever, From 95a0e033cbf224002a1fc477a14fbc3d5c7c9514 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Thu, 6 Nov 2025 11:01:02 +1300 Subject: [PATCH 15/15] edit testing for rename --- test/e2e/space_default_retention_policy_service_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/space_default_retention_policy_service_test.go b/test/e2e/space_default_retention_policy_service_test.go index 5edd18f4..48a25856 100644 --- a/test/e2e/space_default_retention_policy_service_test.go +++ b/test/e2e/space_default_retention_policy_service_test.go @@ -52,7 +52,7 @@ func TestModifyLifecycleReleaseRetentionDefaultPolicy(t *testing.T) { t.Fatal(err) } - policy := retention.CountBasedLifecycleReleaseRetentionPolicy(4, retention.RetentionUnitItems, defaultSpace.ID, defaultSpaceLifecycleReleasePolicy.ID) + policy := retention.NewCountBasedLifecycleReleaseRetentionPolicy(4, retention.RetentionUnitItems, defaultSpace.ID, defaultSpaceLifecycleReleasePolicy.ID) res, err := retention.Update(client, policy) require.NoError(t, err) @@ -75,7 +75,7 @@ func TestModifyLifecycleTentacleRetentionDefaultPolicy(t *testing.T) { t.Fatal(err) } - policy := retention.CountBasedLifecycleTentacleRetentionPolicy(3, retention.RetentionUnitDays, defaultSpace.ID, defaultSpaceLifecycleReleasePolicy.ID) + policy := retention.NewCountBasedLifecycleTentacleRetentionPolicy(3, retention.RetentionUnitDays, defaultSpace.ID, defaultSpaceLifecycleReleasePolicy.ID) res, err := retention.Update(client, policy) require.NoError(t, err) require.NotNil(t, res)