From 2bb490dd39ecc64b68da63c98f38809e84649a48 Mon Sep 17 00:00:00 2001 From: Pavel Ashevskii Date: Fri, 13 Nov 2020 13:30:49 +0400 Subject: [PATCH] Add posibility to add custom repository Signed-off-by: Pavel Ashevskii --- locales/en/messages.po | 37 ++++ locales/fi/messages.po | 36 ++++ locales/ru/messages.po | 36 ++++ src/main/helm/helm-repo-manager.ts | 21 ++- .../+preferences/add-helm-repo-dialog.scss | 22 +++ .../+preferences/add-helm-repo-dialog.tsx | 178 ++++++++++++++++++ .../components/+preferences/preferences.tsx | 31 ++- 7 files changed, 350 insertions(+), 11 deletions(-) create mode 100644 src/renderer/components/+preferences/add-helm-repo-dialog.scss create mode 100644 src/renderer/components/+preferences/add-helm-repo-dialog.tsx diff --git a/locales/en/messages.po b/locales/en/messages.po index 8591a1235f108..53e5d40d09051 100644 --- a/locales/en/messages.po +++ b/locales/en/messages.po @@ -140,6 +140,43 @@ msgstr "Add field" msgid "Adding helm branch <0>{0} has failed: {1}" msgstr "Adding helm branch <0>{0} has failed: {1}" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:91 +msgid "Helm repository <0>{0} has added" +msgstr "Helm repository <0>{0} has added" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:128 +msgid "Skip TLS certificate checks for the repository" +msgstr "Skip TLS certificate checks for the repository" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:128 +msgid "Key file" +msgstr "Key file" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:129 +msgid "Ca file" +msgstr "Ca file" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:130 +msgid "Cerificate file" +msgstr "Cerificate file" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:134 +msgid "Username" +msgstr "Username" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:140 +msgid "Password" +msgstr "Password" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:163 +msgid "Helm repo name" +msgstr "Helm repo name" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:163 +msgid "More" +msgstr "More" + #: src/renderer/components/+preferences/preferences.tsx:108 #~ msgid "Adding repo <0>{0} has failed: {1}" #~ msgstr "Adding repo <0>{0} has failed: {1}" diff --git a/locales/fi/messages.po b/locales/fi/messages.po index 76f10f6baf86d..6524225d19731 100644 --- a/locales/fi/messages.po +++ b/locales/fi/messages.po @@ -140,6 +140,42 @@ msgstr "" msgid "Adding helm branch <0>{0} has failed: {1}" msgstr "" +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:91 +msgid "Helm repository <0>{0} has added" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:128 +msgid "Skip TLS certificate checks for the repository" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:128 +msgid "Key file" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:129 +msgid "Ca file" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:130 +msgid "Cerificate file" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:134 +msgid "Username" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:140 +msgid "Password" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:163 +msgid "Helm repo name" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:163 +msgid "More" +msgstr "" + #: src/renderer/components/+preferences/preferences.tsx:108 #~ msgid "Adding repo <0>{0} has failed: {1}" #~ msgstr "" diff --git a/locales/ru/messages.po b/locales/ru/messages.po index 97f92264801c6..fe45943fedfc9 100644 --- a/locales/ru/messages.po +++ b/locales/ru/messages.po @@ -141,6 +141,42 @@ msgstr "Добавить поле" msgid "Adding helm branch <0>{0} has failed: {1}" msgstr "" +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:91 +msgid "Helm repository <0>{0} has added" +msgstr "Helm репозиторий <0>{0} добавлен" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:128 +msgid "Skip TLS certificate checks for the repository" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:128 +msgid "Key file" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:129 +msgid "Ca file" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:130 +msgid "Cerificate file" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:134 +msgid "Username" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:140 +msgid "Password" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:163 +msgid "Helm repo name" +msgstr "" + +#: src/renderer/components/+preferences/add-helm-repo-dialog.tsx:163 +msgid "More" +msgstr "" + #: src/renderer/components/+preferences/preferences.tsx:108 #~ msgid "Adding repo <0>{0} has failed: {1}" #~ msgstr "" diff --git a/src/main/helm/helm-repo-manager.ts b/src/main/helm/helm-repo-manager.ts index ae8595dae9d14..74afb166b1a9f 100644 --- a/src/main/helm/helm-repo-manager.ts +++ b/src/main/helm/helm-repo-manager.ts @@ -22,7 +22,7 @@ export interface HelmRepo { cacheFilePath?: string caFile?: string, certFile?: string, - insecure_skip_tls_verify?: boolean, + insecureSkipTlsVerify?: boolean, keyFile?: string, username?: string, password?: string, @@ -131,6 +131,25 @@ export class HelmRepoManager extends Singleton { return stdout; } + public async addСustomRepo(repoAttributes : HelmRepo) { + logger.info(`[HELM]: adding repo "${repoAttributes.name}" from ${repoAttributes.url}`); + const helm = await helmCli.binaryPath(); + + const insecureSkipTlsVerify = repoAttributes.insecureSkipTlsVerify ? " --insecure-skip-tls-verify" : ""; + const username = repoAttributes.username ? ` --username "${repoAttributes.username}"` : ""; + const password = repoAttributes.password ? ` --password "${repoAttributes.password}"` : ""; + const caFile = repoAttributes.caFile ? ` --ca-file "${repoAttributes.caFile}"` : ""; + const keyFile = repoAttributes.keyFile ? ` --key-file "${repoAttributes.keyFile}"` : ""; + const certFile = repoAttributes.certFile ? ` --cert-file "${repoAttributes.certFile}"` : ""; + + const addRepoCommand = `"${helm}" repo add ${repoAttributes.name} ${repoAttributes.url}${insecureSkipTlsVerify}${username}${password}${caFile}${keyFile}${certFile}`; + const { stdout } = await promiseExec(addRepoCommand).catch((error) => { + throw(error.stderr); + }); + + return stdout; + } + public async removeRepo({ name, url }: HelmRepo): Promise { logger.info(`[HELM]: removing repo "${name}" from ${url}`); const helm = await helmCli.binaryPath(); diff --git a/src/renderer/components/+preferences/add-helm-repo-dialog.scss b/src/renderer/components/+preferences/add-helm-repo-dialog.scss new file mode 100644 index 0000000000000..ab3ef22f7e783 --- /dev/null +++ b/src/renderer/components/+preferences/add-helm-repo-dialog.scss @@ -0,0 +1,22 @@ +.AddHelmRepoDialog { + --flex-gap: #{$margin * 1.5}; + + .accordion { + font-weight: bold; + align-self: flex-start; + padding: 0; + &:focus:not(:active) { + box-shadow: none; + } + } + .Icon { + --color-active: black; + } + + .fields-title { + display: grid; + grid-template-columns: min-content auto; + align-items: center; + gap: $margin / 2; + } +} diff --git a/src/renderer/components/+preferences/add-helm-repo-dialog.tsx b/src/renderer/components/+preferences/add-helm-repo-dialog.tsx new file mode 100644 index 0000000000000..6c4b729adcf9c --- /dev/null +++ b/src/renderer/components/+preferences/add-helm-repo-dialog.tsx @@ -0,0 +1,178 @@ +import "./add-helm-repo-dialog.scss"; + +import React from "react"; +import { remote, FileFilter } from "electron"; +import { observable } from "mobx"; +import { observer } from "mobx-react"; +import { t, Trans } from "@lingui/macro"; +import { _i18n } from "../../i18n"; +import { Dialog, DialogProps } from "../dialog"; +import { Wizard, WizardStep } from "../wizard"; +import { Input } from "../input"; +import { Checkbox } from "../checkbox"; +import { Button } from "../button"; +import { systemName, isUrl, isPath } from "../input/input_validators"; +import { SubTitle } from "../layout/sub-title"; +import { Icon } from "../icon"; +import { Notifications } from "../notifications"; +import { HelmRepo, repoManager } from "../../../main/helm/helm-repo-manager"; + +interface Props extends Partial { + onAddRepo: Function +} + +enum FileType { + CaFile = "caFile", + KeyFile = "keyFile", + CertFile = "certFile", +} + +@observer +export class AddHelmRepoDialog extends React.Component { + private emptyRepo = {name: "", url: "", username: "", password: "", insecureSkipTlsVerify: false, caFile:"", keyFile: "", certFile: ""}; + + private static keyExtensions = ["key", "keystore", "jks", "p12", "pfx", "pem"] + private static certExtensions = ["crt", "cer", "ca-bundle", "p7b", "p7c" , "p7s", "p12", "pfx", "pem"] + + @observable static isOpen = false; + + static open() { + AddHelmRepoDialog.isOpen = true; + } + + static close() { + AddHelmRepoDialog.isOpen = false; + } + + @observable helmRepo : HelmRepo = this.emptyRepo; + @observable showOptions = false; + + close = () => { + AddHelmRepoDialog.close(); + this.helmRepo = this.emptyRepo; + this.showOptions = false; + }; + + setFilepath(type: FileType, value: string) { + this.helmRepo[type] = value; + } + + getFilePath(type: FileType) : string { + return this.helmRepo[type]; + } + + async selectFileDialog(type: FileType, fileFilter: FileFilter) { + const { dialog, BrowserWindow } = remote; + const { canceled, filePaths } = await dialog.showOpenDialog(BrowserWindow.getFocusedWindow(), { + defaultPath: this.getFilePath(type), + properties: ["openFile", "showHiddenFiles"], + message: _i18n._(t`Select file`), + buttonLabel: _i18n._(t`Use file`), + filters: [ + fileFilter, + { name: "Any", extensions: ["*"]} + ] + }); + + if (!canceled && filePaths.length) { + this.setFilepath(type, filePaths[0]); + } + } + + async addCustomRepo() { + try { + await repoManager.addСustomRepo(this.helmRepo); + Notifications.ok(Helm repository {this.helmRepo.name} has added); + this.props.onAddRepo(); + this.close(); + } catch (err) { + Notifications.error(Adding helm branch {this.helmRepo.name} has failed: {String(err)}); + } + } + + renderFileInput(placeholder:string, fileType:FileType ,fileExtensions:string[]){ + return( +
+ this.setFilepath(fileType, v)} + /> + this.selectFileDialog(fileType, {name: placeholder, extensions: fileExtensions})} + tooltip={Browse} + /> +
); + } + + renderOptions() { + return ( + <> + Security settings} /> + this.helmRepo.insecureSkipTlsVerify = v} + /> + {this.renderFileInput(_i18n._(t`Key file`), FileType.KeyFile, AddHelmRepoDialog.keyExtensions)} + {this.renderFileInput(_i18n._(t`Ca file`), FileType.CaFile, AddHelmRepoDialog.certExtensions)} + {this.renderFileInput(_i18n._(t`Cerificate file`), FileType.CertFile, AddHelmRepoDialog.certExtensions)} + Chart Repository Credentials} /> + this.helmRepo.username = v} + /> + this.helmRepo.password = v} + /> + ); + } + + render() { + const { ...dialogProps } = this.props; + + const header =
Add custom Helm Repo
; + + return ( + + + Add} next={()=>{this.addCustomRepo();}}> +
+ this.helmRepo.name = v} + /> + this.helmRepo.url = v} + /> + + {this.showOptions && this.renderOptions()} +
+
+
+
+ ); + } +} diff --git a/src/renderer/components/+preferences/preferences.tsx b/src/renderer/components/+preferences/preferences.tsx index 69971acad5c77..68bfd7fa20fed 100644 --- a/src/renderer/components/+preferences/preferences.tsx +++ b/src/renderer/components/+preferences/preferences.tsx @@ -13,11 +13,13 @@ import { Input } from "../input"; import { Checkbox } from "../checkbox"; import { Notifications } from "../notifications"; import { Badge } from "../badge"; +import { Button } from "../button"; import { themeStore } from "../../theme.store"; import { Tooltip } from "../tooltip"; import { KubectlBinaries } from "./kubectl-binaries"; import { appPreferenceRegistry } from "../../../extensions/registries/app-preference-registry"; import { PageLayout } from "../layout/page-layout"; +import { AddHelmRepoDialog } from "./add-helm-repo-dialog"; @observer export class Preferences extends React.Component { @@ -134,16 +136,25 @@ export class Preferences extends React.Component {

Helm

- Repositories} + isLoading={this.helmLoading} + isDisabled={this.helmLoading} + options={this.helmOptions} + onChange={this.onRepoSelect} + formatOptionLabel={this.formatHelmOptionLabel} + controlShouldRenderValue={false} + className="box grow" + /> +