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/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/space_default_lifecycle_release_retention_policy.go b/pkg/retention/space_default_lifecycle_release_retention_policy.go new file mode 100644 index 00000000..e010caf6 --- /dev/null +++ b/pkg/retention/space_default_lifecycle_release_retention_policy.go @@ -0,0 +1,40 @@ +package retention + +import "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" + +type LifecycleReleaseRetentionPolicy struct { + QuantityToKeep int `json:"QuantityToKeep"` + Strategy string `json:"Strategy"` + Unit string `json:"Unit"` + SpaceDefaultRetentionPolicy +} + +func NewCountBasedLifecycleReleaseRetentionPolicy(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 NewKeepForeverLifecycleReleaseRetentionPolicy(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 new file mode 100644 index 00000000..30aaa348 --- /dev/null +++ b/pkg/retention/space_default_lifecycle_tentacle_retention_policy.go @@ -0,0 +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 NewCountBasedLifecycleTentacleRetentionPolicy(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 NewKeepForeverLifecycleTentacleRetentionPolicy(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 new file mode 100644 index 00000000..e903d0fe --- /dev/null +++ b/pkg/retention/space_default_retention_policy.go @@ -0,0 +1,28 @@ +package retention + +import ( + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/resources" +) + +type SpaceDefaultRetentionPolicy struct { + SpaceId string `json:"SpaceId"` + Name string `json:"Name"` + RetentionType RetentionType `json:"RetentionType"` + resources.Resource +} + +type SpaceDefaultRetentionPolicyResource struct { + SpaceDefaultRetentionPolicy + QuantityToKeep int `json:"QuantityToKeep"` + Strategy string `json:"Strategy"` + Unit string `json:"Unit"` +} + +type ISpaceDefaultRetentionPolicy interface { + GetSpaceID() string + resources.IResource +} + +func (policy *SpaceDefaultRetentionPolicy) GetSpaceID() string { + return policy.SpaceId +} 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 new file mode 100644 index 00000000..e462d8c2 --- /dev/null +++ b/pkg/retention/space_default_retention_policy_service.go @@ -0,0 +1,28 @@ +package retention + +import ( + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/newclient" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/services" +) + +type SpaceDefaultRetentionPolicyService struct { + services.Service +} + +const template = "/api/{spaceId}/retentionpolicies{/id}{?RetentionType}" + +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 ISpaceDefaultRetentionPolicy) (*SpaceDefaultRetentionPolicyResource, error) { + res, err := newclient.Update[SpaceDefaultRetentionPolicyResource](client, template, spaceDefaultRetentionPolicy.GetSpaceID(), spaceDefaultRetentionPolicy.GetID(), spaceDefaultRetentionPolicy) + if err != nil { + return nil, err + } + return res, err +} 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..48a25856 --- /dev/null +++ b/test/e2e/space_default_retention_policy_service_test.go @@ -0,0 +1,85 @@ +package e2e + +import ( + "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{ + RetentionType: retention.LifecycleReleaseRetentionType, + SpaceID: 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{ + RetentionType: retention.LifecycleTentacleRetentionType, + SpaceID: 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{ + RetentionType: retention.LifecycleReleaseRetentionType, + SpaceID: defaultSpace.ID, + } + defaultSpaceLifecycleReleasePolicy, err := retention.Get(client, query) + if err != nil { + t.Fatal(err) + } + + policy := retention.NewCountBasedLifecycleReleaseRetentionPolicy(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) + 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{ + RetentionType: retention.LifecycleTentacleRetentionType, + SpaceID: defaultSpace.ID, + } + defaultSpaceLifecycleReleasePolicy, err := retention.Get(client, query) + if err != nil { + t.Fatal(err) + } + + policy := retention.NewCountBasedLifecycleTentacleRetentionPolicy(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) + require.Equal(t, res.Strategy, retention.RetentionStrategyCount) + require.Equal(t, res.Unit, retention.RetentionUnitDays) +}