2021-12-07 13:18:08 -05:00

424 lines
22 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.KubernetesObjectApi = void 0;
const request = require("request");
const api_1 = require("./api");
/**
* Valid Content-Type header values for patch operations. See
* https://kubernetes.io/docs/tasks/run-application/update-api-object-kubectl-patch/
* for details.
*/
var KubernetesPatchStrategies;
(function (KubernetesPatchStrategies) {
/** Diff-like JSON format. */
KubernetesPatchStrategies["JsonPatch"] = "application/json-patch+json";
/** Simple merge. */
KubernetesPatchStrategies["MergePatch"] = "application/merge-patch+json";
/** Merge with different strategies depending on field metadata. */
KubernetesPatchStrategies["StrategicMergePatch"] = "application/strategic-merge-patch+json";
})(KubernetesPatchStrategies || (KubernetesPatchStrategies = {}));
/**
* Dynamically construct Kubernetes API request URIs so client does not have to know what type of object it is acting
* on.
*/
class KubernetesObjectApi extends api_1.ApisApi {
constructor() {
super(...arguments);
/** Initialize the default namespace. May be overwritten by context. */
this.defaultNamespace = 'default';
/** Cache resource API response. */
this.apiVersionResourceCache = {};
}
/**
* Create a KubernetesObjectApi object from the provided KubeConfig. This method should be used rather than
* [[KubeConfig.makeApiClient]] so we can properly determine the default namespace if one is provided by the current
* context.
*
* @param kc Valid Kubernetes config
* @return Properly instantiated [[KubernetesObjectApi]] object
*/
static makeApiClient(kc) {
const client = kc.makeApiClient(KubernetesObjectApi);
client.setDefaultNamespace(kc);
return client;
}
/**
* Create any Kubernetes resource.
* @param spec Kubernetes resource spec.
* @param pretty If \'true\', then the output is pretty printed.
* @param dryRun When present, indicates that modifications should not be persisted. An invalid or unrecognized
* dryRun directive will result in an error response and no further processing of the request. Valid values
* are: - All: all dry run stages will be processed
* @param fieldManager fieldManager is a name associated with the actor or entity that is making these changes. The
* value must be less than or 128 characters long, and only contain printable characters, as defined by
* https://golang.org/pkg/unicode/#IsPrint.
* @param options Optional headers to use in the request.
* @return Promise containing the request response and [[KubernetesObject]].
*/
async create(spec, pretty, dryRun, fieldManager, options = { headers: {} }) {
// verify required parameter 'spec' is not null or undefined
if (spec === null || spec === undefined) {
throw new Error('Required parameter spec was null or undefined when calling create.');
}
const localVarPath = await this.specUriPath(spec, 'create');
const localVarQueryParameters = {};
const localVarHeaderParams = this.generateHeaders(options.headers);
if (pretty !== undefined) {
localVarQueryParameters.pretty = api_1.ObjectSerializer.serialize(pretty, 'string');
}
if (dryRun !== undefined) {
localVarQueryParameters.dryRun = api_1.ObjectSerializer.serialize(dryRun, 'string');
}
if (fieldManager !== undefined) {
localVarQueryParameters.fieldManager = api_1.ObjectSerializer.serialize(fieldManager, 'string');
}
const localVarRequestOptions = {
method: 'POST',
qs: localVarQueryParameters,
headers: localVarHeaderParams,
uri: localVarPath,
useQuerystring: this._useQuerystring,
json: true,
body: api_1.ObjectSerializer.serialize(spec, 'KubernetesObject'),
};
return this.requestPromise(localVarRequestOptions);
}
/**
* Delete any Kubernetes resource.
* @param spec Kubernetes resource spec
* @param pretty If \'true\', then the output is pretty printed.
* @param dryRun When present, indicates that modifications should not be persisted. An invalid or unrecognized
* dryRun directive will result in an error response and no further processing of the request. Valid values
* are: - All: all dry run stages will be processed
* @param gracePeriodSeconds The duration in seconds before the object should be deleted. Value must be non-negative
* integer. The value zero indicates delete immediately. If this value is nil, the default grace period for
* the specified type will be used. Defaults to a per object value if not specified. zero means delete
* immediately.
* @param orphanDependents Deprecated: please use the PropagationPolicy, this field will be deprecated in
* 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be
* added to/removed from the object\'s finalizers list. Either this field or PropagationPolicy may be
* set, but not both.
* @param propagationPolicy Whether and how garbage collection will be performed. Either this field or
* OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in
* the metadata.finalizers and the resource-specific default policy. Acceptable values are:
* \'Orphan\' - orphan the dependents; \'Background\' - allow the garbage collector to delete
* the dependents in the background; \'Foreground\' - a cascading policy that deletes all dependents
* in the foreground.
* @param body See [[V1DeleteOptions]].
* @param options Optional headers to use in the request.
* @return Promise containing the request response and a Kubernetes [[V1Status]].
*/
async delete(spec, pretty, dryRun, gracePeriodSeconds, orphanDependents, propagationPolicy, body, options = { headers: {} }) {
// verify required parameter 'spec' is not null or undefined
if (spec === null || spec === undefined) {
throw new Error('Required parameter spec was null or undefined when calling delete.');
}
const localVarPath = await this.specUriPath(spec, 'delete');
const localVarQueryParameters = {};
const localVarHeaderParams = this.generateHeaders(options.headers);
if (pretty !== undefined) {
localVarQueryParameters.pretty = api_1.ObjectSerializer.serialize(pretty, 'string');
}
if (dryRun !== undefined) {
localVarQueryParameters.dryRun = api_1.ObjectSerializer.serialize(dryRun, 'string');
}
if (gracePeriodSeconds !== undefined) {
localVarQueryParameters.gracePeriodSeconds = api_1.ObjectSerializer.serialize(gracePeriodSeconds, 'number');
}
if (orphanDependents !== undefined) {
localVarQueryParameters.orphanDependents = api_1.ObjectSerializer.serialize(orphanDependents, 'boolean');
}
if (propagationPolicy !== undefined) {
localVarQueryParameters.propagationPolicy = api_1.ObjectSerializer.serialize(propagationPolicy, 'string');
}
const localVarRequestOptions = {
method: 'DELETE',
qs: localVarQueryParameters,
headers: localVarHeaderParams,
uri: localVarPath,
useQuerystring: this._useQuerystring,
json: true,
body: api_1.ObjectSerializer.serialize(body, 'V1DeleteOptions'),
};
return this.requestPromise(localVarRequestOptions, 'V1Status');
}
/**
* Patch any Kubernetes resource.
* @param spec Kubernetes resource spec
* @param pretty If \'true\', then the output is pretty printed.
* @param dryRun When present, indicates that modifications should not be persisted. An invalid or unrecognized
* dryRun directive will result in an error response and no further processing of the request. Valid values
* are: - All: all dry run stages will be processed
* @param fieldManager fieldManager is a name associated with the actor or entity that is making these changes. The
* value must be less than or 128 characters long, and only contain printable characters, as defined by
* https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests
* (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch,
* StrategicMergePatch).
* @param force Force is going to \"force\" Apply requests. It means user will re-acquire conflicting
* fields owned by other people. Force flag must be unset for non-apply patch requests.
* @param options Optional headers to use in the request.
* @return Promise containing the request response and [[KubernetesObject]].
*/
async patch(spec, pretty, dryRun, fieldManager, force, options = { headers: {} }) {
// verify required parameter 'spec' is not null or undefined
if (spec === null || spec === undefined) {
throw new Error('Required parameter spec was null or undefined when calling patch.');
}
const localVarPath = await this.specUriPath(spec, 'patch');
const localVarQueryParameters = {};
const localVarHeaderParams = this.generateHeaders(options.headers, 'PATCH');
if (pretty !== undefined) {
localVarQueryParameters.pretty = api_1.ObjectSerializer.serialize(pretty, 'string');
}
if (dryRun !== undefined) {
localVarQueryParameters.dryRun = api_1.ObjectSerializer.serialize(dryRun, 'string');
}
if (fieldManager !== undefined) {
localVarQueryParameters.fieldManager = api_1.ObjectSerializer.serialize(fieldManager, 'string');
}
if (force !== undefined) {
localVarQueryParameters.force = api_1.ObjectSerializer.serialize(force, 'boolean');
}
const localVarRequestOptions = {
method: 'PATCH',
qs: localVarQueryParameters,
headers: localVarHeaderParams,
uri: localVarPath,
useQuerystring: this._useQuerystring,
json: true,
body: api_1.ObjectSerializer.serialize(spec, 'object'),
};
return this.requestPromise(localVarRequestOptions);
}
/**
* Read any Kubernetes resource.
* @param spec Kubernetes resource spec
* @param pretty If \'true\', then the output is pretty printed.
* @param exact Should the export be exact. Exact export maintains cluster-specific fields like
* \'Namespace\'. Deprecated. Planned for removal in 1.18.
* @param exportt Should this value be exported. Export strips fields that a user can not
* specify. Deprecated. Planned for removal in 1.18.
* @param options Optional headers to use in the request.
* @return Promise containing the request response and [[KubernetesObject]].
*/
async read(spec, pretty, exact, exportt, options = { headers: {} }) {
// verify required parameter 'spec' is not null or undefined
if (spec === null || spec === undefined) {
throw new Error('Required parameter spec was null or undefined when calling read.');
}
const localVarPath = await this.specUriPath(spec, 'read');
const localVarQueryParameters = {};
const localVarHeaderParams = this.generateHeaders(options.headers);
if (pretty !== undefined) {
localVarQueryParameters.pretty = api_1.ObjectSerializer.serialize(pretty, 'string');
}
if (exact !== undefined) {
localVarQueryParameters.exact = api_1.ObjectSerializer.serialize(exact, 'boolean');
}
if (exportt !== undefined) {
localVarQueryParameters.export = api_1.ObjectSerializer.serialize(exportt, 'boolean');
}
const localVarRequestOptions = {
method: 'GET',
qs: localVarQueryParameters,
headers: localVarHeaderParams,
uri: localVarPath,
useQuerystring: this._useQuerystring,
json: true,
};
return this.requestPromise(localVarRequestOptions);
}
/**
* Replace any Kubernetes resource.
* @param spec Kubernetes resource spec
* @param pretty If \'true\', then the output is pretty printed.
* @param dryRun When present, indicates that modifications should not be persisted. An invalid or unrecognized
* dryRun directive will result in an error response and no further processing of the request. Valid values
* are: - All: all dry run stages will be processed
* @param fieldManager fieldManager is a name associated with the actor or entity that is making these changes. The
* value must be less than or 128 characters long, and only contain printable characters, as defined by
* https://golang.org/pkg/unicode/#IsPrint.
* @param options Optional headers to use in the request.
* @return Promise containing the request response and [[KubernetesObject]].
*/
async replace(spec, pretty, dryRun, fieldManager, options = { headers: {} }) {
// verify required parameter 'spec' is not null or undefined
if (spec === null || spec === undefined) {
throw new Error('Required parameter spec was null or undefined when calling replace.');
}
const localVarPath = await this.specUriPath(spec, 'replace');
const localVarQueryParameters = {};
const localVarHeaderParams = this.generateHeaders(options.headers);
if (pretty !== undefined) {
localVarQueryParameters.pretty = api_1.ObjectSerializer.serialize(pretty, 'string');
}
if (dryRun !== undefined) {
localVarQueryParameters.dryRun = api_1.ObjectSerializer.serialize(dryRun, 'string');
}
if (fieldManager !== undefined) {
localVarQueryParameters.fieldManager = api_1.ObjectSerializer.serialize(fieldManager, 'string');
}
const localVarRequestOptions = {
method: 'PUT',
qs: localVarQueryParameters,
headers: localVarHeaderParams,
uri: localVarPath,
useQuerystring: this._useQuerystring,
json: true,
body: api_1.ObjectSerializer.serialize(spec, 'KubernetesObject'),
};
return this.requestPromise(localVarRequestOptions);
}
/** Set default namespace from current context, if available. */
setDefaultNamespace(kc) {
if (kc.currentContext) {
const currentContext = kc.getContextObject(kc.currentContext);
if (currentContext && currentContext.namespace) {
this.defaultNamespace = currentContext.namespace;
}
}
return this.defaultNamespace;
}
/**
* Use spec information to construct resource URI path. If any required information in not provided, an Error is
* thrown. If an `apiVersion` is not provided, 'v1' is used. If a `metadata.namespace` is not provided for a
* request that requires one, the context default is used, if available, if not, 'default' is used.
*
* @param spec Kubernetes resource spec which must define kind and apiVersion properties.
* @param action API action, see [[K8sApiAction]].
* @return tail of resource-specific URI
*/
async specUriPath(spec, action) {
if (!spec.kind) {
throw new Error('Required spec property kind is not set');
}
if (!spec.apiVersion) {
spec.apiVersion = 'v1';
}
if (!spec.metadata) {
spec.metadata = {};
}
const resource = await this.resource(spec.apiVersion, spec.kind);
if (!resource) {
throw new Error(`Unrecognized API version and kind: ${spec.apiVersion} ${spec.kind}`);
}
if (resource.namespaced && !spec.metadata.namespace) {
spec.metadata.namespace = this.defaultNamespace;
}
const parts = [this.apiVersionPath(spec.apiVersion)];
if (resource.namespaced && spec.metadata.namespace) {
parts.push('namespaces', encodeURIComponent(String(spec.metadata.namespace)));
}
parts.push(resource.name);
if (action !== 'create') {
if (!spec.metadata.name) {
throw new Error('Required spec property name is not set');
}
parts.push(encodeURIComponent(String(spec.metadata.name)));
}
return parts.join('/').toLowerCase();
}
/** Return root of API path up to API version. */
apiVersionPath(apiVersion) {
const api = apiVersion.includes('/') ? 'apis' : 'api';
return [this.basePath, api, apiVersion].join('/');
}
/**
* Merge default headers and provided headers, setting the 'Accept' header to 'application/json' and, if the
* `action` is 'PATCH', the 'Content-Type' header to [[KubernetesPatchStrategies.StrategicMergePatch]]. Both of
* these defaults can be overriden by values provided in `optionsHeaders`.
*
* @param optionHeaders Headers from method's options argument.
* @param action HTTP action headers are being generated for.
* @return Headers to use in request.
*/
generateHeaders(optionsHeaders, action = 'GET') {
const headers = Object.assign({}, this._defaultHeaders);
headers.accept = 'application/json';
if (action === 'PATCH') {
headers['content-type'] = KubernetesPatchStrategies.StrategicMergePatch;
}
Object.assign(headers, optionsHeaders);
return headers;
}
/**
* Get metadata from Kubernetes API for resources described by `kind` and `apiVersion`. If it is unable to find the
* resource `kind` under the provided `apiVersion`, `undefined` is returned.
*
* This method caches responses from the Kubernetes API to use for future requests. If the cache for apiVersion
* exists but the kind is not found the request is attempted again.
*
* @param apiVersion Kubernetes API version, e.g., 'v1' or 'apps/v1'.
* @param kind Kubernetes resource kind, e.g., 'Pod' or 'Namespace'.
* @return Promise of the resource metadata or `undefined` if the resource is not found.
*/
async resource(apiVersion, kind) {
// verify required parameter 'apiVersion' is not null or undefined
if (apiVersion === null || apiVersion === undefined) {
throw new Error('Required parameter apiVersion was null or undefined when calling resource');
}
// verify required parameter 'kind' is not null or undefined
if (kind === null || kind === undefined) {
throw new Error('Required parameter kind was null or undefined when calling resource');
}
if (this.apiVersionResourceCache[apiVersion]) {
const resource = this.apiVersionResourceCache[apiVersion].resources.find((r) => r.kind === kind);
if (resource) {
return resource;
}
}
const localVarPath = this.apiVersionPath(apiVersion);
const localVarQueryParameters = {};
const localVarHeaderParams = this.generateHeaders({});
const localVarRequestOptions = {
method: 'GET',
qs: localVarQueryParameters,
headers: localVarHeaderParams,
uri: localVarPath,
useQuerystring: this._useQuerystring,
json: true,
};
try {
const getApiResponse = await this.requestPromise(localVarRequestOptions, 'V1APIResourceList');
this.apiVersionResourceCache[apiVersion] = getApiResponse.body;
return this.apiVersionResourceCache[apiVersion].resources.find((r) => r.kind === kind);
}
catch (e) {
e.message = `Failed to fetch resource metadata for ${apiVersion}/${kind}: ${e.message}`;
throw e;
}
}
/**
* Standard Kubernetes request wrapped in a Promise.
*/
async requestPromise(requestOptions, tipe = 'KubernetesObject') {
let authenticationPromise = Promise.resolve();
if (this.authentications.BearerToken.apiKey) {
authenticationPromise = authenticationPromise.then(() => this.authentications.BearerToken.applyToRequest(requestOptions));
}
authenticationPromise = authenticationPromise.then(() => this.authentications.default.applyToRequest(requestOptions));
let interceptorPromise = authenticationPromise;
for (const interceptor of this.interceptors) {
interceptorPromise = interceptorPromise.then(() => interceptor(requestOptions));
}
await interceptorPromise;
return new Promise((resolve, reject) => {
request(requestOptions, (error, response, body) => {
if (error) {
reject(error);
}
else {
body = api_1.ObjectSerializer.deserialize(body, tipe);
if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) {
resolve({ response, body });
}
else {
reject(new api_1.HttpError(response, body, response.statusCode));
}
}
});
});
}
}
exports.KubernetesObjectApi = KubernetesObjectApi;
//# sourceMappingURL=object.js.map