More Opinionated Revisions on PR #11

* No need to increase the config version. That is only for breaking
  changes. We can assume 'Standard' for all URLs that do not have a mode
  for backwards compatibility. Incrementing the config version is when
  we have a breaking change like changing existing key names or other
  edge cases we can't code around with high confidence.
* Changed the modals slightly to include more information and links to
  documentation.
This commit is contained in:
Caesar Kabalan 2024-06-24 10:55:02 -07:00
parent 0c61b56c3c
commit b30c1719ef
No known key found for this signature in database
GPG key ID: DDFEF5FF6CFAB608

87
dist/js/main.js vendored
View file

@ -27,8 +27,8 @@ let noteTimeout;
let operatingMode = 'Standard' let operatingMode = 'Standard'
let previousOperatingMode = 'Standard' let previousOperatingMode = 'Standard'
let inflightColor = 'NONE' let inflightColor = 'NONE'
let urlVersion = '2' let urlVersion = '1'
let configVersion = '2' let configVersion = '1'
const netsizePatterns = { const netsizePatterns = {
Standard: '^([0-9]|[12][0-9]|3[0-2])$', Standard: '^([0-9]|[12][0-9]|3[0-2])$',
@ -446,13 +446,16 @@ function mutate_subnet_map(verb, network, subnetTree, propValue = '') {
} else { } else {
switch (operatingMode) { switch (operatingMode) {
case 'AWS': case 'AWS':
var modal_error_message = 'The minimum IPv4 subnet size for AWS is /' + minSubnetSizes[operatingMode] + '.<br/><br/>More Information:<br/><a href="https://docs.aws.amazon.com/vpc/latest/userguide/subnet-sizing.html#subnet-sizing-ipv4" target="_blank">Amazon Virtual Private Cloud > User Guide > Subnet CIDR Blocks > Subnet Sizing for IPv4</a>'
break;
case 'AZURE': case 'AZURE':
show_warning_modal('<div>Minimum subnet size for ' + operatingMode + ' is ' + minSubnetSizes[operatingMode] + '</div>') 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">Azure Virtual Network FAQ > How small and how large can virtual networks and subnets be?</a>'
break; break;
default: default:
show_warning_modal('<div>Minimum subnet size is ' + minSubnetSizes[operatingMode] + '</div>') 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">Wikipedia - Classless Inter-Domain Routing</a>'
break; break;
} }
show_warning_modal('<div>' + modal_error_message + '</div>')
} }
} else if (verb === 'join') { } else if (verb === 'join') {
// Options: // Options:
@ -491,11 +494,13 @@ function switchMode(operatingMode) {
switch (operatingMode) { switch (operatingMode) {
case 'AWS': case 'AWS':
var validate_error_message = "(AWS) Smallest size is /" + minSubnetSizes[operatingMode]
break;
case 'AZURE': case 'AZURE':
var message = "("+operatingMode+") Smallest size is " + minSubnetSizes[operatingMode] var validate_error_message = "(Azure) Smallest size is /" + minSubnetSizes[operatingMode]
break; break;
default: default:
var message = "Smallest size is " + minSubnetSizes[operatingMode] var validate_error_message = "Smallest size is /" + minSubnetSizes[operatingMode]
break; break;
} }
@ -506,7 +511,7 @@ function switchMode(operatingMode) {
pattern: netsizePatterns[operatingMode], pattern: netsizePatterns[operatingMode],
messages: { messages: {
required: "Please enter a network size", required: "Please enter a network size",
pattern: message pattern: validate_error_message
} }
}); });
// Remove active class from all buttons if needed // Remove active class from all buttons if needed
@ -514,7 +519,18 @@ function switchMode(operatingMode) {
$('#dropdown_' + operatingMode.toLowerCase()).addClass('active'); $('#dropdown_' + operatingMode.toLowerCase()).addClass('active');
isSwitched = true; isSwitched = true;
} else { } else {
show_warning_modal('<div>Some subnets have a netmask size smaller than the minimum allowed for ' + operatingMode +'.</div><div>The smallest size allowed is ' + minSubnetSizes[operatingMode] + '</div>'); switch (operatingMode) {
case 'AWS':
var modal_error_message = 'One or more subnets are smaller than the minimum allowed for AWS.<br/>The smallest size allowed is /' + minSubnetSizes[operatingMode] + '.<br/>See: <a href="https://docs.aws.amazon.com/vpc/latest/userguide/subnet-sizing.html#subnet-sizing-ipv4" target="_blank">Amazon Virtual Private Cloud > User Guide > Subnet CIDR Blocks > Subnet Sizing for IPv4</a>'
break;
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">Azure Virtual Network FAQ > How small and how large can virtual networks and subnets be?</a>'
break;
default:
var validate_error_message = "Unknown Error"
break;
}
show_warning_modal('<div>' + modal_error_message + '</div>');
isSwitched = false; isSwitched = false;
} }
} else { } else {
@ -611,17 +627,26 @@ $( document ).ready(function() {
}); });
function exportConfig() { function exportConfig() {
return { if (operatingMode !== 'Standard') {
'config_version': configVersion, return {
'operating_mode': operatingMode, 'config_version': configVersion,
'subnets': subnetMap, 'operating_mode': operatingMode,
'subnets': subnetMap,
}
} else {
return {
'config_version': configVersion,
'subnets': subnetMap,
}
} }
} }
function getConfigUrl() { function getConfigUrl() {
let defaultExport = JSON.parse(JSON.stringify(exportConfig())); let defaultExport = JSON.parse(JSON.stringify(exportConfig()));
renameKey(defaultExport, 'config_version', 'v') renameKey(defaultExport, 'config_version', 'v')
renameKey(defaultExport, 'operating_mode', 'm') if (defaultExport.hasOwnProperty('operating_mode')) {
renameKey(defaultExport, 'operating_mode', 'm')
}
renameKey(defaultExport, 'subnets', 's') renameKey(defaultExport, 'subnets', 's')
shortenKeys(defaultExport['s']) shortenKeys(defaultExport['s'])
return '/index.html?c=' + urlVersion + LZString.compressToEncodedURIComponent(JSON.stringify(defaultExport)) return '/index.html?c=' + urlVersion + LZString.compressToEncodedURIComponent(JSON.stringify(defaultExport))
@ -636,17 +661,14 @@ function processConfigUrl() {
let urlVersion = params['c'].substring(0, 1) let urlVersion = params['c'].substring(0, 1)
let urlData = params['c'].substring(1) let urlData = params['c'].substring(1)
let urlConfig = JSON.parse(LZString.decompressFromEncodedURIComponent(params['c'].substring(1))) let urlConfig = JSON.parse(LZString.decompressFromEncodedURIComponent(params['c'].substring(1)))
if (urlVersion === '2') {
renameKey(urlConfig, 'm','operating_mode')
}
renameKey(urlConfig, 'v', 'config_version') renameKey(urlConfig, 'v', 'config_version')
if (urlConfig.hasOwnProperty('m')) {
renameKey(urlConfig, 'm', 'operating_mode')
}
renameKey(urlConfig, 's', 'subnets') renameKey(urlConfig, 's', 'subnets')
expandKeys(urlConfig['subnets']) expandKeys(urlConfig['subnets'])
importConfig(urlConfig) importConfig(urlConfig)
return true return true
} }
} }
@ -698,25 +720,14 @@ function renameKey(obj, oldKey, newKey) {
} }
function importConfig(text) { function importConfig(text) {
switch (text['config_version']) { if (text['config_version'] === '1') {
case '1': let subnet_split = Object.keys(text['subnets'])[0].split('/')
operatingMode = 'Standard'; $('#network').val(subnet_split[0])
break; $('#netsize').val(subnet_split[1])
case '2': subnetMap = text['subnets'];
operatingMode = text['operating_mode']; operatingMode = text['operating_mode'] || 'Standard'
break; switchMode(operatingMode);
default:
// Optionally handle unexpected config_version values
show_warning_modal('<div>Invalid operating_mode</div>');
reset();
break;
} }
let subnet_split = Object.keys(text['subnets'])[0].split('/')
$('#network').val(subnet_split[0])
$('#netsize').val(subnet_split[1])
subnetMap = text['subnets'];
switchMode(operatingMode);
} }
const rgba2hex = (rgba) => `#${rgba.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+\.{0,1}\d*))?\)$/).slice(1).map((n, i) => (i === 3 ? Math.round(parseFloat(n) * 255) : parseFloat(n)).toString(16).padStart(2, '0').replace('NaN', '')).join('')}` const rgba2hex = (rgba) => `#${rgba.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+\.{0,1}\d*))?\)$/).slice(1).map((n, i) => (i === 3 ? Math.round(parseFloat(n) * 255) : parseFloat(n)).toString(16).padStart(2, '0').replace('NaN', '')).join('')}`