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
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,14 @@ should align to these tenets, or propose an adjustment to the tenets.
- Azure Reserved - DNS Mapping
- Broadcast Address (last network address)

### OCI mode ([docs](https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/overview.htm#Reserved__reserved_subnet)):

- Smallest subnet: /30
- Three reserved addresses per subnet:
- Network Address (network + 0)
- OCI Reserved - Default Gateway Address (network + 1)
- Broadcast Address (last network address)

## Building From Source

If you have a more opinionated best-practice way to lay out this repository please open an issue.
Expand Down
1 change: 1 addition & 0 deletions dist/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ <h1>Visual Subnet Calculator</h1>
<li><a class="dropdown-item active" href="#" data-bs-toggle="operatingMode" data-bs-target="#operatingMode" id="dropdown_standard" aria-current="true">Mode - Standard</a></li>
<li><a class="dropdown-item" href="#" data-bs-toggle="operatingMode" data-bs-target="#operatingMode" id="dropdown_aws">Mode - AWS</a></li>
<li><a class="dropdown-item" href="#" data-bs-toggle="operatingMode" data-bs-target="#operatingMode" id="dropdown_azure">Mode - Azure</a></li>
<li><a class="dropdown-item" href="#" data-bs-toggle="operatingMode" data-bs-target="#operatingMode" id="dropdown_oci">Mode - OCI</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" data-bs-toggle="modal" data-bs-target="#importExportModal" id="btn_import_export">Import / Export</a></li>
</ul>
Expand Down
47 changes: 45 additions & 2 deletions dist/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ let infoColumnCount = 5
// - Net+2 = Reserved - DNS Mapping
// - Net+3 = Reserved - DNS Mapping
// - Last = Broadcast Address
// OCI mode:
// - Smallest subnet: /30
// - Three reserved addresses per subnet:
// - Net+0 = Network Address
// - Net+1 = OCI Reserved - Default Gateway Address
// - Last = Broadcast Address
let noteTimeout;
let operatingMode = 'Standard'
let previousOperatingMode = 'Standard'
Expand All @@ -34,12 +40,14 @@ const netsizePatterns = {
Standard: '^([12]?[0-9]|3[0-2])$',
AZURE: '^([12]?[0-9])$',
AWS: '^(1?[0-9]|2[0-8])$',
OCI: '^([12]?[0-9]|{30})$',
};

const minSubnetSizes = {
Standard: 32,
AZURE: 29,
AWS: 28,
OCI: 30,
};

$('input#network').on('paste', function (e) {
Expand Down Expand Up @@ -123,6 +131,15 @@ $('#dropdown_aws').click(function() {
}
});

$('#dropdown_oci').click(function() {
previousOperatingMode = operatingMode;
operatingMode = 'OCI';

if(!switchMode(operatingMode)) {
operatingMode = previousOperatingMode;
$('#dropdown_'+ operatingMode.toLowerCase()).addClass('active');
}
});

$('#importBtn').on('click', function() {
importConfig(JSON.parse($('#importExportArea').val()))
Expand Down Expand Up @@ -415,7 +432,21 @@ function subnet_usable_first(network, netSize, operatingMode) {
// AWS reserves 3 additional IPs
// https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-faq#are-there-any-restrictions-on-using-ip-addresses-within-these-subnets
// Azure reserves 3 additional IPs
return network + (operatingMode == 'Standard' ? 1 : 4);
// https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/overview.htm#Reserved__reserved_subnet
// OCI reserves 2 additional IPs
//return network + (operatingMode == 'Standard' ? 1 : 4);
switch (operatingMode) {
case 'AWS':
case 'AZURE':
return network + 4;
break;
case 'OCI':
return network + 2;
break;
default:
return network + 1;
break;
}
} else {
return network;
}
Expand Down Expand Up @@ -587,6 +618,9 @@ function mutate_subnet_map(verb, network, subnetTree, propValue = '') {
case 'AZURE':
var modal_error_message = 'The minimum IPv4 subnet size for Azure is /' + minSubnetSizes[operatingMode] + '.<br/><br/>More Information:<br/><a href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-faq#how-small-and-how-large-can-virtual-networks-and-subnets-be" target="_blank" rel="noopener noreferrer">Azure Virtual Network FAQ > How small and how large can virtual networks and subnets be?</a>'
break;
case 'OCI':
var modal_error_message = 'The minimum IPv4 subnet size for OCI is /' + minSubnetSizes[operatingMode] + '.<br/><br/>More Information:<br/><a href="https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/overview.htm#Reserved__reserved_subnet" target="_blank" rel="noopener noreferrer">Infrastructure Services>Networking>Networking Overview>Three IP Addresses in Each Subnet</a>'
break;
default:
var modal_error_message = 'The minimum size for an IPv4 subnet is /' + minSubnetSizes[operatingMode] + '.<br/><br/>More Information:<br/><a href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing" target="_blank" rel="noopener noreferrer">Wikipedia - Classless Inter-Domain Routing</a>'
break;
Expand Down Expand Up @@ -635,6 +669,9 @@ function switchMode(operatingMode) {
case 'AZURE':
var validate_error_message = 'Azure Mode - Smallest size is /' + minSubnetSizes[operatingMode]
break;
case 'OCI':
var validate_error_message = 'OCI Mode - Smallest size is /' + minSubnetSizes[operatingMode]
break;
default:
var validate_error_message = 'Smallest size is /' + minSubnetSizes[operatingMode]
break;
Expand All @@ -651,7 +688,7 @@ function switchMode(operatingMode) {
}
});
// Remove active class from all buttons if needed
$('#dropdown_standard, #dropdown_azure, #dropdown_aws').removeClass('active');
$('#dropdown_standard, #dropdown_azure, #dropdown_aws, #dropdown_oci').removeClass('active');
$('#dropdown_' + operatingMode.toLowerCase()).addClass('active');
isSwitched = true;
} else {
Expand All @@ -662,6 +699,9 @@ function switchMode(operatingMode) {
case 'AZURE':
var modal_error_message = 'One or more subnets are smaller than the minimum allowed for Azure.<br/>The smallest size allowed is /' + minSubnetSizes[operatingMode] + '.<br/>See: <a href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-faq#how-small-and-how-large-can-virtual-networks-and-subnets-be" target="_blank" rel="noopener noreferrer">Azure Virtual Network FAQ > How small and how large can virtual networks and subnets be?</a>'
break;
case 'OCI':
var modal_error_message = 'One or more subnets are smaller than the minimum allowed for OCI.<br/>The smallest size allowed is /' + minSubnetSizes[operatingMode] + '.<br/>See: <a href="https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/overview.htm#Reserved__reserved_subnet" target="_blank" rel="noopener noreferrer">Infrastructure Services>Networking>Networking Overview>Three IP Addresses in Each Subnet</a>'
break;
default:
var validate_error_message = 'Unknown Error'
break;
Expand Down Expand Up @@ -707,6 +747,9 @@ function set_usable_ips_title(operatingMode) {
case 'AZURE':
$('#useableHeader').html('Usable IPs (<a href="https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-faq#are-there-any-restrictions-on-using-ip-addresses-within-these-subnets" target="_blank" rel="noopener noreferrer" style="color:#000; border-bottom: 1px dotted #000; text-decoration: dotted" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-html="true" title="Azure reserves 5 addresses in each subnet for platform use.<br/>Click to navigate to the Azure documentation.">Azure</a>)')
break;
case 'OCI':
$('#useableHeader').html('Usable IPs (<a href="https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/overview.htm#Reserved__reserved_subnet" target="_blank" rel="noopener noreferrer" style="color:#000; border-bottom: 1px dotted #000; text-decoration: dotted" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-html="true" title="OCI reserves 3 addresses in each subnet for platform use.<br/>Click to navigate to the OCI documentation.">OCI</a>)')
break;
default:
$('#useableHeader').html('Usable IPs')
break;
Expand Down
10 changes: 10 additions & 0 deletions src/tests/import-export.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,16 @@ test('Default (Azure) Export Content', async ({ page }) => {
await page.getByLabel('Import/Export', { exact: true }).getByText('Close').click();
});

test('Default (OCI) Export Content', async ({ page }) => {
await page.goto('/');
await page.getByRole('button', { name: 'Tools' }).click();
await page.getByRole('link', { name: 'Mode - OCI' }).click();
await page.getByRole('button', { name: 'Tools' }).click();
await page.getByRole('link', { name: 'Import / Export' }).click();
await expect(page.getByLabel('Import/Export Content')).toHaveValue('{\n "config_version": "2",\n "operating_mode": "OCI",\n "base_network": "10.0.0.0/16",\n "subnets": {\n "10.0.0.0/16": {}\n }\n}');
//await page.getByLabel('Import/Export', { exact: true }).getByText('Close').click();
});

test('Import 192.168.0.0/24', async ({ page }) => {
await page.goto('/');
await page.getByRole('button', { name: 'Tools' }).click();
Expand Down
7 changes: 7 additions & 0 deletions src/tests/subnet-basic.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,13 @@ test('Usable IPs - Azure', async ({ page }) => {
await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Usable IPs')).toContainText('10.0.0.4 - 10.0.255.254');
});

test('Usable IPs - OCI', async ({ page }) => {
await page.goto('/');
await page.getByRole('button', { name: 'Tools' }).click();
await page.getByRole('link', { name: 'Mode - OCI' }).click();
await expect(page.getByLabel('10.0.0.0/16', { exact: true }).getByLabel('Usable IPs')).toContainText('10.0.0.2 - 10.0.255.254');
});

test('Note Splitting', async ({ page }) => {
await page.goto('/');
await page.getByLabel('Note Split/Join').click();
Expand Down
12 changes: 12 additions & 0 deletions src/tests/ui-error-handling.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,15 @@ test('Subnet Too Small for Azure Mode', async ({ page }) => {
await expect(page.getByText('Azure Mode - Smallest size is /29')).toBeVisible();
});

test('Subnet Too Small for OCI Mode', async ({ page }) => {
await page.goto('/');
await expect(page.locator('#useableHeader')).toContainText('Usable IPs');
await page.getByRole('button', { name: 'Tools' }).click();
await page.getByRole('link', { name: 'Mode - OCI' }).click();
await page.getByLabel('Network Size').click();
await page.getByLabel('Network Size').fill('31');
await page.getByRole('button', { name: 'Go' }).click();
await expect(page.locator('#notifyModalLabel')).toContainText('Warning!');
await expect(page.locator('#notifyModalDescription')).toContainText('Please correct the errors in the form!');
await expect(page.getByText('OCI Mode - Smallest size is /30')).toBeVisible();
});
9 changes: 9 additions & 0 deletions src/tests/ui-usage.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,15 @@ test('Table Header Azure Mode', async ({ page }) => {
await expect(page.getByText('Azure reserves 5 addresses in')).toBeVisible();
});

test('Table Header OCI Mode', async ({ page }) => {
await page.goto('/');
await expect(page.locator('#useableHeader')).toContainText('Usable IPs');
await page.getByRole('button', { name: 'Tools' }).click();
await page.getByRole('link', { name: 'Mode - OCI' }).click();
await expect(page.getByRole('cell', { name: 'Usable IPs', exact: true })).toContainText('Usable IPs (OCI)');
await page.getByRole('link', { name: 'OCI' }).hover()
await expect(page.getByText('OCI reserves 3 addresses in')).toBeVisible();
});

test('Table Header AWS then Standard', async ({ page }) => {
await page.goto('/');
Expand Down
Loading