UNPKG

@atomist/sdm

Version:

Atomist Software Delivery Machine SDK

152 lines (144 loc) 6.25 kB
/* * Copyright © 2020 Atomist, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { ProjectOperationCredentials } from "@atomist/automation-client/lib/operations/common/ProjectOperationCredentials"; import { RemoteRepoRef } from "@atomist/automation-client/lib/operations/common/RepoId"; import * as _ from "lodash"; import { SoftwareDeliveryMachine } from "../../api/machine/SoftwareDeliveryMachine"; /** * Configuration options to be passed to the extension pack creation. */ export interface SdmPackK8sOptions { /** * Whether to add the bot/web-app commands provided by this SDM * extension pack. If no value is provided, the commands are not * added. */ addCommands?: boolean; /** * Synchronize resources in k8s cluster with a Git repo. */ sync?: KubernetesSyncOptions; } /** * Configuration options for sync mode operation. */ export interface KubernetesSyncOptions { /** * To synchronize resources in k8s cluster with a Git repo, * provide a repo ref as the value of this property. The value * can be either a SyncRepoRef or RemoteRepoRef. On startup, the * contents of this repo ref will be synchronized with the * cluster, subsequent changes to this repo will be syncronized to * the cluster, and subsequent resource deployments will update * the contents of this repo. * * If a SyncRepoRef is provided, on startup cortex is queried to * find the details of the repo needed to create a RemoteRepoRef. * This RemoteRepoRef is created and then used as the value of * this property for the lifetime of the SDM. * * If a RemoteRepoRef is provided, it is used as is. */ repo: SyncRepoRef | RemoteRepoRef; /** * Credentials to use when cloning the sync.repo. These are * typically not provided in the SDM configuration, rather they * are are obtained during startup by the SDM via a cortex query. * If they are provided, the provided credentials are used rather * than any returned from cortex. */ credentials?: ProjectOperationCredentials; /** * If provided, the SDM will apply all specs in the sync repo * approximately every `intervalMinutes` minutes. If not provided * or set to zero (0) or a negative number, specs will only be * applied at startup or when they are changed by a commit. */ intervalMinutes?: number; /** * Key to use to encrypt Kubernetes Secret resource values before * storing them in the sync repo and decrypt them when reading * them from the sync repo. If it is not provided, secrets are * not encrypted in the sync repo, so hopefully they aren't too * secret. * * You can use the Atomist CLI or bin/secret.js script bundled * with this package to manually encrypt and decrypt values using * the same strategy. */ secretKey?: string; /** * Default format to use when creating Kubernetes specs in the * sync repo. If updating an existing file, the format of the * existing file will be used. If not provided, "yaml" is the * default. */ specFormat?: "json" | "yaml"; } /** * Information needed to create a proper RemoteRepoRef for the * [[SdmPackK8sOptions.sync.repo]] by querying cortex. */ export interface SyncRepoRef { /** Owner, i.e., user or organization, of sync repo. */ owner: string; /** Name of sync repository. */ repo: string; /** * If branch is provided, it is used. If it is not provided, * things get complicated. If the repo exists in the graph and it * has the defaultBranch property set, then the defaultBranch is * used. If the repo does not exist in the graph or its * defaultBranch property is not set, "master" is used. Since the * repo defaultBranch property could not be set initially but get * set at a later time, how sync repo behaves can change even if * the configuration does not. Long story short, even though * branch is optional, set it if you want sync repo to behave * deterministically. */ branch?: string; /** * The internal cortex ID of the source code management (SCM) * provider for the sync repo. Typically this is not necessary * and not provided. It is only necessary to provide the provider * ID if your Atomist workspace has multiple SCM providers and the * name and owner of the sync repo you want to use matches * different repositories in different SCM providers. For * example, if you want to use "my/specs" as your sync repo and * your Atomist workspace is linked to both GitHub.com and a GHE * instance, both of which have a repo named "my/specs". */ providerId?: string; } /** Validate the the partial SyncOptions contains a repo property. */ export function validSyncOptions(o: Partial<KubernetesSyncOptions>): o is KubernetesSyncOptions { return !!o && !!o.repo; } /** * Safely merge the the provided Kubernetes options with those already * existing in the SDM. The values in the SDM take precedence over * those in the passed in options. The passed in SDM is modified in * place and returned. * * @param sdm Software Delivery Machine that may or may not have any Kubernetes pack options * @param options Kubernetes pack options * @return Modified SDM object */ export function mergeK8sOptions(sdm: SoftwareDeliveryMachine, options?: SdmPackK8sOptions): SoftwareDeliveryMachine { _.defaultsDeep(sdm, { configuration: { sdm: { k8s: { options: {} } } } }); sdm.configuration.sdm.k8s.options = _.merge({}, options, sdm.configuration.sdm.k8s.options); return sdm; }