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
39 changes: 6 additions & 33 deletions app/forms/instance-create.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ const baseDefaultValues: InstanceCreateInput = {
*/
presetId: 'general-xs',
memory: 8,
ncpus: 2,
ncpus: 1,
hostname: '',

bootDiskName: '',
Expand Down Expand Up @@ -647,12 +647,6 @@ export default function CreateInstanceForm() {
<Tabs.Trigger value="general" disabled={isSubmitting}>
General Purpose
</Tabs.Trigger>
<Tabs.Trigger value="highCPU" disabled={isSubmitting}>
High CPU
</Tabs.Trigger>
<Tabs.Trigger value="highMemory" disabled={isSubmitting}>
High Memory
</Tabs.Trigger>
<Tabs.Trigger value="custom" disabled={isSubmitting}>
Custom
</Tabs.Trigger>
Expand All @@ -663,18 +657,6 @@ export default function CreateInstanceForm() {
</RadioFieldDyn>
</Tabs.Content>

<Tabs.Content value="highCPU">
<RadioFieldDyn name="presetId" control={control} disabled={isSubmitting}>
{renderLargeRadioCards('highCPU')}
</RadioFieldDyn>
</Tabs.Content>

<Tabs.Content value="highMemory">
<RadioFieldDyn name="presetId" control={control} disabled={isSubmitting}>
{renderLargeRadioCards('highMemory')}
</RadioFieldDyn>
</Tabs.Content>

<Tabs.Content value="custom">
<NumberField
required
Expand Down Expand Up @@ -1103,21 +1085,12 @@ const renderLargeRadioCards = (category: string) => {
))
}

// 1 vCPU to 8 GiB RAM
const PRESETS = [
{ category: 'general', id: 'general-xs', memory: 8, ncpus: 2 },
{ category: 'general', id: 'general-sm', memory: 16, ncpus: 4 },
{ category: 'general', id: 'general-md', memory: 32, ncpus: 8 },
{ category: 'general', id: 'general-lg', memory: 64, ncpus: 16 },

{ category: 'highCPU', id: 'highCPU-xs', memory: 4, ncpus: 2 },
{ category: 'highCPU', id: 'highCPU-sm', memory: 8, ncpus: 4 },
{ category: 'highCPU', id: 'highCPU-md', memory: 16, ncpus: 8 },
{ category: 'highCPU', id: 'highCPU-lg', memory: 32, ncpus: 16 },

{ category: 'highMemory', id: 'highMemory-xs', memory: 16, ncpus: 2 },
{ category: 'highMemory', id: 'highMemory-sm', memory: 32, ncpus: 4 },
{ category: 'highMemory', id: 'highMemory-md', memory: 64, ncpus: 8 },
{ category: 'highMemory', id: 'highMemory-lg', memory: 128, ncpus: 16 },
{ category: 'general', id: 'general-xs', memory: 8, ncpus: 1 },
{ category: 'general', id: 'general-sm', memory: 16, ncpus: 2 },
{ category: 'general', id: 'general-md', memory: 32, ncpus: 4 },
{ category: 'general', id: 'general-lg', memory: 64, ncpus: 8 },

{ category: 'custom', id: 'custom', memory: 0, ncpus: 0 },
] as const
Expand Down
23 changes: 4 additions & 19 deletions test/e2e/instance-create.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ test('can create an instance', async ({ page }) => {
const instanceName = 'my-instance'
await page.getByRole('textbox', { name: 'Name', exact: true }).fill(instanceName)
await page.fill('textarea[name=description]', 'An instance... from space!')

// first preset is selected by default
await expect(page.getByRole('radio', { name: '1 CPU 8 gibibytes RAM' })).toBeChecked()
await page.locator('.ox-radio-card').nth(3).click()

await page.getByRole('textbox', { name: 'Disk name' }).fill('my-boot-disk')
Expand Down Expand Up @@ -104,7 +107,7 @@ test('can create an instance', async ({ page }) => {
await expect(page).toHaveURL(`/projects/mock-project/instances/${instanceName}/storage`)

await expect(page.getByRole('heading', { name: instanceName })).toBeVisible()
await expect(page.getByText('16 vCPUs')).toBeVisible()
await expect(page.getByText('8 vCPUs')).toBeVisible()
await expect(page.getByText('64 GiB')).toBeVisible()
await expect(page.getByText('from space')).toBeVisible()

Expand Down Expand Up @@ -189,31 +192,13 @@ test('duplicate instance name produces visible error', async ({ page }) => {
await expect(page.getByText('Instance name already exists')).toBeVisible()
})

test('first preset is auto-selected in each tab', async ({ page }) => {
await page.goto('/projects/mock-project/instances-new')

await expect(page.getByRole('radio', { name: '2 CPU 8 gibibytes RAM' })).toBeChecked()
await page.getByRole('tab', { name: 'High CPU' }).click()
await expect(page.getByRole('radio', { name: '2 CPU 4 gibibytes RAM' })).toBeChecked()
await page.getByRole('tab', { name: 'High Memory' }).click()
await expect(page.getByRole('radio', { name: '2 CPU 16 gibibytes RAM' })).toBeChecked()
await page.getByRole('tab', { name: 'General Purpose' }).click()
await expect(page.getByRole('radio', { name: '2 CPU 8 gibibytes RAM' })).toBeChecked()
})

test('can create an instance with custom hardware', async ({ page }) => {
await page.goto('/projects/mock-project/instances-new')

const instanceName = 'my-custom-instance'
await page.fill('input[name=name]', instanceName)
await page.fill('textarea[name=description]', 'An instance... from space!')

// Click the other tabs to make sure the custom input works
// even when something has been previously selected
await page.getByRole('tab', { name: 'High CPU' }).click()
await page.getByRole('tab', { name: 'High Memory' }).click()
await page.getByText('64 GiB RAM').click()

// Fill in custom specs
await page.getByRole('tab', { name: 'Custom' }).click()
await page.getByRole('textbox', { name: 'CPUs' }).fill('29')
Expand Down
Loading