Skip to content

Commit

Permalink
Merge pull request #10458 from linode/staging
Browse files Browse the repository at this point in the history
Release v1.119.0 - staging → master
  • Loading branch information
jdamore-linode authored May 13, 2024
2 parents 1ab4d3c + b5bf273 commit e1e0bd8
Show file tree
Hide file tree
Showing 207 changed files with 6,298 additions and 2,732 deletions.
18 changes: 18 additions & 0 deletions packages/api-v4/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,21 @@
## [2024-05-13] - v0.117.0


### Added:

- 'edge' Linode type class ([#10415](https://github.com/linode/manager/pull/10415))

### Changed:

- Allow `backup_id` to be `null` in `CreateLinodeRequest` ([#10404](https://github.com/linode/manager/pull/10404))
- Add disk_encryption to Linode, Disk, CreateLinodeRequest, RebuildRequest, and KubeNodePoolResponse interfaces ([#10413](https://github.com/linode/manager/pull/10413))
- Allow null for Placement Groups maximum_pgs_per_customer ([#10433](https://github.com/linode/manager/pull/10433))

### Upcoming Features:

- Update Placement Group event types ([#10420](https://github.com/linode/manager/pull/10420))


## [2024-05-06] - v0.116.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.116.0",
"version": "0.117.0",
"homepage": "https://github.com/linode/manager/tree/develop/packages/api-v4",
"bugs": {
"url": "https://github.com/linode/manager/issues"
Expand Down
11 changes: 6 additions & 5 deletions packages/api-v4/src/account/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -359,11 +359,12 @@ export type EventAction =
| 'nodebalancer_update'
| 'password_reset'
| 'placement_group_assign'
| 'placement_group_created'
| 'placement_group_assigned'
| 'placement_group_unassigned'
| 'placement_group_updated'
| 'placement_group_deleted'
| 'placement_group_became_non_compliant'
| 'placement_group_became_compliant'
| 'placement_group_create'
| 'placement_group_unassign'
| 'placement_group_update'
| 'placement_group_delete'
| 'profile_update'
| 'stackscript_create'
| 'stackscript_delete'
Expand Down
3 changes: 3 additions & 0 deletions packages/api-v4/src/kubernetes/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import type { EncryptionStatus } from 'src/linodes';

export interface KubernetesCluster {
created: string;
updated: string;
Expand All @@ -16,6 +18,7 @@ export interface KubeNodePoolResponse {
nodes: PoolNodeResponse[];
type: string;
autoscaler: AutoscaleSettings;
disk_encryption?: EncryptionStatus; // @TODO LDE: remove optionality once LDE is fully rolled out
}

export interface PoolNodeResponse {
Expand Down
14 changes: 12 additions & 2 deletions packages/api-v4/src/linodes/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import type { PlacementGroupPayload } from '../placement-groups/types';

export type Hypervisor = 'kvm' | 'zen';

export type EncryptionStatus = 'enabled' | 'disabled';

export interface LinodeSpecs {
disk: number;
memory: number;
Expand All @@ -18,6 +20,7 @@ export interface Linode {
alerts: LinodeAlerts;
backups: LinodeBackups;
created: string;
disk_encryption?: EncryptionStatus; // @TODO LDE: Remove optionality once LDE is fully rolled out
region: string;
image: string | null;
group: string;
Expand Down Expand Up @@ -267,6 +270,7 @@ export interface Disk {
filesystem: Filesystem;
created: string;
updated: string;
disk_encryption?: EncryptionStatus; // @TODO LDE: remove optionality once LDE is fully rolled out
}

export type DiskStatus = 'ready' | 'not ready' | 'deleting';
Expand Down Expand Up @@ -374,7 +378,7 @@ export interface CreateLinodeRequest {
*
* This field and the image field are mutually exclusive.
*/
backup_id?: number;
backup_id?: number | null;
/**
* When deploying from an Image, this field is optional, otherwise it is ignored.
* This is used to set the swap disk size for the newly-created Linode.
Expand Down Expand Up @@ -447,9 +451,14 @@ export interface CreateLinodeRequest {
*/
firewall_id?: number | null;
/**
* An object that assigns this the Linode to a placment group upon creation.
* An object that assigns this the Linode to a placement group upon creation.
*/
placement_group?: CreateLinodePlacementGroupPayload;
/**
* A property with a string literal type indicating whether the Linode is encrypted or unencrypted.
* @default 'enabled' (if the region supports LDE)
*/
disk_encryption?: EncryptionStatus;
}

export interface MigrateLinodeRequest {
Expand Down Expand Up @@ -485,6 +494,7 @@ export interface RebuildRequest {
stackscript_id?: number;
stackscript_data?: any;
booted?: boolean;
disk_encryption?: EncryptionStatus;
}

export interface LinodeDiskCreationData {
Expand Down
2 changes: 1 addition & 1 deletion packages/api-v4/src/placement-groups/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export const AFFINITY_TYPES = {
} as const;

export type AffinityType = keyof typeof AFFINITY_TYPES;
export type AffinityEnforcement = 'Strict' | 'Flexible';
export type AffinityTypeEnforcement = 'Strict' | 'Flexible';

export interface PlacementGroup {
id: number;
Expand Down
2 changes: 1 addition & 1 deletion packages/api-v4/src/regions/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export interface Region {
country: Country;
capabilities: Capabilities[];
placement_group_limits: {
maximum_pgs_per_customer: number;
maximum_pgs_per_customer: number | null; // This value can be unlimited for some customers, for which the API returns the `null` value.
maximum_linodes_per_pg: number;
};
status: RegionStatus;
Expand Down
56 changes: 56 additions & 0 deletions packages/manager/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,62 @@ 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/).

## [2024-05-13] - v1.119.0


### Changed:

- Update Account Closure Dialog Wording ([#10406](https://github.com/linode/manager/pull/10406))
- Implement GPUv2 plan divider & cleanup/consolidate plan selection components ([#10407](https://github.com/linode/manager/pull/10407)) [#10450](https://github.com/linode/manager/pull/10450)

### Fixed:

- Object ACL select field enabled in loading state ([#10412](https://github.com/linode/manager/pull/10412))
- Modification of Linode config 'interfaces' array on no changes ([#10423](https://github.com/linode/manager/pull/10423))
- Table component props forwarding ([#10424](https://github.com/linode/manager/pull/10424))

### Tech Stories:

- Remove `linodeCloneUiChanges` feature flag and clean up usages ([#10385](https://github.com/linode/manager/pull/10385))
- Query Key Factory for Volumes ([#10414](https://github.com/linode/manager/pull/10414))
- Query Key Factory for Kubernetes ([#10428](https://github.com/linode/manager/pull/10428))
- Clean up Main Content Banner ([#10430](https://github.com/linode/manager/pull/10430))
- Clean up Database feature flagging logic ([#10435](https://github.com/linode/manager/pull/10435))

### Tests:

- Add Cypress test coverage for Firewall renaming ([#10384](https://github.com/linode/manager/pull/10384))
- Add Cypress test for Domain cloning ([#10403](https://github.com/linode/manager/pull/10403))
- Fix VPC subnet Linode assignment integration test failures ([#10405](https://github.com/linode/manager/pull/10405))
- Fix access key test failure when user has many OBJ buckets ([#10405](https://github.com/linode/manager/pull/10405))
- Refactor Linode config end-to-end tests ([#10405](https://github.com/linode/manager/pull/10405))
- Fix failing OBJ E2E tests following API release ([#10417](https://github.com/linode/manager/pull/10417))
- Add Cypress tests for Placement Group deletion flows ([#10425](https://github.com/linode/manager/pull/10425))
- Add Placement Group create flow UI test ([#10445](https://github.com/linode/manager/pull/10445))
- Fix One-Click App test by using Ubuntu 22.04 image ([#10447](https://github.com/linode/manager/pull/10447))

### Upcoming Features:

- Add dialog to refresh proxy tokens as time expires ([#10361](https://github.com/linode/manager/pull/10361))
- Update Placement Groups text copy ([#10399](https://github.com/linode/manager/pull/10399))
- Linode Create Refactor:
- Marketplace - Part 1 ([#10401](https://github.com/linode/manager/pull/10401))
- Backups (#10404)
- Marketplace - Part 2 (#10419)
- Cloning ([#10421](https://github.com/linode/manager/pull/10421))
- Update Placement Group Table Row linodes tooltip and SelectPlacementGroup option label ([#10408](https://github.com/linode/manager/pull/10408))
- Add content to the ResourcesSection of the PG landing page in empty state ([#10411](https://github.com/linode/manager/pull/10411))
- Use 'edge'-class plans in edge regions ([#10415](https://github.com/linode/manager/pull/10415))
- Add disk_encryption to several factories for mocked data ([#10418](https://github.com/linode/manager/pull/10418))
- Fix Placement Group action event formatting ([#10420](https://github.com/linode/manager/pull/10420))
- Replace remaining feature flag implementation with `useIsPlacementGroupsEnabled` utility function ([#10431](https://github.com/linode/manager/pull/10431))
- Update Placement Groups final copy ([#10434](https://github.com/linode/manager/pull/10434))
- Add support for Placement Groups in Linode CLI tool ([#10438](https://github.com/linode/manager/pull/10438))
- Set PlacementGroupSelect clearOnBlur to true ([#10427](https://github.com/linode/manager/pull/10427))
- Update Placement Groups maximum_pgs_per_customer UI (#10433)
- Add DiskEncryption component ([#10439](https://github.com/linode/manager/pull/10439))


## [2024-05-06] - v1.118.1


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,9 @@ describe('Account cancellation', () => {
});

ui.dialog
.findByTitle('Are you sure you want to close your Linode account?')
.findByTitle(
'Are you sure you want to close your cloud computing services account?'
)
.should('be.visible')
.within(() => {
cy.findByText(cancellationDataLossWarning, { exact: false }).should(
Expand Down Expand Up @@ -179,7 +181,9 @@ describe('Account cancellation', () => {

// Fill out cancellation dialog and attempt submission.
ui.dialog
.findByTitle('Are you sure you want to close your Linode account?')
.findByTitle(
'Are you sure you want to close your cloud computing services account?'
)
.should('be.visible')
.within(() => {
cy.findByLabelText(
Expand Down Expand Up @@ -353,7 +357,9 @@ describe('Parent/Child account cancellation', () => {
});

ui.dialog
.findByTitle('Are you sure you want to close your Linode account?')
.findByTitle(
'Are you sure you want to close your cloud computing services account?'
)
.should('be.visible')
.within(() => {
cy.findByText(cancellationDataLossWarning, { exact: false }).should(
Expand Down
137 changes: 137 additions & 0 deletions packages/manager/cypress/e2e/core/domains/smoke-clone-domain.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
import { Domain } from '@linode/api-v4';
import { domainFactory } from '@src/factories';
import { getClick, fbtClick, fbltClick } from 'support/helpers';
import { authenticate } from 'support/api/authentication';
import { randomDomainName } from 'support/util/random';
import { createDomain } from '@linode/api-v4/lib/domains';
import { createDomainRecords } from 'support/constants/domains';
import { interceptCreateDomainRecord } from 'support/intercepts/domains';
import { ui } from 'support/ui';
import { cleanUp } from 'support/util/cleanup';

authenticate();
describe('Clone a Domain', () => {
before(() => {
cleanUp('domains');
});

/*
* - Clicks "Clone" action menu item for domain but cancels operation.
* - Clicks "Clone" action menu item for domain and confirms operation.
* - Confirms that a "Domain is not valid." error is yielded when entering an invalid domain name.
* - Confirms that the user is redirected to the new Domain's details page after cloning.
* - Confirms that domain is still in landing page list after canceled operation.
* - Confirms that cloned domains contain the same records as the original Domain.
*/
it('clones a domain', () => {
const domainRequest = domainFactory.build({
domain: randomDomainName(),
group: 'test-group',
});

const invalidDomainName = 'invalid-domain-name';
const clonedDomainName = randomDomainName();

const domainRecords = createDomainRecords();

cy.defer(createDomain(domainRequest), 'creating domain').then(
(domain: Domain) => {
// Add records to the domain.
cy.visitWithLogin(`/domains/${domain.id}`);

domainRecords.forEach((rec) => {
interceptCreateDomainRecord().as('apiCreateRecord');
fbtClick(rec.name);
rec.fields.forEach((f) => {
getClick(f.name).type(f.value);
});
fbtClick('Save');
cy.wait('@apiCreateRecord');
});

cy.visitWithLogin('/domains');

// Confirm that domain is listed and initiate deletion.
cy.findByText(domain.domain)
.should('be.visible')
.closest('tr')
.within(() => {
ui.actionMenu
.findByTitle(`Action menu for Domain ${domain}`)
.should('be.visible')
.click();
});
ui.actionMenuItem.findByTitle('Clone').should('be.visible').click();

// Cancel cloning when prompted to confirm.
ui.drawer
.findByTitle(`Clone Domain`)
.should('be.visible')
.within(() => {
ui.buttonGroup
.findButtonByTitle('Cancel')
.should('be.visible')
.should('be.enabled')
.click();
});

// Confirm that no new domain is added and initiate cloning again.
cy.findByText(domain.domain)
.should('be.visible')
.closest('tr')
.within(() => {
ui.actionMenu
.findByTitle(`Action menu for Domain ${domain}`)
.should('be.visible')
.click();
});
ui.actionMenuItem.findByTitle('Clone').should('be.visible').click();

// Confirm cloning.
ui.drawer
.findByTitle(`Clone Domain`)
.should('be.visible')
.within(() => {
// The button should be disabled before confirming the correct domain
ui.buttonGroup
.findButtonByTitle('Create Domain')
.should('be.visible')
.should('be.disabled');

// Confirm that an error is displayed when entering an invalid domain name
fbltClick('New Domain').type(invalidDomainName);
ui.buttonGroup
.findButtonByTitle('Create Domain')
.should('be.visible')
.should('be.enabled')
.click();
cy.findByText('Domain is not valid.').should('be.visible');

fbltClick('New Domain').clear().type(clonedDomainName);
ui.buttonGroup
.findButtonByTitle('Create Domain')
.should('be.visible')
.should('be.enabled')
.click();
});
// After cloning a Domain, the user is redirected to the new Domain's details page
cy.url().should('endWith', 'domains');

// Confirm that domain is cloned and cloned domains contain the same records as the original Domain.
cy.visitWithLogin('/domains');
cy.findByText(domain.domain).should('be.visible');
cy.findByText(clonedDomainName).should('be.visible').click();
domainRecords.forEach((rec) => {
cy.get(`[aria-label="${rec.tableAriaLabel}"]`).within((_table) => {
rec.fields.forEach((f) => {
if (f.skipCheck) {
return;
}
cy.findByText(f.value, { exact: !f.approximate });
});
});
});
}
);
});
});
Loading

0 comments on commit e1e0bd8

Please sign in to comment.