Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 5 additions & 0 deletions packages/api-v4/.changeset/pr-13269-added-1768236376323.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/api-v4": Added
---

`Maintenance Policy` to Linode Capabilities ([#13269](https://github.com/linode/manager/pull/13269))
9 changes: 8 additions & 1 deletion packages/api-v4/src/linodes/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,13 @@ export interface Linode {
label: string;
lke_cluster_id: null | number;
locks: LockType[];
maintenance_policy?: MaintenancePolicySlug;
/**
* The maintenance policy configured for this Linode.
*
* Will be `null` if the Maintenance Policy feature is not enabled or the Linode's
* region does not support maintenance policies.
*/
maintenance_policy: MaintenancePolicySlug | null;
placement_group: LinodePlacementGroupPayload | null;
region: string;
site_type: RegionSite;
Expand Down Expand Up @@ -75,6 +81,7 @@ export interface LinodeBackups {
export type LinodeCapabilities =
| 'Block Storage Encryption'
| 'Block Storage Performance B1'
| 'Maintenance Policy'
| 'SMTP Enabled';

export type Window =
Expand Down
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-13269-fixed-1768236332373.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@linode/manager": Fixed
---

Only show Maintenance Policy for Linodes that actually have a Maintenance Policy ([#13269](https://github.com/linode/manager/pull/13269))
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,63 @@

expect(await findByTestId('linode-encryption-status')).toBeVisible();
});

it('should display the Linode maintenance policy if it supports it and the flag is on', async () => {
const linode = linodeFactory.build({
maintenance_policy: 'linode/power_off_on',
capabilities: ['Maintenance Policy'],

Check warning on line 343 in packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx

View workflow job for this annotation

GitHub Actions / ESLint Review (manager)

[eslint] reported by reviewdog 🐢 Define a constant instead of duplicating this literal 3 times. Raw Output: {"ruleId":"sonarjs/no-duplicate-string","severity":1,"message":"Define a constant instead of duplicating this literal 3 times.","line":343,"column":22,"nodeType":"Literal","endLine":343,"endColumn":42}
});

server.use(
http.get('*/linode/instances/:linodeId', () => {
return HttpResponse.json(linode);
})
);

const { findByText, getByText } = renderWithTheme(
<LinodeEntityDetail handlers={handlers} id={linode.id} linode={linode} />,
{
flags: {
vmHostMaintenance: { enabled: true, beta: false, new: false },
},
}
);

expect(
await findByText('Maintenance Policy', { exact: false })
).toBeVisible();

expect(getByText('Power Off / Power On')).toBeVisible();
});

it('should not display a maintenance policy if the linode does not have one', async () => {
const linode = linodeFactory.build({
maintenance_policy: null,
capabilities: [],
});

server.use(
http.get('*/linode/instances/:linodeId', () => {
return HttpResponse.json(linode);
})
);

const { findByText, queryByText } = renderWithTheme(
<LinodeEntityDetail handlers={handlers} id={linode.id} linode={linode} />,
{
flags: {
vmHostMaintenance: { enabled: true, beta: false, new: false },
},
}
);

// Ensure the Linode is loaded
await findByText(linode.ipv4[0]);

expect(
queryByText('Maintenance Policy', { exact: false })
).not.toBeInTheDocument();
});
});

describe('getSubnetsString function', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ export const LinodeEntityDetail = (props: Props) => {
image={linode.image ?? 'Unknown Image'}
imageVendor={imageVendor}
isSummaryView={isSummaryView}
linodeCapabilities={linode.capabilities}
linodeId={linode.id}
linodeLabel={linode.label}
linodeMaintenancePolicySet={
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,7 @@ import { LinodeEntityDetailHeaderMaintenancePolicy } from './LinodeEntityDetailH
import { getLinodeIconStatus } from './LinodesLanding/utils';

import type { LinodeHandlers } from './LinodesLanding/LinodesLanding';
import type {
Config,
LinodeBackups,
MaintenancePolicySlug,
} from '@linode/api-v4';
import type { Config, LinodeBackups, LinodeCapabilities } from '@linode/api-v4';
import type { Linode, LinodeType } from '@linode/api-v4/lib/linodes/types';
import type { TypographyProps } from '@linode/ui';
import type { LinodeMaintenance } from 'src/utilities/linodes';
Expand All @@ -45,9 +41,10 @@ export interface HeaderProps {
image: string;
imageVendor: null | string;
isSummaryView?: boolean;
linodeCapabilities: LinodeCapabilities[];
linodeId: number;
linodeLabel: string;
linodeMaintenancePolicySet: MaintenancePolicySlug | undefined;
linodeMaintenancePolicySet: Linode['maintenance_policy'];
linodeRegionDisplay: string;
linodeStatus: Linode['status'];
maintenance: LinodeMaintenance | null;
Expand Down Expand Up @@ -76,6 +73,7 @@ export const LinodeEntityDetailHeader = (
linodeLabel,
linodeRegionDisplay,
linodeStatus,
linodeCapabilities,
linodeMaintenancePolicySet,
maintenance,
openNotificationMenu,
Expand All @@ -87,6 +85,10 @@ export const LinodeEntityDetailHeader = (

const { isVMHostMaintenanceEnabled } = useVMHostMaintenanceEnabled();

const showMaintenancePolicy =
isVMHostMaintenanceEnabled &&
linodeCapabilities.includes('Maintenance Policy');

const isRunning = linodeStatus === 'running';

const isRebootNeeded = React.useMemo(
Expand Down Expand Up @@ -157,7 +159,7 @@ export const LinodeEntityDetailHeader = (
text={VPC_REBOOT_MESSAGE}
/>
)}
{isVMHostMaintenanceEnabled && (
{showMaintenancePolicy && (
<LinodeEntityDetailHeaderMaintenancePolicy
linodeMaintenancePolicySet={linodeMaintenancePolicySet}
maintenance={maintenance}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import * as React from 'react';
import { statusTooltipIcons } from 'src/features/Linodes/LinodeEntityDetailHeaderMaintenancePolicy.utils';
import { LinodeMaintenanceText } from 'src/features/Linodes/LinodeMaintenanceText';

import type { MaintenancePolicySlug } from '@linode/api-v4';
import type { Linode } from '@linode/api-v4';
import type { LinodeMaintenance } from 'src/utilities/linodes';

interface LinodeEntityDetailHeaderMaintenancePolicyProps {
linodeMaintenancePolicySet: MaintenancePolicySlug | undefined;
linodeMaintenancePolicySet: Linode['maintenance_policy'];
maintenance: LinodeMaintenance | null;
}

Expand Down