Skip to content

Commit da9953c

Browse files
Merge pull request #684 from linode/dev
Release v5.43.0
2 parents 2fbed9e + 9535d63 commit da9953c

20 files changed

Lines changed: 403 additions & 66 deletions

.github/workflows/ci.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,35 @@ on:
1212
jobs:
1313
lint:
1414
runs-on: ubuntu-latest
15+
permissions:
16+
contents: read
17+
pull-requests: read
1518
steps:
19+
# Enforce TPT-1234: prefix on PR titles, with the following exemptions:
20+
# - PRs labeled 'dependencies' (e.g. Dependabot PRs)
21+
# - PRs labeled 'hotfix' (urgent fixes that may not have a ticket)
22+
# - PRs labeled 'community-contribution' (external contributors without TPT tickets)
23+
# - PRs labeled 'ignore-for-release' (release PRs that don't need a ticket prefix)
24+
- name: Validate PR Title
25+
if: github.event_name == 'pull_request'
26+
uses: amannn/action-semantic-pull-request@v6
27+
with:
28+
types: |
29+
TPT-\d+
30+
requireScope: false
31+
# Override the default header pattern to allow hyphens and digits in the type
32+
# (e.g. "TPT-4298: Description"). The default pattern only matches word
33+
# characters (\w) which excludes hyphens.
34+
headerPattern: '^([\w-]+):\s?(.*)$'
35+
headerPatternCorrespondence: type, subject
36+
ignoreLabels: |
37+
dependencies
38+
hotfix
39+
community-contribution
40+
ignore-for-release
41+
env:
42+
GITHUB_TOKEN: ${{ github.token }}
43+
1644
- name: checkout repo
1745
uses: actions/checkout@v6
1846

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: Clean Release Notes
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
jobs:
8+
clean-release-notes:
9+
runs-on: ubuntu-latest
10+
permissions:
11+
contents: write
12+
13+
steps:
14+
- name: Remove ticket prefixes from release notes
15+
uses: actions/github-script@v8
16+
with:
17+
script: |
18+
const release = context.payload.release;
19+
20+
let body = release.body;
21+
22+
if (!body) {
23+
console.log("Release body empty, nothing to clean.");
24+
return;
25+
}
26+
27+
// Remove ticket prefixes like "TPT-1234: " or "TPT-1234:"
28+
body = body.replace(/TPT-\d+:\s*/g, '');
29+
30+
await github.rest.repos.updateRelease({
31+
owner: context.repo.owner,
32+
repo: context.repo.repo,
33+
release_id: release.id,
34+
body: body
35+
});
36+
37+
console.log("Release notes cleaned.");

.github/workflows/e2e-test.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ jobs:
105105

106106
- name: Upload Test Report as Artifact
107107
if: always()
108-
uses: actions/upload-artifact@v6
108+
uses: actions/upload-artifact@v7
109109
with:
110110
name: test-report-file
111111
if-no-files-found: ignore
@@ -241,7 +241,7 @@ jobs:
241241
steps:
242242
- name: Notify Slack
243243
id: main_message
244-
uses: slackapi/slack-github-action@v2.1.1
244+
uses: slackapi/slack-github-action@v3
245245
with:
246246
method: chat.postMessage
247247
token: ${{ secrets.SLACK_BOT_TOKEN }}
@@ -273,7 +273,7 @@ jobs:
273273
274274
- name: Test summary thread
275275
if: success()
276-
uses: slackapi/slack-github-action@v2.1.1
276+
uses: slackapi/slack-github-action@v3
277277
with:
278278
method: chat.postMessage
279279
token: ${{ secrets.SLACK_BOT_TOKEN }}

.github/workflows/nightly-smoke-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ jobs:
4545

4646
- name: Notify Slack
4747
if: always() && github.repository == 'linode/linode_api4-python'
48-
uses: slackapi/slack-github-action@v2.1.1
48+
uses: slackapi/slack-github-action@v3
4949
with:
5050
method: chat.postMessage
5151
token: ${{ secrets.SLACK_BOT_TOKEN }}

.github/workflows/publish-pypi.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@ jobs:
2828
LINODE_SDK_VERSION: ${{ github.event.release.tag_name }}
2929

3030
- name: Publish the release artifacts to PyPI
31-
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # pin@release/v1.13.0
31+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # pin@release/v1.14.0

.github/workflows/release-notify-slack.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ jobs:
1111
steps:
1212
- name: Notify Slack - Main Message
1313
id: main_message
14-
uses: slackapi/slack-github-action@v2.1.1
14+
uses: slackapi/slack-github-action@v3
1515
with:
1616
method: chat.postMessage
1717
token: ${{ secrets.SLACK_BOT_TOKEN }}

linode_api4/groups/linode.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,6 @@ def instance_create(
322322
:param firewall: The firewall to attach this Linode to.
323323
:type firewall: int or Firewall
324324
:param disk_encryption: The disk encryption policy for this Linode.
325-
NOTE: Disk encryption may not currently be available to all users.
326325
:type disk_encryption: InstanceDiskEncryptionType or str
327326
:param interfaces: An array of Network Interfaces to add to this Linode’s Configuration Profile.
328327
At least one and up to three Interface objects can exist in this array.

linode_api4/groups/monitor.py

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
from typing import Any, Optional
1+
from typing import Any, Optional, Union
22

33
from linode_api4 import PaginatedList
44
from linode_api4.errors import UnexpectedResponseError
55
from linode_api4.groups import Group
66
from linode_api4.objects import (
77
AlertChannel,
88
AlertDefinition,
9+
AlertDefinitionEntity,
10+
AlertScope,
911
MonitorDashboard,
1012
MonitorMetricsDefinition,
1113
MonitorService,
@@ -202,7 +204,7 @@ def alert_channels(self, *filters) -> PaginatedList:
202204
203205
.. note:: This endpoint is in beta and requires using the v4beta base URL.
204206
205-
API Documentation: https://techdocs.akamai.com/linode-api/reference/get-alert-channels
207+
API Documentation: https://techdocs.akamai.com/linode-api/reference/get-notification-channels
206208
207209
:param filters: Optional filter expressions to apply to the collection.
208210
See :doc:`Filtering Collections</linode_api4/objects/filtering>` for details.
@@ -221,6 +223,8 @@ def create_alert_definition(
221223
trigger_conditions: dict,
222224
entity_ids: Optional[list[str]] = None,
223225
description: Optional[str] = None,
226+
scope: Optional[Union[AlertScope, str]] = None,
227+
regions: Optional[list[str]] = None,
224228
) -> AlertDefinition:
225229
"""
226230
Create a new alert definition for a given service type.
@@ -252,6 +256,10 @@ def create_alert_definition(
252256
:type entity_ids: Optional[list[str]]
253257
:param description: (Optional) Longer description for the alert definition.
254258
:type description: Optional[str]
259+
:param scope: (Optional) Alert scope (for example: `account`, `entity`, or `region`). Defaults to `entity`.
260+
:type scope: Optional[Union[AlertScope, str]]
261+
:param regions: (Optional) Regions to monitor.
262+
:type regions: Optional[list[str]]
255263
256264
:returns: The newly created :class:`AlertDefinition`.
257265
:rtype: AlertDefinition
@@ -267,10 +275,15 @@ def create_alert_definition(
267275
"rule_criteria": rule_criteria,
268276
"trigger_conditions": trigger_conditions,
269277
}
270-
if description is not None:
271-
params["description"] = description
278+
272279
if entity_ids is not None:
273280
params["entity_ids"] = entity_ids
281+
if description is not None:
282+
params["description"] = description
283+
if scope is not None:
284+
params["scope"] = scope
285+
if regions is not None:
286+
params["regions"] = regions
274287

275288
# API will validate service_type and return an error if missing
276289
result = self.client.post(
@@ -284,3 +297,38 @@ def create_alert_definition(
284297
)
285298

286299
return AlertDefinition(self.client, result["id"], service_type, result)
300+
301+
def alert_definition_entities(
302+
self,
303+
service_type: str,
304+
id: int,
305+
*filters,
306+
) -> PaginatedList:
307+
"""
308+
List entities associated with a specific alert definition.
309+
310+
This endpoint supports pagination fields (`page`, `page_size`) in the API.
311+
312+
.. note:: This endpoint is in beta and requires using the v4beta base URL.
313+
314+
API Documentation: TODO
315+
316+
:param service_type: Service type for the alert definition (e.g. `dbaas`).
317+
:type service_type: str
318+
:param id: Alert definition identifier.
319+
:type id: int
320+
:param filters: Optional filter expressions to apply to the collection.
321+
See :doc:`Filtering Collections</linode_api4/objects/filtering>`.
322+
323+
:returns: A paginated list of entities associated with the alert definition.
324+
:rtype: PaginatedList[AlertDefinitionEntity]
325+
"""
326+
327+
endpoint = (
328+
f"/monitor/services/{service_type}/alert-definitions/{id}/entities"
329+
)
330+
return self.client._get_and_filter(
331+
AlertDefinitionEntity,
332+
*filters,
333+
endpoint=endpoint,
334+
)

linode_api4/groups/volume.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ def create(self, label, region=None, linode=None, size=20, **kwargs):
4848
:type tags: list[str]
4949
:param encryption: Whether the new Volume should opt in or out of disk encryption.
5050
:type encryption: str
51-
Note: Block Storage Disk Encryption is not currently available to all users.
5251
:returns: The new Volume.
5352
:rtype: Volume
5453
"""

linode_api4/objects/linode.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1448,7 +1448,6 @@ def disk_create(
14481448
should already be set up, see :any:`ProfileGroup.ssh_keys`
14491449
for details.
14501450
:param disk_encryption: The disk encryption policy for this Linode.
1451-
NOTE: Disk encryption may not currently be available to all users.
14521451
:type disk_encryption: InstanceDiskEncryptionType or str
14531452
:param stackscript: A StackScript object, or the ID of one, to deploy to this
14541453
disk. Requires deploying a compatible image.
@@ -1642,7 +1641,6 @@ def rebuild(
16421641
the key.
16431642
:type authorized_keys: list or str
16441643
:param disk_encryption: The disk encryption policy for this Linode.
1645-
NOTE: Disk encryption may not currently be available to all users.
16461644
:type disk_encryption: InstanceDiskEncryptionType or str
16471645
16481646
:returns: The newly generated password, if one was not provided

0 commit comments

Comments
 (0)