Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
4fcc96c
test: [DI-30016] - Add spec for Edit notification channel (#13431)
shnagend-akamai Mar 11, 2026
0481a1b
ref: STORIF-285 - Quota resource metric converted into an enum. (#13447)
dchyrva-akamai Mar 12, 2026
d8296c0
upcoming: [DPS-41595] - Utility setup changes for CSV downloader in C…
venkymano-akamai Mar 13, 2026
a831ac3
Merge branch 'master' into develop
grevanak-akamai Mar 13, 2026
1cc7151
fix: [DPS-36773] - Destination Form: endpoint field is not clearing v…
mduda-akamai Mar 13, 2026
528ede1
Merge branch 'linode:develop' into develop
grevanak-akamai Mar 13, 2026
2965cf8
fix: [UIE-10482] Parent / Child - `SwitchAccountDrawer` search focus …
abailly-akamai Mar 13, 2026
6b9514b
upcoming: [UIE-10422] - Fix PgBouncer and Service URI bugs (#13487)
hana-akamai Mar 16, 2026
bbd6995
fix: [UIE-10338] marketplace fixes (#13498)
tvijay-akamai Mar 17, 2026
952f363
fix: [UIE-10352] Added capability to open links in markdown in differ…
tvijay-akamai Mar 17, 2026
9fcb771
upcoming: [UIE-10204] - Allow Simultaneous V1 (Legacy) and V2 (ACLP) …
pmakode-akamai Mar 17, 2026
9bce141
fix: [DPS-36769] - Filtering clusters by region not working (#13491)
mduda-akamai Mar 17, 2026
6f39842
fix: [UIE-10285] - Advanced Config field tooltip error (#13465)
hana-akamai Mar 17, 2026
cac8d8c
upcoming: [DPS-41183] - Migrate content to details for Notification C…
santoshp210-akamai Mar 17, 2026
fff15c2
fix: [UIE-10482] Improve loading pattern on Account Delegation landin…
abailly-akamai Mar 18, 2026
b710851
fix: [UIE-10472] - Remove unintended validation on optional email fie…
harsh-akamai Mar 18, 2026
f18fce5
upcoming: [UIE-9376] — Add Image select table to Linode Rebuild dialo…
dwiley-akamai Mar 18, 2026
d01dccc
upcoming: [UIE-10425] - Add the new feature "Reserved IPs" to side na…
grevanak-akamai Mar 18, 2026
462f74e
build(deps-dev): Bump simple-git from 3.27.0 to 3.32.3 (#13477)
dependabot[bot] Mar 19, 2026
f284f03
new: STORIF-316 - Removed ErrorState for 404 error in global quotas t…
dchyrva-akamai Mar 19, 2026
9765174
change: [DPS-41214] - Stream and Destination Empty Landing pages flic…
kagora-akamai Mar 19, 2026
c89a6b2
test: [UIE-10422] - DBaaS - Fixing flaky ServiceURI.spec.ts tests (#1…
smans-akamai Mar 19, 2026
85edc8c
feat: [OCA-1666] - Add (DeepSeek,OpenClaw) to Quick Deploy Apps (#13499)
n0vabyte Mar 23, 2026
076ad9d
upcoming: [DPS-36770] - Custom HTTPS form - UX and Tech Writing impro…
mduda-akamai Mar 23, 2026
2cbecd4
upcoming: [DPS-41595] - Ability to download widget data as CSV in Clo…
venkymano-akamai Mar 23, 2026
ca83906
fix: [UIE-10522] - Disable credential buttons for resuming state (#13…
hana-akamai Mar 23, 2026
849c34e
Fix failure by asserting password reveal button is disabled when DB i…
jdamore-linode Mar 23, 2026
0bff8eb
upcoming: [DPS-41443] - Metrics widget dimension filter and Group By …
santoshp210-akamai Mar 24, 2026
d4975ff
test: [DI-30129] - Add spec for show details notification channel (#1…
shnagend-akamai Mar 24, 2026
891c1e5
fix: [DPS-41958] - Destination Form: omit empty tls_hostname from des…
mduda-akamai Mar 24, 2026
c02927b
fix: [UIE-10337] updated error message in marketplace contact sales d…
tvijay-akamai Mar 24, 2026
f44fbdd
fix: [UIE-10357] fixed accessibility issue (#13515)
tvijay-akamai Mar 24, 2026
4536cf7
build(deps): Bump dompurify from 3.2.4 to 3.3.1 (#13466)
dependabot[bot] Mar 24, 2026
988fc5f
upcoming: [UIE-10490] - Configure New Feature Chip and Banner Messagi…
pmakode-akamai Mar 24, 2026
a3d6dd4
fix: General Service URI text in Database Summary page (#13519)
hana-akamai Mar 24, 2026
1c93873
build(deps): Bump jspdf from 4.2.0 to 4.2.1 (#13503)
dependabot[bot] Mar 24, 2026
d0083e8
test: [UIE-10554] - Fix LKE create test following APL launch (#13526)
jdamore-linode Mar 24, 2026
28d5bf9
Fix Linode alert creation test failures (#13527)
jdamore-linode Mar 24, 2026
2b3b3f8
feat: [UIE-10505] IAM Parent/Child - pendo tags (#13530)
mpolotsk-akamai Mar 25, 2026
d1ccb5b
Added: [UIE-10469] added new marketplace products (#13531)
tvijay-akamai Mar 25, 2026
696ca2b
test: corrected "can create and delete object storage buckets" test (…
skulpok-akamai Mar 25, 2026
8d2cc6d
fix: [UIE-10490, UIE-10564] - Mock relevant flags in alerts-related t…
pmakode-akamai Mar 25, 2026
d73a7f6
upcoming: [UIE-9402] - Implement Owned groups tab landing page (#13506)
fabrice-akamai Mar 25, 2026
6e7793d
Cloud version 1.161.0, API v4 version 0.159.0, Validation version 0.8…
tvijay-akamai Mar 25, 2026
abf048c
Merge pull request #13534 from linode/release/v1.161.0
tvijay-akamai Mar 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions packages/api-v4/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
## [2026-03-31] - v0.159.0


### Removed:

- Old `failed` property from `DatabaseStatus` ([#13505](https://github.com/linode/manager/pull/13505))

### Upcoming Features:

- Replaced `content` with `details` in cloudpulse/types.ts for ACLP-Alerts Notification Channels ([#13495](https://github.com/linode/manager/pull/13495))

## [2026-03-16] - v0.158.0


Expand Down
2 changes: 1 addition & 1 deletion packages/api-v4/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@linode/api-v4",
"version": "0.158.0",
"version": "0.159.0",
"homepage": "https://github.com/linode/manager/tree/develop/packages/api-v4",
"bugs": {
"url": "https://github.com/linode/manager/issues"
Expand Down
40 changes: 5 additions & 35 deletions packages/api-v4/src/cloudpulse/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ type AlertNotificationEmail = 'email';
type AlertNotificationSlack = 'slack';
type AlertNotificationPagerDuty = 'pagerduty';
type AlertNotificationWebHook = 'webhook';
type EmailRecipientType =
export type EmailRecipientType =
| 'admin_users'
| 'read_users'
| 'read_write_users'
Expand Down Expand Up @@ -303,14 +303,7 @@ interface NotificationChannelBase {

interface NotificationChannelEmail extends NotificationChannelBase {
channel_type: AlertNotificationEmail;
content?: {
email: {
email_addresses: string[];
message: string;
subject: string;
};
};
details?: {
details: {
email: {
recipient_type: EmailRecipientType;
usernames: string[];
Expand All @@ -320,14 +313,7 @@ interface NotificationChannelEmail extends NotificationChannelBase {

interface NotificationChannelSlack extends NotificationChannelBase {
channel_type: AlertNotificationSlack;
content?: {
slack: {
message: string;
slack_channel: string;
slack_webhook_url: string;
};
};
details?: {
details: {
slack: {
slack_channel: string;
slack_webhook_url: string;
Expand All @@ -337,14 +323,7 @@ interface NotificationChannelSlack extends NotificationChannelBase {

interface NotificationChannelPagerDuty extends NotificationChannelBase {
channel_type: AlertNotificationPagerDuty;
content?: {
pagerduty: {
attributes: string[];
description: string;
service_api_key: string;
};
};
details?: {
details: {
pagerduty: {
attributes: string[];
description: string;
Expand All @@ -354,16 +333,7 @@ interface NotificationChannelPagerDuty extends NotificationChannelBase {
}
interface NotificationChannelWebHook extends NotificationChannelBase {
channel_type: AlertNotificationWebHook;
content?: {
webhook: {
http_headers: {
header_key: string;
header_value: string;
}[];
webhook_url: string;
};
};
details?: {
details: {
webhook: {
alert_body: {
body: string;
Expand Down
1 change: 0 additions & 1 deletion packages/api-v4/src/databases/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ export interface DatabaseEngine {
export type DatabaseStatus =
| 'active'
| 'degraded'
| 'failed'
| 'migrated'
| 'migrating'
| 'provisioning'
Expand Down
2 changes: 2 additions & 0 deletions packages/api-v4/src/images/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export * from './images';

export * from './sharegroups';

export * from './types';
15 changes: 14 additions & 1 deletion packages/api-v4/src/quotas/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
import type { ObjectStorageEndpointTypes } from 'src/object-storage';
import type { Region } from 'src/regions';

export enum QuotaResourceMetrics {
BUCKET = 'bucket',
BYTE = 'byte',
BYTE_PER_SECOND = 'byte_per_second',
CLUSTER = 'cluster',
CPU = 'CPU',
GPU = 'GPU',
OBJECT = 'object',
REQUEST = 'request',
VPU = 'VPU',
}

/**
* A Quota is a service used limit that is rated based on service metrics such
* as vCPUs used, instances or storage size.
Expand Down Expand Up @@ -54,7 +67,7 @@ export interface Quota {
/**
* The unit of measurement for this service limit.
*/
resource_metric: string;
resource_metric: QuotaResourceMetrics;

/**
* The S3 endpoint URL to which this limit applies.
Expand Down
54 changes: 54 additions & 0 deletions packages/manager/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,60 @@ All notable changes to this project will be documented in this file.

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

## [2026-03-31] - v1.161.0


### Added:

- Quota resource metrics enum ([#13447](https://github.com/linode/manager/pull/13447))
- Add DeepSeek-R1 and OpenClaw to Quick Deploy Apps ([#13499](https://github.com/linode/manager/pull/13499))
- IAM: Add Pendo IDs for Parent/Child ([#13530](https://github.com/linode/manager/pull/13530))
- sftpgo
([#13531](https://github.com/linode/manager/pull/13531))

### Changed:

- Streams and Destinations Landing page initial load spinner added before empty state ([#13489](https://github.com/linode/manager/pull/13489))

### Fixed:

- Database Advanced Config field tooltip error ([#13465](https://github.com/linode/manager/pull/13465))
- Remove unintended validation on optional email fields in Contact Sales Drawer ([#13483](https://github.com/linode/manager/pull/13483))
- Parent / Child - SwitchAccountDrawer search focus ([#13490](https://github.com/linode/manager/pull/13490))
- 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))
- Destination Form: the Endpoint field is not clearing validation error when a Bucket is selected ([#13494](https://github.com/linode/manager/pull/13494))
- Marketplace Fixes: Improved texts and tooltips. Changed submit enable behavior in contact sales form ([#13498](https://github.com/linode/manager/pull/13498))
- 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))
- Improve loading pattern on Account Delegation landing page ([#13502](https://github.com/linode/manager/pull/13502))
- Disable Database credential buttons for resuming state ([#13505](https://github.com/linode/manager/pull/13505))
- Updated rate limiting error message in contact sales drawer ([#13512](https://github.com/linode/manager/pull/13512))
- 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))

### Tech Stories:

- Bump jspdf from 4.2.0 to 4.2.1 ([#13503](https://github.com/linode/manager/pull/13503))

### Tests:

- Added automation spec for edit notifiation channel ([#13431](https://github.com/linode/manager/pull/13431))
- Adding spec for show details notification channel ([#13449](https://github.com/linode/manager/pull/13449))
- Fix test failures in lke-create.spec.ts following feature flag change ([#13526](https://github.com/linode/manager/pull/13526))

### Upcoming Features:

- Allow simultaneous v1 (Legacy) and v2 (ACLP) alerting in Linode edit flow ([#13455](https://github.com/linode/manager/pull/13455))
- Use ImageSelectTable in Linode Rebuild dialog ([#13482](https://github.com/linode/manager/pull/13482))
- Utility setup changes for CSV download for `CloudPulse metrics widget data` ([#13484](https://github.com/linode/manager/pull/13484))
- Reserve IP: Add the new feature Reserved IPs to side nav ([#13486](https://github.com/linode/manager/pull/13486))
- Fix PgBouncer and Service URI bugs ([#13487](https://github.com/linode/manager/pull/13487))
- Migrated to `details` from `content` in ACLP-Alerts Notification Channels ([#13495](https://github.com/linode/manager/pull/13495))
- 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))
- 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))
- Ability to download widget data as CSV in `CloudPulse metrics dashboards` ([#13497](https://github.com/linode/manager/pull/13497))
- Implement owned groups landing page content ([#13506](https://github.com/linode/manager/pull/13506))
- Custom HTTPS destination form: improve the UX and update copy ([#13507](https://github.com/linode/manager/pull/13507))
- Configure new feature chip and banner messaging for ACLP Linode Alerts and Metrics ([#13509](https://github.com/linode/manager/pull/13509))

## [2026-03-16] - v1.160.0


Expand Down
13 changes: 7 additions & 6 deletions packages/manager/cypress/e2e/core/account/quotas-storage.spec.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { QuotaResourceMetrics } from '@linode/api-v4';
import { regionFactory } from '@linode/utilities';
import { profileFactory } from '@linode/utilities';
import { mockAppendFeatureFlags } from 'support/intercepts/feature-flags';
Expand Down Expand Up @@ -74,7 +75,7 @@ const mockQuotas = [
endpoint_type: mockSelectedEndpoint.endpoint_type,
quota_limit: 10,
quota_name: randomLabel(15),
resource_metric: 'byte',
resource_metric: QuotaResourceMetrics.BYTE,
s3_endpoint: selectedDomain,
}),
quotaFactory.build({
Expand All @@ -84,7 +85,7 @@ const mockQuotas = [
endpoint_type: mockSelectedEndpoint.endpoint_type,
quota_limit: 78,
quota_name: randomLabel(15),
resource_metric: 'bucket',
resource_metric: QuotaResourceMetrics.BUCKET,
s3_endpoint: selectedDomain,
}),
quotaFactory.build({
Expand All @@ -94,7 +95,7 @@ const mockQuotas = [
endpoint_type: mockSelectedEndpoint.endpoint_type,
quota_limit: 400,
quota_name: randomLabel(15),
resource_metric: 'object',
resource_metric: QuotaResourceMetrics.OBJECT,
s3_endpoint: selectedDomain,
}),
];
Expand Down Expand Up @@ -229,7 +230,7 @@ describe('Quota workflow tests', () => {
endpoint_type: updatedEndpoint.endpoint_type,
quota_limit: 20,
quota_name: randomLabel(15),
resource_metric: 'byte',
resource_metric: QuotaResourceMetrics.BYTE,
s3_endpoint: updatedDomain,
}),
quotaFactory.build({
Expand All @@ -239,7 +240,7 @@ describe('Quota workflow tests', () => {
endpoint_type: updatedEndpoint.endpoint_type,
quota_limit: 122,
quota_name: randomLabel(15),
resource_metric: 'bucket',
resource_metric: QuotaResourceMetrics.BUCKET,
s3_endpoint: updatedDomain,
}),
quotaFactory.build({
Expand All @@ -249,7 +250,7 @@ describe('Quota workflow tests', () => {
endpoint_type: updatedEndpoint.endpoint_type,
quota_limit: 450,
quota_name: randomLabel(15),
resource_metric: 'object',
resource_metric: QuotaResourceMetrics.OBJECT,
s3_endpoint: updatedDomain,
}),
];
Expand Down
58 changes: 41 additions & 17 deletions packages/manager/cypress/e2e/core/cloudpulse/aclp-support.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ import {
import { randomLabel, randomNumber } from 'support/util/random';

import {
METRICS_BETA_MODE_BANNER_TEXT,
METRICS_BETA_MODE_BUTTON_TEXT,
METRICS_LEGACY_MODE_BANNER_TEXT,
METRICS_LEGACY_MODE_BUTTON_TEXT,
METRICS_ACLP_MODE_BETA_AND_NEW_PHASE_BUTTON_TEXT,
METRICS_ACLP_MODE_BETA_PHASE_BANNER_TEXT,
METRICS_LEGACY_MODE_BETA_PHASE_BANNER_TEXT,
METRICS_LEGACY_MODE_BETA_PHASE_BUTTON_TEXT,
} from 'src/features/Linodes/constants';

import type { Stats } from '@linode/api-v4';
Expand All @@ -34,10 +34,26 @@ describe('ACLP Components UI varies according to ACLP support by region and user
mockAppendFeatureFlags({
aclpServices: {
linode: {
alerts: { beta: false, enabled: false },
metrics: { beta: true, enabled: true },
alerts: {
beta: false, // irrelevant since we are no longer using this service-specific beta flag
enabled: false,
},
metrics: {
beta: true, // irrelevant since we are no longer using this service-specific beta flag
enabled: true,
},
},
},
// For Metrics
aclp: {
beta: true, // relevant for this test suite
new: false, // relevant for this test suite
},
// For Alerts
aclpAlerting: {
beta: false, // relevant for this test suite
new: false, // relevant for this test suite
},
}).as('getFeatureFlags');
});
describe('toggle user preference when region supports aclp', function () {
Expand Down Expand Up @@ -69,7 +85,7 @@ describe('ACLP Components UI varies according to ACLP support by region and user
});
// UI displays beta metrics, can switch to legacy view
it('user preference enables aclp', function () {
mockGetUserPreferences({ isAclpMetricsBeta: true }).as(
mockGetUserPreferences({ isAclpMetricsMode: true }).as(
'getUserPreferences'
);
cy.visitWithLogin(`/linodes/${this.mockLinodeId}/metrics`);
Expand All @@ -94,10 +110,12 @@ describe('ACLP Components UI varies according to ACLP support by region and user
cy.get('[data-testid="metrics-preference-banner-text"]').should(
'be.visible'
);
cy.contains(METRICS_BETA_MODE_BANNER_TEXT).should('be.visible');
cy.contains(METRICS_ACLP_MODE_BETA_PHASE_BANNER_TEXT).should(
'be.visible'
);

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

// UI displays legacy metrics, can switch to beta view
it('user preference disables aclp', function () {
mockGetUserPreferences({ isAclpMetricsBeta: false }).as(
mockGetUserPreferences({ isAclpMetricsMode: false }).as(
'getUserPreferences'
);
const mockLegacyStats: Stats = generateMockLegacyStats();
Expand Down Expand Up @@ -137,19 +155,25 @@ describe('ACLP Components UI varies according to ACLP support by region and user
);
// expect legacy metrics view of LinodeSummary component to be displayed
cy.get('[data-testid="linode-summary"]').should('be.visible');
cy.contains(METRICS_LEGACY_MODE_BANNER_TEXT).should('be.visible');
cy.contains(METRICS_LEGACY_MODE_BETA_PHASE_BANNER_TEXT).should(
'be.visible'
);
// switch to beta metrics
ui.button
.findByTitle(METRICS_LEGACY_MODE_BUTTON_TEXT)
.findByTitle(METRICS_LEGACY_MODE_BETA_PHASE_BUTTON_TEXT)
.should('be.visible')
.should('be.enabled')
.click();
// wait for dashboard query to complete
cy.wait('@getDashboardError');
cy.contains(METRICS_BETA_MODE_BANNER_TEXT).should('be.visible');
cy.contains(METRICS_LEGACY_MODE_BANNER_TEXT).should('not.exist');
cy.contains(METRICS_ACLP_MODE_BETA_PHASE_BANNER_TEXT).should(
'be.visible'
);
cy.contains(METRICS_LEGACY_MODE_BETA_PHASE_BANNER_TEXT).should(
'not.exist'
);
ui.button
.findByTitle(METRICS_BETA_MODE_BUTTON_TEXT)
.findByTitle(METRICS_ACLP_MODE_BETA_AND_NEW_PHASE_BUTTON_TEXT)
.should('be.visible')
.should('be.enabled');
});
Expand Down Expand Up @@ -182,7 +206,7 @@ describe('ACLP Components UI varies according to ACLP support by region and user
});
// UI displays legacy metrics, no option to switch to beta view
it('user preference enables aclp', function () {
mockGetUserPreferences({ isAclpMetricsBeta: true }).as(
mockGetUserPreferences({ isAclpMetricsMode: true }).as(
'getUserPreferences'
);
cy.visitWithLogin(`/linodes/${this.mockLinodeId}/metrics`);
Expand All @@ -191,7 +215,7 @@ describe('ACLP Components UI varies according to ACLP support by region and user

// UI displays legacy metrics, no option to switch to beta view
it('user preference disables aclp', function () {
mockGetUserPreferences({ isAclpMetricsBeta: false }).as(
mockGetUserPreferences({ isAclpMetricsMode: false }).as(
'getUserPreferences'
);
cy.visitWithLogin(`/linodes/${this.mockLinodeId}/metrics`);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,9 @@ const notificationChannels = notificationChannelFactory.buildList(5);
const createNotificationChannel = notificationChannelFactory.build({
label: 'Test Channel Name',
channel_type: 'email',
content: {
details: {
email: {
email_addresses: ['user1', 'user2'],
message: 'You have a new Alert',
subject: 'Sample Alert',
usernames: ['user1', 'user2'],
},
},
});
Expand Down
Loading
Loading