diff --git a/backend/routes/api/components/componentUtils.js b/backend/routes/api/components/componentUtils.js index 1b3a644894..874b662ee4 100644 --- a/backend/routes/api/components/componentUtils.js +++ b/backend/routes/api/components/componentUtils.js @@ -3,6 +3,7 @@ const fs = require('fs'); const path = require('path'); const jsYaml = require('js-yaml'); const constants = require('../../../utils/constants'); +const features = require('../../../utils/features'); const getServices = async (fastify) => { const coreV1Api = fastify.kube.coreV1Api; @@ -152,11 +153,14 @@ const getEnabledConfigMaps = (fastify, appDefs) => { const getApplicationDefs = () => { const normalizedPath = path.join(__dirname, '../../../../data/applications'); const applicationDefs = []; + const featureFlags = features.getComponentFeatureFlags(); fs.readdirSync(normalizedPath).forEach((file) => { if (constants.yamlRegExp.test(file)) { try { const doc = jsYaml.load(fs.readFileSync(path.join(normalizedPath, file), 'utf8')); - applicationDefs.push(doc); + if (!doc.spec.featureFlag || featureFlags[doc.spec.featureFlag]) { + applicationDefs.push(doc); + } } catch (e) { console.error(`Error loading application definition ${file}: ${e}`); } diff --git a/backend/routes/api/docs/docUtils.js b/backend/routes/api/docs/docUtils.js index 68e6927a72..575faa89f4 100644 --- a/backend/routes/api/docs/docUtils.js +++ b/backend/routes/api/docs/docUtils.js @@ -2,15 +2,28 @@ const fs = require('fs'); const path = require('path'); const jsYaml = require('js-yaml'); const constants = require('../../../utils/constants'); +const features = require('../../../utils/features'); +const componentUtils = require('../components/componentUtils'); const getDocs = () => { const normalizedPath = path.join(__dirname, '../../../../data/docs'); const docs = []; + const featureFlags = features.getComponentFeatureFlags(); + const appDefs = componentUtils.getApplicationDefs(); + fs.readdirSync(normalizedPath).forEach((file) => { if (constants.yamlRegExp.test(file)) { try { const doc = jsYaml.load(fs.readFileSync(path.join(normalizedPath, file), 'utf8')); - docs.push(doc); + if (doc.spec.featureFlag) { + if (featureFlags[doc.spec.featureFlag]) { + docs.push(doc); + } + return; + } + if (!doc.spec.appName || appDefs.find((def) => def.metadata.name === doc.spec.appName)) { + docs.push(doc); + } } catch (e) { console.error(`Error loading doc ${file}: ${e}`); } diff --git a/backend/routes/api/quickstarts/quickStartUtils.js b/backend/routes/api/quickstarts/quickStartUtils.js index b9a7e760be..7ffb3b3461 100644 --- a/backend/routes/api/quickstarts/quickStartUtils.js +++ b/backend/routes/api/quickstarts/quickStartUtils.js @@ -2,6 +2,7 @@ const fs = require('fs'); const path = require('path'); const jsYaml = require('js-yaml'); const constants = require('../../../utils/constants'); +const features = require('../../../utils/features'); // TODO: Retrieve from the correct group for dashboard quick starts const quickStartsGroup = 'odh.openshift.io'; @@ -24,13 +25,17 @@ const getInstalledQuickStarts = async (fastify) => { // fastify.log.error(e, 'failed to get quickstarts'); // } + const featureFlags = features.getComponentFeatureFlags(); + // TODO: Remove local quick starts when we get the correct quick starts from OpenShift const normalizedPath = path.join(__dirname, '../../../../data/quickstarts'); fs.readdirSync(normalizedPath).forEach((file) => { if (constants.yamlRegExp.test(file)) { try { const doc = jsYaml.load(fs.readFileSync(path.join(normalizedPath, file), 'utf8')); - installedQuickStarts.push(doc); + if (!doc.spec.featureFlag || featureFlags[doc.spec.featureFlag]) { + installedQuickStarts.push(doc); + } } catch (e) { console.error(`Error loading quick start ${file}: ${e}`); } diff --git a/backend/utils/features.js b/backend/utils/features.js new file mode 100644 index 0000000000..d3407545a8 --- /dev/null +++ b/backend/utils/features.js @@ -0,0 +1,13 @@ +const fs = require('fs'); +const path = require('path'); + +const getComponentFeatureFlags = () => { + const normalizedPath = path.join(__dirname, '../../data/features.json'); + try { + return JSON.parse(fs.readFileSync(normalizedPath, 'utf8')); + } catch { + return {}; + } +}; + +module.exports = { getComponentFeatureFlags }; diff --git a/data/features.json b/data/features.json new file mode 100644 index 0000000000..c79ceede08 --- /dev/null +++ b/data/features.json @@ -0,0 +1,3 @@ +{ + "example-feature-app-name": true +}