Skip to content

Commit 36669bf

Browse files
Add package cache retention setting to machine policy (#337)
* WIP package cache * Use strings with validation instead of enums * Add test running instructions * Add method to create non-default retention policy * Add package cache retention to machine package --------- Co-authored-by: Bec Callow <bec.callow@octopus.com>
1 parent 34d849a commit 36669bf

6 files changed

Lines changed: 193 additions & 106 deletions

File tree

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,28 @@ Operations like `Add`, `DeleteByID`, `GetByID`, and `Update` are supported by mo
6262

6363
Numerous code samples that showcase the API and this client are available in the [examples](/examples) directory. There are also many [integration](/test) and unit tests available to examine that demonstrate the capabilities of this API client.
6464

65+
## Testing
66+
67+
### Running Tests Locally using Visual Studio Code
68+
69+
> [!CAUTION]
70+
> The integration tests will create and delete resources on your instance. Use a dedicated instance to run tests
71+
72+
To run the tests against an instance of Octopus Deploy, create a `.env` file at the root directory of this repository
73+
74+
```
75+
OCTOPUS_HOST=http://your-octopus-instance-url
76+
OCTOPUS_API_KEY=API-YOURAPIKEY
77+
```
78+
79+
and add a Visual Studio Code workspace setting (`.vscode/settings.json`) for the test environment settings
80+
81+
```
82+
{
83+
"go.testEnvFile": "${workspaceFolder}/.env"
84+
}
85+
```
86+
6587
## 🤝 Contributions
6688

6789
Contributions are welcome! :heart: Please read our [Contributing Guide](CONTRIBUTING.md) for information about how to get involved in this project.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package machinepolicies
2+
3+
type MachinePackageCacheRetentionPolicy struct {
4+
Strategy string `json:"Strategy" validate:"required,oneof=Default Quantities"`
5+
QuantityOfPackagesToKeep int32 `json:"QuantityOfPackagesToKeep,omitempty"`
6+
PackageUnit string `json:"PackageUnit,omitempty" validate:"omitempty,oneof=Items"`
7+
QuantityOfVersionsToKeep int32 `json:"QuantityOfVersionsToKeep,omitempty"`
8+
VersionUnit string `json:"VersionUnit,omitempty" validate:"omitempty,oneof=Items"`
9+
}
10+
11+
func NewDefaultMachinePackageCacheRetentionPolicy() *MachinePackageCacheRetentionPolicy {
12+
return &MachinePackageCacheRetentionPolicy{
13+
Strategy: "Default",
14+
}
15+
}
16+
17+
func NewMachinePackageCacheRetentionPolicy(strategy string, quantityOfPackages int32, packageUnit string, quantityOfVersions int32, versionUnit string) *MachinePackageCacheRetentionPolicy {
18+
return &MachinePackageCacheRetentionPolicy{
19+
Strategy: strategy,
20+
QuantityOfPackagesToKeep: quantityOfPackages,
21+
PackageUnit: packageUnit,
22+
QuantityOfVersionsToKeep: quantityOfVersions,
23+
VersionUnit: versionUnit,
24+
}
25+
}

pkg/machinepolicies/machine_policy.go

Lines changed: 59 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,21 @@ import (
1010
)
1111

1212
type MachinePolicy struct {
13-
ConnectionConnectTimeout time.Duration `json:"ConnectionConnectTimeout" validate:"required,min=10s"`
14-
ConnectionRetryCountLimit int32 `json:"ConnectionRetryCountLimit" validate:"required,gte=2"`
15-
ConnectionRetrySleepInterval time.Duration `json:"ConnectionRetrySleepInterval" validate:"required"`
16-
ConnectionRetryTimeLimit time.Duration `json:"ConnectionRetryTimeLimit" validate:"required,min=10s"`
17-
Description string `json:"Description,omitempty"`
18-
IsDefault bool `json:"IsDefault"`
19-
MachineCleanupPolicy *MachineCleanupPolicy `json:"MachineCleanupPolicy"`
20-
MachineConnectivityPolicy *MachineConnectivityPolicy `json:"MachineConnectivityPolicy"`
21-
MachineHealthCheckPolicy *MachineHealthCheckPolicy `json:"MachineHealthCheckPolicy"`
22-
MachineUpdatePolicy *MachineUpdatePolicy `json:"MachineUpdatePolicy"`
23-
Name string `json:"Name" validate:"required,notblank"`
24-
PollingRequestMaximumMessageProcessingTimeout time.Duration `json:"PollingRequestMaximumMessageProcessingTimeout,omitempty"`
25-
PollingRequestQueueTimeout time.Duration `json:"PollingRequestQueueTimeout" validate:"required"`
26-
SpaceID string `json:"SpaceId,omitempty"`
13+
ConnectionConnectTimeout time.Duration `json:"ConnectionConnectTimeout" validate:"required,min=10s"`
14+
ConnectionRetryCountLimit int32 `json:"ConnectionRetryCountLimit" validate:"required,gte=2"`
15+
ConnectionRetrySleepInterval time.Duration `json:"ConnectionRetrySleepInterval" validate:"required"`
16+
ConnectionRetryTimeLimit time.Duration `json:"ConnectionRetryTimeLimit" validate:"required,min=10s"`
17+
Description string `json:"Description,omitempty"`
18+
IsDefault bool `json:"IsDefault"`
19+
MachineCleanupPolicy *MachineCleanupPolicy `json:"MachineCleanupPolicy"`
20+
MachineConnectivityPolicy *MachineConnectivityPolicy `json:"MachineConnectivityPolicy"`
21+
MachineHealthCheckPolicy *MachineHealthCheckPolicy `json:"MachineHealthCheckPolicy"`
22+
MachineUpdatePolicy *MachineUpdatePolicy `json:"MachineUpdatePolicy"`
23+
MachinePackageCacheRetentionPolicy *MachinePackageCacheRetentionPolicy `json:"MachinePackageCacheRetentionPolicy"`
24+
Name string `json:"Name" validate:"required,notblank"`
25+
PollingRequestMaximumMessageProcessingTimeout time.Duration `json:"PollingRequestMaximumMessageProcessingTimeout,omitempty"`
26+
PollingRequestQueueTimeout time.Duration `json:"PollingRequestQueueTimeout" validate:"required"`
27+
SpaceID string `json:"SpaceId,omitempty"`
2728

2829
resources.Resource
2930
}
@@ -38,6 +39,7 @@ func NewMachinePolicy(name string) *MachinePolicy {
3839
MachineConnectivityPolicy: NewMachineConnectivityPolicy(),
3940
MachineHealthCheckPolicy: NewMachineHealthCheckPolicy(),
4041
MachineUpdatePolicy: NewMachineUpdatePolicy(),
42+
MachinePackageCacheRetentionPolicy: NewDefaultMachinePackageCacheRetentionPolicy(),
4143
Name: name,
4244
PollingRequestMaximumMessageProcessingTimeout: 10 * time.Minute,
4345
PollingRequestQueueTimeout: 2 * time.Minute,
@@ -48,33 +50,35 @@ func NewMachinePolicy(name string) *MachinePolicy {
4850
// MarshalJSON returns a machine policy as its JSON encoding.
4951
func (m *MachinePolicy) MarshalJSON() ([]byte, error) {
5052
machinePolicy := struct {
51-
ConnectionConnectTimeout string `json:"ConnectionConnectTimeout" validate:"required"`
52-
ConnectionRetryCountLimit int32 `json:"ConnectionRetryCountLimit" validate:"required"`
53-
ConnectionRetrySleepInterval string `json:"ConnectionRetrySleepInterval" validate:"required"`
54-
ConnectionRetryTimeLimit string `json:"ConnectionRetryTimeLimit" validate:"required"`
55-
Description string `json:"Description,omitempty"`
56-
IsDefault bool `json:"IsDefault"`
57-
MachineCleanupPolicy *MachineCleanupPolicy `json:"MachineCleanupPolicy"`
58-
MachineConnectivityPolicy *MachineConnectivityPolicy `json:"MachineConnectivityPolicy"`
59-
MachineHealthCheckPolicy *MachineHealthCheckPolicy `json:"MachineHealthCheckPolicy"`
60-
MachineUpdatePolicy *MachineUpdatePolicy `json:"MachineUpdatePolicy"`
61-
Name string `json:"Name" validate:"required,notblank"`
62-
PollingRequestMaximumMessageProcessingTimeout string `json:"PollingRequestMaximumMessageProcessingTimeout,omitempty"`
63-
PollingRequestQueueTimeout string `json:"PollingRequestQueueTimeout" validate:"required"`
64-
SpaceID string `json:"SpaceId,omitempty"`
53+
ConnectionConnectTimeout string `json:"ConnectionConnectTimeout" validate:"required"`
54+
ConnectionRetryCountLimit int32 `json:"ConnectionRetryCountLimit" validate:"required"`
55+
ConnectionRetrySleepInterval string `json:"ConnectionRetrySleepInterval" validate:"required"`
56+
ConnectionRetryTimeLimit string `json:"ConnectionRetryTimeLimit" validate:"required"`
57+
Description string `json:"Description,omitempty"`
58+
IsDefault bool `json:"IsDefault"`
59+
MachineCleanupPolicy *MachineCleanupPolicy `json:"MachineCleanupPolicy"`
60+
MachineConnectivityPolicy *MachineConnectivityPolicy `json:"MachineConnectivityPolicy"`
61+
MachineHealthCheckPolicy *MachineHealthCheckPolicy `json:"MachineHealthCheckPolicy"`
62+
MachineUpdatePolicy *MachineUpdatePolicy `json:"MachineUpdatePolicy"`
63+
MachinePackageCacheRetentionPolicy *MachinePackageCacheRetentionPolicy `json:"MachinePackageCacheRetentionPolicy"`
64+
Name string `json:"Name" validate:"required,notblank"`
65+
PollingRequestMaximumMessageProcessingTimeout string `json:"PollingRequestMaximumMessageProcessingTimeout,omitempty"`
66+
PollingRequestQueueTimeout string `json:"PollingRequestQueueTimeout" validate:"required"`
67+
SpaceID string `json:"SpaceId,omitempty"`
6568
resources.Resource
6669
}{
67-
ConnectionConnectTimeout: ToTimeSpan(m.ConnectionConnectTimeout),
68-
ConnectionRetryCountLimit: m.ConnectionRetryCountLimit,
69-
ConnectionRetrySleepInterval: ToTimeSpan(m.ConnectionRetrySleepInterval),
70-
ConnectionRetryTimeLimit: ToTimeSpan(m.ConnectionRetryTimeLimit),
71-
Description: m.Description,
72-
IsDefault: m.IsDefault,
73-
MachineCleanupPolicy: m.MachineCleanupPolicy,
74-
MachineConnectivityPolicy: m.MachineConnectivityPolicy,
75-
MachineHealthCheckPolicy: m.MachineHealthCheckPolicy,
76-
MachineUpdatePolicy: m.MachineUpdatePolicy,
77-
Name: m.Name,
70+
ConnectionConnectTimeout: ToTimeSpan(m.ConnectionConnectTimeout),
71+
ConnectionRetryCountLimit: m.ConnectionRetryCountLimit,
72+
ConnectionRetrySleepInterval: ToTimeSpan(m.ConnectionRetrySleepInterval),
73+
ConnectionRetryTimeLimit: ToTimeSpan(m.ConnectionRetryTimeLimit),
74+
Description: m.Description,
75+
IsDefault: m.IsDefault,
76+
MachineCleanupPolicy: m.MachineCleanupPolicy,
77+
MachineConnectivityPolicy: m.MachineConnectivityPolicy,
78+
MachineHealthCheckPolicy: m.MachineHealthCheckPolicy,
79+
MachineUpdatePolicy: m.MachineUpdatePolicy,
80+
MachinePackageCacheRetentionPolicy: m.MachinePackageCacheRetentionPolicy,
81+
Name: m.Name,
7882
PollingRequestMaximumMessageProcessingTimeout: ToTimeSpan(m.PollingRequestMaximumMessageProcessingTimeout),
7983
PollingRequestQueueTimeout: ToTimeSpan(m.PollingRequestQueueTimeout),
8084
SpaceID: m.SpaceID,
@@ -87,20 +91,21 @@ func (m *MachinePolicy) MarshalJSON() ([]byte, error) {
8791
// UnmarshalJSON sets this Kubernetes endpoint to its representation in JSON.
8892
func (m *MachinePolicy) UnmarshalJSON(data []byte) error {
8993
var fields struct {
90-
ConnectionConnectTimeout string `json:"ConnectionConnectTimeout" validate:"required"`
91-
ConnectionRetryCountLimit int32 `json:"ConnectionRetryCountLimit" validate:"required"`
92-
ConnectionRetrySleepInterval string `json:"ConnectionRetrySleepInterval" validate:"required"`
93-
ConnectionRetryTimeLimit string `json:"ConnectionRetryTimeLimit" validate:"required"`
94-
Description string `json:"Description,omitempty"`
95-
IsDefault bool `json:"IsDefault"`
96-
MachineCleanupPolicy *MachineCleanupPolicy `json:"MachineCleanupPolicy"`
97-
MachineConnectivityPolicy *MachineConnectivityPolicy `json:"MachineConnectivityPolicy"`
98-
MachineHealthCheckPolicy *MachineHealthCheckPolicy `json:"MachineHealthCheckPolicy"`
99-
MachineUpdatePolicy *MachineUpdatePolicy `json:"MachineUpdatePolicy"`
100-
Name string `json:"Name"`
101-
PollingRequestMaximumMessageProcessingTimeout string `json:"PollingRequestMaximumMessageProcessingTimeout,omitempty"`
102-
PollingRequestQueueTimeout string `json:"PollingRequestQueueTimeout" validate:"required"`
103-
SpaceID string `json:"SpaceId,omitempty"`
94+
ConnectionConnectTimeout string `json:"ConnectionConnectTimeout" validate:"required"`
95+
ConnectionRetryCountLimit int32 `json:"ConnectionRetryCountLimit" validate:"required"`
96+
ConnectionRetrySleepInterval string `json:"ConnectionRetrySleepInterval" validate:"required"`
97+
ConnectionRetryTimeLimit string `json:"ConnectionRetryTimeLimit" validate:"required"`
98+
Description string `json:"Description,omitempty"`
99+
IsDefault bool `json:"IsDefault"`
100+
MachineCleanupPolicy *MachineCleanupPolicy `json:"MachineCleanupPolicy"`
101+
MachineConnectivityPolicy *MachineConnectivityPolicy `json:"MachineConnectivityPolicy"`
102+
MachineHealthCheckPolicy *MachineHealthCheckPolicy `json:"MachineHealthCheckPolicy"`
103+
MachineUpdatePolicy *MachineUpdatePolicy `json:"MachineUpdatePolicy"`
104+
MachinePackageCacheRetentionPolicy *MachinePackageCacheRetentionPolicy `json:"MachinePackageCacheRetentionPolicy"`
105+
Name string `json:"Name"`
106+
PollingRequestMaximumMessageProcessingTimeout string `json:"PollingRequestMaximumMessageProcessingTimeout,omitempty"`
107+
PollingRequestQueueTimeout string `json:"PollingRequestQueueTimeout" validate:"required"`
108+
SpaceID string `json:"SpaceId,omitempty"`
104109
resources.Resource
105110
}
106111
err := json.Unmarshal(data, &fields)
@@ -146,6 +151,7 @@ func (m *MachinePolicy) UnmarshalJSON(data []byte) error {
146151
m.MachineConnectivityPolicy = fields.MachineConnectivityPolicy
147152
m.MachineHealthCheckPolicy = fields.MachineHealthCheckPolicy
148153
m.MachineUpdatePolicy = fields.MachineUpdatePolicy
154+
m.MachinePackageCacheRetentionPolicy = fields.MachinePackageCacheRetentionPolicy
149155
m.Name = fields.Name
150156
m.SpaceID = fields.SpaceID
151157
m.Resource = fields.Resource
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package machines
2+
3+
type MachinePackageCacheRetentionPolicy struct {
4+
Strategy string `json:"Strategy" validate:"required,oneof=Default Quantities"`
5+
QuantityOfPackagesToKeep int32 `json:"QuantityOfPackagesToKeep,omitempty"`
6+
PackageUnit string `json:"PackageUnit,omitempty" validate:"omitempty,oneof=Items"`
7+
QuantityOfVersionsToKeep int32 `json:"QuantityOfVersionsToKeep,omitempty"`
8+
VersionUnit string `json:"VersionUnit,omitempty" validate:"omitempty,oneof=Items"`
9+
}
10+
11+
func NewDefaultMachinePackageCacheRetentionPolicy() *MachinePackageCacheRetentionPolicy {
12+
return &MachinePackageCacheRetentionPolicy{
13+
Strategy: "Default",
14+
}
15+
}
16+
17+
func NewMachinePackageCacheRetentionPolicy(strategy string, quantityOfPackages int32, packageUnit string, quantityOfVersions int32, versionUnit string) *MachinePackageCacheRetentionPolicy {
18+
return &MachinePackageCacheRetentionPolicy{
19+
Strategy: strategy,
20+
QuantityOfPackagesToKeep: quantityOfPackages,
21+
PackageUnit: packageUnit,
22+
QuantityOfVersionsToKeep: quantityOfVersions,
23+
VersionUnit: versionUnit,
24+
}
25+
}

0 commit comments

Comments
 (0)