From 0085711c3f84172ba1f46c2dc7f068716812159f Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Thu, 8 Feb 2024 17:23:15 -0500 Subject: [PATCH 01/22] display edge icon in region select --- packages/api-v4/src/regions/types.ts | 3 + .../assets/icons/entityIcons/edge-server.svg | 7 + packages/manager/src/cachedData/regions.json | 569 +++++++++++++++++- .../components/RegionSelect/RegionOption.tsx | 39 +- .../components/RegionSelect/RegionSelect.tsx | 40 ++ .../RegionSelect/RegionSelect.types.ts | 2 + .../RegionSelect/RegionSelect.utils.ts | 2 + 7 files changed, 660 insertions(+), 2 deletions(-) create mode 100644 packages/manager/src/assets/icons/entityIcons/edge-server.svg diff --git a/packages/api-v4/src/regions/types.ts b/packages/api-v4/src/regions/types.ts index f03c852531c..c9cf914d727 100644 --- a/packages/api-v4/src/regions/types.ts +++ b/packages/api-v4/src/regions/types.ts @@ -22,6 +22,8 @@ export interface DNSResolvers { export type RegionStatus = 'ok' | 'outage'; +export type RegionSite = 'core' | 'edge'; + export interface Region { id: string; label: string; @@ -29,6 +31,7 @@ export interface Region { capabilities: Capabilities[]; status: RegionStatus; resolvers: DNSResolvers; + site_type: RegionSite; } export interface RegionAvailability { diff --git a/packages/manager/src/assets/icons/entityIcons/edge-server.svg b/packages/manager/src/assets/icons/entityIcons/edge-server.svg new file mode 100644 index 00000000000..1ca05241491 --- /dev/null +++ b/packages/manager/src/assets/icons/entityIcons/edge-server.svg @@ -0,0 +1,7 @@ + + +edge-server + + + + diff --git a/packages/manager/src/cachedData/regions.json b/packages/manager/src/cachedData/regions.json index 3becff548ed..6268a6a17bb 100644 --- a/packages/manager/src/cachedData/regions.json +++ b/packages/manager/src/cachedData/regions.json @@ -1 +1,568 @@ -{"data":[{"id":"ap-west","label":"Mumbai, IN","country":"in","capabilities":["Linodes","NodeBalancers","Block Storage","GPU Linodes","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"172.105.34.5, 172.105.35.5, 172.105.36.5, 172.105.37.5, 172.105.38.5, 172.105.39.5, 172.105.40.5, 172.105.41.5, 172.105.42.5, 172.105.43.5","ipv6":"2400:8904::f03c:91ff:fea5:659, 2400:8904::f03c:91ff:fea5:9282, 2400:8904::f03c:91ff:fea5:b9b3, 2400:8904::f03c:91ff:fea5:925a, 2400:8904::f03c:91ff:fea5:22cb, 2400:8904::f03c:91ff:fea5:227a, 2400:8904::f03c:91ff:fea5:924c, 2400:8904::f03c:91ff:fea5:f7e2, 2400:8904::f03c:91ff:fea5:2205, 2400:8904::f03c:91ff:fea5:9207"}},{"id":"ca-central","label":"Toronto, CA","country":"ca","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"172.105.0.5, 172.105.3.5, 172.105.4.5, 172.105.5.5, 172.105.6.5, 172.105.7.5, 172.105.8.5, 172.105.9.5, 172.105.10.5, 172.105.11.5","ipv6":"2600:3c04::f03c:91ff:fea9:f63, 2600:3c04::f03c:91ff:fea9:f6d, 2600:3c04::f03c:91ff:fea9:f80, 2600:3c04::f03c:91ff:fea9:f0f, 2600:3c04::f03c:91ff:fea9:f99, 2600:3c04::f03c:91ff:fea9:fbd, 2600:3c04::f03c:91ff:fea9:fdd, 2600:3c04::f03c:91ff:fea9:fe2, 2600:3c04::f03c:91ff:fea9:f68, 2600:3c04::f03c:91ff:fea9:f4a"}},{"id":"ap-southeast","label":"Sydney, AU","country":"au","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"172.105.166.5, 172.105.169.5, 172.105.168.5, 172.105.172.5, 172.105.162.5, 172.105.170.5, 172.105.167.5, 172.105.171.5, 172.105.181.5, 172.105.161.5","ipv6":"2400:8907::f03c:92ff:fe6e:ec8, 2400:8907::f03c:92ff:fe6e:98e4, 2400:8907::f03c:92ff:fe6e:1c58, 2400:8907::f03c:92ff:fe6e:c299, 2400:8907::f03c:92ff:fe6e:c210, 2400:8907::f03c:92ff:fe6e:c219, 2400:8907::f03c:92ff:fe6e:1c5c, 2400:8907::f03c:92ff:fe6e:c24e, 2400:8907::f03c:92ff:fe6e:e6b, 2400:8907::f03c:92ff:fe6e:e3d"}},{"id":"us-iad","label":"Washington, DC","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Managed Databases","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"139.144.192.62, 139.144.192.60, 139.144.192.61, 139.144.192.53, 139.144.192.54, 139.144.192.67, 139.144.192.69, 139.144.192.66, 139.144.192.52, 139.144.192.68","ipv6":"2600:3c05::f03c:93ff:feb6:43b6, 2600:3c05::f03c:93ff:feb6:4365, 2600:3c05::f03c:93ff:feb6:43c2, 2600:3c05::f03c:93ff:feb6:e441, 2600:3c05::f03c:93ff:feb6:94ef, 2600:3c05::f03c:93ff:feb6:94ba, 2600:3c05::f03c:93ff:feb6:94a8, 2600:3c05::f03c:93ff:feb6:9413, 2600:3c05::f03c:93ff:feb6:9443, 2600:3c05::f03c:93ff:feb6:94e0"}},{"id":"us-ord","label":"Chicago, IL","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Managed Databases","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.0.17, 172.232.0.16, 172.232.0.21, 172.232.0.13, 172.232.0.22, 172.232.0.9, 172.232.0.19, 172.232.0.20, 172.232.0.15, 172.232.0.18","ipv6":"2600:3c06::f03c:93ff:fed0:e5fc, 2600:3c06::f03c:93ff:fed0:e54b, 2600:3c06::f03c:93ff:fed0:e572, 2600:3c06::f03c:93ff:fed0:e530, 2600:3c06::f03c:93ff:fed0:e597, 2600:3c06::f03c:93ff:fed0:e511, 2600:3c06::f03c:93ff:fed0:e5f2, 2600:3c06::f03c:93ff:fed0:e5bf, 2600:3c06::f03c:93ff:fed0:e529, 2600:3c06::f03c:93ff:fed0:e5a3"}},{"id":"fr-par","label":"Paris, FR","country":"fr","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Managed Databases","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.32.21, 172.232.32.23, 172.232.32.17, 172.232.32.18, 172.232.32.16, 172.232.32.22, 172.232.32.20, 172.232.32.14, 172.232.32.11, 172.232.32.12","ipv6":"2600:3c07::f03c:93ff:fef2:2e63, 2600:3c07::f03c:93ff:fef2:2ec7, 2600:3c07::f03c:93ff:fef2:0dee, 2600:3c07::f03c:93ff:fef2:0d25, 2600:3c07::f03c:93ff:fef2:0de0, 2600:3c07::f03c:93ff:fef2:2e29, 2600:3c07::f03c:93ff:fef2:0dda, 2600:3c07::f03c:93ff:fef2:0d82, 2600:3c07::f03c:93ff:fef2:b3ac, 2600:3c07::f03c:93ff:fef2:b3a8"}},{"id":"us-sea","label":"Seattle, WA","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.160.19, 172.232.160.21, 172.232.160.17, 172.232.160.15, 172.232.160.18, 172.232.160.8, 172.232.160.12, 172.232.160.11, 172.232.160.14, 172.232.160.16","ipv6":"2600:3c0a::f03c:93ff:fe54:c6da, 2600:3c0a::f03c:93ff:fe54:c691, 2600:3c0a::f03c:93ff:fe54:c68d, 2600:3c0a::f03c:93ff:fe54:c61e, 2600:3c0a::f03c:93ff:fe54:c653, 2600:3c0a::f03c:93ff:fe54:c64c, 2600:3c0a::f03c:93ff:fe54:c68a, 2600:3c0a::f03c:93ff:fe54:c697, 2600:3c0a::f03c:93ff:fe54:c60f, 2600:3c0a::f03c:93ff:fe54:c6a0"}},{"id":"br-gru","label":"Sao Paulo, BR","country":"br","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.0.4, 172.233.0.9, 172.233.0.7, 172.233.0.12, 172.233.0.5, 172.233.0.13, 172.233.0.10, 172.233.0.6, 172.233.0.8, 172.233.0.11","ipv6":"2600:3c0d::f03c:93ff:fe3d:51cb, 2600:3c0d::f03c:93ff:fe3d:51a7, 2600:3c0d::f03c:93ff:fe3d:51a9, 2600:3c0d::f03c:93ff:fe3d:5119, 2600:3c0d::f03c:93ff:fe3d:51fe, 2600:3c0d::f03c:93ff:fe3d:517c, 2600:3c0d::f03c:93ff:fe3d:5144, 2600:3c0d::f03c:93ff:fe3d:5170, 2600:3c0d::f03c:93ff:fe3d:51cc, 2600:3c0d::f03c:93ff:fe3d:516c"}},{"id":"nl-ams","label":"Amsterdam, NL","country":"nl","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.33.36, 172.233.33.38, 172.233.33.35, 172.233.33.39, 172.233.33.34, 172.233.33.33, 172.233.33.31, 172.233.33.30, 172.233.33.37, 172.233.33.32","ipv6":"2600:3c0e::f03c:93ff:fe9d:2d10, 2600:3c0e::f03c:93ff:fe9d:2d89, 2600:3c0e::f03c:93ff:fe9d:2d79, 2600:3c0e::f03c:93ff:fe9d:2d96, 2600:3c0e::f03c:93ff:fe9d:2da5, 2600:3c0e::f03c:93ff:fe9d:2d34, 2600:3c0e::f03c:93ff:fe9d:2d68, 2600:3c0e::f03c:93ff:fe9d:2d17, 2600:3c0e::f03c:93ff:fe9d:2d45, 2600:3c0e::f03c:93ff:fe9d:2d5c"}},{"id":"se-sto","label":"Stockholm, SE","country":"se","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.128.24, 172.232.128.26, 172.232.128.20, 172.232.128.22, 172.232.128.25, 172.232.128.19, 172.232.128.23, 172.232.128.18, 172.232.128.21, 172.232.128.27","ipv6":"2600:3c09::f03c:93ff:fea9:4dbe, 2600:3c09::f03c:93ff:fea9:4d63, 2600:3c09::f03c:93ff:fea9:4dce, 2600:3c09::f03c:93ff:fea9:4dbb, 2600:3c09::f03c:93ff:fea9:4d99, 2600:3c09::f03c:93ff:fea9:4d26, 2600:3c09::f03c:93ff:fea9:4de0, 2600:3c09::f03c:93ff:fea9:4d69, 2600:3c09::f03c:93ff:fea9:4dbf, 2600:3c09::f03c:93ff:fea9:4da6"}},{"id":"in-maa","label":"Chennai, IN","country":"in","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.96.17, 172.232.96.26, 172.232.96.19, 172.232.96.20, 172.232.96.25, 172.232.96.21, 172.232.96.18, 172.232.96.22, 172.232.96.23, 172.232.96.24","ipv6":"2600:3c08::f03c:93ff:fe7c:1135, 2600:3c08::f03c:93ff:fe7c:11f8, 2600:3c08::f03c:93ff:fe7c:11d2, 2600:3c08::f03c:93ff:fe7c:11a7, 2600:3c08::f03c:93ff:fe7c:11ad, 2600:3c08::f03c:93ff:fe7c:110a, 2600:3c08::f03c:93ff:fe7c:11f9, 2600:3c08::f03c:93ff:fe7c:1137, 2600:3c08::f03c:93ff:fe7c:11db, 2600:3c08::f03c:93ff:fe7c:1164"}},{"id":"jp-osa","label":"Osaka, JP","country":"jp","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.64.44, 172.233.64.43, 172.233.64.37, 172.233.64.40, 172.233.64.46, 172.233.64.41, 172.233.64.39, 172.233.64.42, 172.233.64.45, 172.233.64.38","ipv6":"2400:8905::f03c:93ff:fe9d:b085, 2400:8905::f03c:93ff:fe9d:b012, 2400:8905::f03c:93ff:fe9d:b09b, 2400:8905::f03c:93ff:fe9d:b0d8, 2400:8905::f03c:93ff:fe9d:259f, 2400:8905::f03c:93ff:fe9d:b006, 2400:8905::f03c:93ff:fe9d:b084, 2400:8905::f03c:93ff:fe9d:b0ce, 2400:8905::f03c:93ff:fe9d:25ea, 2400:8905::f03c:93ff:fe9d:b086"}},{"id":"it-mil","label":"Milan, IT","country":"it","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.192.19, 172.232.192.18, 172.232.192.16, 172.232.192.20, 172.232.192.24, 172.232.192.21, 172.232.192.22, 172.232.192.17, 172.232.192.15, 172.232.192.23","ipv6":"2600:3c0b::f03c:93ff:feba:d513, 2600:3c0b::f03c:93ff:feba:d5c3, 2600:3c0b::f03c:93ff:feba:d597, 2600:3c0b::f03c:93ff:feba:d5fb, 2600:3c0b::f03c:93ff:feba:d51f, 2600:3c0b::f03c:93ff:feba:d58e, 2600:3c0b::f03c:93ff:feba:d5d5, 2600:3c0b::f03c:93ff:feba:d534, 2600:3c0b::f03c:93ff:feba:d57c, 2600:3c0b::f03c:93ff:feba:d529"}},{"id":"us-mia","label":"Miami, FL","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.160.34, 172.233.160.27, 172.233.160.30, 172.233.160.29, 172.233.160.32, 172.233.160.28, 172.233.160.33, 172.233.160.26, 172.233.160.25, 172.233.160.31","ipv6":"2a01:7e04::f03c:93ff:fead:d31f, 2a01:7e04::f03c:93ff:fead:d37f, 2a01:7e04::f03c:93ff:fead:d30c, 2a01:7e04::f03c:93ff:fead:d318, 2a01:7e04::f03c:93ff:fead:d316, 2a01:7e04::f03c:93ff:fead:d339, 2a01:7e04::f03c:93ff:fead:d367, 2a01:7e04::f03c:93ff:fead:d395, 2a01:7e04::f03c:93ff:fead:d3d0, 2a01:7e04::f03c:93ff:fead:d38e"}},{"id":"id-cgk","label":"Jakarta, ID","country":"id","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.224.23, 172.232.224.32, 172.232.224.26, 172.232.224.27, 172.232.224.21, 172.232.224.24, 172.232.224.22, 172.232.224.20, 172.232.224.31, 172.232.224.28","ipv6":"2600:3c0c::f03c:93ff:feed:a90b, 2600:3c0c::f03c:93ff:feed:a9a5, 2600:3c0c::f03c:93ff:feed:a935, 2600:3c0c::f03c:93ff:feed:a930, 2600:3c0c::f03c:93ff:feed:a95c, 2600:3c0c::f03c:93ff:feed:a9ad, 2600:3c0c::f03c:93ff:feed:a9f2, 2600:3c0c::f03c:93ff:feed:a9ff, 2600:3c0c::f03c:93ff:feed:a9c8, 2600:3c0c::f03c:93ff:feed:a96b"}},{"id":"us-lax","label":"Los Angeles, CA","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.128.45, 172.233.128.38, 172.233.128.53, 172.233.128.37, 172.233.128.34, 172.233.128.36, 172.233.128.33, 172.233.128.39, 172.233.128.43, 172.233.128.44","ipv6":"2a01:7e03::f03c:93ff:feb1:b789, 2a01:7e03::f03c:93ff:feb1:b717, 2a01:7e03::f03c:93ff:feb1:b707, 2a01:7e03::f03c:93ff:feb1:b7ab, 2a01:7e03::f03c:93ff:feb1:b7e2, 2a01:7e03::f03c:93ff:feb1:b709, 2a01:7e03::f03c:93ff:feb1:b7a6, 2a01:7e03::f03c:93ff:feb1:b750, 2a01:7e03::f03c:93ff:feb1:b76e, 2a01:7e03::f03c:93ff:feb1:b7a2"}},{"id":"us-central","label":"Dallas, TX","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"72.14.179.5, 72.14.188.5, 173.255.199.5, 66.228.53.5, 96.126.122.5, 96.126.124.5, 96.126.127.5, 198.58.107.5, 198.58.111.5, 23.239.24.5","ipv6":"2600:3c00::2, 2600:3c00::9, 2600:3c00::7, 2600:3c00::5, 2600:3c00::3, 2600:3c00::8, 2600:3c00::6, 2600:3c00::4, 2600:3c00::c, 2600:3c00::b"}},{"id":"us-west","label":"Fremont, CA","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5","ipv6":"2600:3c01::2, 2600:3c01::9, 2600:3c01::5, 2600:3c01::7, 2600:3c01::3, 2600:3c01::8, 2600:3c01::4, 2600:3c01::b, 2600:3c01::c, 2600:3c01::6"}},{"id":"us-southeast","label":"Atlanta, GA","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","GPU Linodes","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"74.207.231.5, 173.230.128.5, 173.230.129.5, 173.230.136.5, 173.230.140.5, 66.228.59.5, 66.228.62.5, 50.116.35.5, 50.116.41.5, 23.239.18.5","ipv6":"2600:3c02::3, 2600:3c02::5, 2600:3c02::4, 2600:3c02::6, 2600:3c02::c, 2600:3c02::7, 2600:3c02::2, 2600:3c02::9, 2600:3c02::8, 2600:3c02::b"}},{"id":"us-east","label":"Newark, NJ","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","GPU Linodes","Kubernetes","Cloud Firewall","Bare Metal","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"66.228.42.5, 96.126.106.5, 50.116.53.5, 50.116.58.5, 50.116.61.5, 50.116.62.5, 66.175.211.5, 97.107.133.4, 207.192.69.4, 207.192.69.5","ipv6":"2600:3c03::7, 2600:3c03::4, 2600:3c03::9, 2600:3c03::6, 2600:3c03::3, 2600:3c03::c, 2600:3c03::5, 2600:3c03::b, 2600:3c03::2, 2600:3c03::8"}},{"id":"eu-west","label":"London, UK","country":"gb","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20","ipv6":"2a01:7e00::9, 2a01:7e00::3, 2a01:7e00::c, 2a01:7e00::5, 2a01:7e00::6, 2a01:7e00::8, 2a01:7e00::b, 2a01:7e00::4, 2a01:7e00::7, 2a01:7e00::2"}},{"id":"ap-south","label":"Singapore, SG","country":"sg","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","GPU Linodes","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"139.162.11.5, 139.162.13.5, 139.162.14.5, 139.162.15.5, 139.162.16.5, 139.162.21.5, 139.162.27.5, 103.3.60.18, 103.3.60.19, 103.3.60.20","ipv6":"2400:8901::5, 2400:8901::4, 2400:8901::b, 2400:8901::3, 2400:8901::9, 2400:8901::2, 2400:8901::8, 2400:8901::7, 2400:8901::c, 2400:8901::6"}},{"id":"eu-central","label":"Frankfurt, DE","country":"de","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","GPU Linodes","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"139.162.130.5, 139.162.131.5, 139.162.132.5, 139.162.133.5, 139.162.134.5, 139.162.135.5, 139.162.136.5, 139.162.137.5, 139.162.138.5, 139.162.139.5","ipv6":"2a01:7e01::5, 2a01:7e01::9, 2a01:7e01::7, 2a01:7e01::c, 2a01:7e01::2, 2a01:7e01::4, 2a01:7e01::3, 2a01:7e01::6, 2a01:7e01::b, 2a01:7e01::8"}}],"page":1,"pages":1,"results":23} \ No newline at end of file +{"data":[ + { + "id": "ap-west", + "label": "Mumbai, IN", + "country": "in", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "GPU Linodes", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.105.34.5, 172.105.35.5, 172.105.36.5, 172.105.37.5, 172.105.38.5, 172.105.39.5, 172.105.40.5, 172.105.41.5, 172.105.42.5, 172.105.43.5", + "ipv6": "2400:8904::f03c:91ff:fea5:659, 2400:8904::f03c:91ff:fea5:9282, 2400:8904::f03c:91ff:fea5:b9b3, 2400:8904::f03c:91ff:fea5:925a, 2400:8904::f03c:91ff:fea5:22cb, 2400:8904::f03c:91ff:fea5:227a, 2400:8904::f03c:91ff:fea5:924c, 2400:8904::f03c:91ff:fea5:f7e2, 2400:8904::f03c:91ff:fea5:2205, 2400:8904::f03c:91ff:fea5:9207" + }, + "site_type": "edge" + }, + { + "id": "ca-central", + "label": "Toronto, CA", + "country": "ca", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.105.0.5, 172.105.3.5, 172.105.4.5, 172.105.5.5, 172.105.6.5, 172.105.7.5, 172.105.8.5, 172.105.9.5, 172.105.10.5, 172.105.11.5", + "ipv6": "2600:3c04::f03c:91ff:fea9:f63, 2600:3c04::f03c:91ff:fea9:f6d, 2600:3c04::f03c:91ff:fea9:f80, 2600:3c04::f03c:91ff:fea9:f0f, 2600:3c04::f03c:91ff:fea9:f99, 2600:3c04::f03c:91ff:fea9:fbd, 2600:3c04::f03c:91ff:fea9:fdd, 2600:3c04::f03c:91ff:fea9:fe2, 2600:3c04::f03c:91ff:fea9:f68, 2600:3c04::f03c:91ff:fea9:f4a" + }, + "site_type": "core" + }, + { + "id": "ap-southeast", + "label": "Sydney, AU", + "country": "au", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.105.166.5, 172.105.169.5, 172.105.168.5, 172.105.172.5, 172.105.162.5, 172.105.170.5, 172.105.167.5, 172.105.171.5, 172.105.181.5, 172.105.161.5", + "ipv6": "2400:8907::f03c:92ff:fe6e:ec8, 2400:8907::f03c:92ff:fe6e:98e4, 2400:8907::f03c:92ff:fe6e:1c58, 2400:8907::f03c:92ff:fe6e:c299, 2400:8907::f03c:92ff:fe6e:c210, 2400:8907::f03c:92ff:fe6e:c219, 2400:8907::f03c:92ff:fe6e:1c5c, 2400:8907::f03c:92ff:fe6e:c24e, 2400:8907::f03c:92ff:fe6e:e6b, 2400:8907::f03c:92ff:fe6e:e3d" + }, + "site_type": "core" + }, + { + "id": "us-iad", + "label": "Washington, DC", + "country": "us", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Managed Databases", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "139.144.192.62, 139.144.192.60, 139.144.192.61, 139.144.192.53, 139.144.192.54, 139.144.192.67, 139.144.192.69, 139.144.192.66, 139.144.192.52, 139.144.192.68", + "ipv6": "2600:3c05::f03c:93ff:feb6:43b6, 2600:3c05::f03c:93ff:feb6:4365, 2600:3c05::f03c:93ff:feb6:43c2, 2600:3c05::f03c:93ff:feb6:e441, 2600:3c05::f03c:93ff:feb6:94ef, 2600:3c05::f03c:93ff:feb6:94ba, 2600:3c05::f03c:93ff:feb6:94a8, 2600:3c05::f03c:93ff:feb6:9413, 2600:3c05::f03c:93ff:feb6:9443, 2600:3c05::f03c:93ff:feb6:94e0" + }, + "site_type": "core" + }, + { + "id": "us-ord", + "label": "Chicago, IL", + "country": "us", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Managed Databases", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.232.0.17, 172.232.0.16, 172.232.0.21, 172.232.0.13, 172.232.0.22, 172.232.0.9, 172.232.0.19, 172.232.0.20, 172.232.0.15, 172.232.0.18", + "ipv6": "2600:3c06::f03c:93ff:fed0:e5fc, 2600:3c06::f03c:93ff:fed0:e54b, 2600:3c06::f03c:93ff:fed0:e572, 2600:3c06::f03c:93ff:fed0:e530, 2600:3c06::f03c:93ff:fed0:e597, 2600:3c06::f03c:93ff:fed0:e511, 2600:3c06::f03c:93ff:fed0:e5f2, 2600:3c06::f03c:93ff:fed0:e5bf, 2600:3c06::f03c:93ff:fed0:e529, 2600:3c06::f03c:93ff:fed0:e5a3" + }, + "site_type": "core" + }, + { + "id": "fr-par", + "label": "Paris, FR", + "country": "fr", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Managed Databases", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.232.32.21, 172.232.32.23, 172.232.32.17, 172.232.32.18, 172.232.32.16, 172.232.32.22, 172.232.32.20, 172.232.32.14, 172.232.32.11, 172.232.32.12", + "ipv6": "2600:3c07::f03c:93ff:fef2:2e63, 2600:3c07::f03c:93ff:fef2:2ec7, 2600:3c07::f03c:93ff:fef2:0dee, 2600:3c07::f03c:93ff:fef2:0d25, 2600:3c07::f03c:93ff:fef2:0de0, 2600:3c07::f03c:93ff:fef2:2e29, 2600:3c07::f03c:93ff:fef2:0dda, 2600:3c07::f03c:93ff:fef2:0d82, 2600:3c07::f03c:93ff:fef2:b3ac, 2600:3c07::f03c:93ff:fef2:b3a8" + }, + "site_type": "core" + }, + { + "id": "us-sea", + "label": "Seattle, WA", + "country": "us", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.232.160.19, 172.232.160.21, 172.232.160.17, 172.232.160.15, 172.232.160.18, 172.232.160.8, 172.232.160.12, 172.232.160.11, 172.232.160.14, 172.232.160.16", + "ipv6": "2600:3c0a::f03c:93ff:fe54:c6da, 2600:3c0a::f03c:93ff:fe54:c691, 2600:3c0a::f03c:93ff:fe54:c68d, 2600:3c0a::f03c:93ff:fe54:c61e, 2600:3c0a::f03c:93ff:fe54:c653, 2600:3c0a::f03c:93ff:fe54:c64c, 2600:3c0a::f03c:93ff:fe54:c68a, 2600:3c0a::f03c:93ff:fe54:c697, 2600:3c0a::f03c:93ff:fe54:c60f, 2600:3c0a::f03c:93ff:fe54:c6a0" + }, + "site_type": "core" + }, + { + "id": "br-gru", + "label": "Sao Paulo, BR", + "country": "br", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.233.0.4, 172.233.0.9, 172.233.0.7, 172.233.0.12, 172.233.0.5, 172.233.0.13, 172.233.0.10, 172.233.0.6, 172.233.0.8, 172.233.0.11", + "ipv6": "2600:3c0d::f03c:93ff:fe3d:51cb, 2600:3c0d::f03c:93ff:fe3d:51a7, 2600:3c0d::f03c:93ff:fe3d:51a9, 2600:3c0d::f03c:93ff:fe3d:5119, 2600:3c0d::f03c:93ff:fe3d:51fe, 2600:3c0d::f03c:93ff:fe3d:517c, 2600:3c0d::f03c:93ff:fe3d:5144, 2600:3c0d::f03c:93ff:fe3d:5170, 2600:3c0d::f03c:93ff:fe3d:51cc, 2600:3c0d::f03c:93ff:fe3d:516c" + }, + "site_type": "core" + }, + { + "id": "nl-ams", + "label": "Amsterdam, NL", + "country": "nl", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.233.33.36, 172.233.33.38, 172.233.33.35, 172.233.33.39, 172.233.33.34, 172.233.33.33, 172.233.33.31, 172.233.33.30, 172.233.33.37, 172.233.33.32", + "ipv6": "2600:3c0e::f03c:93ff:fe9d:2d10, 2600:3c0e::f03c:93ff:fe9d:2d89, 2600:3c0e::f03c:93ff:fe9d:2d79, 2600:3c0e::f03c:93ff:fe9d:2d96, 2600:3c0e::f03c:93ff:fe9d:2da5, 2600:3c0e::f03c:93ff:fe9d:2d34, 2600:3c0e::f03c:93ff:fe9d:2d68, 2600:3c0e::f03c:93ff:fe9d:2d17, 2600:3c0e::f03c:93ff:fe9d:2d45, 2600:3c0e::f03c:93ff:fe9d:2d5c" + }, + "site_type": "core" + }, + { + "id": "se-sto", + "label": "Stockholm, SE", + "country": "se", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.232.128.24, 172.232.128.26, 172.232.128.20, 172.232.128.22, 172.232.128.25, 172.232.128.19, 172.232.128.23, 172.232.128.18, 172.232.128.21, 172.232.128.27", + "ipv6": "2600:3c09::f03c:93ff:fea9:4dbe, 2600:3c09::f03c:93ff:fea9:4d63, 2600:3c09::f03c:93ff:fea9:4dce, 2600:3c09::f03c:93ff:fea9:4dbb, 2600:3c09::f03c:93ff:fea9:4d99, 2600:3c09::f03c:93ff:fea9:4d26, 2600:3c09::f03c:93ff:fea9:4de0, 2600:3c09::f03c:93ff:fea9:4d69, 2600:3c09::f03c:93ff:fea9:4dbf, 2600:3c09::f03c:93ff:fea9:4da6" + }, + "site_type": "core" + }, + { + "id": "es-mad", + "label": "Madrid, ES", + "country": "es", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.233.111.6, 172.233.111.17, 172.233.111.21, 172.233.111.25, 172.233.111.19, 172.233.111.12, 172.233.111.26, 172.233.111.16, 172.233.111.18, 172.233.111.9", + "ipv6": "2a01:7e02::f03c:93ff:feea:b585, 2a01:7e02::f03c:93ff:feea:b5ab, 2a01:7e02::f03c:93ff:feea:b5c6, 2a01:7e02::f03c:93ff:feea:b592, 2a01:7e02::f03c:93ff:feea:b5aa, 2a01:7e02::f03c:93ff:feea:b5d3, 2a01:7e02::f03c:93ff:feea:b5d7, 2a01:7e02::f03c:93ff:feea:b528, 2a01:7e02::f03c:93ff:feea:b522, 2a01:7e02::f03c:93ff:feea:b51a" + }, + "site_type": "core" + }, + { + "id": "in-maa", + "label": "Chennai, IN", + "country": "in", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.232.96.17, 172.232.96.26, 172.232.96.19, 172.232.96.20, 172.232.96.25, 172.232.96.21, 172.232.96.18, 172.232.96.22, 172.232.96.23, 172.232.96.24", + "ipv6": "2600:3c08::f03c:93ff:fe7c:1135, 2600:3c08::f03c:93ff:fe7c:11f8, 2600:3c08::f03c:93ff:fe7c:11d2, 2600:3c08::f03c:93ff:fe7c:11a7, 2600:3c08::f03c:93ff:fe7c:11ad, 2600:3c08::f03c:93ff:fe7c:110a, 2600:3c08::f03c:93ff:fe7c:11f9, 2600:3c08::f03c:93ff:fe7c:1137, 2600:3c08::f03c:93ff:fe7c:11db, 2600:3c08::f03c:93ff:fe7c:1164" + }, + "site_type": "core" + }, + { + "id": "jp-osa", + "label": "Osaka, JP", + "country": "jp", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.233.64.44, 172.233.64.43, 172.233.64.37, 172.233.64.40, 172.233.64.46, 172.233.64.41, 172.233.64.39, 172.233.64.42, 172.233.64.45, 172.233.64.38", + "ipv6": "2400:8905::f03c:93ff:fe9d:b085, 2400:8905::f03c:93ff:fe9d:b012, 2400:8905::f03c:93ff:fe9d:b09b, 2400:8905::f03c:93ff:fe9d:b0d8, 2400:8905::f03c:93ff:fe9d:259f, 2400:8905::f03c:93ff:fe9d:b006, 2400:8905::f03c:93ff:fe9d:b084, 2400:8905::f03c:93ff:fe9d:b0ce, 2400:8905::f03c:93ff:fe9d:25ea, 2400:8905::f03c:93ff:fe9d:b086" + }, + "site_type": "core" + }, + { + "id": "it-mil", + "label": "Milan, IT", + "country": "it", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.232.192.19, 172.232.192.18, 172.232.192.16, 172.232.192.20, 172.232.192.24, 172.232.192.21, 172.232.192.22, 172.232.192.17, 172.232.192.15, 172.232.192.23", + "ipv6": "2600:3c0b::f03c:93ff:feba:d513, 2600:3c0b::f03c:93ff:feba:d5c3, 2600:3c0b::f03c:93ff:feba:d597, 2600:3c0b::f03c:93ff:feba:d5fb, 2600:3c0b::f03c:93ff:feba:d51f, 2600:3c0b::f03c:93ff:feba:d58e, 2600:3c0b::f03c:93ff:feba:d5d5, 2600:3c0b::f03c:93ff:feba:d534, 2600:3c0b::f03c:93ff:feba:d57c, 2600:3c0b::f03c:93ff:feba:d529" + }, + "site_type": "core" + }, + { + "id": "us-mia", + "label": "Miami, FL", + "country": "us", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.233.160.34, 172.233.160.27, 172.233.160.30, 172.233.160.29, 172.233.160.32, 172.233.160.28, 172.233.160.33, 172.233.160.26, 172.233.160.25, 172.233.160.31", + "ipv6": "2a01:7e04::f03c:93ff:fead:d31f, 2a01:7e04::f03c:93ff:fead:d37f, 2a01:7e04::f03c:93ff:fead:d30c, 2a01:7e04::f03c:93ff:fead:d318, 2a01:7e04::f03c:93ff:fead:d316, 2a01:7e04::f03c:93ff:fead:d339, 2a01:7e04::f03c:93ff:fead:d367, 2a01:7e04::f03c:93ff:fead:d395, 2a01:7e04::f03c:93ff:fead:d3d0, 2a01:7e04::f03c:93ff:fead:d38e" + }, + "site_type": "core" + }, + { + "id": "id-cgk", + "label": "Jakarta, ID", + "country": "id", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.232.224.23, 172.232.224.32, 172.232.224.26, 172.232.224.27, 172.232.224.21, 172.232.224.24, 172.232.224.22, 172.232.224.20, 172.232.224.31, 172.232.224.28", + "ipv6": "2600:3c0c::f03c:93ff:feed:a90b, 2600:3c0c::f03c:93ff:feed:a9a5, 2600:3c0c::f03c:93ff:feed:a935, 2600:3c0c::f03c:93ff:feed:a930, 2600:3c0c::f03c:93ff:feed:a95c, 2600:3c0c::f03c:93ff:feed:a9ad, 2600:3c0c::f03c:93ff:feed:a9f2, 2600:3c0c::f03c:93ff:feed:a9ff, 2600:3c0c::f03c:93ff:feed:a9c8, 2600:3c0c::f03c:93ff:feed:a96b" + }, + "site_type": "core" + }, + { + "id": "us-lax", + "label": "Los Angeles, CA", + "country": "us", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "VPCs", + "Metadata", + "Premium Plans" + ], + "status": "ok", + "resolvers": { + "ipv4": "172.233.128.45, 172.233.128.38, 172.233.128.53, 172.233.128.37, 172.233.128.34, 172.233.128.36, 172.233.128.33, 172.233.128.39, 172.233.128.43, 172.233.128.44", + "ipv6": "2a01:7e03::f03c:93ff:feb1:b789, 2a01:7e03::f03c:93ff:feb1:b717, 2a01:7e03::f03c:93ff:feb1:b707, 2a01:7e03::f03c:93ff:feb1:b7ab, 2a01:7e03::f03c:93ff:feb1:b7e2, 2a01:7e03::f03c:93ff:feb1:b709, 2a01:7e03::f03c:93ff:feb1:b7a6, 2a01:7e03::f03c:93ff:feb1:b750, 2a01:7e03::f03c:93ff:feb1:b76e, 2a01:7e03::f03c:93ff:feb1:b7a2" + }, + "site_type": "core" + }, + { + "id": "us-central", + "label": "Dallas, TX", + "country": "us", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "72.14.179.5, 72.14.188.5, 173.255.199.5, 66.228.53.5, 96.126.122.5, 96.126.124.5, 96.126.127.5, 198.58.107.5, 198.58.111.5, 23.239.24.5", + "ipv6": "2600:3c00::2, 2600:3c00::9, 2600:3c00::7, 2600:3c00::5, 2600:3c00::3, 2600:3c00::8, 2600:3c00::6, 2600:3c00::4, 2600:3c00::c, 2600:3c00::b" + }, + "site_type": "core" + }, + { + "id": "us-west", + "label": "Fremont, CA", + "country": "us", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", + "ipv6": "2600:3c01::2, 2600:3c01::9, 2600:3c01::5, 2600:3c01::7, 2600:3c01::3, 2600:3c01::8, 2600:3c01::4, 2600:3c01::b, 2600:3c01::c, 2600:3c01::6" + }, + "site_type": "core" + }, + { + "id": "us-southeast", + "label": "Atlanta, GA", + "country": "us", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "GPU Linodes", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "74.207.231.5, 173.230.128.5, 173.230.129.5, 173.230.136.5, 173.230.140.5, 66.228.59.5, 66.228.62.5, 50.116.35.5, 50.116.41.5, 23.239.18.5", + "ipv6": "2600:3c02::3, 2600:3c02::5, 2600:3c02::4, 2600:3c02::6, 2600:3c02::c, 2600:3c02::7, 2600:3c02::2, 2600:3c02::9, 2600:3c02::8, 2600:3c02::b" + }, + "site_type": "edge" + }, + { + "id": "us-east", + "label": "Newark, NJ", + "country": "us", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "GPU Linodes", + "Kubernetes", + "Cloud Firewall", + "Bare Metal", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "66.228.42.5, 96.126.106.5, 50.116.53.5, 50.116.58.5, 50.116.61.5, 50.116.62.5, 66.175.211.5, 97.107.133.4, 207.192.69.4, 207.192.69.5", + "ipv6": "2600:3c03::7, 2600:3c03::4, 2600:3c03::9, 2600:3c03::6, 2600:3c03::3, 2600:3c03::c, 2600:3c03::5, 2600:3c03::b, 2600:3c03::2, 2600:3c03::8" + }, + "site_type": "core" + }, + { + "id": "eu-west", + "label": "London, UK", + "country": "gb", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", + "ipv6": "2a01:7e00::9, 2a01:7e00::3, 2a01:7e00::c, 2a01:7e00::5, 2a01:7e00::6, 2a01:7e00::8, 2a01:7e00::b, 2a01:7e00::4, 2a01:7e00::7, 2a01:7e00::2" + }, + "site_type": "core" + }, + { + "id": "ap-south", + "label": "Singapore, SG", + "country": "sg", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "GPU Linodes", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "139.162.11.5, 139.162.13.5, 139.162.14.5, 139.162.15.5, 139.162.16.5, 139.162.21.5, 139.162.27.5, 103.3.60.18, 103.3.60.19, 103.3.60.20", + "ipv6": "2400:8901::5, 2400:8901::4, 2400:8901::b, 2400:8901::3, 2400:8901::9, 2400:8901::2, 2400:8901::8, 2400:8901::7, 2400:8901::c, 2400:8901::6" + }, + "site_type": "core" + }, + { + "id": "eu-central", + "label": "Frankfurt, DE", + "country": "de", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Object Storage", + "GPU Linodes", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "139.162.130.5, 139.162.131.5, 139.162.132.5, 139.162.133.5, 139.162.134.5, 139.162.135.5, 139.162.136.5, 139.162.137.5, 139.162.138.5, 139.162.139.5", + "ipv6": "2a01:7e01::5, 2a01:7e01::9, 2a01:7e01::7, 2a01:7e01::c, 2a01:7e01::2, 2a01:7e01::4, 2a01:7e01::3, 2a01:7e01::6, 2a01:7e01::b, 2a01:7e01::8" + }, + "site_type": "core" + }, + { + "id": "ap-northeast", + "label": "Tokyo, JP", + "country": "jp", + "capabilities": [ + "Linodes", + "NodeBalancers", + "Block Storage", + "Kubernetes", + "Cloud Firewall", + "Vlans", + "Block Storage Migrations", + "Managed Databases" + ], + "status": "ok", + "resolvers": { + "ipv4": "139.162.66.5, 139.162.67.5, 139.162.68.5, 139.162.69.5, 139.162.70.5, 139.162.71.5, 139.162.72.5, 139.162.73.5, 139.162.74.5, 139.162.75.5", + "ipv6": "2400:8902::3, 2400:8902::6, 2400:8902::c, 2400:8902::4, 2400:8902::2, 2400:8902::8, 2400:8902::7, 2400:8902::5, 2400:8902::b, 2400:8902::9" + }, + "site_type": "core" + } +],"page":1,"pages":1,"results":23} \ No newline at end of file diff --git a/packages/manager/src/components/RegionSelect/RegionOption.tsx b/packages/manager/src/components/RegionSelect/RegionOption.tsx index 5b4279666b5..9a166e3f68f 100644 --- a/packages/manager/src/components/RegionSelect/RegionOption.tsx +++ b/packages/manager/src/components/RegionSelect/RegionOption.tsx @@ -1,10 +1,13 @@ +import { styled } from '@mui/material/styles'; import { visuallyHidden } from '@mui/utils'; import React from 'react'; +import EdgeServer from 'src/assets/icons/entityIcons/edge-server.svg'; import { Box } from 'src/components/Box'; import { Flag } from 'src/components/Flag'; import { Link } from 'src/components/Link'; import { Tooltip } from 'src/components/Tooltip'; +import { TooltipIcon } from 'src/components/TooltipIcon'; import { useFlags } from 'src/hooks/useFlags'; import { @@ -89,9 +92,43 @@ export const RegionOption = ({ option, props, selected }: Props) => { )} - {selected && } + {option.site_type === 'edge' && ( + } + status="other" + sxTooltipIcon={sxIcon} + text="This region is an edge site." + /> + )} ); }; + +const sxIcon = { + '& svg': { + height: 21, + width: 24, + }, + '&:hover': { + color: 'inherit', + }, + color: 'inherit', + padding: 0, +}; + +// const StyledEndAdornment = styled(Box, { label: 'StyledEndAdornment' })( +// ({ theme }) => ({ +// '& svg': { +// height: 21, +// width: 24, +// }, +// '&:hover': { +// color: 'inherit', +// }, +// color: 'inherit', +// display: 'flex', +// marginLeft: 4, +// }) +// ); diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index d0948de5781..f9ae6abed92 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -1,7 +1,11 @@ +import { styled } from '@mui/material/styles'; import * as React from 'react'; +import EdgeServer from 'src/assets/icons/entityIcons/edge-server.svg'; import { Autocomplete } from 'src/components/Autocomplete/Autocomplete'; +import { Box } from 'src/components/Box'; import { Flag } from 'src/components/Flag'; +import { TooltipIcon } from 'src/components/TooltipIcon'; import { useFlags } from 'src/hooks/useFlags'; import { useAccountAvailabilitiesQueryUnpaginated } from 'src/queries/accountAvailability'; @@ -112,6 +116,14 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { }} textFieldProps={{ InputProps: { + endAdornment: selectedRegion?.site_type === 'edge' && ( + } + status="other" + sxTooltipIcon={sxIcon} + text="This region is an edge server." + /> + ), required, startAdornment: selectedRegion && ( @@ -139,3 +151,31 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { ); }); + +const sxIcon = { + '& svg': { + color: 'inherit !important', + height: 21, + width: 24, + }, + '&:hover': { + color: 'inherit', + }, + color: 'inherit', + padding: 0, +}; + +const StyledEndAdornment = styled(Box, { label: 'StyledEndAdornment' })( + ({ theme }) => ({ + '& svg': { + height: 21, + width: 24, + }, + '&:hover': { + color: 'inherit', + }, + color: 'inherit', + display: 'flex', + marginLeft: 4, + }) +); diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.types.ts b/packages/manager/src/components/RegionSelect/RegionSelect.types.ts index 90460892f2f..c6c6a9aa314 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.types.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.types.ts @@ -5,6 +5,7 @@ import type { Capabilities, Country, Region, + RegionSite, } from '@linode/api-v4'; import type { EnhancedAutocompleteProps } from 'src/components/Autocomplete/Autocomplete'; @@ -14,6 +15,7 @@ export interface RegionSelectOption { region: string; }; label: string; + site_type: RegionSite; unavailable: boolean; value: string; } diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts b/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts index d5f54ca0304..544f0ba0110 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts @@ -43,6 +43,7 @@ export const getRegionOptions = ({ region: group, }, label: `${region.label} (${region.id})`, + site_type: region.site_type, unavailable: getRegionOptionAvailability({ accountAvailabilityData, currentCapability, @@ -116,6 +117,7 @@ export const getSelectedRegionById = ({ region: group, }, label: `${selectedRegion.label} (${selectedRegion.id})`, + site_type: selectedRegion.site_type, unavailable: getRegionOptionAvailability({ accountAvailabilityData, currentCapability, From 51d836c23ec934aeb46cb9de181759993f872f30 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Mon, 12 Feb 2024 01:13:37 -0500 Subject: [PATCH 02/22] add icon explanation --- .../RegionSelect/RegionSelect.styles.ts | 1 + .../components/RegionSelect/RegionSelect.tsx | 38 ++++++++++++------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts b/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts index b71ef206b31..4bdc7afdd30 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts @@ -20,6 +20,7 @@ export const StyledAutocompleteContainer = styled(Box, { marginTop: -8, }, }, + display: 'flex', })); export const StyledFlagContainer = styled('div', { diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index f9ae6abed92..2c30d22c4f1 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -1,3 +1,4 @@ +import { Typography } from '@mui/material'; import { styled } from '@mui/material/styles'; import * as React from 'react'; @@ -5,6 +6,7 @@ import EdgeServer from 'src/assets/icons/entityIcons/edge-server.svg'; import { Autocomplete } from 'src/components/Autocomplete/Autocomplete'; import { Box } from 'src/components/Box'; import { Flag } from 'src/components/Flag'; +import { Link } from 'src/components/Link'; import { TooltipIcon } from 'src/components/TooltipIcon'; import { useFlags } from 'src/hooks/useFlags'; import { useAccountAvailabilitiesQueryUnpaginated } from 'src/queries/accountAvailability'; @@ -146,9 +148,18 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { noOptionsText="No results" options={options} placeholder="Select a Region" + sx={{ minWidth: 416 }} value={selectedRegion} /> + + + + {' '} + Indicates an Edge server region. Learn more + + + // @TODO Gecko MVP: Add docs link ); }); @@ -165,17 +176,16 @@ const sxIcon = { padding: 0, }; -const StyledEndAdornment = styled(Box, { label: 'StyledEndAdornment' })( - ({ theme }) => ({ - '& svg': { - height: 21, - width: 24, - }, - '&:hover': { - color: 'inherit', - }, - color: 'inherit', - display: 'flex', - marginLeft: 4, - }) -); +const StyledBox = styled(Box, { label: 'StyledBox' })(({ theme }) => ({ + '& svg': { + height: 21, + marginLeft: 8, + marginRight: 8, + width: 24, + }, + alignSelf: 'end', + color: 'inherit', + display: 'flex', + marginLeft: 8, + padding: '8px 0', +})); From 0b76b656621c8646b5b7bf3023186d3354de0111 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Mon, 12 Feb 2024 01:17:51 -0500 Subject: [PATCH 03/22] fix selected edge icon position --- .../manager/src/components/RegionSelect/RegionSelect.styles.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts b/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts index 4bdc7afdd30..c747011a3c2 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts @@ -20,6 +20,9 @@ export const StyledAutocompleteContainer = styled(Box, { marginTop: -8, }, }, + '& .MuiAutocomplete-root .MuiAutocomplete-inputRoot': { + paddingRight: 8, + }, display: 'flex', })); From d9589110f7752fd766bafd9acb4a7f30433b2b12 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Mon, 12 Feb 2024 15:03:31 -0500 Subject: [PATCH 04/22] feature flag code --- .../components/RegionSelect/RegionOption.tsx | 17 ++++---- .../components/RegionSelect/RegionSelect.tsx | 39 +++++++++++-------- .../manager/src/dev-tools/FeatureFlagTool.tsx | 2 +- packages/manager/src/featureFlags.ts | 1 + 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionOption.tsx b/packages/manager/src/components/RegionSelect/RegionOption.tsx index 9a166e3f68f..49a6c275391 100644 --- a/packages/manager/src/components/RegionSelect/RegionOption.tsx +++ b/packages/manager/src/components/RegionSelect/RegionOption.tsx @@ -1,4 +1,3 @@ -import { styled } from '@mui/material/styles'; import { visuallyHidden } from '@mui/utils'; import React from 'react'; @@ -10,22 +9,22 @@ import { Tooltip } from 'src/components/Tooltip'; import { TooltipIcon } from 'src/components/TooltipIcon'; import { useFlags } from 'src/hooks/useFlags'; -import { - SelectedIcon, - StyledFlagContainer, - StyledListItem, -} from './RegionSelect.styles'; +import { StyledFlagContainer, StyledListItem } from './RegionSelect.styles'; import { RegionSelectOption } from './RegionSelect.types'; import type { ListItemComponentsPropsOverrides } from '@mui/material/ListItem'; type Props = { + displayEdgeServerIcon: boolean; option: RegionSelectOption; props: React.HTMLAttributes; - selected: boolean; }; -export const RegionOption = ({ option, props, selected }: Props) => { +export const RegionOption = ({ + displayEdgeServerIcon, + option, + props, +}: Props) => { const flags = useFlags(); const isDisabledMenuItem = Boolean(flags.dcGetWell) && Boolean(option.unavailable); @@ -92,7 +91,7 @@ export const RegionOption = ({ option, props, selected }: Props) => { )} - {option.site_type === 'edge' && ( + {displayEdgeServerIcon && ( } status="other" diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index 2c30d22c4f1..e25f3a59642 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -106,26 +106,29 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { handleRegionChange(null); } }} - renderOption={(props, option, { selected }) => { + renderOption={(props, option) => { return ( ); }} textFieldProps={{ InputProps: { - endAdornment: selectedRegion?.site_type === 'edge' && ( - } - status="other" - sxTooltipIcon={sxIcon} - text="This region is an edge server." - /> - ), + endAdornment: flags.gecko && + selectedRegion?.site_type === 'edge' && ( + } + status="other" + sxTooltipIcon={sxIcon} + text="This region is an edge server." + /> + ), required, startAdornment: selectedRegion && ( @@ -151,13 +154,15 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { sx={{ minWidth: 416 }} value={selectedRegion} /> - - - - {' '} - Indicates an Edge server region. Learn more - - + {flags.gecko && ( + + + + {' '} + Indicates an Edge server region. Learn more + + + )} // @TODO Gecko MVP: Add docs link ); diff --git a/packages/manager/src/dev-tools/FeatureFlagTool.tsx b/packages/manager/src/dev-tools/FeatureFlagTool.tsx index af174364a63..edc3911a9bf 100644 --- a/packages/manager/src/dev-tools/FeatureFlagTool.tsx +++ b/packages/manager/src/dev-tools/FeatureFlagTool.tsx @@ -16,7 +16,7 @@ const options: { flag: keyof Flags; label: string }[] = [ { flag: 'aclbFullCreateFlow', label: 'ACLB Full Create Flow' }, { flag: 'dcGetWell', label: 'DC Get Well' }, { flag: 'linodeCloneUIChanges', label: 'Linode Clone UI Changes' }, - { flag: 'metadata', label: 'Metadata' }, + { flag: 'gecko', label: 'Gecko' }, { flag: 'parentChildAccountAccess', label: 'Parent/Child Account' }, { flag: 'selfServeBetas', label: 'Self Serve Betas' }, { flag: 'vpc', label: 'VPC' }, diff --git a/packages/manager/src/featureFlags.ts b/packages/manager/src/featureFlags.ts index 0c2127f8336..a0f300e73ae 100644 --- a/packages/manager/src/featureFlags.ts +++ b/packages/manager/src/featureFlags.ts @@ -48,6 +48,7 @@ export interface Flags { databases: boolean; dcGetWell: boolean; firewallNodebalancer: boolean; + gecko: boolean; ipv6Sharing: boolean; linodeCloneUIChanges: boolean; linodeCreateWithFirewall: boolean; From 0b995244de780ea2488fcea1ba8844a26b926595 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Mon, 12 Feb 2024 16:59:59 -0500 Subject: [PATCH 05/22] hide edge servers in marketplace region dropdown --- .../components/RegionSelect/RegionSelect.tsx | 20 +++++++++++++------ .../RegionSelect/RegionSelect.types.ts | 1 + .../RegionSelect/RegionSelect.utils.ts | 13 +++++++++--- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index e25f3a59642..4a1358c9cd8 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -1,6 +1,7 @@ import { Typography } from '@mui/material'; import { styled } from '@mui/material/styles'; import * as React from 'react'; +import { useLocation } from 'react-router-dom'; import EdgeServer from 'src/assets/icons/entityIcons/edge-server.svg'; import { Autocomplete } from 'src/components/Autocomplete/Autocomplete'; @@ -10,6 +11,7 @@ import { Link } from 'src/components/Link'; import { TooltipIcon } from 'src/components/TooltipIcon'; import { useFlags } from 'src/hooks/useFlags'; import { useAccountAvailabilitiesQueryUnpaginated } from 'src/queries/accountAvailability'; +import { getQueryParamFromQueryString } from 'src/utilities/queryParams'; import { RegionOption } from './RegionOption'; import { @@ -46,6 +48,9 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { } = props; const flags = useFlags(); + const location = useLocation(); + const createType = getQueryParamFromQueryString(location.search, 'type'); + const { data: accountAvailability, isLoading: accountAvailabilityLoading, @@ -77,14 +82,17 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { } }, [selectedId]); + const geckoEnabled = Boolean(flags.gecko && createType !== 'One-Click'); // hide edge sites from Marketplace + const options = React.useMemo( () => getRegionOptions({ accountAvailabilityData: accountAvailability, currentCapability, + hideEdgeServers: !geckoEnabled, regions, }), - [accountAvailability, currentCapability, regions] + [accountAvailability, currentCapability, regions, geckoEnabled] ); return ( @@ -109,9 +117,9 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { renderOption={(props, option) => { return ( { }} textFieldProps={{ InputProps: { - endAdornment: flags.gecko && + endAdornment: geckoEnabled && selectedRegion?.site_type === 'edge' && ( } @@ -154,7 +162,7 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { sx={{ minWidth: 416 }} value={selectedRegion} /> - {flags.gecko && ( + {geckoEnabled && ( diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.types.ts b/packages/manager/src/components/RegionSelect/RegionSelect.types.ts index c6c6a9aa314..7c698a62d40 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.types.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.types.ts @@ -70,6 +70,7 @@ export interface RegionOptionAvailability { } export interface GetRegionOptions extends RegionOptionAvailability { + hideEdgeServers?: boolean; regions: Region[]; } diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts b/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts index 544f0ba0110..5b7793e28bd 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts @@ -25,12 +25,19 @@ const NORTH_AMERICA = CONTINENT_CODE_TO_CONTINENT.NA; export const getRegionOptions = ({ accountAvailabilityData, currentCapability, + hideEdgeServers = false, regions, }: GetRegionOptions): RegionSelectOption[] => { const filteredRegions = currentCapability - ? regions.filter((region) => - region.capabilities.includes(currentCapability) - ) + ? regions.filter((region) => { + if (hideEdgeServers) { + return ( + region.capabilities.includes(currentCapability) && + region.site_type !== 'edge' + ); + } + return region.capabilities.includes(currentCapability); + }) : regions; return filteredRegions From 761b64b035a240428c3c029c7c9145fa1132e8fa Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Tue, 13 Feb 2024 12:12:16 -0500 Subject: [PATCH 06/22] hide edge sites from Image Upload region select --- .../components/RegionSelect/RegionSelect.tsx | 7 +++++- .../RegionSelect/RegionSelect.utils.ts | 22 +++++++++---------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index 4a1358c9cd8..54af6fc887a 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -82,7 +82,12 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { } }, [selectedId]); - const geckoEnabled = Boolean(flags.gecko && createType !== 'One-Click'); // hide edge sites from Marketplace + // Hide edge sites from Marketplace and Image Upload + const isNotImagesOrMarketplace = + !['Images', 'One-Click'].includes(createType) && + !location.pathname.match('/images/create'); + + const geckoEnabled = Boolean(flags.gecko && isNotImagesOrMarketplace); const options = React.useMemo( () => diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts b/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts index 5b7793e28bd..6b750f452af 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts @@ -28,19 +28,19 @@ export const getRegionOptions = ({ hideEdgeServers = false, regions, }: GetRegionOptions): RegionSelectOption[] => { - const filteredRegions = currentCapability - ? regions.filter((region) => { - if (hideEdgeServers) { - return ( - region.capabilities.includes(currentCapability) && - region.site_type !== 'edge' - ); - } - return region.capabilities.includes(currentCapability); - }) + const filteredRegionsByCapability = currentCapability + ? regions.filter((region) => + region.capabilities.includes(currentCapability) + ) : regions; - return filteredRegions + const filteredRegionsByCapabilityAndSiteType = hideEdgeServers + ? filteredRegionsByCapability.filter( + (region) => region.site_type !== 'edge' + ) + : filteredRegionsByCapability; + + return filteredRegionsByCapabilityAndSiteType .map((region: Region) => { const group = getRegionCountryGroup(region); From 1f54275e013716aa2db7db860d34602555730d41 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Tue, 13 Feb 2024 13:58:43 -0500 Subject: [PATCH 07/22] hide linodes located in an edge region from Image create dropdown --- .../src/features/Images/ImagesCreate/CreateImageTab.tsx | 9 ++++++++- packages/manager/src/mocks/serverHandlers.ts | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/manager/src/features/Images/ImagesCreate/CreateImageTab.tsx b/packages/manager/src/features/Images/ImagesCreate/CreateImageTab.tsx index 6773a912703..88717cc573e 100644 --- a/packages/manager/src/features/Images/ImagesCreate/CreateImageTab.tsx +++ b/packages/manager/src/features/Images/ImagesCreate/CreateImageTab.tsx @@ -21,6 +21,7 @@ import { useFlags } from 'src/hooks/useFlags'; import { useEventsPollingActions } from 'src/queries/events/events'; import { useCreateImageMutation } from 'src/queries/images'; import { useGrants, useProfile } from 'src/queries/profile'; +import { useRegionsQuery } from 'src/queries/regions'; import { getAPIErrorOrDefault } from 'src/utilities/errorUtils'; import { getAPIErrorFor } from 'src/utilities/getAPIErrorFor'; @@ -99,6 +100,7 @@ export const CreateImageTab: React.FC = (props) => { const { data: profile } = useProfile(); const { data: grants } = useGrants(); const flags = useFlags(); + const { data: regions } = useRegionsQuery(); const { mutateAsync: createImage } = useCreateImageMutation(); @@ -236,6 +238,9 @@ export const CreateImageTab: React.FC = (props) => { const linodeError = hasErrorFor('linode_id'); const diskError = hasErrorFor('disk_id'); + const linodeIsNotInEdgeRegion = (linodeRegion: string) => + regions?.find((region) => region.id === linodeRegion)?.site_type !== 'edge'; + return ( {!canCreateImage ? ( @@ -251,7 +256,9 @@ export const CreateImageTab: React.FC = (props) => { - availableLinodesToImagize?.includes(linode.id) ?? true + (linodeIsNotInEdgeRegion(linode.region) && + availableLinodesToImagize?.includes(linode.id)) ?? + true } disabled={!canCreateImage} errorText={linodeError} diff --git a/packages/manager/src/mocks/serverHandlers.ts b/packages/manager/src/mocks/serverHandlers.ts index 6d2552aa742..6ddb72879af 100644 --- a/packages/manager/src/mocks/serverHandlers.ts +++ b/packages/manager/src/mocks/serverHandlers.ts @@ -666,6 +666,11 @@ export const handlers = [ label: 'metadata-test-region', region: 'eu-west', }); + const linodeInEdgeRegion = linodeFactory.build({ + image: 'edge-test-image', + label: 'edge-test-region', + region: 'us-southeast', + }); const onlineLinodes = linodeFactory.buildList(40, { backups: { enabled: false }, ipv4: ['000.000.000.000'], @@ -696,6 +701,7 @@ export const handlers = [ const linodes = [ metadataLinodeWithCompatibleImage, metadataLinodeWithCompatibleImageAndRegion, + linodeInEdgeRegion, ...onlineLinodes, linodeWithEligibleVolumes, ...offlineLinodes, From d14625beb819213ccf19faf15d091750e4c24160 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Tue, 13 Feb 2024 23:34:36 -0500 Subject: [PATCH 08/22] hide edge sites from Create NodeBalancers region select --- .../src/components/RegionSelect/RegionSelect.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index 54af6fc887a..85936d2396c 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -82,12 +82,13 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { } }, [selectedId]); - // Hide edge sites from Marketplace and Image Upload - const isNotImagesOrMarketplace = - !['Images', 'One-Click'].includes(createType) && - !location.pathname.match('/images/create'); - - const geckoEnabled = Boolean(flags.gecko && isNotImagesOrMarketplace); + // Hide edge sites from Marketplace, Create NodeBalancer, and Image Upload + const unsupportedEdgeEntities = + ['Images', 'One-Click'].includes(createType) || + ['/images/create/upload', '/nodebalancers/create'].includes( + location.pathname + ); + const geckoEnabled = Boolean(flags.gecko && !unsupportedEdgeEntities); const options = React.useMemo( () => From 7853c45aea1fdca3349f8f2b48eb7ae9328bf4fc Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Tue, 13 Feb 2024 23:57:14 -0500 Subject: [PATCH 09/22] hide edge sites from Create LKE region select --- .../src/components/RegionSelect/RegionSelect.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index 85936d2396c..d11756bd01e 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -82,12 +82,14 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { } }, [selectedId]); - // Hide edge sites from Marketplace, Create NodeBalancer, and Image Upload + // Hide edge sites from Marketplace, Create NodeBalancer, Create LKE, and Image Upload const unsupportedEdgeEntities = ['Images', 'One-Click'].includes(createType) || - ['/images/create/upload', '/nodebalancers/create'].includes( - location.pathname - ); + [ + '/images/create/upload', + '/kubernetes/create', + '/nodebalancers/create', + ].includes(location.pathname); const geckoEnabled = Boolean(flags.gecko && !unsupportedEdgeEntities); const options = React.useMemo( From cda698e6100eb63e677457e908cc364bb417df72 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Wed, 14 Feb 2024 11:04:12 -0500 Subject: [PATCH 10/22] fix position styling --- .../components/RegionSelect/RegionOption.tsx | 35 +++----------- .../RegionSelect/RegionSelect.styles.ts | 36 ++++++++++++++ .../components/RegionSelect/RegionSelect.tsx | 48 +++++-------------- 3 files changed, 54 insertions(+), 65 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionOption.tsx b/packages/manager/src/components/RegionSelect/RegionOption.tsx index 49a6c275391..df843c8d79a 100644 --- a/packages/manager/src/components/RegionSelect/RegionOption.tsx +++ b/packages/manager/src/components/RegionSelect/RegionOption.tsx @@ -9,7 +9,11 @@ import { Tooltip } from 'src/components/Tooltip'; import { TooltipIcon } from 'src/components/TooltipIcon'; import { useFlags } from 'src/hooks/useFlags'; -import { StyledFlagContainer, StyledListItem } from './RegionSelect.styles'; +import { + StyledFlagContainer, + StyledListItem, + sxEdgeIcon, +} from './RegionSelect.styles'; import { RegionSelectOption } from './RegionSelect.types'; import type { ListItemComponentsPropsOverrides } from '@mui/material/ListItem'; @@ -95,7 +99,7 @@ export const RegionOption = ({ } status="other" - sxTooltipIcon={sxIcon} + sxTooltipIcon={sxEdgeIcon} text="This region is an edge site." /> )} @@ -104,30 +108,3 @@ export const RegionOption = ({ ); }; - -const sxIcon = { - '& svg': { - height: 21, - width: 24, - }, - '&:hover': { - color: 'inherit', - }, - color: 'inherit', - padding: 0, -}; - -// const StyledEndAdornment = styled(Box, { label: 'StyledEndAdornment' })( -// ({ theme }) => ({ -// '& svg': { -// height: 21, -// width: 24, -// }, -// '&:hover': { -// color: 'inherit', -// }, -// color: 'inherit', -// display: 'flex', -// marginLeft: 4, -// }) -// ); diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts b/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts index c747011a3c2..a4e575033cf 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts @@ -24,8 +24,44 @@ export const StyledAutocompleteContainer = styled(Box, { paddingRight: 8, }, display: 'flex', + [theme.breakpoints.down('md')]: { + flexDirection: 'column', + }, })); +export const sxEdgeIcon = { + '& svg': { + color: 'inherit !important', + height: 21, + width: 24, + }, + '&:hover': { + color: 'inherit', + }, + color: 'inherit', + padding: 0, +}; + +export const StyledEdgeBox = styled(Box, { label: 'StyledEdgeBox' })( + ({ theme }) => ({ + '& svg': { + height: 21, + marginLeft: 8, + marginRight: 8, + width: 24, + }, + alignSelf: 'end', + color: 'inherit', + display: 'flex', + marginLeft: 8, + padding: '8px 0', + [theme.breakpoints.down('md')]: { + alignSelf: 'start', + marginLeft: 0, + }, + }) +); + export const StyledFlagContainer = styled('div', { label: 'RegionSelectFlagContainer', })(({ theme }) => ({ diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index d11756bd01e..a4eed9aee8b 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -1,11 +1,9 @@ import { Typography } from '@mui/material'; -import { styled } from '@mui/material/styles'; import * as React from 'react'; import { useLocation } from 'react-router-dom'; import EdgeServer from 'src/assets/icons/entityIcons/edge-server.svg'; import { Autocomplete } from 'src/components/Autocomplete/Autocomplete'; -import { Box } from 'src/components/Box'; import { Flag } from 'src/components/Flag'; import { Link } from 'src/components/Link'; import { TooltipIcon } from 'src/components/TooltipIcon'; @@ -16,7 +14,9 @@ import { getQueryParamFromQueryString } from 'src/utilities/queryParams'; import { RegionOption } from './RegionOption'; import { StyledAutocompleteContainer, + StyledEdgeBox, StyledFlagContainer, + sxEdgeIcon, } from './RegionSelect.styles'; import { getRegionOptions, getSelectedRegionById } from './RegionSelect.utils'; @@ -134,6 +134,11 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { /> ); }} + sx={(theme) => ({ + [theme.breakpoints.up('md')]: { + width: '416px', + }, + })} textFieldProps={{ InputProps: { endAdornment: geckoEnabled && @@ -141,7 +146,7 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { } status="other" - sxTooltipIcon={sxIcon} + sxTooltipIcon={sxEdgeIcon} text="This region is an edge server." /> ), @@ -167,46 +172,17 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { noOptionsText="No results" options={options} placeholder="Select a Region" - sx={{ minWidth: 416 }} value={selectedRegion} /> - {geckoEnabled && ( - + {geckoEnabled && ( // @TODO Gecko MVP: Add docs link + - + {' '} Indicates an Edge server region. Learn more - + )} - // @TODO Gecko MVP: Add docs link ); }); - -const sxIcon = { - '& svg': { - color: 'inherit !important', - height: 21, - width: 24, - }, - '&:hover': { - color: 'inherit', - }, - color: 'inherit', - padding: 0, -}; - -const StyledBox = styled(Box, { label: 'StyledBox' })(({ theme }) => ({ - '& svg': { - height: 21, - marginLeft: 8, - marginRight: 8, - width: 24, - }, - alignSelf: 'end', - color: 'inherit', - display: 'flex', - marginLeft: 8, - padding: '8px 0', -})); From f8ec5fce2b9ea13dd95accb5fb5e5f41868038cb Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Wed, 14 Feb 2024 11:50:57 -0500 Subject: [PATCH 11/22] fix arrow icon in region select --- .../manager/src/components/Autocomplete/Autocomplete.tsx | 6 ++++++ .../manager/src/components/RegionSelect/RegionSelect.tsx | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/manager/src/components/Autocomplete/Autocomplete.tsx b/packages/manager/src/components/Autocomplete/Autocomplete.tsx index 013314d5235..1bbc6ccc2ef 100644 --- a/packages/manager/src/components/Autocomplete/Autocomplete.tsx +++ b/packages/manager/src/components/Autocomplete/Autocomplete.tsx @@ -112,6 +112,12 @@ export const Autocomplete = < InputProps={{ ...params.InputProps, ...textFieldProps?.InputProps, + endAdornment: ( + + {textFieldProps?.InputProps?.endAdornment} + {params.InputProps.endAdornment} + + ), }} /> )} diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index a4eed9aee8b..7969c527990 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -147,7 +147,7 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { icon={} status="other" sxTooltipIcon={sxEdgeIcon} - text="This region is an edge server." + text="This region is an Edge server." /> ), required, From c885d0bd38cd4bd4bd3265740a4e957f6b0c9d07 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Thu, 15 Feb 2024 13:36:25 -0500 Subject: [PATCH 12/22] address errors --- .../src/components/RegionSelect/RegionOption.tsx | 11 ++++++----- .../RegionSelect/RegionSelect.utils.test.tsx | 3 +++ packages/manager/src/factories/regions.ts | 2 ++ packages/manager/src/utilities/regions.test.ts | 4 ++++ 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionOption.tsx b/packages/manager/src/components/RegionSelect/RegionOption.tsx index df843c8d79a..ab1baa23c6c 100644 --- a/packages/manager/src/components/RegionSelect/RegionOption.tsx +++ b/packages/manager/src/components/RegionSelect/RegionOption.tsx @@ -7,9 +7,9 @@ import { Flag } from 'src/components/Flag'; import { Link } from 'src/components/Link'; import { Tooltip } from 'src/components/Tooltip'; import { TooltipIcon } from 'src/components/TooltipIcon'; -import { useFlags } from 'src/hooks/useFlags'; import { + SelectedIcon, StyledFlagContainer, StyledListItem, sxEdgeIcon, @@ -19,19 +19,19 @@ import { RegionSelectOption } from './RegionSelect.types'; import type { ListItemComponentsPropsOverrides } from '@mui/material/ListItem'; type Props = { - displayEdgeServerIcon: boolean; + displayEdgeServerIcon?: boolean; option: RegionSelectOption; props: React.HTMLAttributes; + selected?: boolean; }; export const RegionOption = ({ displayEdgeServerIcon, option, props, + selected, }: Props) => { - const flags = useFlags(); - const isDisabledMenuItem = - Boolean(flags.dcGetWell) && Boolean(option.unavailable); + const isDisabledMenuItem = option.unavailable; return ( )} + {selected && } {displayEdgeServerIcon && ( } diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx index f7a4b1c2acc..f9d459a5593 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx @@ -45,18 +45,21 @@ const expectedRegions: RegionSelectOption[] = [ region: 'North America', }, label: 'US Location (us-1)', + site_type: 'core', unavailable: false, value: 'us-1', }, { data: { country: 'ca', region: 'North America' }, label: 'CA Location (ca-1)', + site_type: 'core', unavailable: false, value: 'ca-1', }, { data: { country: 'jp', region: 'Asia' }, label: 'JP Location (jp-1)', + site_type: 'core', unavailable: false, value: 'jp-1', }, diff --git a/packages/manager/src/factories/regions.ts b/packages/manager/src/factories/regions.ts index 436ab8e840f..a9e9edf302c 100644 --- a/packages/manager/src/factories/regions.ts +++ b/packages/manager/src/factories/regions.ts @@ -17,6 +17,7 @@ export const regionFactory = Factory.Sync.makeFactory({ id: Factory.each((id) => `us-${id}`), label: Factory.each((id) => `${id}, NJ`), resolvers: resolverFactory.build(), + site_type: 'core', status: 'ok', }); @@ -36,6 +37,7 @@ export const regionWithDynamicPricingFactory = Factory.Sync.makeFactory( id: 'id-cgk', label: 'Jakarta, ID', resolvers: resolverFactory.build(), + site_type: 'core', status: 'ok', } ); diff --git a/packages/manager/src/utilities/regions.test.ts b/packages/manager/src/utilities/regions.test.ts index 1a8b89931a6..72e9cd2ca31 100644 --- a/packages/manager/src/utilities/regions.test.ts +++ b/packages/manager/src/utilities/regions.test.ts @@ -11,6 +11,7 @@ describe('getRegionsByRegionId', () => { id: 'us-east', label: 'Newark, NJ', resolvers: { ipv4: '', ipv6: '' }, + site_type: 'core', status: 'ok', }, { @@ -19,6 +20,7 @@ describe('getRegionsByRegionId', () => { id: 'us-southeast', label: 'Atlanta, GA', resolvers: { ipv4: '', ipv6: '' }, + site_type: 'core', status: 'ok', }, ]; @@ -30,6 +32,7 @@ describe('getRegionsByRegionId', () => { id: 'us-east', label: 'Newark, NJ', resolvers: { ipv4: '', ipv6: '' }, + site_type: 'core', status: 'ok', }, 'us-southeast': { @@ -38,6 +41,7 @@ describe('getRegionsByRegionId', () => { id: 'us-southeast', label: 'Atlanta, GA', resolvers: { ipv4: '', ipv6: '' }, + site_type: 'core', status: 'ok', }, }; From 6ef201ae44012d1d0da13ecf935718bc4797de21 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Thu, 15 Feb 2024 17:50:27 -0500 Subject: [PATCH 13/22] use region capability to filter unsupported entities --- packages/manager/src/cachedData/regions.json | 18 ++++++++++++++-- .../components/RegionSelect/RegionSelect.tsx | 21 +++++++++++-------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/packages/manager/src/cachedData/regions.json b/packages/manager/src/cachedData/regions.json index 6268a6a17bb..5177c210921 100644 --- a/packages/manager/src/cachedData/regions.json +++ b/packages/manager/src/cachedData/regions.json @@ -19,7 +19,7 @@ "ipv4": "172.105.34.5, 172.105.35.5, 172.105.36.5, 172.105.37.5, 172.105.38.5, 172.105.39.5, 172.105.40.5, 172.105.41.5, 172.105.42.5, 172.105.43.5", "ipv6": "2400:8904::f03c:91ff:fea5:659, 2400:8904::f03c:91ff:fea5:9282, 2400:8904::f03c:91ff:fea5:b9b3, 2400:8904::f03c:91ff:fea5:925a, 2400:8904::f03c:91ff:fea5:22cb, 2400:8904::f03c:91ff:fea5:227a, 2400:8904::f03c:91ff:fea5:924c, 2400:8904::f03c:91ff:fea5:f7e2, 2400:8904::f03c:91ff:fea5:2205, 2400:8904::f03c:91ff:fea5:9207" }, - "site_type": "edge" + "site_type": "core" }, { "id": "ca-central", @@ -430,6 +430,20 @@ }, "site_type": "core" }, + { + "id": "us-edgetest", + "label": "Gecko Edge Test", + "country": "us", + "capabilities": [ + "Linodes" + ], + "status": "ok", + "resolvers": { + "ipv4": "74.207.231.5, 173.230.128.5, 173.230.129.5, 173.230.136.5, 173.230.140.5, 66.228.59.5, 66.228.62.5, 50.116.35.5, 50.116.41.5, 23.239.18.5", + "ipv6": "2600:3c02::3, 2600:3c02::5, 2600:3c02::4, 2600:3c02::6, 2600:3c02::c, 2600:3c02::7, 2600:3c02::2, 2600:3c02::9, 2600:3c02::8, 2600:3c02::b" + }, + "site_type": "edge" + }, { "id": "us-southeast", "label": "Atlanta, GA", @@ -451,7 +465,7 @@ "ipv4": "74.207.231.5, 173.230.128.5, 173.230.129.5, 173.230.136.5, 173.230.140.5, 66.228.59.5, 66.228.62.5, 50.116.35.5, 50.116.41.5, 23.239.18.5", "ipv6": "2600:3c02::3, 2600:3c02::5, 2600:3c02::4, 2600:3c02::6, 2600:3c02::c, 2600:3c02::7, 2600:3c02::2, 2600:3c02::9, 2600:3c02::8, 2600:3c02::b" }, - "site_type": "edge" + "site_type": "core" }, { "id": "us-east", diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index f90a160d350..d2967b504a4 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -82,16 +82,19 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { } }, [selectedId]); - // Hide edge sites from Marketplace, Create NodeBalancer, Create LKE, and Image Upload - const unsupportedEdgeEntities = - ['Images', 'One-Click'].includes(createType) || - [ - '/images/create/upload', - '/kubernetes/create', - '/nodebalancers/create', - ].includes(location.pathname); + // Hide edge sites from Marketplace and Images + const unsupportedEdgeEntities = ['Images', 'One-Click'].includes(createType); const geckoEnabled = Boolean(flags.gecko && !unsupportedEdgeEntities); + const showGeckoHelperText = + geckoEnabled && + currentCapability && + regions.find( + (region) => + region.site_type === 'edge' && + region.capabilities.includes(currentCapability) + ); + const options = React.useMemo( () => getRegionOptions({ @@ -172,7 +175,7 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { placeholder="Select a Region" value={selectedRegion} /> - {geckoEnabled && ( // @TODO Gecko MVP: Add docs link + {showGeckoHelperText && ( // @TODO Gecko MVP: Add docs link From 5250de137092590cbef9a483f9407aac6087d9e7 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Tue, 20 Feb 2024 13:42:53 -0500 Subject: [PATCH 14/22] update regionsData instead of cached regions --- packages/manager/src/__data__/regionsData.ts | 20 + packages/manager/src/cachedData/regions.json | 583 +------------------ packages/manager/src/mocks/serverHandlers.ts | 4 +- 3 files changed, 23 insertions(+), 584 deletions(-) diff --git a/packages/manager/src/__data__/regionsData.ts b/packages/manager/src/__data__/regionsData.ts index 7f7220ad9cf..a149801ed2e 100644 --- a/packages/manager/src/__data__/regionsData.ts +++ b/packages/manager/src/__data__/regionsData.ts @@ -12,6 +12,7 @@ export const regions: Region[] = [ id: 'ap-west', label: 'Mumbai, IN', resolvers, + site_type: 'core', status: 'ok', }, { @@ -20,6 +21,7 @@ export const regions: Region[] = [ id: 'ap-southeast', label: 'Sydney, AU', resolvers, + site_type: 'core', status: 'ok', }, { @@ -28,6 +30,7 @@ export const regions: Region[] = [ id: 'ca-central', label: 'Toronto, CA', resolvers, + site_type: 'core', status: 'ok', }, { @@ -36,6 +39,7 @@ export const regions: Region[] = [ id: 'us-central', label: 'Dallas, TX', resolvers, + site_type: 'core', status: 'ok', }, { @@ -44,6 +48,7 @@ export const regions: Region[] = [ id: 'us-west', label: 'Fremont, CA', resolvers, + site_type: 'core', status: 'ok', }, { @@ -52,6 +57,7 @@ export const regions: Region[] = [ id: 'us-southeast', label: 'Atlanta, GA', resolvers, + site_type: 'core', status: 'ok', }, { @@ -65,6 +71,7 @@ export const regions: Region[] = [ id: 'us-east', label: 'Newark, NJ', resolvers, + site_type: 'core', status: 'ok', }, { @@ -73,6 +80,7 @@ export const regions: Region[] = [ id: 'eu-west', label: 'London, UK', resolvers, + site_type: 'core', status: 'ok', }, { @@ -81,6 +89,7 @@ export const regions: Region[] = [ id: 'ap-south', label: 'Singapore, SG', resolvers, + site_type: 'core', status: 'ok', }, { @@ -89,6 +98,7 @@ export const regions: Region[] = [ id: 'eu-central', label: 'Frankfurt, DE', resolvers, + site_type: 'core', status: 'ok', }, { @@ -97,6 +107,16 @@ export const regions: Region[] = [ id: 'ap-northeast', label: 'Tokyo, JP', resolvers, + site_type: 'core', + status: 'ok', + }, + { + capabilities: ['Linodes'], + country: 'us', + id: 'us-edgetest', + label: 'Gecko Edge Test', + resolvers, + site_type: 'edge', status: 'ok', }, ]; diff --git a/packages/manager/src/cachedData/regions.json b/packages/manager/src/cachedData/regions.json index 5177c210921..3becff548ed 100644 --- a/packages/manager/src/cachedData/regions.json +++ b/packages/manager/src/cachedData/regions.json @@ -1,582 +1 @@ -{"data":[ - { - "id": "ap-west", - "label": "Mumbai, IN", - "country": "in", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "GPU Linodes", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.105.34.5, 172.105.35.5, 172.105.36.5, 172.105.37.5, 172.105.38.5, 172.105.39.5, 172.105.40.5, 172.105.41.5, 172.105.42.5, 172.105.43.5", - "ipv6": "2400:8904::f03c:91ff:fea5:659, 2400:8904::f03c:91ff:fea5:9282, 2400:8904::f03c:91ff:fea5:b9b3, 2400:8904::f03c:91ff:fea5:925a, 2400:8904::f03c:91ff:fea5:22cb, 2400:8904::f03c:91ff:fea5:227a, 2400:8904::f03c:91ff:fea5:924c, 2400:8904::f03c:91ff:fea5:f7e2, 2400:8904::f03c:91ff:fea5:2205, 2400:8904::f03c:91ff:fea5:9207" - }, - "site_type": "core" - }, - { - "id": "ca-central", - "label": "Toronto, CA", - "country": "ca", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.105.0.5, 172.105.3.5, 172.105.4.5, 172.105.5.5, 172.105.6.5, 172.105.7.5, 172.105.8.5, 172.105.9.5, 172.105.10.5, 172.105.11.5", - "ipv6": "2600:3c04::f03c:91ff:fea9:f63, 2600:3c04::f03c:91ff:fea9:f6d, 2600:3c04::f03c:91ff:fea9:f80, 2600:3c04::f03c:91ff:fea9:f0f, 2600:3c04::f03c:91ff:fea9:f99, 2600:3c04::f03c:91ff:fea9:fbd, 2600:3c04::f03c:91ff:fea9:fdd, 2600:3c04::f03c:91ff:fea9:fe2, 2600:3c04::f03c:91ff:fea9:f68, 2600:3c04::f03c:91ff:fea9:f4a" - }, - "site_type": "core" - }, - { - "id": "ap-southeast", - "label": "Sydney, AU", - "country": "au", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.105.166.5, 172.105.169.5, 172.105.168.5, 172.105.172.5, 172.105.162.5, 172.105.170.5, 172.105.167.5, 172.105.171.5, 172.105.181.5, 172.105.161.5", - "ipv6": "2400:8907::f03c:92ff:fe6e:ec8, 2400:8907::f03c:92ff:fe6e:98e4, 2400:8907::f03c:92ff:fe6e:1c58, 2400:8907::f03c:92ff:fe6e:c299, 2400:8907::f03c:92ff:fe6e:c210, 2400:8907::f03c:92ff:fe6e:c219, 2400:8907::f03c:92ff:fe6e:1c5c, 2400:8907::f03c:92ff:fe6e:c24e, 2400:8907::f03c:92ff:fe6e:e6b, 2400:8907::f03c:92ff:fe6e:e3d" - }, - "site_type": "core" - }, - { - "id": "us-iad", - "label": "Washington, DC", - "country": "us", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Managed Databases", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "139.144.192.62, 139.144.192.60, 139.144.192.61, 139.144.192.53, 139.144.192.54, 139.144.192.67, 139.144.192.69, 139.144.192.66, 139.144.192.52, 139.144.192.68", - "ipv6": "2600:3c05::f03c:93ff:feb6:43b6, 2600:3c05::f03c:93ff:feb6:4365, 2600:3c05::f03c:93ff:feb6:43c2, 2600:3c05::f03c:93ff:feb6:e441, 2600:3c05::f03c:93ff:feb6:94ef, 2600:3c05::f03c:93ff:feb6:94ba, 2600:3c05::f03c:93ff:feb6:94a8, 2600:3c05::f03c:93ff:feb6:9413, 2600:3c05::f03c:93ff:feb6:9443, 2600:3c05::f03c:93ff:feb6:94e0" - }, - "site_type": "core" - }, - { - "id": "us-ord", - "label": "Chicago, IL", - "country": "us", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Managed Databases", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.232.0.17, 172.232.0.16, 172.232.0.21, 172.232.0.13, 172.232.0.22, 172.232.0.9, 172.232.0.19, 172.232.0.20, 172.232.0.15, 172.232.0.18", - "ipv6": "2600:3c06::f03c:93ff:fed0:e5fc, 2600:3c06::f03c:93ff:fed0:e54b, 2600:3c06::f03c:93ff:fed0:e572, 2600:3c06::f03c:93ff:fed0:e530, 2600:3c06::f03c:93ff:fed0:e597, 2600:3c06::f03c:93ff:fed0:e511, 2600:3c06::f03c:93ff:fed0:e5f2, 2600:3c06::f03c:93ff:fed0:e5bf, 2600:3c06::f03c:93ff:fed0:e529, 2600:3c06::f03c:93ff:fed0:e5a3" - }, - "site_type": "core" - }, - { - "id": "fr-par", - "label": "Paris, FR", - "country": "fr", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Managed Databases", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.232.32.21, 172.232.32.23, 172.232.32.17, 172.232.32.18, 172.232.32.16, 172.232.32.22, 172.232.32.20, 172.232.32.14, 172.232.32.11, 172.232.32.12", - "ipv6": "2600:3c07::f03c:93ff:fef2:2e63, 2600:3c07::f03c:93ff:fef2:2ec7, 2600:3c07::f03c:93ff:fef2:0dee, 2600:3c07::f03c:93ff:fef2:0d25, 2600:3c07::f03c:93ff:fef2:0de0, 2600:3c07::f03c:93ff:fef2:2e29, 2600:3c07::f03c:93ff:fef2:0dda, 2600:3c07::f03c:93ff:fef2:0d82, 2600:3c07::f03c:93ff:fef2:b3ac, 2600:3c07::f03c:93ff:fef2:b3a8" - }, - "site_type": "core" - }, - { - "id": "us-sea", - "label": "Seattle, WA", - "country": "us", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.232.160.19, 172.232.160.21, 172.232.160.17, 172.232.160.15, 172.232.160.18, 172.232.160.8, 172.232.160.12, 172.232.160.11, 172.232.160.14, 172.232.160.16", - "ipv6": "2600:3c0a::f03c:93ff:fe54:c6da, 2600:3c0a::f03c:93ff:fe54:c691, 2600:3c0a::f03c:93ff:fe54:c68d, 2600:3c0a::f03c:93ff:fe54:c61e, 2600:3c0a::f03c:93ff:fe54:c653, 2600:3c0a::f03c:93ff:fe54:c64c, 2600:3c0a::f03c:93ff:fe54:c68a, 2600:3c0a::f03c:93ff:fe54:c697, 2600:3c0a::f03c:93ff:fe54:c60f, 2600:3c0a::f03c:93ff:fe54:c6a0" - }, - "site_type": "core" - }, - { - "id": "br-gru", - "label": "Sao Paulo, BR", - "country": "br", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.233.0.4, 172.233.0.9, 172.233.0.7, 172.233.0.12, 172.233.0.5, 172.233.0.13, 172.233.0.10, 172.233.0.6, 172.233.0.8, 172.233.0.11", - "ipv6": "2600:3c0d::f03c:93ff:fe3d:51cb, 2600:3c0d::f03c:93ff:fe3d:51a7, 2600:3c0d::f03c:93ff:fe3d:51a9, 2600:3c0d::f03c:93ff:fe3d:5119, 2600:3c0d::f03c:93ff:fe3d:51fe, 2600:3c0d::f03c:93ff:fe3d:517c, 2600:3c0d::f03c:93ff:fe3d:5144, 2600:3c0d::f03c:93ff:fe3d:5170, 2600:3c0d::f03c:93ff:fe3d:51cc, 2600:3c0d::f03c:93ff:fe3d:516c" - }, - "site_type": "core" - }, - { - "id": "nl-ams", - "label": "Amsterdam, NL", - "country": "nl", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.233.33.36, 172.233.33.38, 172.233.33.35, 172.233.33.39, 172.233.33.34, 172.233.33.33, 172.233.33.31, 172.233.33.30, 172.233.33.37, 172.233.33.32", - "ipv6": "2600:3c0e::f03c:93ff:fe9d:2d10, 2600:3c0e::f03c:93ff:fe9d:2d89, 2600:3c0e::f03c:93ff:fe9d:2d79, 2600:3c0e::f03c:93ff:fe9d:2d96, 2600:3c0e::f03c:93ff:fe9d:2da5, 2600:3c0e::f03c:93ff:fe9d:2d34, 2600:3c0e::f03c:93ff:fe9d:2d68, 2600:3c0e::f03c:93ff:fe9d:2d17, 2600:3c0e::f03c:93ff:fe9d:2d45, 2600:3c0e::f03c:93ff:fe9d:2d5c" - }, - "site_type": "core" - }, - { - "id": "se-sto", - "label": "Stockholm, SE", - "country": "se", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.232.128.24, 172.232.128.26, 172.232.128.20, 172.232.128.22, 172.232.128.25, 172.232.128.19, 172.232.128.23, 172.232.128.18, 172.232.128.21, 172.232.128.27", - "ipv6": "2600:3c09::f03c:93ff:fea9:4dbe, 2600:3c09::f03c:93ff:fea9:4d63, 2600:3c09::f03c:93ff:fea9:4dce, 2600:3c09::f03c:93ff:fea9:4dbb, 2600:3c09::f03c:93ff:fea9:4d99, 2600:3c09::f03c:93ff:fea9:4d26, 2600:3c09::f03c:93ff:fea9:4de0, 2600:3c09::f03c:93ff:fea9:4d69, 2600:3c09::f03c:93ff:fea9:4dbf, 2600:3c09::f03c:93ff:fea9:4da6" - }, - "site_type": "core" - }, - { - "id": "es-mad", - "label": "Madrid, ES", - "country": "es", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.233.111.6, 172.233.111.17, 172.233.111.21, 172.233.111.25, 172.233.111.19, 172.233.111.12, 172.233.111.26, 172.233.111.16, 172.233.111.18, 172.233.111.9", - "ipv6": "2a01:7e02::f03c:93ff:feea:b585, 2a01:7e02::f03c:93ff:feea:b5ab, 2a01:7e02::f03c:93ff:feea:b5c6, 2a01:7e02::f03c:93ff:feea:b592, 2a01:7e02::f03c:93ff:feea:b5aa, 2a01:7e02::f03c:93ff:feea:b5d3, 2a01:7e02::f03c:93ff:feea:b5d7, 2a01:7e02::f03c:93ff:feea:b528, 2a01:7e02::f03c:93ff:feea:b522, 2a01:7e02::f03c:93ff:feea:b51a" - }, - "site_type": "core" - }, - { - "id": "in-maa", - "label": "Chennai, IN", - "country": "in", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.232.96.17, 172.232.96.26, 172.232.96.19, 172.232.96.20, 172.232.96.25, 172.232.96.21, 172.232.96.18, 172.232.96.22, 172.232.96.23, 172.232.96.24", - "ipv6": "2600:3c08::f03c:93ff:fe7c:1135, 2600:3c08::f03c:93ff:fe7c:11f8, 2600:3c08::f03c:93ff:fe7c:11d2, 2600:3c08::f03c:93ff:fe7c:11a7, 2600:3c08::f03c:93ff:fe7c:11ad, 2600:3c08::f03c:93ff:fe7c:110a, 2600:3c08::f03c:93ff:fe7c:11f9, 2600:3c08::f03c:93ff:fe7c:1137, 2600:3c08::f03c:93ff:fe7c:11db, 2600:3c08::f03c:93ff:fe7c:1164" - }, - "site_type": "core" - }, - { - "id": "jp-osa", - "label": "Osaka, JP", - "country": "jp", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.233.64.44, 172.233.64.43, 172.233.64.37, 172.233.64.40, 172.233.64.46, 172.233.64.41, 172.233.64.39, 172.233.64.42, 172.233.64.45, 172.233.64.38", - "ipv6": "2400:8905::f03c:93ff:fe9d:b085, 2400:8905::f03c:93ff:fe9d:b012, 2400:8905::f03c:93ff:fe9d:b09b, 2400:8905::f03c:93ff:fe9d:b0d8, 2400:8905::f03c:93ff:fe9d:259f, 2400:8905::f03c:93ff:fe9d:b006, 2400:8905::f03c:93ff:fe9d:b084, 2400:8905::f03c:93ff:fe9d:b0ce, 2400:8905::f03c:93ff:fe9d:25ea, 2400:8905::f03c:93ff:fe9d:b086" - }, - "site_type": "core" - }, - { - "id": "it-mil", - "label": "Milan, IT", - "country": "it", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.232.192.19, 172.232.192.18, 172.232.192.16, 172.232.192.20, 172.232.192.24, 172.232.192.21, 172.232.192.22, 172.232.192.17, 172.232.192.15, 172.232.192.23", - "ipv6": "2600:3c0b::f03c:93ff:feba:d513, 2600:3c0b::f03c:93ff:feba:d5c3, 2600:3c0b::f03c:93ff:feba:d597, 2600:3c0b::f03c:93ff:feba:d5fb, 2600:3c0b::f03c:93ff:feba:d51f, 2600:3c0b::f03c:93ff:feba:d58e, 2600:3c0b::f03c:93ff:feba:d5d5, 2600:3c0b::f03c:93ff:feba:d534, 2600:3c0b::f03c:93ff:feba:d57c, 2600:3c0b::f03c:93ff:feba:d529" - }, - "site_type": "core" - }, - { - "id": "us-mia", - "label": "Miami, FL", - "country": "us", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.233.160.34, 172.233.160.27, 172.233.160.30, 172.233.160.29, 172.233.160.32, 172.233.160.28, 172.233.160.33, 172.233.160.26, 172.233.160.25, 172.233.160.31", - "ipv6": "2a01:7e04::f03c:93ff:fead:d31f, 2a01:7e04::f03c:93ff:fead:d37f, 2a01:7e04::f03c:93ff:fead:d30c, 2a01:7e04::f03c:93ff:fead:d318, 2a01:7e04::f03c:93ff:fead:d316, 2a01:7e04::f03c:93ff:fead:d339, 2a01:7e04::f03c:93ff:fead:d367, 2a01:7e04::f03c:93ff:fead:d395, 2a01:7e04::f03c:93ff:fead:d3d0, 2a01:7e04::f03c:93ff:fead:d38e" - }, - "site_type": "core" - }, - { - "id": "id-cgk", - "label": "Jakarta, ID", - "country": "id", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.232.224.23, 172.232.224.32, 172.232.224.26, 172.232.224.27, 172.232.224.21, 172.232.224.24, 172.232.224.22, 172.232.224.20, 172.232.224.31, 172.232.224.28", - "ipv6": "2600:3c0c::f03c:93ff:feed:a90b, 2600:3c0c::f03c:93ff:feed:a9a5, 2600:3c0c::f03c:93ff:feed:a935, 2600:3c0c::f03c:93ff:feed:a930, 2600:3c0c::f03c:93ff:feed:a95c, 2600:3c0c::f03c:93ff:feed:a9ad, 2600:3c0c::f03c:93ff:feed:a9f2, 2600:3c0c::f03c:93ff:feed:a9ff, 2600:3c0c::f03c:93ff:feed:a9c8, 2600:3c0c::f03c:93ff:feed:a96b" - }, - "site_type": "core" - }, - { - "id": "us-lax", - "label": "Los Angeles, CA", - "country": "us", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "VPCs", - "Metadata", - "Premium Plans" - ], - "status": "ok", - "resolvers": { - "ipv4": "172.233.128.45, 172.233.128.38, 172.233.128.53, 172.233.128.37, 172.233.128.34, 172.233.128.36, 172.233.128.33, 172.233.128.39, 172.233.128.43, 172.233.128.44", - "ipv6": "2a01:7e03::f03c:93ff:feb1:b789, 2a01:7e03::f03c:93ff:feb1:b717, 2a01:7e03::f03c:93ff:feb1:b707, 2a01:7e03::f03c:93ff:feb1:b7ab, 2a01:7e03::f03c:93ff:feb1:b7e2, 2a01:7e03::f03c:93ff:feb1:b709, 2a01:7e03::f03c:93ff:feb1:b7a6, 2a01:7e03::f03c:93ff:feb1:b750, 2a01:7e03::f03c:93ff:feb1:b76e, 2a01:7e03::f03c:93ff:feb1:b7a2" - }, - "site_type": "core" - }, - { - "id": "us-central", - "label": "Dallas, TX", - "country": "us", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "72.14.179.5, 72.14.188.5, 173.255.199.5, 66.228.53.5, 96.126.122.5, 96.126.124.5, 96.126.127.5, 198.58.107.5, 198.58.111.5, 23.239.24.5", - "ipv6": "2600:3c00::2, 2600:3c00::9, 2600:3c00::7, 2600:3c00::5, 2600:3c00::3, 2600:3c00::8, 2600:3c00::6, 2600:3c00::4, 2600:3c00::c, 2600:3c00::b" - }, - "site_type": "core" - }, - { - "id": "us-west", - "label": "Fremont, CA", - "country": "us", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5", - "ipv6": "2600:3c01::2, 2600:3c01::9, 2600:3c01::5, 2600:3c01::7, 2600:3c01::3, 2600:3c01::8, 2600:3c01::4, 2600:3c01::b, 2600:3c01::c, 2600:3c01::6" - }, - "site_type": "core" - }, - { - "id": "us-edgetest", - "label": "Gecko Edge Test", - "country": "us", - "capabilities": [ - "Linodes" - ], - "status": "ok", - "resolvers": { - "ipv4": "74.207.231.5, 173.230.128.5, 173.230.129.5, 173.230.136.5, 173.230.140.5, 66.228.59.5, 66.228.62.5, 50.116.35.5, 50.116.41.5, 23.239.18.5", - "ipv6": "2600:3c02::3, 2600:3c02::5, 2600:3c02::4, 2600:3c02::6, 2600:3c02::c, 2600:3c02::7, 2600:3c02::2, 2600:3c02::9, 2600:3c02::8, 2600:3c02::b" - }, - "site_type": "edge" - }, - { - "id": "us-southeast", - "label": "Atlanta, GA", - "country": "us", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "GPU Linodes", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "74.207.231.5, 173.230.128.5, 173.230.129.5, 173.230.136.5, 173.230.140.5, 66.228.59.5, 66.228.62.5, 50.116.35.5, 50.116.41.5, 23.239.18.5", - "ipv6": "2600:3c02::3, 2600:3c02::5, 2600:3c02::4, 2600:3c02::6, 2600:3c02::c, 2600:3c02::7, 2600:3c02::2, 2600:3c02::9, 2600:3c02::8, 2600:3c02::b" - }, - "site_type": "core" - }, - { - "id": "us-east", - "label": "Newark, NJ", - "country": "us", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "GPU Linodes", - "Kubernetes", - "Cloud Firewall", - "Bare Metal", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "66.228.42.5, 96.126.106.5, 50.116.53.5, 50.116.58.5, 50.116.61.5, 50.116.62.5, 66.175.211.5, 97.107.133.4, 207.192.69.4, 207.192.69.5", - "ipv6": "2600:3c03::7, 2600:3c03::4, 2600:3c03::9, 2600:3c03::6, 2600:3c03::3, 2600:3c03::c, 2600:3c03::5, 2600:3c03::b, 2600:3c03::2, 2600:3c03::8" - }, - "site_type": "core" - }, - { - "id": "eu-west", - "label": "London, UK", - "country": "gb", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20", - "ipv6": "2a01:7e00::9, 2a01:7e00::3, 2a01:7e00::c, 2a01:7e00::5, 2a01:7e00::6, 2a01:7e00::8, 2a01:7e00::b, 2a01:7e00::4, 2a01:7e00::7, 2a01:7e00::2" - }, - "site_type": "core" - }, - { - "id": "ap-south", - "label": "Singapore, SG", - "country": "sg", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "GPU Linodes", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "139.162.11.5, 139.162.13.5, 139.162.14.5, 139.162.15.5, 139.162.16.5, 139.162.21.5, 139.162.27.5, 103.3.60.18, 103.3.60.19, 103.3.60.20", - "ipv6": "2400:8901::5, 2400:8901::4, 2400:8901::b, 2400:8901::3, 2400:8901::9, 2400:8901::2, 2400:8901::8, 2400:8901::7, 2400:8901::c, 2400:8901::6" - }, - "site_type": "core" - }, - { - "id": "eu-central", - "label": "Frankfurt, DE", - "country": "de", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Object Storage", - "GPU Linodes", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "139.162.130.5, 139.162.131.5, 139.162.132.5, 139.162.133.5, 139.162.134.5, 139.162.135.5, 139.162.136.5, 139.162.137.5, 139.162.138.5, 139.162.139.5", - "ipv6": "2a01:7e01::5, 2a01:7e01::9, 2a01:7e01::7, 2a01:7e01::c, 2a01:7e01::2, 2a01:7e01::4, 2a01:7e01::3, 2a01:7e01::6, 2a01:7e01::b, 2a01:7e01::8" - }, - "site_type": "core" - }, - { - "id": "ap-northeast", - "label": "Tokyo, JP", - "country": "jp", - "capabilities": [ - "Linodes", - "NodeBalancers", - "Block Storage", - "Kubernetes", - "Cloud Firewall", - "Vlans", - "Block Storage Migrations", - "Managed Databases" - ], - "status": "ok", - "resolvers": { - "ipv4": "139.162.66.5, 139.162.67.5, 139.162.68.5, 139.162.69.5, 139.162.70.5, 139.162.71.5, 139.162.72.5, 139.162.73.5, 139.162.74.5, 139.162.75.5", - "ipv6": "2400:8902::3, 2400:8902::6, 2400:8902::c, 2400:8902::4, 2400:8902::2, 2400:8902::8, 2400:8902::7, 2400:8902::5, 2400:8902::b, 2400:8902::9" - }, - "site_type": "core" - } -],"page":1,"pages":1,"results":23} \ No newline at end of file +{"data":[{"id":"ap-west","label":"Mumbai, IN","country":"in","capabilities":["Linodes","NodeBalancers","Block Storage","GPU Linodes","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"172.105.34.5, 172.105.35.5, 172.105.36.5, 172.105.37.5, 172.105.38.5, 172.105.39.5, 172.105.40.5, 172.105.41.5, 172.105.42.5, 172.105.43.5","ipv6":"2400:8904::f03c:91ff:fea5:659, 2400:8904::f03c:91ff:fea5:9282, 2400:8904::f03c:91ff:fea5:b9b3, 2400:8904::f03c:91ff:fea5:925a, 2400:8904::f03c:91ff:fea5:22cb, 2400:8904::f03c:91ff:fea5:227a, 2400:8904::f03c:91ff:fea5:924c, 2400:8904::f03c:91ff:fea5:f7e2, 2400:8904::f03c:91ff:fea5:2205, 2400:8904::f03c:91ff:fea5:9207"}},{"id":"ca-central","label":"Toronto, CA","country":"ca","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"172.105.0.5, 172.105.3.5, 172.105.4.5, 172.105.5.5, 172.105.6.5, 172.105.7.5, 172.105.8.5, 172.105.9.5, 172.105.10.5, 172.105.11.5","ipv6":"2600:3c04::f03c:91ff:fea9:f63, 2600:3c04::f03c:91ff:fea9:f6d, 2600:3c04::f03c:91ff:fea9:f80, 2600:3c04::f03c:91ff:fea9:f0f, 2600:3c04::f03c:91ff:fea9:f99, 2600:3c04::f03c:91ff:fea9:fbd, 2600:3c04::f03c:91ff:fea9:fdd, 2600:3c04::f03c:91ff:fea9:fe2, 2600:3c04::f03c:91ff:fea9:f68, 2600:3c04::f03c:91ff:fea9:f4a"}},{"id":"ap-southeast","label":"Sydney, AU","country":"au","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"172.105.166.5, 172.105.169.5, 172.105.168.5, 172.105.172.5, 172.105.162.5, 172.105.170.5, 172.105.167.5, 172.105.171.5, 172.105.181.5, 172.105.161.5","ipv6":"2400:8907::f03c:92ff:fe6e:ec8, 2400:8907::f03c:92ff:fe6e:98e4, 2400:8907::f03c:92ff:fe6e:1c58, 2400:8907::f03c:92ff:fe6e:c299, 2400:8907::f03c:92ff:fe6e:c210, 2400:8907::f03c:92ff:fe6e:c219, 2400:8907::f03c:92ff:fe6e:1c5c, 2400:8907::f03c:92ff:fe6e:c24e, 2400:8907::f03c:92ff:fe6e:e6b, 2400:8907::f03c:92ff:fe6e:e3d"}},{"id":"us-iad","label":"Washington, DC","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Managed Databases","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"139.144.192.62, 139.144.192.60, 139.144.192.61, 139.144.192.53, 139.144.192.54, 139.144.192.67, 139.144.192.69, 139.144.192.66, 139.144.192.52, 139.144.192.68","ipv6":"2600:3c05::f03c:93ff:feb6:43b6, 2600:3c05::f03c:93ff:feb6:4365, 2600:3c05::f03c:93ff:feb6:43c2, 2600:3c05::f03c:93ff:feb6:e441, 2600:3c05::f03c:93ff:feb6:94ef, 2600:3c05::f03c:93ff:feb6:94ba, 2600:3c05::f03c:93ff:feb6:94a8, 2600:3c05::f03c:93ff:feb6:9413, 2600:3c05::f03c:93ff:feb6:9443, 2600:3c05::f03c:93ff:feb6:94e0"}},{"id":"us-ord","label":"Chicago, IL","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Managed Databases","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.0.17, 172.232.0.16, 172.232.0.21, 172.232.0.13, 172.232.0.22, 172.232.0.9, 172.232.0.19, 172.232.0.20, 172.232.0.15, 172.232.0.18","ipv6":"2600:3c06::f03c:93ff:fed0:e5fc, 2600:3c06::f03c:93ff:fed0:e54b, 2600:3c06::f03c:93ff:fed0:e572, 2600:3c06::f03c:93ff:fed0:e530, 2600:3c06::f03c:93ff:fed0:e597, 2600:3c06::f03c:93ff:fed0:e511, 2600:3c06::f03c:93ff:fed0:e5f2, 2600:3c06::f03c:93ff:fed0:e5bf, 2600:3c06::f03c:93ff:fed0:e529, 2600:3c06::f03c:93ff:fed0:e5a3"}},{"id":"fr-par","label":"Paris, FR","country":"fr","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Managed Databases","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.32.21, 172.232.32.23, 172.232.32.17, 172.232.32.18, 172.232.32.16, 172.232.32.22, 172.232.32.20, 172.232.32.14, 172.232.32.11, 172.232.32.12","ipv6":"2600:3c07::f03c:93ff:fef2:2e63, 2600:3c07::f03c:93ff:fef2:2ec7, 2600:3c07::f03c:93ff:fef2:0dee, 2600:3c07::f03c:93ff:fef2:0d25, 2600:3c07::f03c:93ff:fef2:0de0, 2600:3c07::f03c:93ff:fef2:2e29, 2600:3c07::f03c:93ff:fef2:0dda, 2600:3c07::f03c:93ff:fef2:0d82, 2600:3c07::f03c:93ff:fef2:b3ac, 2600:3c07::f03c:93ff:fef2:b3a8"}},{"id":"us-sea","label":"Seattle, WA","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.160.19, 172.232.160.21, 172.232.160.17, 172.232.160.15, 172.232.160.18, 172.232.160.8, 172.232.160.12, 172.232.160.11, 172.232.160.14, 172.232.160.16","ipv6":"2600:3c0a::f03c:93ff:fe54:c6da, 2600:3c0a::f03c:93ff:fe54:c691, 2600:3c0a::f03c:93ff:fe54:c68d, 2600:3c0a::f03c:93ff:fe54:c61e, 2600:3c0a::f03c:93ff:fe54:c653, 2600:3c0a::f03c:93ff:fe54:c64c, 2600:3c0a::f03c:93ff:fe54:c68a, 2600:3c0a::f03c:93ff:fe54:c697, 2600:3c0a::f03c:93ff:fe54:c60f, 2600:3c0a::f03c:93ff:fe54:c6a0"}},{"id":"br-gru","label":"Sao Paulo, BR","country":"br","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.0.4, 172.233.0.9, 172.233.0.7, 172.233.0.12, 172.233.0.5, 172.233.0.13, 172.233.0.10, 172.233.0.6, 172.233.0.8, 172.233.0.11","ipv6":"2600:3c0d::f03c:93ff:fe3d:51cb, 2600:3c0d::f03c:93ff:fe3d:51a7, 2600:3c0d::f03c:93ff:fe3d:51a9, 2600:3c0d::f03c:93ff:fe3d:5119, 2600:3c0d::f03c:93ff:fe3d:51fe, 2600:3c0d::f03c:93ff:fe3d:517c, 2600:3c0d::f03c:93ff:fe3d:5144, 2600:3c0d::f03c:93ff:fe3d:5170, 2600:3c0d::f03c:93ff:fe3d:51cc, 2600:3c0d::f03c:93ff:fe3d:516c"}},{"id":"nl-ams","label":"Amsterdam, NL","country":"nl","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.33.36, 172.233.33.38, 172.233.33.35, 172.233.33.39, 172.233.33.34, 172.233.33.33, 172.233.33.31, 172.233.33.30, 172.233.33.37, 172.233.33.32","ipv6":"2600:3c0e::f03c:93ff:fe9d:2d10, 2600:3c0e::f03c:93ff:fe9d:2d89, 2600:3c0e::f03c:93ff:fe9d:2d79, 2600:3c0e::f03c:93ff:fe9d:2d96, 2600:3c0e::f03c:93ff:fe9d:2da5, 2600:3c0e::f03c:93ff:fe9d:2d34, 2600:3c0e::f03c:93ff:fe9d:2d68, 2600:3c0e::f03c:93ff:fe9d:2d17, 2600:3c0e::f03c:93ff:fe9d:2d45, 2600:3c0e::f03c:93ff:fe9d:2d5c"}},{"id":"se-sto","label":"Stockholm, SE","country":"se","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.128.24, 172.232.128.26, 172.232.128.20, 172.232.128.22, 172.232.128.25, 172.232.128.19, 172.232.128.23, 172.232.128.18, 172.232.128.21, 172.232.128.27","ipv6":"2600:3c09::f03c:93ff:fea9:4dbe, 2600:3c09::f03c:93ff:fea9:4d63, 2600:3c09::f03c:93ff:fea9:4dce, 2600:3c09::f03c:93ff:fea9:4dbb, 2600:3c09::f03c:93ff:fea9:4d99, 2600:3c09::f03c:93ff:fea9:4d26, 2600:3c09::f03c:93ff:fea9:4de0, 2600:3c09::f03c:93ff:fea9:4d69, 2600:3c09::f03c:93ff:fea9:4dbf, 2600:3c09::f03c:93ff:fea9:4da6"}},{"id":"in-maa","label":"Chennai, IN","country":"in","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.96.17, 172.232.96.26, 172.232.96.19, 172.232.96.20, 172.232.96.25, 172.232.96.21, 172.232.96.18, 172.232.96.22, 172.232.96.23, 172.232.96.24","ipv6":"2600:3c08::f03c:93ff:fe7c:1135, 2600:3c08::f03c:93ff:fe7c:11f8, 2600:3c08::f03c:93ff:fe7c:11d2, 2600:3c08::f03c:93ff:fe7c:11a7, 2600:3c08::f03c:93ff:fe7c:11ad, 2600:3c08::f03c:93ff:fe7c:110a, 2600:3c08::f03c:93ff:fe7c:11f9, 2600:3c08::f03c:93ff:fe7c:1137, 2600:3c08::f03c:93ff:fe7c:11db, 2600:3c08::f03c:93ff:fe7c:1164"}},{"id":"jp-osa","label":"Osaka, JP","country":"jp","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.64.44, 172.233.64.43, 172.233.64.37, 172.233.64.40, 172.233.64.46, 172.233.64.41, 172.233.64.39, 172.233.64.42, 172.233.64.45, 172.233.64.38","ipv6":"2400:8905::f03c:93ff:fe9d:b085, 2400:8905::f03c:93ff:fe9d:b012, 2400:8905::f03c:93ff:fe9d:b09b, 2400:8905::f03c:93ff:fe9d:b0d8, 2400:8905::f03c:93ff:fe9d:259f, 2400:8905::f03c:93ff:fe9d:b006, 2400:8905::f03c:93ff:fe9d:b084, 2400:8905::f03c:93ff:fe9d:b0ce, 2400:8905::f03c:93ff:fe9d:25ea, 2400:8905::f03c:93ff:fe9d:b086"}},{"id":"it-mil","label":"Milan, IT","country":"it","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.192.19, 172.232.192.18, 172.232.192.16, 172.232.192.20, 172.232.192.24, 172.232.192.21, 172.232.192.22, 172.232.192.17, 172.232.192.15, 172.232.192.23","ipv6":"2600:3c0b::f03c:93ff:feba:d513, 2600:3c0b::f03c:93ff:feba:d5c3, 2600:3c0b::f03c:93ff:feba:d597, 2600:3c0b::f03c:93ff:feba:d5fb, 2600:3c0b::f03c:93ff:feba:d51f, 2600:3c0b::f03c:93ff:feba:d58e, 2600:3c0b::f03c:93ff:feba:d5d5, 2600:3c0b::f03c:93ff:feba:d534, 2600:3c0b::f03c:93ff:feba:d57c, 2600:3c0b::f03c:93ff:feba:d529"}},{"id":"us-mia","label":"Miami, FL","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.160.34, 172.233.160.27, 172.233.160.30, 172.233.160.29, 172.233.160.32, 172.233.160.28, 172.233.160.33, 172.233.160.26, 172.233.160.25, 172.233.160.31","ipv6":"2a01:7e04::f03c:93ff:fead:d31f, 2a01:7e04::f03c:93ff:fead:d37f, 2a01:7e04::f03c:93ff:fead:d30c, 2a01:7e04::f03c:93ff:fead:d318, 2a01:7e04::f03c:93ff:fead:d316, 2a01:7e04::f03c:93ff:fead:d339, 2a01:7e04::f03c:93ff:fead:d367, 2a01:7e04::f03c:93ff:fead:d395, 2a01:7e04::f03c:93ff:fead:d3d0, 2a01:7e04::f03c:93ff:fead:d38e"}},{"id":"id-cgk","label":"Jakarta, ID","country":"id","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.232.224.23, 172.232.224.32, 172.232.224.26, 172.232.224.27, 172.232.224.21, 172.232.224.24, 172.232.224.22, 172.232.224.20, 172.232.224.31, 172.232.224.28","ipv6":"2600:3c0c::f03c:93ff:feed:a90b, 2600:3c0c::f03c:93ff:feed:a9a5, 2600:3c0c::f03c:93ff:feed:a935, 2600:3c0c::f03c:93ff:feed:a930, 2600:3c0c::f03c:93ff:feed:a95c, 2600:3c0c::f03c:93ff:feed:a9ad, 2600:3c0c::f03c:93ff:feed:a9f2, 2600:3c0c::f03c:93ff:feed:a9ff, 2600:3c0c::f03c:93ff:feed:a9c8, 2600:3c0c::f03c:93ff:feed:a96b"}},{"id":"us-lax","label":"Los Angeles, CA","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","Kubernetes","Cloud Firewall","Vlans","Metadata","Premium Plans"],"status":"ok","resolvers":{"ipv4":"172.233.128.45, 172.233.128.38, 172.233.128.53, 172.233.128.37, 172.233.128.34, 172.233.128.36, 172.233.128.33, 172.233.128.39, 172.233.128.43, 172.233.128.44","ipv6":"2a01:7e03::f03c:93ff:feb1:b789, 2a01:7e03::f03c:93ff:feb1:b717, 2a01:7e03::f03c:93ff:feb1:b707, 2a01:7e03::f03c:93ff:feb1:b7ab, 2a01:7e03::f03c:93ff:feb1:b7e2, 2a01:7e03::f03c:93ff:feb1:b709, 2a01:7e03::f03c:93ff:feb1:b7a6, 2a01:7e03::f03c:93ff:feb1:b750, 2a01:7e03::f03c:93ff:feb1:b76e, 2a01:7e03::f03c:93ff:feb1:b7a2"}},{"id":"us-central","label":"Dallas, TX","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"72.14.179.5, 72.14.188.5, 173.255.199.5, 66.228.53.5, 96.126.122.5, 96.126.124.5, 96.126.127.5, 198.58.107.5, 198.58.111.5, 23.239.24.5","ipv6":"2600:3c00::2, 2600:3c00::9, 2600:3c00::7, 2600:3c00::5, 2600:3c00::3, 2600:3c00::8, 2600:3c00::6, 2600:3c00::4, 2600:3c00::c, 2600:3c00::b"}},{"id":"us-west","label":"Fremont, CA","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"173.230.145.5, 173.230.147.5, 173.230.155.5, 173.255.212.5, 173.255.219.5, 173.255.241.5, 173.255.243.5, 173.255.244.5, 74.207.241.5, 74.207.242.5","ipv6":"2600:3c01::2, 2600:3c01::9, 2600:3c01::5, 2600:3c01::7, 2600:3c01::3, 2600:3c01::8, 2600:3c01::4, 2600:3c01::b, 2600:3c01::c, 2600:3c01::6"}},{"id":"us-southeast","label":"Atlanta, GA","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","GPU Linodes","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"74.207.231.5, 173.230.128.5, 173.230.129.5, 173.230.136.5, 173.230.140.5, 66.228.59.5, 66.228.62.5, 50.116.35.5, 50.116.41.5, 23.239.18.5","ipv6":"2600:3c02::3, 2600:3c02::5, 2600:3c02::4, 2600:3c02::6, 2600:3c02::c, 2600:3c02::7, 2600:3c02::2, 2600:3c02::9, 2600:3c02::8, 2600:3c02::b"}},{"id":"us-east","label":"Newark, NJ","country":"us","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","GPU Linodes","Kubernetes","Cloud Firewall","Bare Metal","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"66.228.42.5, 96.126.106.5, 50.116.53.5, 50.116.58.5, 50.116.61.5, 50.116.62.5, 66.175.211.5, 97.107.133.4, 207.192.69.4, 207.192.69.5","ipv6":"2600:3c03::7, 2600:3c03::4, 2600:3c03::9, 2600:3c03::6, 2600:3c03::3, 2600:3c03::c, 2600:3c03::5, 2600:3c03::b, 2600:3c03::2, 2600:3c03::8"}},{"id":"eu-west","label":"London, UK","country":"gb","capabilities":["Linodes","NodeBalancers","Block Storage","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"178.79.182.5, 176.58.107.5, 176.58.116.5, 176.58.121.5, 151.236.220.5, 212.71.252.5, 212.71.253.5, 109.74.192.20, 109.74.193.20, 109.74.194.20","ipv6":"2a01:7e00::9, 2a01:7e00::3, 2a01:7e00::c, 2a01:7e00::5, 2a01:7e00::6, 2a01:7e00::8, 2a01:7e00::b, 2a01:7e00::4, 2a01:7e00::7, 2a01:7e00::2"}},{"id":"ap-south","label":"Singapore, SG","country":"sg","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","GPU Linodes","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"139.162.11.5, 139.162.13.5, 139.162.14.5, 139.162.15.5, 139.162.16.5, 139.162.21.5, 139.162.27.5, 103.3.60.18, 103.3.60.19, 103.3.60.20","ipv6":"2400:8901::5, 2400:8901::4, 2400:8901::b, 2400:8901::3, 2400:8901::9, 2400:8901::2, 2400:8901::8, 2400:8901::7, 2400:8901::c, 2400:8901::6"}},{"id":"eu-central","label":"Frankfurt, DE","country":"de","capabilities":["Linodes","NodeBalancers","Block Storage","Object Storage","GPU Linodes","Kubernetes","Cloud Firewall","Vlans","Block Storage Migrations","Managed Databases"],"status":"ok","resolvers":{"ipv4":"139.162.130.5, 139.162.131.5, 139.162.132.5, 139.162.133.5, 139.162.134.5, 139.162.135.5, 139.162.136.5, 139.162.137.5, 139.162.138.5, 139.162.139.5","ipv6":"2a01:7e01::5, 2a01:7e01::9, 2a01:7e01::7, 2a01:7e01::c, 2a01:7e01::2, 2a01:7e01::4, 2a01:7e01::3, 2a01:7e01::6, 2a01:7e01::b, 2a01:7e01::8"}}],"page":1,"pages":1,"results":23} \ No newline at end of file diff --git a/packages/manager/src/mocks/serverHandlers.ts b/packages/manager/src/mocks/serverHandlers.ts index 643a03c73a8..46d2d4e319d 100644 --- a/packages/manager/src/mocks/serverHandlers.ts +++ b/packages/manager/src/mocks/serverHandlers.ts @@ -10,7 +10,7 @@ import { import { DateTime } from 'luxon'; import { rest } from 'msw'; -import cachedRegions from 'src/cachedData/regions.json'; +import { regions } from 'src/__data__/regionsData'; import { VLANFactory, abuseTicketNotificationFactory, @@ -589,7 +589,7 @@ export const handlers = [ return res(ctx.json(req.body as SecurityQuestionsPayload)); }), rest.get('*/regions', async (req, res, ctx) => { - return res(ctx.json(cachedRegions)); + return res(ctx.json({ data: regions })); }), rest.get('*/images', async (req, res, ctx) => { const privateImages = imageFactory.buildList(5, { From d5cae9b9b88480eb97a8576cba133027f0ef5e3a Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Tue, 20 Feb 2024 14:06:58 -0500 Subject: [PATCH 15/22] hide edge regions from cloning --- .../manager/src/components/RegionSelect/RegionSelect.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index d2967b504a4..6db426cc30a 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -82,8 +82,12 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { } }, [selectedId]); - // Hide edge sites from Marketplace and Images - const unsupportedEdgeEntities = ['Images', 'One-Click'].includes(createType); + // Hide edge sites from Marketplace, Cloning, and Images + const unsupportedEdgeEntities = [ + 'Clone Linode', + 'Images', + 'One-Click', + ].includes(createType); const geckoEnabled = Boolean(flags.gecko && !unsupportedEdgeEntities); const showGeckoHelperText = From 9a2476621bcf12fe08ffc12582e2702b8df1d07a Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Tue, 20 Feb 2024 14:09:31 -0500 Subject: [PATCH 16/22] Added changeset: Update Region Select for edge sites --- .../.changeset/pr-10194-upcoming-features-1708456171781.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/manager/.changeset/pr-10194-upcoming-features-1708456171781.md diff --git a/packages/manager/.changeset/pr-10194-upcoming-features-1708456171781.md b/packages/manager/.changeset/pr-10194-upcoming-features-1708456171781.md new file mode 100644 index 00000000000..7e255b7427c --- /dev/null +++ b/packages/manager/.changeset/pr-10194-upcoming-features-1708456171781.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Upcoming Features +--- + +Update Region Select for edge sites ([#10194](https://github.com/linode/manager/pull/10194)) From 943b272c9831759c46fcee4e2d84fefd5d9d9495 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Tue, 20 Feb 2024 14:26:17 -0500 Subject: [PATCH 17/22] fix unit test --- .../src/components/RegionSelect/RegionSelect.utils.test.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx index f9d459a5593..4952db4a03b 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx @@ -126,6 +126,7 @@ describe('getSelectedRegionById', () => { region: 'North America', }, label: 'US Location (us-1)', + site_type: 'core', unavailable: false, value: 'us-1', }; @@ -191,6 +192,7 @@ describe('getSelectedRegionsByIds', () => { region: 'North America', }, label: 'US Location (us-1)', + site_type: 'core', unavailable: false, value: 'us-1', }, @@ -200,6 +202,7 @@ describe('getSelectedRegionsByIds', () => { region: 'North America', }, label: 'CA Location (ca-1)', + site_type: 'core', unavailable: false, value: 'ca-1', }, @@ -225,6 +228,7 @@ describe('getSelectedRegionsByIds', () => { region: 'North America', }, label: 'US Location (us-1)', + site_type: 'core', unavailable: false, value: 'us-1', }, From f9c3bd805243ae96a1f87009e1de056b9a253c4e Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Wed, 21 Feb 2024 12:10:55 -0500 Subject: [PATCH 18/22] adddress feedback --- .../RegionSelect/RegionSelect.styles.ts | 3 ++ .../RegionSelect/RegionSelect.test.tsx | 18 ++++++++ .../components/RegionSelect/RegionSelect.tsx | 33 +++----------- .../RegionSelect/RegionSelect.types.ts | 2 + .../RegionSelect/RegionSelect.utils.test.tsx | 44 +++++++++++++++++++ .../SelectRegionPanel.test.tsx | 2 + .../SelectRegionPanel/SelectRegionPanel.tsx | 22 ++++++++++ 7 files changed, 98 insertions(+), 26 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts b/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts index a4e575033cf..d4a72010e19 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.styles.ts @@ -56,6 +56,9 @@ export const StyledEdgeBox = styled(Box, { label: 'StyledEdgeBox' })( marginLeft: 8, padding: '8px 0', [theme.breakpoints.down('md')]: { + '& svg': { + marginLeft: 0, + }, alignSelf: 'start', marginLeft: 0, }, diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.test.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.test.tsx index 33f6cd426f0..dc1ed580610 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.test.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.test.tsx @@ -64,4 +64,22 @@ describe('RegionSelect', () => { ); expect(getByTestId('textfield-input')).toBeDisabled(); }); + + it('should render a Select component with edge region text', () => { + const newProps = { + ...props, + showGeckoHelperText: true, + }; + const { getByTestId } = renderWithTheme(); + expect(getByTestId('region-select-edge-text')).toBeInTheDocument(); + }); + + it('should render a Select component with no edge region text', () => { + const newProps = { + ...props, + showGeckoHelperText: false, + }; + const { queryByTestId } = renderWithTheme(); + expect(queryByTestId('region-select-edge-text')).not.toBeInTheDocument(); + }); }); diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index 6db426cc30a..08bd6bea494 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -1,15 +1,12 @@ import { Typography } from '@mui/material'; import * as React from 'react'; -import { useLocation } from 'react-router-dom'; import EdgeServer from 'src/assets/icons/entityIcons/edge-server.svg'; import { Autocomplete } from 'src/components/Autocomplete/Autocomplete'; import { Flag } from 'src/components/Flag'; import { Link } from 'src/components/Link'; import { TooltipIcon } from 'src/components/TooltipIcon'; -import { useFlags } from 'src/hooks/useFlags'; import { useAccountAvailabilitiesQueryUnpaginated } from 'src/queries/accountAvailability'; -import { getQueryParamFromQueryString } from 'src/utilities/queryParams'; import { RegionOption } from './RegionOption'; import { @@ -37,6 +34,7 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { currentCapability, disabled, errorText, + geckoEnabled, handleSelection, helperText, isClearable, @@ -44,13 +42,10 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { regions, required, selectedId, + showGeckoHelperText, width, } = props; - const flags = useFlags(); - const location = useLocation(); - const createType = getQueryParamFromQueryString(location.search, 'type'); - const { data: accountAvailability, isLoading: accountAvailabilityLoading, @@ -82,23 +77,6 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { } }, [selectedId]); - // Hide edge sites from Marketplace, Cloning, and Images - const unsupportedEdgeEntities = [ - 'Clone Linode', - 'Images', - 'One-Click', - ].includes(createType); - const geckoEnabled = Boolean(flags.gecko && !unsupportedEdgeEntities); - - const showGeckoHelperText = - geckoEnabled && - currentCapability && - regions.find( - (region) => - region.site_type === 'edge' && - region.capabilities.includes(currentCapability) - ); - const options = React.useMemo( () => getRegionOptions({ @@ -182,9 +160,12 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { {showGeckoHelperText && ( // @TODO Gecko MVP: Add docs link - + {' '} - Indicates an Edge server region. Learn more + Indicates an Edge server region. Learn more. )} diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.types.ts b/packages/manager/src/components/RegionSelect/RegionSelect.types.ts index 7c698a62d40..1f7bb034916 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.types.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.types.ts @@ -33,6 +33,7 @@ export interface RegionSelectProps * See `ImageUpload.tsx` for an example of a RegionSelect with an undefined `currentCapability` - there is no capability associated with Images yet. */ currentCapability: Capabilities | undefined; + geckoEnabled?: boolean; handleSelection: (id: string) => void; helperText?: string; isClearable?: boolean; @@ -40,6 +41,7 @@ export interface RegionSelectProps regions: Region[]; required?: boolean; selectedId: null | string; + showGeckoHelperText?: boolean; width?: number; } diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx index 4952db4a03b..5b424acc1c7 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.utils.test.tsx @@ -38,6 +38,17 @@ const regions: Region[] = [ }), ]; +const regionsWithEdge = [ + ...regions, + regionFactory.build({ + capabilities: ['Linodes'], + country: 'us', + id: 'us-edge-1', + label: 'Gecko Edge Test', + site_type: 'edge', + }), +]; + const expectedRegions: RegionSelectOption[] = [ { data: { @@ -106,6 +117,39 @@ describe('getRegionOptions', () => { expect(result).toEqual(expectedRegions); }); + + it('should filter out edge regions if hideEdgeServers is true', () => { + const result: RegionSelectOption[] = getRegionOptions({ + accountAvailabilityData, + currentCapability: 'Linodes', + hideEdgeServers: true, + regions: regionsWithEdge, + }); + + expect(result).toEqual(expectedRegions); + }); + + it('should not filter out edge regions if hideEdgeServers is false', () => { + const expectedRegionsWithEdge = [ + { + data: { country: 'us', region: 'North America' }, + label: 'Gecko Edge Test (us-edge-1)', + site_type: 'edge', + unavailable: false, + value: 'us-edge-1', + }, + ...expectedRegions, + ]; + + const result: RegionSelectOption[] = getRegionOptions({ + accountAvailabilityData, + currentCapability: 'Linodes', + hideEdgeServers: false, + regions: regionsWithEdge, + }); + + expect(result).toEqual(expectedRegionsWithEdge); + }); }); describe('getSelectedRegionById', () => { diff --git a/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.test.tsx b/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.test.tsx index 2a21db6cd10..ab77c8c36be 100644 --- a/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.test.tsx +++ b/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.test.tsx @@ -11,6 +11,7 @@ const pricingMocks = vi.hoisted(() => ({ })); const queryParamMocks = vi.hoisted(() => ({ + getQueryParamFromQueryString: vi.fn().mockReturnValue({}), getQueryParamsFromQueryString: vi.fn().mockReturnValue({}), })); @@ -20,6 +21,7 @@ vi.mock('src/utilities/pricing/linodes', () => ({ })); vi.mock('src/utilities/queryParams', () => ({ + getQueryParamFromQueryString: queryParamMocks.getQueryParamFromQueryString, getQueryParamsFromQueryString: queryParamMocks.getQueryParamsFromQueryString, })); diff --git a/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.tsx b/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.tsx index 4db3bdde0ce..96d5e05a4d4 100644 --- a/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.tsx +++ b/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.tsx @@ -9,6 +9,7 @@ import { RegionSelect } from 'src/components/RegionSelect/RegionSelect'; import { RegionHelperText } from 'src/components/SelectRegionPanel/RegionHelperText'; import { Typography } from 'src/components/Typography'; import { CROSS_DATA_CENTER_CLONE_WARNING } from 'src/features/Linodes/LinodesCreate/constants'; +import { useFlags } from 'src/hooks/useFlags'; import { useTypeQuery } from 'src/queries/types'; import { sendLinodeCreateDocsEvent } from 'src/utilities/analytics'; import { @@ -48,6 +49,7 @@ export const SelectRegionPanel = (props: SelectRegionPanelProps) => { selectedLinodeTypeId, } = props; + const flags = useFlags(); const location = useLocation(); const theme = useTheme(); const params = getQueryParamsFromQueryString(location.search); @@ -72,6 +74,24 @@ export const SelectRegionPanel = (props: SelectRegionPanelProps) => { type, }); + // Hide edge sites from Marketplace, Cloning, and Images + const unsupportedEdgeEntities = [ + 'Clone Linode', + 'Images', + 'One-Click', + ].includes(params.type); + const geckoEnabled = Boolean(flags.gecko && !unsupportedEdgeEntities); + + const showGeckoHelperText = Boolean( + geckoEnabled && + currentCapability && + regions.find( + (region) => + region.site_type === 'edge' && + region.capabilities.includes(currentCapability) + ) + ); + if (props.regions.length === 0) { return null; } @@ -116,10 +136,12 @@ export const SelectRegionPanel = (props: SelectRegionPanelProps) => { currentCapability={currentCapability} disabled={disabled} errorText={error} + geckoEnabled={geckoEnabled} handleSelection={handleSelection} helperText={helperText} regions={regions} selectedId={selectedId || null} + showGeckoHelperText={showGeckoHelperText} /> {showClonePriceWarning && ( Date: Thu, 22 Feb 2024 13:50:04 -0500 Subject: [PATCH 19/22] update regionselect documentation --- .../manager/src/components/RegionSelect/RegionSelect.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index 08bd6bea494..2baf9925aeb 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -26,8 +26,10 @@ import type { * A specific select for regions. * * The RegionSelect automatically filters regions based on capability using its `currentCapability` prop. For example, if - * `currentCapability="VPCs"`, only regions that support VPCs will appear in the RegionSelect dropdown. There is no need to - * prefilter regions when passing them to the RegionSelect. See the description of `currentCapability` prop for more information. + * `currentCapability="VPCs"`, only regions that support VPCs will appear in the RegionSelect dropdown. Edge regions are filtered based on the `hideEdgeServers` prop. + * There is no need to pre-filter regions when passing them to the RegionSelect. See the description of `currentCapability` prop for more information. + * + * We do not display the selected check mark for single selects. */ export const RegionSelect = React.memo((props: RegionSelectProps) => { const { From 87355edc3ef40d2857eb1dd3fbc62a469123ab81 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Thu, 22 Feb 2024 15:30:18 -0500 Subject: [PATCH 20/22] improve accessibility, thanks @joe --- .../manager/src/components/RegionSelect/RegionOption.tsx | 5 +++++ .../manager/src/components/RegionSelect/RegionSelect.tsx | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/manager/src/components/RegionSelect/RegionOption.tsx b/packages/manager/src/components/RegionSelect/RegionOption.tsx index ab1baa23c6c..7186b1cc6c3 100644 --- a/packages/manager/src/components/RegionSelect/RegionOption.tsx +++ b/packages/manager/src/components/RegionSelect/RegionOption.tsx @@ -87,6 +87,11 @@ export const RegionOption = ({ {option.label} + {displayEdgeServerIcon && ( + +  (This region is an Edge site.) + + )} {isDisabledMenuItem && ( Disabled option - There may be limited capacity in this region. diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.tsx b/packages/manager/src/components/RegionSelect/RegionSelect.tsx index 2baf9925aeb..c1ea6e51432 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionSelect.tsx @@ -167,7 +167,11 @@ export const RegionSelect = React.memo((props: RegionSelectProps) => { sx={{ alignSelf: 'center', textWrap: 'nowrap' }} > {' '} - Indicates an Edge server region. Learn more. + Indicates an Edge server region.{' '} + + Learn more + + . )} From 8c8548794a050f73430d476b37015eba31468177 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Thu, 22 Feb 2024 16:37:18 -0500 Subject: [PATCH 21/22] fix styling --- .../src/components/RegionSelect/RegionMultiSelect.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/manager/src/components/RegionSelect/RegionMultiSelect.tsx b/packages/manager/src/components/RegionSelect/RegionMultiSelect.tsx index 4b37ee42435..aa235200cb3 100644 --- a/packages/manager/src/components/RegionSelect/RegionMultiSelect.tsx +++ b/packages/manager/src/components/RegionSelect/RegionMultiSelect.tsx @@ -117,6 +117,11 @@ export const RegionMultiSelect = React.memo((props: RegionMultiSelectProps) => { /> ); }} + sx={(theme) => ({ + [theme.breakpoints.up('md')]: { + width: '416px', + }, + })} textFieldProps={{ InputProps: { required, From dba825031f6660d21f03c7ced2441baae25d3cc0 Mon Sep 17 00:00:00 2001 From: Hana Xu Date: Fri, 23 Feb 2024 11:23:06 -0500 Subject: [PATCH 22/22] add isGeckoEnabled util --- .../RegionSelect/RegionSelect.types.ts | 2 ++ .../RegionSelect/RegionSelect.utils.ts | 21 +++++++++++++++++++ .../SelectRegionPanel/SelectRegionPanel.tsx | 13 ++++-------- .../Linodes/LinodesCreate/LinodeCreate.tsx | 5 +++-- .../features/Linodes/LinodesCreate/types.ts | 8 +++++++ 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.types.ts b/packages/manager/src/components/RegionSelect/RegionSelect.types.ts index 1f7bb034916..1d6b6b16073 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.types.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.types.ts @@ -91,3 +91,5 @@ export interface GetSelectedRegionsByIdsArgs { regions: Region[]; selectedRegionIds: string[]; } + +export type SupportedEdgeTypes = 'Distributions' | 'StackScripts'; diff --git a/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts b/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts index 6b750f452af..597b7b1276d 100644 --- a/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts +++ b/packages/manager/src/components/RegionSelect/RegionSelect.utils.ts @@ -1,5 +1,6 @@ import { CONTINENT_CODE_TO_CONTINENT } from '@linode/api-v4'; +import { useFlags } from 'src/hooks/useFlags'; import { getRegionCountryGroup, getSelectedRegion, @@ -11,8 +12,10 @@ import type { GetSelectedRegionById, GetSelectedRegionsByIdsArgs, RegionSelectOption, + SupportedEdgeTypes, } from './RegionSelect.types'; import type { AccountAvailability, Region } from '@linode/api-v4'; +import type { LinodeCreateType } from 'src/features/Linodes/LinodesCreate/types'; const NORTH_AMERICA = CONTINENT_CODE_TO_CONTINENT.NA; @@ -184,3 +187,21 @@ export const getSelectedRegionsByIds = ({ ) .filter((region): region is RegionSelectOption => !!region); }; + +/** + * Util to determine whether a create type has support for edge regions. + * + * @returns a boolean indicating whether or not to enable gecko. + */ +export const useIsGeckoEnabled = (createType: LinodeCreateType) => { + const flags = useFlags(); + + const supportedEdgeTypes: SupportedEdgeTypes[] = [ + 'Distributions', + 'StackScripts', + ]; + return Boolean( + flags.gecko && + !supportedEdgeTypes.includes(createType as SupportedEdgeTypes) + ); +}; diff --git a/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.tsx b/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.tsx index 96d5e05a4d4..0d3db1b4740 100644 --- a/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.tsx +++ b/packages/manager/src/components/SelectRegionPanel/SelectRegionPanel.tsx @@ -6,10 +6,10 @@ import { useLocation } from 'react-router-dom'; import { Notice } from 'src/components/Notice/Notice'; import { Paper } from 'src/components/Paper'; import { RegionSelect } from 'src/components/RegionSelect/RegionSelect'; +import { useIsGeckoEnabled } from 'src/components/RegionSelect/RegionSelect.utils'; import { RegionHelperText } from 'src/components/SelectRegionPanel/RegionHelperText'; import { Typography } from 'src/components/Typography'; import { CROSS_DATA_CENTER_CLONE_WARNING } from 'src/features/Linodes/LinodesCreate/constants'; -import { useFlags } from 'src/hooks/useFlags'; import { useTypeQuery } from 'src/queries/types'; import { sendLinodeCreateDocsEvent } from 'src/utilities/analytics'; import { @@ -23,6 +23,8 @@ import { Box } from '../Box'; import { DocsLink } from '../DocsLink/DocsLink'; import { Link } from '../Link'; +import type { LinodeCreateType } from 'src/features/Linodes/LinodesCreate/types'; + interface SelectRegionPanelProps { currentCapability: Capabilities; disabled?: boolean; @@ -49,7 +51,6 @@ export const SelectRegionPanel = (props: SelectRegionPanelProps) => { selectedLinodeTypeId, } = props; - const flags = useFlags(); const location = useLocation(); const theme = useTheme(); const params = getQueryParamsFromQueryString(location.search); @@ -74,13 +75,7 @@ export const SelectRegionPanel = (props: SelectRegionPanelProps) => { type, }); - // Hide edge sites from Marketplace, Cloning, and Images - const unsupportedEdgeEntities = [ - 'Clone Linode', - 'Images', - 'One-Click', - ].includes(params.type); - const geckoEnabled = Boolean(flags.gecko && !unsupportedEdgeEntities); + const geckoEnabled = useIsGeckoEnabled(params.type as LinodeCreateType); const showGeckoHelperText = Boolean( geckoEnabled && diff --git a/packages/manager/src/features/Linodes/LinodesCreate/LinodeCreate.tsx b/packages/manager/src/features/Linodes/LinodesCreate/LinodeCreate.tsx index 63f2f259c6c..8559fe6cb9c 100644 --- a/packages/manager/src/features/Linodes/LinodesCreate/LinodeCreate.tsx +++ b/packages/manager/src/features/Linodes/LinodesCreate/LinodeCreate.tsx @@ -39,11 +39,11 @@ import { RegionsProps } from 'src/containers/regions.container'; import { WithTypesProps } from 'src/containers/types.container'; import { WithLinodesProps } from 'src/containers/withLinodes.container'; import { EUAgreementCheckbox } from 'src/features/Account/Agreements/EUAgreementCheckbox'; -import { regionSupportsMetadata } from 'src/features/Linodes/LinodesCreate/utilities'; import { getMonthlyAndHourlyNodePricing, utoa, } from 'src/features/Linodes/LinodesCreate/utilities'; +import { regionSupportsMetadata } from 'src/features/Linodes/LinodesCreate/utilities'; import { SMTPRestrictionText } from 'src/features/Linodes/SMTPRestrictionText'; import { hasPlacementGroupReachedCapacity } from 'src/features/PlacementGroups/utils'; import { @@ -102,6 +102,7 @@ import { } from './types'; import type { Tab } from 'src/components/Tabs/TabLinkList'; +import type { LinodeCreateType } from 'src/features/Linodes/LinodesCreate/types'; export interface LinodeCreateProps { additionalIPv4RangesForVPC: ExtendedIP[]; @@ -205,7 +206,7 @@ export class LinodeCreate extends React.PureComponent< /** Get the query params as an object, excluding the "?" */ const queryParams = getQueryParamsFromQueryString(location.search); - const _tabs = [ + const _tabs: LinodeCreateType[] = [ 'Distributions', 'One-Click', 'StackScripts', diff --git a/packages/manager/src/features/Linodes/LinodesCreate/types.ts b/packages/manager/src/features/Linodes/LinodesCreate/types.ts index c7efd6d39bb..0907d08a61c 100644 --- a/packages/manager/src/features/Linodes/LinodesCreate/types.ts +++ b/packages/manager/src/features/Linodes/LinodesCreate/types.ts @@ -167,3 +167,11 @@ export type AllFormStateAndHandlers = BaseFormStateAndHandlers & CloneFormStateHandlers & StackScriptFormStateHandlers & BackupFormStateHandlers; + +export type LinodeCreateType = + | 'Backups' + | 'Clone Linode' + | 'Distributions' + | 'Images' + | 'One-Click' + | 'StackScripts';