UNPKG

@stolostron/multicluster-sdk

Version:

Provides extensions and APIs that dynamic plugins can use to leverage multicluster capabilities provided by Red Hat Advanced Cluster Management.

126 lines 5.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fleetWatch = exports.buildResourceURL = exports.getResourcePath = void 0; exports.getClusterFromOptions = getClusterFromOptions; exports.getNamespaceFromOptions = getNamespaceFromOptions; exports.getNameFromOptions = getNameFromOptions; exports.getOptionsWithoutCluster = getOptionsWithoutCluster; exports.getResourceURLFromOptions = getResourceURLFromOptions; const constants_1 = require("../internal/constants"); const getFleetK8sAPIPath_1 = require("../api/getFleetK8sAPIPath"); const requirements_1 = require("./requirements"); const isFleetK8sAPIOptionsWithData = (options) => { const data = options.data; return typeof data === 'object' && !Array.isArray(data); }; const isFleetK8sAPIOptionsWithResource = (options) => { const resource = options.resource; return typeof resource === 'object' && !Array.isArray(resource); }; const getK8sAPIPath = ({ apiGroup = 'core', apiVersion }) => { const isLegacy = apiGroup === 'core' && apiVersion === 'v1'; let p = isLegacy ? '/api/' : '/apis/'; if (!isLegacy && apiGroup) { p += `${apiGroup}/`; } p += apiVersion; return p; }; const excludeEmptyQueryParams = (queryParams) => Object.fromEntries(Object.entries(queryParams || {}).filter(([, value]) => value !== undefined && value !== null && value !== '')); const getResourcePath = (options) => { let url = getK8sAPIPath(options.model); if (options.ns) { url += `/namespaces/${options.ns}`; } url += `/${options.model.plural}`; if (options.name) { // Some resources like Users can have special characters in the name. url += `/${encodeURIComponent(options.name)}`; } if (options.path) { url += `/${options.path}`; } const queryParams = excludeEmptyQueryParams(options.queryParams || {}); if (Object.keys(queryParams).length > 0) { const queryString = new URLSearchParams(queryParams).toString(); url += `?${queryString}`; } return url; }; exports.getResourcePath = getResourcePath; const buildResourceURL = (params) => { const { model, ns, name, cluster, queryParams, basePath = constants_1.BASE_K8S_API_PATH } = params; const resourcePath = (0, exports.getResourcePath)({ model, ns, name, queryParams, cluster }); return `${basePath}${resourcePath}`; }; exports.buildResourceURL = buildResourceURL; function getClusterFromOptions(options) { return (options.cluster ?? ((isFleetK8sAPIOptionsWithData(options) && options.data.cluster) || (isFleetK8sAPIOptionsWithResource(options) && options.resource.cluster) || undefined)); } function getNamespaceFromOptions(options) { return (options.ns ?? ((isFleetK8sAPIOptionsWithData(options) && options.data.metadata?.namespace) || (isFleetK8sAPIOptionsWithResource(options) && options.resource.metadata?.namespace) || options.queryParams?.ns || undefined)); } function getNameFromOptions(options) { return (options.name ?? ((isFleetK8sAPIOptionsWithData(options) && options.data.metadata?.name) || (isFleetK8sAPIOptionsWithResource(options) && options.resource.metadata?.name) || undefined)); } function getOptionsWithoutCluster(options) { const { cluster: _optionsCluster, ...optionsWithoutCluster } = options; if (isFleetK8sAPIOptionsWithData(options)) { const { cluster: _dataCluster, ...dataWithoutCluster } = options.data; return { ...optionsWithoutCluster, data: dataWithoutCluster }; } else if (isFleetK8sAPIOptionsWithResource(options)) { const { cluster: _resourceCluster, ...resourceWithoutCluster } = options.resource; return { ...optionsWithoutCluster, resource: resourceWithoutCluster }; } return optionsWithoutCluster; } async function getResourceURLFromOptions(options, collection = false) { const basePath = await (0, getFleetK8sAPIPath_1.getFleetK8sAPIPath)(getClusterFromOptions(options)); return (0, exports.buildResourceURL)({ basePath, ...options, cluster: getClusterFromOptions(options), ns: getNamespaceFromOptions(options), name: collection ? undefined : getNameFromOptions(options), }); } const fleetWatch = (model, query = {}, backendURL) => { const queryParams = { watch: 'true' }; const { labelSelector } = query; if (labelSelector) { const encodedSelector = (0, requirements_1.selectorToString)(labelSelector); if (encodedSelector) { queryParams.labelSelector = encodedSelector; } } if (query.fieldSelector) { queryParams.fieldSelector = query.fieldSelector; } if (query.resourceVersion) { queryParams.resourceVersion = query.resourceVersion; } if (query.allowWatchBookmarks) { queryParams.allowWatchBookmarks = 'true'; } const requestPath = (0, exports.buildResourceURL)({ model, cluster: query.cluster, queryParams, ns: query.ns, basePath: backendURL, }); return new WebSocket(requestPath); }; exports.fleetWatch = fleetWatch; //# sourceMappingURL=apiRequests.js.map