Skip to content

Commit abf048c

Browse files
Merge pull request #13534 from linode/release/v1.161.0
Release v1.161.0 - release → staging
2 parents 272eaa7 + 6e7793d commit abf048c

223 files changed

Lines changed: 7913 additions & 1952 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/api-v4/CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
## [2026-03-31] - v0.159.0
2+
3+
4+
### Removed:
5+
6+
- Old `failed` property from `DatabaseStatus` ([#13505](https://github.com/linode/manager/pull/13505))
7+
8+
### Upcoming Features:
9+
10+
- Replaced `content` with `details` in cloudpulse/types.ts for ACLP-Alerts Notification Channels ([#13495](https://github.com/linode/manager/pull/13495))
11+
112
## [2026-03-16] - v0.158.0
213

314

packages/api-v4/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@linode/api-v4",
3-
"version": "0.158.0",
3+
"version": "0.159.0",
44
"homepage": "https://github.com/linode/manager/tree/develop/packages/api-v4",
55
"bugs": {
66
"url": "https://github.com/linode/manager/issues"

packages/api-v4/src/cloudpulse/types.ts

Lines changed: 5 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ type AlertNotificationEmail = 'email';
4747
type AlertNotificationSlack = 'slack';
4848
type AlertNotificationPagerDuty = 'pagerduty';
4949
type AlertNotificationWebHook = 'webhook';
50-
type EmailRecipientType =
50+
export type EmailRecipientType =
5151
| 'admin_users'
5252
| 'read_users'
5353
| 'read_write_users'
@@ -303,14 +303,7 @@ interface NotificationChannelBase {
303303

304304
interface NotificationChannelEmail extends NotificationChannelBase {
305305
channel_type: AlertNotificationEmail;
306-
content?: {
307-
email: {
308-
email_addresses: string[];
309-
message: string;
310-
subject: string;
311-
};
312-
};
313-
details?: {
306+
details: {
314307
email: {
315308
recipient_type: EmailRecipientType;
316309
usernames: string[];
@@ -320,14 +313,7 @@ interface NotificationChannelEmail extends NotificationChannelBase {
320313

321314
interface NotificationChannelSlack extends NotificationChannelBase {
322315
channel_type: AlertNotificationSlack;
323-
content?: {
324-
slack: {
325-
message: string;
326-
slack_channel: string;
327-
slack_webhook_url: string;
328-
};
329-
};
330-
details?: {
316+
details: {
331317
slack: {
332318
slack_channel: string;
333319
slack_webhook_url: string;
@@ -337,14 +323,7 @@ interface NotificationChannelSlack extends NotificationChannelBase {
337323

338324
interface NotificationChannelPagerDuty extends NotificationChannelBase {
339325
channel_type: AlertNotificationPagerDuty;
340-
content?: {
341-
pagerduty: {
342-
attributes: string[];
343-
description: string;
344-
service_api_key: string;
345-
};
346-
};
347-
details?: {
326+
details: {
348327
pagerduty: {
349328
attributes: string[];
350329
description: string;
@@ -354,16 +333,7 @@ interface NotificationChannelPagerDuty extends NotificationChannelBase {
354333
}
355334
interface NotificationChannelWebHook extends NotificationChannelBase {
356335
channel_type: AlertNotificationWebHook;
357-
content?: {
358-
webhook: {
359-
http_headers: {
360-
header_key: string;
361-
header_value: string;
362-
}[];
363-
webhook_url: string;
364-
};
365-
};
366-
details?: {
336+
details: {
367337
webhook: {
368338
alert_body: {
369339
body: string;

packages/api-v4/src/databases/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ export interface DatabaseEngine {
3232
export type DatabaseStatus =
3333
| 'active'
3434
| 'degraded'
35-
| 'failed'
3635
| 'migrated'
3736
| 'migrating'
3837
| 'provisioning'
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
export * from './images';
22

3+
export * from './sharegroups';
4+
35
export * from './types';

packages/api-v4/src/quotas/types.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
import type { ObjectStorageEndpointTypes } from 'src/object-storage';
22
import type { Region } from 'src/regions';
3+
4+
export enum QuotaResourceMetrics {
5+
BUCKET = 'bucket',
6+
BYTE = 'byte',
7+
BYTE_PER_SECOND = 'byte_per_second',
8+
CLUSTER = 'cluster',
9+
CPU = 'CPU',
10+
GPU = 'GPU',
11+
OBJECT = 'object',
12+
REQUEST = 'request',
13+
VPU = 'VPU',
14+
}
15+
316
/**
417
* A Quota is a service used limit that is rated based on service metrics such
518
* as vCPUs used, instances or storage size.
@@ -54,7 +67,7 @@ export interface Quota {
5467
/**
5568
* The unit of measurement for this service limit.
5669
*/
57-
resource_metric: string;
70+
resource_metric: QuotaResourceMetrics;
5871

5972
/**
6073
* The S3 endpoint URL to which this limit applies.

packages/manager/CHANGELOG.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,60 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
66

7+
## [2026-03-31] - v1.161.0
8+
9+
10+
### Added:
11+
12+
- Quota resource metrics enum ([#13447](https://github.com/linode/manager/pull/13447))
13+
- Add DeepSeek-R1 and OpenClaw to Quick Deploy Apps ([#13499](https://github.com/linode/manager/pull/13499))
14+
- IAM: Add Pendo IDs for Parent/Child ([#13530](https://github.com/linode/manager/pull/13530))
15+
- sftpgo
16+
([#13531](https://github.com/linode/manager/pull/13531))
17+
18+
### Changed:
19+
20+
- Streams and Destinations Landing page initial load spinner added before empty state ([#13489](https://github.com/linode/manager/pull/13489))
21+
22+
### Fixed:
23+
24+
- Database Advanced Config field tooltip error ([#13465](https://github.com/linode/manager/pull/13465))
25+
- Remove unintended validation on optional email fields in Contact Sales Drawer ([#13483](https://github.com/linode/manager/pull/13483))
26+
- Parent / Child - SwitchAccountDrawer search focus ([#13490](https://github.com/linode/manager/pull/13490))
27+
- In Stream Create and Edit forms in the Clusters table filtering by region resulted in an empty clusters list ([#13491](https://github.com/linode/manager/pull/13491))
28+
- Destination Form: the Endpoint field is not clearing validation error when a Bucket is selected ([#13494](https://github.com/linode/manager/pull/13494))
29+
- Marketplace Fixes: Improved texts and tooltips. Changed submit enable behavior in contact sales form ([#13498](https://github.com/linode/manager/pull/13498))
30+
- Product content received in markdown format can have links. Added capability in markdown to open these links in new tab ([#13501](https://github.com/linode/manager/pull/13501))
31+
- Improve loading pattern on Account Delegation landing page ([#13502](https://github.com/linode/manager/pull/13502))
32+
- Disable Database credential buttons for resuming state ([#13505](https://github.com/linode/manager/pull/13505))
33+
- Updated rate limiting error message in contact sales drawer ([#13512](https://github.com/linode/manager/pull/13512))
34+
- Destination Form: omit the tls_hostname field from the request if it is empty or contains only whitespace ([#13524](https://github.com/linode/manager/pull/13524))
35+
36+
### Tech Stories:
37+
38+
- Bump jspdf from 4.2.0 to 4.2.1 ([#13503](https://github.com/linode/manager/pull/13503))
39+
40+
### Tests:
41+
42+
- Added automation spec for edit notifiation channel ([#13431](https://github.com/linode/manager/pull/13431))
43+
- Adding spec for show details notification channel ([#13449](https://github.com/linode/manager/pull/13449))
44+
- Fix test failures in lke-create.spec.ts following feature flag change ([#13526](https://github.com/linode/manager/pull/13526))
45+
46+
### Upcoming Features:
47+
48+
- Allow simultaneous v1 (Legacy) and v2 (ACLP) alerting in Linode edit flow ([#13455](https://github.com/linode/manager/pull/13455))
49+
- Use ImageSelectTable in Linode Rebuild dialog ([#13482](https://github.com/linode/manager/pull/13482))
50+
- Utility setup changes for CSV download for `CloudPulse metrics widget data` ([#13484](https://github.com/linode/manager/pull/13484))
51+
- Reserve IP: Add the new feature Reserved IPs to side nav ([#13486](https://github.com/linode/manager/pull/13486))
52+
- Fix PgBouncer and Service URI bugs ([#13487](https://github.com/linode/manager/pull/13487))
53+
- Migrated to `details` from `content` in ACLP-Alerts Notification Channels ([#13495](https://github.com/linode/manager/pull/13495))
54+
- ACLP-Metrics updated Tooltip messages for Group-by, DimensionFilter icons when in disabled state for the Widgets ([#13496](https://github.com/linode/manager/pull/13496))
55+
- Add alternate tool tip texts for group-by, dimension filter widget icons when disabled in ACLP-Metrics ([#13496](https://github.com/linode/manager/pull/13496))
56+
- Ability to download widget data as CSV in `CloudPulse metrics dashboards` ([#13497](https://github.com/linode/manager/pull/13497))
57+
- Implement owned groups landing page content ([#13506](https://github.com/linode/manager/pull/13506))
58+
- Custom HTTPS destination form: improve the UX and update copy ([#13507](https://github.com/linode/manager/pull/13507))
59+
- Configure new feature chip and banner messaging for ACLP Linode Alerts and Metrics ([#13509](https://github.com/linode/manager/pull/13509))
60+
761
## [2026-03-16] - v1.160.0
862

963

packages/manager/cypress/e2e/core/account/quotas-storage.spec.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { QuotaResourceMetrics } from '@linode/api-v4';
12
import { regionFactory } from '@linode/utilities';
23
import { profileFactory } from '@linode/utilities';
34
import { mockAppendFeatureFlags } from 'support/intercepts/feature-flags';
@@ -74,7 +75,7 @@ const mockQuotas = [
7475
endpoint_type: mockSelectedEndpoint.endpoint_type,
7576
quota_limit: 10,
7677
quota_name: randomLabel(15),
77-
resource_metric: 'byte',
78+
resource_metric: QuotaResourceMetrics.BYTE,
7879
s3_endpoint: selectedDomain,
7980
}),
8081
quotaFactory.build({
@@ -84,7 +85,7 @@ const mockQuotas = [
8485
endpoint_type: mockSelectedEndpoint.endpoint_type,
8586
quota_limit: 78,
8687
quota_name: randomLabel(15),
87-
resource_metric: 'bucket',
88+
resource_metric: QuotaResourceMetrics.BUCKET,
8889
s3_endpoint: selectedDomain,
8990
}),
9091
quotaFactory.build({
@@ -94,7 +95,7 @@ const mockQuotas = [
9495
endpoint_type: mockSelectedEndpoint.endpoint_type,
9596
quota_limit: 400,
9697
quota_name: randomLabel(15),
97-
resource_metric: 'object',
98+
resource_metric: QuotaResourceMetrics.OBJECT,
9899
s3_endpoint: selectedDomain,
99100
}),
100101
];
@@ -229,7 +230,7 @@ describe('Quota workflow tests', () => {
229230
endpoint_type: updatedEndpoint.endpoint_type,
230231
quota_limit: 20,
231232
quota_name: randomLabel(15),
232-
resource_metric: 'byte',
233+
resource_metric: QuotaResourceMetrics.BYTE,
233234
s3_endpoint: updatedDomain,
234235
}),
235236
quotaFactory.build({
@@ -239,7 +240,7 @@ describe('Quota workflow tests', () => {
239240
endpoint_type: updatedEndpoint.endpoint_type,
240241
quota_limit: 122,
241242
quota_name: randomLabel(15),
242-
resource_metric: 'bucket',
243+
resource_metric: QuotaResourceMetrics.BUCKET,
243244
s3_endpoint: updatedDomain,
244245
}),
245246
quotaFactory.build({
@@ -249,7 +250,7 @@ describe('Quota workflow tests', () => {
249250
endpoint_type: updatedEndpoint.endpoint_type,
250251
quota_limit: 450,
251252
quota_name: randomLabel(15),
252-
resource_metric: 'object',
253+
resource_metric: QuotaResourceMetrics.OBJECT,
253254
s3_endpoint: updatedDomain,
254255
}),
255256
];

packages/manager/cypress/e2e/core/cloudpulse/aclp-support.spec.ts

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import {
1414
import { randomLabel, randomNumber } from 'support/util/random';
1515

1616
import {
17-
METRICS_BETA_MODE_BANNER_TEXT,
18-
METRICS_BETA_MODE_BUTTON_TEXT,
19-
METRICS_LEGACY_MODE_BANNER_TEXT,
20-
METRICS_LEGACY_MODE_BUTTON_TEXT,
17+
METRICS_ACLP_MODE_BETA_AND_NEW_PHASE_BUTTON_TEXT,
18+
METRICS_ACLP_MODE_BETA_PHASE_BANNER_TEXT,
19+
METRICS_LEGACY_MODE_BETA_PHASE_BANNER_TEXT,
20+
METRICS_LEGACY_MODE_BETA_PHASE_BUTTON_TEXT,
2121
} from 'src/features/Linodes/constants';
2222

2323
import type { Stats } from '@linode/api-v4';
@@ -34,10 +34,26 @@ describe('ACLP Components UI varies according to ACLP support by region and user
3434
mockAppendFeatureFlags({
3535
aclpServices: {
3636
linode: {
37-
alerts: { beta: false, enabled: false },
38-
metrics: { beta: true, enabled: true },
37+
alerts: {
38+
beta: false, // irrelevant since we are no longer using this service-specific beta flag
39+
enabled: false,
40+
},
41+
metrics: {
42+
beta: true, // irrelevant since we are no longer using this service-specific beta flag
43+
enabled: true,
44+
},
3945
},
4046
},
47+
// For Metrics
48+
aclp: {
49+
beta: true, // relevant for this test suite
50+
new: false, // relevant for this test suite
51+
},
52+
// For Alerts
53+
aclpAlerting: {
54+
beta: false, // relevant for this test suite
55+
new: false, // relevant for this test suite
56+
},
4157
}).as('getFeatureFlags');
4258
});
4359
describe('toggle user preference when region supports aclp', function () {
@@ -69,7 +85,7 @@ describe('ACLP Components UI varies according to ACLP support by region and user
6985
});
7086
// UI displays beta metrics, can switch to legacy view
7187
it('user preference enables aclp', function () {
72-
mockGetUserPreferences({ isAclpMetricsBeta: true }).as(
88+
mockGetUserPreferences({ isAclpMetricsMode: true }).as(
7389
'getUserPreferences'
7490
);
7591
cy.visitWithLogin(`/linodes/${this.mockLinodeId}/metrics`);
@@ -94,10 +110,12 @@ describe('ACLP Components UI varies according to ACLP support by region and user
94110
cy.get('[data-testid="metrics-preference-banner-text"]').should(
95111
'be.visible'
96112
);
97-
cy.contains(METRICS_BETA_MODE_BANNER_TEXT).should('be.visible');
113+
cy.contains(METRICS_ACLP_MODE_BETA_PHASE_BANNER_TEXT).should(
114+
'be.visible'
115+
);
98116

99117
ui.button
100-
.findByTitle(METRICS_BETA_MODE_BUTTON_TEXT)
118+
.findByTitle(METRICS_ACLP_MODE_BETA_AND_NEW_PHASE_BUTTON_TEXT)
101119
.should('be.visible')
102120
.should('be.enabled');
103121
// UI displays mock error msg
@@ -107,7 +125,7 @@ describe('ACLP Components UI varies according to ACLP support by region and user
107125

108126
// UI displays legacy metrics, can switch to beta view
109127
it('user preference disables aclp', function () {
110-
mockGetUserPreferences({ isAclpMetricsBeta: false }).as(
128+
mockGetUserPreferences({ isAclpMetricsMode: false }).as(
111129
'getUserPreferences'
112130
);
113131
const mockLegacyStats: Stats = generateMockLegacyStats();
@@ -137,19 +155,25 @@ describe('ACLP Components UI varies according to ACLP support by region and user
137155
);
138156
// expect legacy metrics view of LinodeSummary component to be displayed
139157
cy.get('[data-testid="linode-summary"]').should('be.visible');
140-
cy.contains(METRICS_LEGACY_MODE_BANNER_TEXT).should('be.visible');
158+
cy.contains(METRICS_LEGACY_MODE_BETA_PHASE_BANNER_TEXT).should(
159+
'be.visible'
160+
);
141161
// switch to beta metrics
142162
ui.button
143-
.findByTitle(METRICS_LEGACY_MODE_BUTTON_TEXT)
163+
.findByTitle(METRICS_LEGACY_MODE_BETA_PHASE_BUTTON_TEXT)
144164
.should('be.visible')
145165
.should('be.enabled')
146166
.click();
147167
// wait for dashboard query to complete
148168
cy.wait('@getDashboardError');
149-
cy.contains(METRICS_BETA_MODE_BANNER_TEXT).should('be.visible');
150-
cy.contains(METRICS_LEGACY_MODE_BANNER_TEXT).should('not.exist');
169+
cy.contains(METRICS_ACLP_MODE_BETA_PHASE_BANNER_TEXT).should(
170+
'be.visible'
171+
);
172+
cy.contains(METRICS_LEGACY_MODE_BETA_PHASE_BANNER_TEXT).should(
173+
'not.exist'
174+
);
151175
ui.button
152-
.findByTitle(METRICS_BETA_MODE_BUTTON_TEXT)
176+
.findByTitle(METRICS_ACLP_MODE_BETA_AND_NEW_PHASE_BUTTON_TEXT)
153177
.should('be.visible')
154178
.should('be.enabled');
155179
});
@@ -182,7 +206,7 @@ describe('ACLP Components UI varies according to ACLP support by region and user
182206
});
183207
// UI displays legacy metrics, no option to switch to beta view
184208
it('user preference enables aclp', function () {
185-
mockGetUserPreferences({ isAclpMetricsBeta: true }).as(
209+
mockGetUserPreferences({ isAclpMetricsMode: true }).as(
186210
'getUserPreferences'
187211
);
188212
cy.visitWithLogin(`/linodes/${this.mockLinodeId}/metrics`);
@@ -191,7 +215,7 @@ describe('ACLP Components UI varies according to ACLP support by region and user
191215

192216
// UI displays legacy metrics, no option to switch to beta view
193217
it('user preference disables aclp', function () {
194-
mockGetUserPreferences({ isAclpMetricsBeta: false }).as(
218+
mockGetUserPreferences({ isAclpMetricsMode: false }).as(
195219
'getUserPreferences'
196220
);
197221
cy.visitWithLogin(`/linodes/${this.mockLinodeId}/metrics`);

0 commit comments

Comments
 (0)