Skip to content

change: [UIE-9888] - Make firewall selection mandatory while creating linode and its interfaces#13410

Open
grevanak-akamai wants to merge 3 commits intolinode:developfrom
grevanak-akamai:feature/UIE-10132-block-interface-creation-without-firewall
Open

change: [UIE-9888] - Make firewall selection mandatory while creating linode and its interfaces#13410
grevanak-akamai wants to merge 3 commits intolinode:developfrom
grevanak-akamai:feature/UIE-10132-block-interface-creation-without-firewall

Conversation

@grevanak-akamai
Copy link
Contributor

@grevanak-akamai grevanak-akamai commented Feb 18, 2026

Description 📝

Make firewall selection mandatory while creating linode and its interfaces. If there are no firewalls or user doesn't wants to assign a firewall to a linode, "No firewall" option can be selected but the firewall field cannot be left blank.

Changes 🔄

List any change(s) relevant to the reviewer.

  • Firewall selection is made mandatory while creating linode and adding interfaces to linode.
  • Added new option "No firewalls" under select firewall dropdown to allow users to not assign a firewall(Not recommended though). Added a warning notice if "No firewall" option is selected.
  • Updated linode schema to make firewall field mandatory.

Scope 🚢

Upon production release, changes in this PR will be visible to:

  • All customers
  • Some customers (e.g. in Beta or Limited Availability)
  • No customers / Not applicable

Target release date 🗓️

Mar 2026

Preview 📷

1. If no firewall is selected
Screenshot 2026-02-23 at 1 47 43 PM
2. "No firewall" option in the dropdown
Screenshot 2026-02-23 at 1 48 18 PM

How to test 🧪

Prerequisites

  • Navigate to Create linode page.

Verification steps

  • Ensure create linode submission fails if no option is selected under firewall dropdown.
  • Select any firewall or select "No Firewall" option in the dropdown and ensure linode is created/cloned.
Author Checklists

As an Author, to speed up the review process, I considered 🤔

👀 Doing a self review
❔ Our contribution guidelines
🤏 Splitting feature into small PRs
➕ Adding a changeset
🧪 Providing/improving test coverage
🔐 Removing all sensitive information from the code and PR description
🚩 Using a feature flag to protect the release
👣 Providing comprehensive reproduction steps
📑 Providing or updating our documentation
🕛 Scheduling a pair reviewing session
📱 Providing mobile support
♿ Providing accessibility support


  • I have read and considered all applicable items listed above.

As an Author, before moving this PR from Draft to Open, I confirmed ✅

  • All tests and CI checks are passing
  • TypeScript compilation succeeded without errors
  • Code passes all linting rules

@grevanak-akamai grevanak-akamai force-pushed the feature/UIE-10132-block-interface-creation-without-firewall branch from c096c03 to 4844424 Compare February 18, 2026 11:07

export const CreateLinodeInterfaceSchema = object({
firewall_id: number().nullable(),
firewall_id: number()
Copy link
Contributor Author

@grevanak-akamai grevanak-akamai Feb 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

API accepts both -1 and null(will be deprecated soon and will be utilized only to assign default firewall if any) to not to assign a firewall to a linode and hence firewall field has been made mandatory in UI.

@grevanak-akamai grevanak-akamai force-pushed the feature/UIE-10132-block-interface-creation-without-firewall branch from 3926c9e to 262df83 Compare February 22, 2026 18:18
@linode-gh-bot
Copy link
Collaborator

Cloud Manager UI test results

🔺 3 failing tests on test run #5 ↗︎

❌ Failing✅ Passing↪️ Skipped🕐 Duration
3 Failing865 Passing11 Skipped40m 58s

Details

Failing Tests
SpecTest
search-images.spec.tsCloud Manager Cypress Tests→Search Images » creates two images and make sure they show up in the table and are searchable
account-switching.spec.tsCloud Manager Cypress Tests→Parent/Child account switching→From Parent to Child » can search child accounts
smoke-community-stackscripts.spec.tsCloud Manager Cypress Tests→Community Stackscripts integration tests » deploys a new linode as expected

Troubleshooting

Use this command to re-run the failing tests:

pnpm cy:run -s "cypress/e2e/core/images/search-images.spec.ts,cypress/e2e/core/parentChild/account-switching.spec.ts,cypress/e2e/core/stackscripts/smoke-community-stackscripts.spec.ts"

label="Linode Interfaces - Public Interface Firewall"
onChange={(e, firewall) => field.onChange(firewall.id)}
placeholder={DEFAULT_FIREWALL_PLACEHOLDER}
showNoFirewallOption={false}
Copy link
Contributor Author

@grevanak-akamai grevanak-akamai Feb 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In future, default firewalls will also support "No Firewalls" option.

@grevanak-akamai grevanak-akamai marked this pull request as ready for review February 23, 2026 15:21
@grevanak-akamai grevanak-akamai requested review from a team as code owners February 23, 2026 15:21
@grevanak-akamai grevanak-akamai requested review from bnussman-akamai, coliu-akamai and jdamore-linode and removed request for a team February 23, 2026 15:21
@grevanak-akamai grevanak-akamai self-assigned this Feb 23, 2026
@grevanak-akamai grevanak-akamai added Ready for Review Linodes Dealing with the Linodes section of the app labels Feb 23, 2026
@grevanak-akamai
Copy link
Contributor Author

Cloud Manager UI test results

🔺 3 failing tests on test run #5 ↗︎

❌ Failing ✅ Passing ↪️ Skipped 🕐 Duration
3 Failing 865 Passing 11 Skipped 40m 58s

Details

Failing Tests
Spec Test
search-images.spec.ts Cloud Manager Cypress Tests→Search Images » creates two images and make sure they show up in the table and are searchable
account-switching.spec.ts Cloud Manager Cypress Tests→Parent/Child account switching→From Parent to Child » can search child accounts
smoke-community-stackscripts.spec.ts Cloud Manager Cypress Tests→Community Stackscripts integration tests » deploys a new linode as expected

Troubleshooting

Use this command to re-run the failing tests:

pnpm cy:run -s "cypress/e2e/core/images/search-images.spec.ts,cypress/e2e/core/parentChild/account-switching.spec.ts,cypress/e2e/core/stackscripts/smoke-community-stackscripts.spec.ts"

Failure in smoke-community-stackscripts.spec.ts is related I guess. Rest 2 are unrelated.

@grevanak-akamai grevanak-akamai force-pushed the feature/UIE-10132-block-interface-creation-without-firewall branch from 5724cc4 to b700773 Compare February 25, 2026 13:13
@grevanak-akamai grevanak-akamai force-pushed the feature/UIE-10132-block-interface-creation-without-firewall branch from b700773 to b5ffc6d Compare February 26, 2026 15:45
Copy link
Contributor

@coliu-akamai coliu-akamai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @grevanak-akamai! Had a couple of questions/comments below.

Also, this PR is missing a changeset - do we still need changesets for the release process? looked at some other open PRs and they had changesets - could we add one to this PR?

Comment on lines +12 to +14
firewall_id: number().required(
'Select an option or create a new Firewall.'
),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we just have this part say 'Select an option.' only? There's no option to create a firewall on the Add Interface drawer:

Image

<FirewallSelect
errorText={fieldState.error?.message}
onChange={(e, firewall) => field.onChange(firewall?.id ?? null)}
showNoFirewallOption={false}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe out of scope for this PR, but given that we're making firewall selection mandatory while creating a linode & its interfaces, should we also make it mandatory when editing an interface?

Image

values.linodeInterfaces = values.linodeInterfaces.map(
getCleanedLinodeInterfaceValues
);
if (tab === 'Clone Linode' && !values.firewall_id) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lines 41-43 look the same as lines 72-75 - do we need this check here underneath if (context?.isLinodeInterfacesEnabled) if we're running it anyway at lines 72-75?

Also, regarding this comment:
The Clone Linode flow does not have the firewall_id field under interfaces object, so we set firewall_id to -1 to bypass the firewall requirement in the validation schema.

just to double check - since we're keeping the original firewall schema which lets us have undefined values, do we still need this condition & the ones below?

}),
}),
metadata: MetadataSchema.notRequired().default(undefined),
firewall_id: number().nullable().notRequired(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we add back in the notRequired() for this schema, since the API will accept undefined? (Referring to Banks' earlier comment here - #13410 (comment))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Linodes Dealing with the Linodes section of the app Ready for Review

Projects

Status: Review

Development

Successfully merging this pull request may close these issues.

4 participants