diff --git a/package-lock.json b/package-lock.json index 9b96f908..5f543121 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9403,6 +9403,7 @@ "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", diff --git a/src/otomi-stack.ts b/src/otomi-stack.ts index 60a41588..873c6bec 100644 --- a/src/otomi-stack.ts +++ b/src/otomi-stack.ts @@ -1,7 +1,7 @@ import { CoreV1Api, KubeConfig, User as k8sUser, V1ObjectReference } from '@kubernetes/client-node' import Debug from 'debug' -import { getRegions, ObjectStorageKeyRegions } from '@linode/api-v4' +import { getRegions, ObjectStorageKeyRegions, Region, ResourcePage } from '@linode/api-v4' import { existsSync, rmSync } from 'fs' import { pathExists, unlink } from 'fs-extra' import { readdir, readFile, writeFile } from 'fs/promises' @@ -105,6 +105,7 @@ import { HIDDEN_APPS, KNOWLEDGE_BASE_KIND, OBJ_STORAGE_APPS, + OBJECT_STORAGE_UI_EXCLUSIONS, PREINSTALLED_EXCLUDED_APPS, TOOLS_HOST, VERSIONS, @@ -169,6 +170,7 @@ const env = cleanEnv({ HIDDEN_APPS, OBJ_STORAGE_APPS, KNOWLEDGE_BASE_KIND, + OBJECT_STORAGE_UI_EXCLUSIONS, }) export const rootPath = '/tmp/otomi/values' @@ -2980,17 +2982,7 @@ export default class OtomiStack { const valuesSchema = await getValuesSchema() const currentSha = rootStack.git.commitSha const { obj } = this.getSettings(['obj']) - let regions - try { - regions = await getRegions() - } catch (error) { - debug('Error fetching object storage regions:', error.message) - } - const objStorageRegions = - regions?.data - ?.filter((region) => region.capabilities.includes('Object Storage')) - ?.map(({ id, label }) => ({ id, label })) - ?.sort((a, b) => a.label.localeCompare(b.label)) || [] + const objStorageRegions = await this.getObjStorageRegions() const data: Session = { ca: env.CUSTOM_ROOT_CA, core: this.getCore() as Record, @@ -3010,4 +3002,28 @@ export default class OtomiStack { } return data } + + private async getObjStorageRegions() { + const allRegions: Region[] = [] + try { + let page = 1 + let totalPages: number + do { + const response: ResourcePage = await getRegions({ page, page_size: 500 }) + allRegions.push(...response.data) + totalPages = response.pages + page++ + } while (page <= totalPages) + } catch (error) { + debug('Error fetching object storage regions:', error.message) + } + const objStorageRegions = allRegions + .filter( + (region) => + region.capabilities?.includes('Object Storage') && !env.OBJECT_STORAGE_UI_EXCLUSIONS.includes(region.id), + ) + .sort((a, b) => a.label.localeCompare(b.label)) + .map(({ id, label }) => ({ id, label })) + return objStorageRegions + } } diff --git a/src/validators.ts b/src/validators.ts index cc1b85e1..7d24c4d9 100644 --- a/src/validators.ts +++ b/src/validators.ts @@ -181,6 +181,10 @@ export const TRUST_PROXY = num({ default: 2, devDefault: 0, }) +export const OBJECT_STORAGE_UI_EXCLUSIONS = json({ + desc: 'Object Storage regions hidden in the UI', + default: ['fr-par-2', 'in-bom-2'], +}) const { env } = process export function cleanEnv(validators: { [K in keyof T]: ValidatorSpec }, options: CleanOptions = {}) { if (env.NODE_ENV === 'test') {