From 4095630159cf6c7289995a8446cc26225f885882 Mon Sep 17 00:00:00 2001 From: Zixuan Qian Date: Wed, 26 Jun 2024 13:11:49 -0700 Subject: [PATCH] Add a new HelmDeployV1 task --- .github/CODEOWNERS | 2 + .../resources.resjson/de-DE/resources.resjson | 109 ++ .../resources.resjson/en-US/resources.resjson | 109 ++ .../resources.resjson/es-ES/resources.resjson | 109 ++ .../resources.resjson/fr-FR/resources.resjson | 109 ++ .../resources.resjson/it-IT/resources.resjson | 109 ++ .../resources.resjson/ja-JP/resources.resjson | 109 ++ .../resources.resjson/ko-KR/resources.resjson | 109 ++ .../resources.resjson/ru-RU/resources.resjson | 109 ++ .../resources.resjson/zh-CN/resources.resjson | 109 ++ .../resources.resjson/zh-TW/resources.resjson | 109 ++ Tasks/HelmDeployV1/Tests/L0.ts | 266 +++ Tasks/HelmDeployV1/Tests/TestSetup.ts | 366 ++++ Tasks/HelmDeployV1/Tests/TestShared.ts | 96 + Tasks/HelmDeployV1/Tests/package-lock.json | 5 + Tasks/HelmDeployV1/Tests/package.json | 19 + Tasks/HelmDeployV1/ThirdPartyNotices.txt | 1707 +++++++++++++++++ .../Node20/Tests/package-lock.json | 13 + .../_buildConfigs/Node20/Tests/package.json | 19 + .../_buildConfigs/Node20/package-lock.json | 1647 ++++++++++++++++ .../_buildConfigs/Node20/package.json | 20 + Tasks/HelmDeployV1/icon.png | Bin 0 -> 936 bytes Tasks/HelmDeployV1/icon.svg | 3 + Tasks/HelmDeployV1/make.json | 16 + Tasks/HelmDeployV1/package-lock.json | 1285 +++++++++++++ Tasks/HelmDeployV1/package.json | 20 + Tasks/HelmDeployV1/src/basecommand.ts | 66 + .../src/clusters/armkubernetescluster.ts | 26 + .../src/clusters/generickubernetescluster.ts | 17 + Tasks/HelmDeployV1/src/commoncommandoption.ts | 17 + Tasks/HelmDeployV1/src/deletesecurefiles.ts | 36 + Tasks/HelmDeployV1/src/downloadsecurefiles.ts | 38 + Tasks/HelmDeployV1/src/helm.ts | 273 +++ Tasks/HelmDeployV1/src/helmcli.ts | 77 + .../src/helmcommands/helmchartpush.ts | 14 + .../src/helmcommands/helmchartremove.ts | 14 + .../src/helmcommands/helmchartsave.ts | 18 + .../HelmDeployV1/src/helmcommands/helminit.ts | 33 + .../src/helmcommands/helminstall.ts | 93 + .../src/helmcommands/helmpackage.ts | 42 + .../src/helmcommands/helmregistrylogin.ts | 39 + .../src/helmcommands/helmupgrade.ts | 91 + .../helmcommands/uinotimplementedcommands.ts | 23 + Tasks/HelmDeployV1/src/kubernetescli.ts | 68 + Tasks/HelmDeployV1/src/tlssetting.ts | 53 + Tasks/HelmDeployV1/src/utils.ts | 106 + Tasks/HelmDeployV1/task.json | 563 ++++++ Tasks/HelmDeployV1/task.loc.json | 563 ++++++ Tasks/HelmDeployV1/tsconfig.json | 9 + _generated/HelmDeployV1.versionmap.txt | 2 + _generated/HelmDeployV1_Node20/.npmrc | 1 + .../resources.resjson/de-DE/resources.resjson | 109 ++ .../resources.resjson/en-US/resources.resjson | 109 ++ .../resources.resjson/es-ES/resources.resjson | 109 ++ .../resources.resjson/fr-FR/resources.resjson | 109 ++ .../resources.resjson/it-IT/resources.resjson | 109 ++ .../resources.resjson/ja-JP/resources.resjson | 109 ++ .../resources.resjson/ko-KR/resources.resjson | 109 ++ .../resources.resjson/ru-RU/resources.resjson | 109 ++ .../resources.resjson/zh-CN/resources.resjson | 109 ++ .../resources.resjson/zh-TW/resources.resjson | 109 ++ _generated/HelmDeployV1_Node20/Tests/L0.ts | 266 +++ .../HelmDeployV1_Node20/Tests/TestSetup.ts | 366 ++++ .../HelmDeployV1_Node20/Tests/TestShared.ts | 96 + .../Tests/package-lock.json | 13 + .../HelmDeployV1_Node20/Tests/package.json | 19 + .../HelmDeployV1_Node20/ThirdPartyNotices.txt | 1707 +++++++++++++++++ _generated/HelmDeployV1_Node20/icon.png | Bin 0 -> 936 bytes _generated/HelmDeployV1_Node20/icon.svg | 3 + _generated/HelmDeployV1_Node20/make.json | 16 + .../HelmDeployV1_Node20/package-lock.json | 1647 ++++++++++++++++ _generated/HelmDeployV1_Node20/package.json | 20 + .../HelmDeployV1_Node20/src/basecommand.ts | 66 + .../src/clusters/armkubernetescluster.ts | 26 + .../src/clusters/generickubernetescluster.ts | 17 + .../src/commoncommandoption.ts | 17 + .../src/deletesecurefiles.ts | 36 + .../src/downloadsecurefiles.ts | 38 + _generated/HelmDeployV1_Node20/src/helm.ts | 273 +++ _generated/HelmDeployV1_Node20/src/helmcli.ts | 77 + .../src/helmcommands/helmchartpush.ts | 14 + .../src/helmcommands/helmchartremove.ts | 14 + .../src/helmcommands/helmchartsave.ts | 18 + .../src/helmcommands/helminit.ts | 33 + .../src/helmcommands/helminstall.ts | 93 + .../src/helmcommands/helmpackage.ts | 42 + .../src/helmcommands/helmregistrylogin.ts | 39 + .../src/helmcommands/helmupgrade.ts | 91 + .../helmcommands/uinotimplementedcommands.ts | 23 + .../HelmDeployV1_Node20/src/kubernetescli.ts | 68 + .../HelmDeployV1_Node20/src/tlssetting.ts | 53 + _generated/HelmDeployV1_Node20/src/utils.ts | 106 + _generated/HelmDeployV1_Node20/task.json | 579 ++++++ _generated/HelmDeployV1_Node20/task.loc.json | 579 ++++++ _generated/HelmDeployV1_Node20/tsconfig.json | 9 + make-options.json | 2 + 96 files changed, 16412 insertions(+) create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 Tasks/HelmDeployV1/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 Tasks/HelmDeployV1/Tests/L0.ts create mode 100644 Tasks/HelmDeployV1/Tests/TestSetup.ts create mode 100644 Tasks/HelmDeployV1/Tests/TestShared.ts create mode 100644 Tasks/HelmDeployV1/Tests/package-lock.json create mode 100644 Tasks/HelmDeployV1/Tests/package.json create mode 100644 Tasks/HelmDeployV1/ThirdPartyNotices.txt create mode 100644 Tasks/HelmDeployV1/_buildConfigs/Node20/Tests/package-lock.json create mode 100644 Tasks/HelmDeployV1/_buildConfigs/Node20/Tests/package.json create mode 100644 Tasks/HelmDeployV1/_buildConfigs/Node20/package-lock.json create mode 100644 Tasks/HelmDeployV1/_buildConfigs/Node20/package.json create mode 100644 Tasks/HelmDeployV1/icon.png create mode 100644 Tasks/HelmDeployV1/icon.svg create mode 100644 Tasks/HelmDeployV1/make.json create mode 100644 Tasks/HelmDeployV1/package-lock.json create mode 100644 Tasks/HelmDeployV1/package.json create mode 100644 Tasks/HelmDeployV1/src/basecommand.ts create mode 100644 Tasks/HelmDeployV1/src/clusters/armkubernetescluster.ts create mode 100644 Tasks/HelmDeployV1/src/clusters/generickubernetescluster.ts create mode 100644 Tasks/HelmDeployV1/src/commoncommandoption.ts create mode 100644 Tasks/HelmDeployV1/src/deletesecurefiles.ts create mode 100644 Tasks/HelmDeployV1/src/downloadsecurefiles.ts create mode 100644 Tasks/HelmDeployV1/src/helm.ts create mode 100644 Tasks/HelmDeployV1/src/helmcli.ts create mode 100644 Tasks/HelmDeployV1/src/helmcommands/helmchartpush.ts create mode 100644 Tasks/HelmDeployV1/src/helmcommands/helmchartremove.ts create mode 100644 Tasks/HelmDeployV1/src/helmcommands/helmchartsave.ts create mode 100644 Tasks/HelmDeployV1/src/helmcommands/helminit.ts create mode 100644 Tasks/HelmDeployV1/src/helmcommands/helminstall.ts create mode 100644 Tasks/HelmDeployV1/src/helmcommands/helmpackage.ts create mode 100644 Tasks/HelmDeployV1/src/helmcommands/helmregistrylogin.ts create mode 100644 Tasks/HelmDeployV1/src/helmcommands/helmupgrade.ts create mode 100644 Tasks/HelmDeployV1/src/helmcommands/uinotimplementedcommands.ts create mode 100644 Tasks/HelmDeployV1/src/kubernetescli.ts create mode 100644 Tasks/HelmDeployV1/src/tlssetting.ts create mode 100644 Tasks/HelmDeployV1/src/utils.ts create mode 100644 Tasks/HelmDeployV1/task.json create mode 100644 Tasks/HelmDeployV1/task.loc.json create mode 100644 Tasks/HelmDeployV1/tsconfig.json create mode 100644 _generated/HelmDeployV1.versionmap.txt create mode 100644 _generated/HelmDeployV1_Node20/.npmrc create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/en-US/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 _generated/HelmDeployV1_Node20/Tests/L0.ts create mode 100644 _generated/HelmDeployV1_Node20/Tests/TestSetup.ts create mode 100644 _generated/HelmDeployV1_Node20/Tests/TestShared.ts create mode 100644 _generated/HelmDeployV1_Node20/Tests/package-lock.json create mode 100644 _generated/HelmDeployV1_Node20/Tests/package.json create mode 100644 _generated/HelmDeployV1_Node20/ThirdPartyNotices.txt create mode 100644 _generated/HelmDeployV1_Node20/icon.png create mode 100644 _generated/HelmDeployV1_Node20/icon.svg create mode 100644 _generated/HelmDeployV1_Node20/make.json create mode 100644 _generated/HelmDeployV1_Node20/package-lock.json create mode 100644 _generated/HelmDeployV1_Node20/package.json create mode 100644 _generated/HelmDeployV1_Node20/src/basecommand.ts create mode 100644 _generated/HelmDeployV1_Node20/src/clusters/armkubernetescluster.ts create mode 100644 _generated/HelmDeployV1_Node20/src/clusters/generickubernetescluster.ts create mode 100644 _generated/HelmDeployV1_Node20/src/commoncommandoption.ts create mode 100644 _generated/HelmDeployV1_Node20/src/deletesecurefiles.ts create mode 100644 _generated/HelmDeployV1_Node20/src/downloadsecurefiles.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helm.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcli.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcommands/helmchartpush.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcommands/helmchartremove.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcommands/helmchartsave.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcommands/helminit.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcommands/helminstall.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcommands/helmpackage.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcommands/helmregistrylogin.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcommands/helmupgrade.ts create mode 100644 _generated/HelmDeployV1_Node20/src/helmcommands/uinotimplementedcommands.ts create mode 100644 _generated/HelmDeployV1_Node20/src/kubernetescli.ts create mode 100644 _generated/HelmDeployV1_Node20/src/tlssetting.ts create mode 100644 _generated/HelmDeployV1_Node20/src/utils.ts create mode 100644 _generated/HelmDeployV1_Node20/task.json create mode 100644 _generated/HelmDeployV1_Node20/task.loc.json create mode 100644 _generated/HelmDeployV1_Node20/tsconfig.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f2663d2eb0b0..2da86717aff1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -259,6 +259,8 @@ Tasks/GulpV1/ @microsoft/akvelon-build-task-team Tasks/HelmDeployV0/ @microsoft/release-management-task-team @manolerazvan +Tasks/HelmDeployV1/ @microsoft/release-management-task-team @manolerazvan + Tasks/HelmInstallerV0/ @microsoft/release-management-task-team @manolerazvan Tasks/HelmInstallerV1/ @microsoft/release-management-task-team @manolerazvan diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/de-DE/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..c6f5ace27147 --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Helm Charts paketieren und bereitstellen", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?linkid=851275) oder [Helm-Dokumentation anzeigen](https://helm.sh/docs/)", + "loc.description": "Hiermit werden Helm-Befehle ausgeführt, um einen Kubernetes-Cluster in Azure Container Service bereitzustellen, zu konfigurieren oder zu aktualisieren.", + "loc.instanceNameFormat": "Helm $(command)", + "loc.group.displayName.cluster": "Kubernetes-Cluster", + "loc.group.displayName.commands": "Befehle", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.connectionType": "Verbindungstyp", + "loc.input.help.connectionType": "Wählen Sie \"Azure Resource Manager\" aus, um unter Verwendung einer Azure-Dienstverbindung eine Verbindung mit einer Azure Kubernetes Service-Instanz herzustellen. Wählen Sie \"Kubernetes-Dienstverbindung\" aus, um unter Verwendung von kubeconfig oder einem Dienstkonto eine Verbindung mit einem Kubernetes-Cluster herzustellen.", + "loc.input.label.azureSubscriptionEndpoint": "Azure-Abonnement", + "loc.input.help.azureSubscriptionEndpoint": "Wählen Sie ein Azure-Abonnement aus, das Ihre Azure Container Registry enthält.", + "loc.input.label.azureResourceGroup": "Ressourcengruppe", + "loc.input.help.azureResourceGroup": "Wählen Sie eine Azure-Ressourcengruppe aus.", + "loc.input.label.kubernetesCluster": "Kubernetes-Cluster", + "loc.input.help.kubernetesCluster": "Wählen Sie einen verwalteten Azure-Cluster aus.", + "loc.input.label.useClusterAdmin": "Anmeldeinformationen für Clusteradministrator verwenden", + "loc.input.help.useClusterAdmin": "Verwenden Sie anstelle der standardmäßigen Anmeldeinformationen für Clusterbenutzer Anmeldeinformationen für Clusteradministratoren.", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes-Dienstverbindung", + "loc.input.help.kubernetesServiceEndpoint": "Wählen Sie eine Kubernetes-Dienstverbindung aus.", + "loc.input.label.namespace": "Namespace", + "loc.input.help.namespace": "Geben Sie den zu verwendenden K8-Namespace an. Der Tiller-Namespace kann im erweiterten Abschnitt der Aufgabe oder durch Übergabe der Option \"--tiller-namespace\" als Argument angegeben werden.", + "loc.input.label.azureSubscriptionEndpointForACR": "Azure-Abonnement für Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Wählen Sie ein Azure-Abonnement aus, das Ihre Azure Container Registry enthält.", + "loc.input.label.azureResourceGroupForACR": "Ressourcengruppe", + "loc.input.help.azureResourceGroupForACR": "Wählen Sie eine Azure-Ressourcengruppe aus, die Ihre Containerregistrierung enthält.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Wählen Sie eine Azure Container Registry-Instanz aus, die zum Pushen von Helm-Diagrammen verwendet wird.", + "loc.input.label.command": "Befehl", + "loc.input.help.command": "Wählen Sie Helm-Befehl aus.", + "loc.input.label.chartType": "Charttyp", + "loc.input.help.chartType": "Wählen Sie aus, wie Chartinformationen eingegeben werden sollen. Sie können entweder einen Chartnamen oder einen Ordner-/Dateipfad zum Chart angeben.", + "loc.input.label.chartName": "Chartname", + "loc.input.help.chartName": "Chartverweis für die Installation, es kann sich um eine URL oder um einen Chartnamen handeln. Wenn der Chartname beispielsweise \"stable/mysql\" lautet, führt die Aufgabe \"helm install stable/mysql\" aus.", + "loc.input.label.chartPath": "Chartpfad", + "loc.input.help.chartPath": "Pfad zum Chart, das installiert werden soll. Es kann sich um einen Pfad zu einem paketierten Chart oder um einen Pfad zu einem nicht paketierten Chartverzeichnis handeln. Wenn beispielsweise \"./redis\" angegeben wird, führt die Aufgabe \"helm install ./redis\" aus.", + "loc.input.label.version": "Version", + "loc.input.help.version": "Geben Sie die genaue Chartversion an, die installiert werden soll. Sofern nicht angegeben, wird die aktuelle Version installiert. Legen Sie die Chartversion auf diese semver-Version fest.", + "loc.input.label.releaseName": "Releasename", + "loc.input.help.releaseName": "Der Releasename. Sofern nicht angegeben, wird automatisch ein Name generiert.", + "loc.input.label.overrideValues": "Werte festlegen", + "loc.input.help.overrideValues": "Legen Sie Werte in der Befehlszeile fest (Mehrfacheingabe oder Trennung von Werten durch Kommas oder Zeilenumbrüche: \"key1=val1,key2=val2\" oder \"
key1=val1
key2=val2
\"). Die Aufgabe erstellt den Helm-Befehl durch Verwendung dieser festgelegten Werte. Beispiel: helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Datei mit Werten", + "loc.input.help.valueFile": "Geben Sie Werte in einer YAML-Datei oder eine URL an. Beispielsweise führt die Angabe von \"myvalues.yaml\" zu \"helm install --values=myvals.yaml\".", + "loc.input.label.destination": "Ziel", + "loc.input.help.destination": "Geben Sie Werte in einer YAML-Datei oder eine URL an.", + "loc.input.label.canaryimage": "Hiermit wird die Imageversion \"canary\" verwendet.", + "loc.input.help.canaryimage": "Verwenden Sie das Tiller-Image \"canary\", die aktuelle Vorabversion von Tiller.", + "loc.input.label.upgradetiller": "Tiller-Upgrade durchführen", + "loc.input.help.upgradetiller": "Führen Sie ein Upgrade durch, wenn Tiller bereits installiert ist.", + "loc.input.label.updatedependency": "Abhängigkeiten aktualisieren", + "loc.input.help.updatedependency": "Führen Sie eine Helm-Abhängigkeitsaktualisierung aus, bevor Sie das Chart installieren. Aktualisieren Sie vor der Paketierung Abhängigkeiten von \"requirements.yaml\" mit dem Verzeichnis \"charts/\".", + "loc.input.label.save": "Speichern", + "loc.input.help.save": "Paketiertes Chart im lokalen Chartrepository speichern (Standardwert: TRUE)", + "loc.input.label.install": "Hiermit wird eine Installation durchgeführt, wenn das Release nicht vorhanden ist.", + "loc.input.help.install": "Falls noch kein Release mit diesem Namen vorhanden ist, führen Sie eine Installation aus.", + "loc.input.label.recreate": "Hiermit werden Pods neu erstellt.", + "loc.input.help.recreate": "Hiermit wird ein Podneustart für die Ressource durchgeführt (sofern zutreffend).", + "loc.input.label.resetValues": "Hiermit werden die Werte zurückgesetzt.", + "loc.input.help.resetValues": "Setzen Sie die Werte auf die integrierten Werte im Chart zurück.", + "loc.input.label.force": "Erzwingen", + "loc.input.help.force": "Erzwingen Sie ggf. über \"delete/recreate\" eine Ressourcenaktualisierung.", + "loc.input.label.waitForExecution": "Warten", + "loc.input.help.waitForExecution": "Führt zu einer Blockierung, bis die Befehlsausführung abgeschlossen ist.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "Helm-Befehlsoptionen.", + "loc.input.label.enableTls": "TLS aktivieren", + "loc.input.help.enableTls": "Hiermit wird die Verwendung von SSL zwischen Helm und Tiller aktiviert.", + "loc.input.label.caCert": "Zertifikat der Zertifizierungsstelle", + "loc.input.help.caCert": "Zertifikat der Zertifizierungsstelle, das zum Ausstellen von Zertifikaten für Tiller und Helm-Clients verwendet wird.", + "loc.input.label.certificate": "Zertifikat", + "loc.input.help.certificate": "Tiller-Zertifikat oder Helm-Clientzertifikat angeben", + "loc.input.label.privatekey": "Schlüssel", + "loc.input.help.privatekey": "Tiller-Schlüssel oder Helm-Clientschlüssel angeben", + "loc.input.label.tillernamespace": "Tiller-Namespace", + "loc.input.help.tillernamespace": "Geben Sie den K8-Namespace von Tiller an.", + "loc.input.label.failOnStderr": "Fehler aufgrund von Standardfehler.", + "loc.input.help.failOnStderr": "Wenn dieser Wert TRUE ist, tritt ein Aufgabenfehler auf, wenn Fehler in die Fehlerpipeline oder Daten in den Standard-Fehlerdatenstrom geschrieben werden. Andernfalls verwendet die Aufgabe ausschließlich den Exitcode zum Ermitteln von Fehlern.", + "loc.input.label.publishPipelineMetadata": "Pipelinemetadaten veröffentlichen", + "loc.input.help.publishPipelineMetadata": "Wenn diese Einstellung auf TRUE festgelegt ist, werden Bereitstellungsmetadaten durch die Aufgabe erfasst und veröffentlicht.", + "loc.input.label.chartNameForACR": "Diagrammname für Azure Container Registry", + "loc.input.help.chartNameForACR": "Der Diagrammname, unter dem das Diagramm in Azure Container Registry gespeichert wird.", + "loc.input.label.chartPathForACR": "Diagrammpfad für Azure Container Registry", + "loc.input.help.chartPathForACR": "Pfad zum Diagrammverzeichnis.", + "loc.messages.CantDownloadAccessProfile": "Zugriffsprofil/Kube-Konfigurationsdatei für den Cluster \"%s\" kann nicht heruntergeladen werden. Ursache: %s.", + "loc.messages.KubeConfigFilePath": "Pfad der Kubeconfig-Datei: %s", + "loc.messages.KubernetesClusterInfo": "ID des Kubernetes-Clusters: %s, Kubernetes-Serverversion: %s, Kubernetes-Bereitstellungszustand: %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes-Cluster \"%s\", Ressourcengruppe \"%s\".", + "loc.messages.ClusterNotProvisioned": "Es wurde festgestellt, dass sich der Cluster \"%s\" im Zustand \"%s\" befindet.", + "loc.messages.ClusterNotFound": "Der Cluster \"%s\" ist nicht vorhanden.", + "loc.messages.FailedToListClusters": "Fehler beim Auflisten der verwalteten Cluster im Abonnement. %s", + "loc.messages.RetryingRequest": "Anforderung wird nach %s Sekunden wiederholt.", + "loc.messages.PatternNotFoundInFilePath": "Muster nicht im Dateipfad \"%s\" gefunden.", + "loc.messages.CantResolvePatternInPath": "Das Muster im Dateipfad \"%s\" kann nicht aufgelöst werden.", + "loc.messages.PatternFoundInPath": "Muster im Dateipfad \"%s\" gefunden.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Ein Zugriffstoken für Azure konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Konfigurieren Sie die verwaltete Dienstidentität (MSI) für den virtuellen Computer (https://aka.ms/azure-msi-docs). Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS ist nicht in der Aufgabe aktiviert. Das Löschen von Zertifikaten wird übersprungen.", + "loc.messages.SkipDownloadSecureFiles": "TLS ist nicht in der Aufgabe aktiviert. Das Herunterladen von Zertifikaten wird übersprungen.", + "loc.messages.FileNotFound": "Datei nicht unter \"%s\" gefunden.", + "loc.messages.KubernetesServiceConnectionNotFound": "Die Details zur Kubernetes-Dienstverbindung wurden nicht gefunden.", + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", + "loc.messages.SaveSupportedInHelmsV3Only": "Das Speichern des Diagramms in Azure Container Registry wird nur in Helm V3 unterstützt.", + "loc.messages.OutputVariableDataSizeExceeded": "Die Ausgabevariable wurde nicht festgelegt, weil die Helm-Befehlsausgabe die maximal unterstützte Länge überschritten hat. Ausgabelänge: %s, maximal unterstützte Länge: %s", + "loc.messages.KubeloginFailed": "Fehler bei der Kubelogin-Authentifizierung. Ausnahme: %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..32acb6a587db --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Package and deploy Helm charts", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=851275) or [see the Helm documentation](https://helm.sh/docs/)", + "loc.description": "Deploy, configure, update a Kubernetes cluster in Azure Container Service by running helm commands", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes Cluster", + "loc.group.displayName.commands": "Commands", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.connectionType": "Connection Type", + "loc.input.help.connectionType": "Select 'Azure Resource Manager' to connect to an Azure Kubernetes Service by using Azure Service Connection. Select 'Kubernetes Service Connection' to connect to any Kubernetes cluster by using kubeconfig or Service Account", + "loc.input.label.azureSubscriptionEndpoint": "Azure subscription", + "loc.input.help.azureSubscriptionEndpoint": "Select an Azure subscription, which has your Azure Container Registry.", + "loc.input.label.azureResourceGroup": "Resource group", + "loc.input.help.azureResourceGroup": "Select an Azure Resource Group.", + "loc.input.label.kubernetesCluster": "Kubernetes cluster", + "loc.input.help.kubernetesCluster": "Select an Azure Managed Cluster.", + "loc.input.label.useClusterAdmin": "Use cluster admin credentials", + "loc.input.help.useClusterAdmin": "Use cluster administrator credentials instead of default cluster user credentials.", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes Service Connection", + "loc.input.help.kubernetesServiceEndpoint": "Select a Kubernetes service connection.", + "loc.input.label.namespace": "Namespace", + "loc.input.help.namespace": "Specify K8 namespace to use. Use Tiller namespace can be specified in the advanced section of the task or by passing the --tiller-namespace option as argument.", + "loc.input.label.azureSubscriptionEndpointForACR": "Azure subscription for Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Select an Azure subscription, which has your Azure Container Registry.", + "loc.input.label.azureResourceGroupForACR": "Resource group", + "loc.input.help.azureResourceGroupForACR": "Select an Azure Resource Group, which has your Container Registry.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Select an Azure Container Registry which will be used for pushing helm charts.", + "loc.input.label.command": "Command", + "loc.input.help.command": "Select a helm command.", + "loc.input.label.chartType": "Chart Type", + "loc.input.help.chartType": "Select how you want to enter chart info. You can either provide name of the chart or folder/file path to the chart.", + "loc.input.label.chartName": "Chart Name", + "loc.input.help.chartName": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", + "loc.input.label.chartPath": "Chart Path", + "loc.input.help.chartPath": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", + "loc.input.label.version": "Version", + "loc.input.help.version": "Specify the exact chart version to install. If this is not specified, the latest version is installed. Set the version on the chart to this semver version​", + "loc.input.label.releaseName": "Release Name", + "loc.input.help.releaseName": "Release name. If unspecified, it will autogenerate one for you.", + "loc.input.label.overrideValues": "Set Values", + "loc.input.help.overrideValues": "Set values on the command line (can specify multiple or separate values with commas or newlines: key1=val1,key2=val2 or
key1=val1
key2=val2
). The task will construct the helm command by using these set values. For example, helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Value File", + "loc.input.help.valueFile": "Specify values in a YAML file or a URL. For example, specifying myvalues.yaml will result in 'helm install --values=myvals.yaml'.", + "loc.input.label.destination": "Destination", + "loc.input.help.destination": "Specify values in a YAML file or a URL.", + "loc.input.label.canaryimage": "Use canary image version.", + "loc.input.help.canaryimage": "Use the canary Tiller image, the latest pre-release version of Tiller.", + "loc.input.label.upgradetiller": "Upgrade Tiller", + "loc.input.help.upgradetiller": "Upgrade if Tiller is already installed.", + "loc.input.label.updatedependency": "Update Dependency", + "loc.input.help.updatedependency": "Run helm dependency update before installing the chart. Update dependencies from 'requirements.yaml' to dir 'charts/' before packaging", + "loc.input.label.save": "Save", + "loc.input.help.save": "Save packaged chart to local chart repository (default true)​", + "loc.input.label.install": "Install if release not present.", + "loc.input.help.install": "If a release by this name doesn't already exist, run an install​.", + "loc.input.label.recreate": "Recreate Pods.", + "loc.input.help.recreate": "Performs pods restart for the resource if applicable.", + "loc.input.label.resetValues": "Reset Values.", + "loc.input.help.resetValues": "Reset the values to the ones built into the chart.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Force resource update through delete/recreate if needed​", + "loc.input.label.waitForExecution": "Wait", + "loc.input.help.waitForExecution": "Block till command execution completes.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Helm command options.", + "loc.input.label.enableTls": "Enable TLS", + "loc.input.help.enableTls": "Enables using SSL between Helm and Tiller.", + "loc.input.label.caCert": "CA certificate", + "loc.input.help.caCert": "CA cert used to issue certificate for tiller and helm client.", + "loc.input.label.certificate": "Certificate", + "loc.input.help.certificate": "Specify Tiller certificate or Helm client certificate", + "loc.input.label.privatekey": "Key", + "loc.input.help.privatekey": "Specify Tiller Key or Helm client key", + "loc.input.label.tillernamespace": "Tiller namespace", + "loc.input.help.tillernamespace": "Specify K8 namespace of tiller.", + "loc.input.label.failOnStderr": "Fail on Standard Error", + "loc.input.help.failOnStderr": "If this is true, this task will fail if any errors are written to the error pipeline, or if any data is written to the Standard Error stream. Otherwise the task will rely on the exit code to determine failure.", + "loc.input.label.publishPipelineMetadata": "Publish pipeline metadata", + "loc.input.help.publishPipelineMetadata": "If this is true, the task will collect and publish deployment metadata", + "loc.input.label.chartNameForACR": "Chart Name For Azure Container Registry", + "loc.input.help.chartNameForACR": "Chart name with which the chart will be stored in Azure Container Registry.", + "loc.input.label.chartPathForACR": "Chart Path for Azure Container Registry", + "loc.input.help.chartPathForACR": "Path to the chart directory.", + "loc.messages.CantDownloadAccessProfile": "Cannot download access profile/kube config file for the cluster %s. Reason %s.", + "loc.messages.KubeConfigFilePath": "Kubeconfig file path: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes cluster Id : %s, kubernetes server version %s, kuberenettes provision state %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes cluster %s, resource group %s.", + "loc.messages.ClusterNotProvisioned": "Observed that the cluster %s is in %s state.", + "loc.messages.ClusterNotFound": "%s cluster does not exists", + "loc.messages.FailedToListClusters": "Failed to list managed clusters in the subscription. %s", + "loc.messages.RetryingRequest": "Retrying request after %s seconds.", + "loc.messages.PatternNotFoundInFilePath": "Pattern not found in file path %s.", + "loc.messages.CantResolvePatternInPath": "Can not resolve pattern in file path %s.", + "loc.messages.PatternFoundInPath": "Pattern found in file path %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Could not fetch access token for Azure. Status code: %s, status message: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Could not fetch access token for Managed Service Principal. Please configure Managed Service Identity (MSI) for virtual machine 'https://aka.ms/azure-msi-docs'. Status code: %s, status message: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Could not fetch access token for Managed Service Principal. Status code: %s, status message: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS not enabled in the Task. Skipping delete of certificates.", + "loc.messages.SkipDownloadSecureFiles": "TLS not enabled in the Task. Skipping download of certificates.", + "loc.messages.FileNotFound": "File not found at %s", + "loc.messages.KubernetesServiceConnectionNotFound": "Kubernetes service connection details not found.", + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "loc.messages.SaveSupportedInHelmsV3Only": "Save chart to Azure Container Registry is only supported in Helms V3.", + "loc.messages.OutputVariableDataSizeExceeded": "Output variable not set as Helm command output exceeded the maximum supported length. Output length: %s, Maximum supported length: %s", + "loc.messages.KubeloginFailed": "Kubelogin authentication failed. Exception: %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/es-ES/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..90cf582fd8cf --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Empaquetar e implementar los gráficos de Helm", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?linkid=851275) o [consultar la documentación de Helm](https://helm.sh/docs/)", + "loc.description": "Implementa, configura y actualiza un clúster de Kubernetes en Azure Container Service mediante la ejecución de comandos helm.", + "loc.instanceNameFormat": "helm $(comando)", + "loc.group.displayName.cluster": "Clúster de Kubernetes", + "loc.group.displayName.commands": "Comandos", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.connectionType": "Tipo de conexión", + "loc.input.help.connectionType": "Seleccione \"Azure Resource Manager\" para conectarse a un servicio de Azure Kubernetes Service mediante la conexión del servicio de Azure. Seleccione \"Conexión de servicio de Kubernetes\" para conectarse a cualquier clúster de Kubernetes mediante kubeconfig o la cuenta de servicio", + "loc.input.label.azureSubscriptionEndpoint": "Suscripción a Azure", + "loc.input.help.azureSubscriptionEndpoint": "Seleccione una suscripción de Azure, que tiene instancia de Azure Container Registry.", + "loc.input.label.azureResourceGroup": "Grupo de recursos", + "loc.input.help.azureResourceGroup": "Seleccione un grupo de recursos de Azure.", + "loc.input.label.kubernetesCluster": "Clúster de Kubernetes", + "loc.input.help.kubernetesCluster": "Seleccione un clúster de Azure administrado.", + "loc.input.label.useClusterAdmin": "Usar credenciales de administrador del clúster", + "loc.input.help.useClusterAdmin": "Use las credenciales de administrador del clúster en lugar de las credenciales predeterminadas de usuario de clúster.", + "loc.input.label.kubernetesServiceEndpoint": "Conexión de servicio de Kubernetes", + "loc.input.help.kubernetesServiceEndpoint": "Seleccione una conexión del servicio de Kubernetes.", + "loc.input.label.namespace": "Espacio de nombres", + "loc.input.help.namespace": "Especificar el espacio de nombres de K8 para usar. Se puede especificar el uso del espacio de nombres de Tiller en la sección de opciones avanzadas de la tarea pasando la opción --tiller-namespace como argumento.", + "loc.input.label.azureSubscriptionEndpointForACR": "Suscripción de Azure para Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Seleccione una suscripción de Azure, que tiene instancia de Azure Container Registry.", + "loc.input.label.azureResourceGroupForACR": "Grupo de recursos", + "loc.input.help.azureResourceGroupForACR": "Seleccione un grupo de recursos de Azure que tenga su instancia de Container Registry.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Seleccione una instancia de Azure Container Registry que se usará para insertar gráficos de Helm.", + "loc.input.label.command": "Comando", + "loc.input.help.command": "Seleccione un comando helm.", + "loc.input.label.chartType": "Tipo de gráfico", + "loc.input.help.chartType": "Seleccione cómo desea escribir la información de gráfico. Puede proporcionar el nombre de la ruta de acceso o la ruta de acceso de la carpeta/archivo al gráfico.", + "loc.input.label.chartName": "Nombre del gráfico", + "loc.input.help.chartName": "Gráfico de referencia para instalar, puede ser una dirección URL o el nombre de un gráfico. Por ejemplo, si el nombre del gráfico es \" stable/mysql\", la tarea ejecutará \"helm install stable/mysql\".", + "loc.input.label.chartPath": "Ruta de acceso del gráfico", + "loc.input.help.chartPath": "Ruta de acceso del gráfico para instalar. Puede ser una ruta de acceso a un gráfico empaquetado o una ruta de acceso a un directorio de gráfico desempaquetado. Por ejemplo, si se especifica \"./redis\", la tarea ejecutará \"helm install ./redis\".", + "loc.input.label.version": "Versión", + "loc.input.help.version": "Especifique la versión exacta del gráfico para instalar. Si no se especifica, se instala la versión más reciente. Establezca la versión del gráfico en esta versión de semver", + "loc.input.label.releaseName": "Nombre de versión", + "loc.input.help.releaseName": "Nombre de la versión. Si no se especifica, se generará una automáticamente.", + "loc.input.label.overrideValues": "Valores establecidos", + "loc.input.help.overrideValues": "Establezca los valores en la línea de comandos (puede especificar valores múltiples o separados con comas o líneas nuevas: key1=val1,key2=val2 o
key1=val1
key2=val2
). La tarea construirá el comando helm con estos valores establecidos. Por ejemplo, helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Archivo de valores", + "loc.input.help.valueFile": "Especifique valores en un archivo YAML o una dirección URL. Por ejemplo, la especificación de myvalues.yaml dará como resultado \"helm install --values=myvals.yaml\".", + "loc.input.label.destination": "Destino", + "loc.input.help.destination": "Especificar valores en un archivo YAML o una dirección URL.", + "loc.input.label.canaryimage": "Use la versión de la imagen del valor controlado.", + "loc.input.help.canaryimage": "Usar la imagen del valor controlado de Tiller, la versión anterior a la publicación más reciente de Tiller.", + "loc.input.label.upgradetiller": "Actualizar Tiller", + "loc.input.help.upgradetiller": "Actualice si Tiller ya está instalado.", + "loc.input.label.updatedependency": "Actualizar dependencia", + "loc.input.help.updatedependency": "Ejecute la actualización de la dependencia de helm antes de instalar el gráfico. Actualice las dependencias de \"requirements.yaml\" al directorio \"charts/\" antes del empaquetado", + "loc.input.label.save": "Guardar", + "loc.input.help.save": "Guardar gráfico empaquetado en el repositorio de gráfico local (true de forma predeterminada)", + "loc.input.label.install": "Instale si la versión no está presente.", + "loc.input.help.install": "Si ya no existe una versión con este nombre, ejecute una instalación.", + "loc.input.label.recreate": "Volver a crear pods.", + "loc.input.help.recreate": "Realiza el reinicio de pods para el recurso, si procede.", + "loc.input.label.resetValues": "Restablezca valores.", + "loc.input.help.resetValues": "Restablezca los valores a los que figuran integrados en el gráfico.", + "loc.input.label.force": "Forzar", + "loc.input.help.force": "Forzar la actualización de recursos a través de eliminar/volver a crear si es necesario", + "loc.input.label.waitForExecution": "Esperar", + "loc.input.help.waitForExecution": "Bloquear hasta que se complete la ejecución del comando.", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Opciones de comando de Helm.", + "loc.input.label.enableTls": "Habilitar TLS", + "loc.input.help.enableTls": "Habilita el uso de SSL entre Helm y Tiller.", + "loc.input.label.caCert": "Certificado de CA", + "loc.input.help.caCert": "Certificado de CA que se usó para emitir el certificado para el cliente tiller y helm.", + "loc.input.label.certificate": "Certificado", + "loc.input.help.certificate": "Especificar el certificado de Tiller o el certificado de cliente de Helm", + "loc.input.label.privatekey": "Llave", + "loc.input.help.privatekey": "Especifique la clave Tiller o la clave de cliente Helm", + "loc.input.label.tillernamespace": "Espacio de nombres de Tiller", + "loc.input.help.tillernamespace": "Especifique el espacio de nombres K8 de tiller.", + "loc.input.label.failOnStderr": "Error si se produce un error estándar", + "loc.input.help.failOnStderr": "Si es true, se producirá un error en la tarea si se escriben errores en la canalización de errores o si se escriben datos en la secuencia de error estándar. De lo contrario, la tarea se basará en el código de salida para determinar el error.", + "loc.input.label.publishPipelineMetadata": "Publicar los metadatos de canalización", + "loc.input.help.publishPipelineMetadata": "Si es true, la tarea recopilará y publicará los metadatos de implementación.", + "loc.input.label.chartNameForACR": "Nombre del gráfico para Azure Container Registry", + "loc.input.help.chartNameForACR": "Nombre del gráfico con el que este se almacenará en Azure Container Registry.", + "loc.input.label.chartPathForACR": "Ruta de acceso del gráfico para Azure Container Registry", + "loc.input.help.chartPathForACR": "Ruta de acceso al directorio del gráfico.", + "loc.messages.CantDownloadAccessProfile": "No se puede descargar el archivo de configuración del perfil de acceso o kube para el clúster %s. Motivo %s.", + "loc.messages.KubeConfigFilePath": "Ruta de acceso de archivo de Kubeconfig: %s", + "loc.messages.KubernetesClusterInfo": "Id. de clúster Kubernetes: %s, versión del servidor kubernetes %s, estado de aprovisionamiento de kubernetes %s", + "loc.messages.KubernetesClusterResourceGroup": "Clúster de Kubernetes %s, grupo de recursos %s.", + "loc.messages.ClusterNotProvisioned": "Observó que el clúster %s está en estado %s.", + "loc.messages.ClusterNotFound": "No existe el clúster %s", + "loc.messages.FailedToListClusters": "Error al enumerar los clústeres administrados en la suscripción. %s", + "loc.messages.RetryingRequest": "Reintentando solicitud después de %s segundos.", + "loc.messages.PatternNotFoundInFilePath": "El patrón no se encontró en la ruta de acceso de archivos %s.", + "loc.messages.CantResolvePatternInPath": "No se puede resolver el patrón en la ruta de archivo %s.", + "loc.messages.PatternFoundInPath": "Patrón encontrado en la ruta de acceso de archivos %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "No se pudo capturar el token de acceso para Azure. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Configure Managed Service Identity (MSI) para la máquina virtual \"https://aka.ms/azure-msi-docs\". Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS no habilitado en la tarea. Omitiendo la eliminación de certificados.", + "loc.messages.SkipDownloadSecureFiles": "TLS no habilitado en la tarea. Omitiendo la descarga de certificados.", + "loc.messages.FileNotFound": "No se encuentra en el archivo en %s", + "loc.messages.KubernetesServiceConnectionNotFound": "No se encontraron los detalles de la conexión de servicio de Kubernetes.", + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", + "loc.messages.SaveSupportedInHelmsV3Only": "Guardar un gráfico en Azure Container Registry solo se admite en Helms V3.", + "loc.messages.OutputVariableDataSizeExceeded": "La variable de salida no establecida como salida del comando de Helm superó la longitud máxima admitida. Longitud de salida: %s. Longitud máxima admitida: %s", + "loc.messages.KubeloginFailed": "Error de autenticación de Kubelogin. Excepción: %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/fr-FR/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..be5a3211e1b7 --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Créer des packages de charts Helm et les déployer", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?linkid=851275) ou [consulter la documentation de Helm](https://helm.sh/docs/)", + "loc.description": "Déployer, configurer et mettre à jour un cluster Kubernetes dans Azure Container Service en exécutant des commandes Helm", + "loc.instanceNameFormat": "helm $(commande)", + "loc.group.displayName.cluster": "Cluster Kubernetes", + "loc.group.displayName.commands": "Commandes", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.connectionType": "Type de connexion", + "loc.input.help.connectionType": "Sélectionnez 'Azure Resource Manager' pour vous connecter à Azure Kubernetes Service via une connexion de service Azure. Sélectionnez 'Connexion de service Kubernetes' pour vous connecter à un cluster Kubernetes via kubeconfig ou un compte de service", + "loc.input.label.azureSubscriptionEndpoint": "Abonnement Azure", + "loc.input.help.azureSubscriptionEndpoint": "Sélectionnez un abonnement Azure ayant votre service Azure Container Registry.", + "loc.input.label.azureResourceGroup": "Groupe de ressources", + "loc.input.help.azureResourceGroup": "Sélectionnez un groupe de ressources Azure.", + "loc.input.label.kubernetesCluster": "Cluster Kubernetes", + "loc.input.help.kubernetesCluster": "Sélectionnez un cluster managé Azure.", + "loc.input.label.useClusterAdmin": "Utiliser les informations d'identification de l'administrateur de cluster", + "loc.input.help.useClusterAdmin": "Utilisez les informations d'identification de l'administrateur de cluster à la place des informations d'identification de l'utilisateur de cluster par défaut.", + "loc.input.label.kubernetesServiceEndpoint": "Connexion au service Kubernetes", + "loc.input.help.kubernetesServiceEndpoint": "Sélectionnez une connexion au service Kubernetes.", + "loc.input.label.namespace": "Espace de noms", + "loc.input.help.namespace": "Spécifiez l'espace de noms K8 à utiliser. Vous pouvez spécifier l'utilisation de l'espace de noms Tiller dans la section avancée de la tâche, ou en passant l'option --tiller-namespace en tant qu'argument.", + "loc.input.label.azureSubscriptionEndpointForACR": "Abonnement Azure pour Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Sélectionnez un abonnement Azure ayant votre service Azure Container Registry.", + "loc.input.label.azureResourceGroupForACR": "Groupe de ressources", + "loc.input.help.azureResourceGroupForACR": "Sélectionnez le groupe de ressources Azure comportant votre registre de conteneurs.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Sélectionnez le registre de conteneurs Azure à utiliser pour l'envoi (push) des charts Helm.", + "loc.input.label.command": "Commande", + "loc.input.help.command": "Sélectionnez une commande helm.", + "loc.input.label.chartType": "Type de chart", + "loc.input.help.chartType": "Sélectionnez la façon dont vous souhaitez entrer les informations relatives au chart. Vous pouvez fournir le nom du chart ou le chemin de dossier/fichier du chart.", + "loc.input.label.chartName": "Nom de chart", + "loc.input.help.chartName": "Référence de chart à installer. Il peut s'agir d'une URL ou d'un nom de chart. Par exemple, si le nom du chart est 'stable/mysql', la tâche exécute 'helm install stable/mysql'.", + "loc.input.label.chartPath": "Chemin de chart", + "loc.input.help.chartPath": "Chemin du chart à installer. Il peut s'agir du chemin d'un chart empaqueté ou du chemin d'un répertoire de chart décompressé. Par exemple, si './redis' est spécifié, la tâche exécute 'helm install ./redis'.", + "loc.input.label.version": "Version", + "loc.input.help.version": "Spécifiez la version exacte du chart à installer. Si vous n'indiquez rien, la dernière version est installée. Définissez la version du chart en fonction de cette version SemVer​", + "loc.input.label.releaseName": "Nom de mise en production", + "loc.input.help.releaseName": "Nom de la mise en production. Si vous n'indiquez rien, il est automatiquement généré.", + "loc.input.label.overrideValues": "Définir des valeurs", + "loc.input.help.overrideValues": "Définissez les valeurs sur la ligne de commande (vous pouvez spécifier plusieurs valeurs et les séparer à l'aide de virgules ou de nouvelles lignes : key1=val1,key2=val2 ou
key1=val1
key2=val2
). La tâche construit la commande helm à l'aide des valeurs définies. Par exemple, helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Fichier de valeurs", + "loc.input.help.valueFile": "Spécifiez les valeurs dans un fichier YAML ou une URL. Par exemple, la spécification de myvalues.yaml correspond à 'helm install --values=myvals.yaml'.", + "loc.input.label.destination": "Destination", + "loc.input.help.destination": "Spécifiez les valeurs dans un fichier YAML ou une URL.", + "loc.input.label.canaryimage": "Utilisez une version d'image canary.", + "loc.input.help.canaryimage": "Utilisez l'image Tiller canary, la dernière version préliminaire de Tiller.", + "loc.input.label.upgradetiller": "Mettre à niveau Tiller", + "loc.input.help.upgradetiller": "Effectuez la mise à niveau si Tiller est déjà installé.", + "loc.input.label.updatedependency": "Mettre à jour la dépendance", + "loc.input.help.updatedependency": "Exécutez la mise à jour des dépendances helm avant d'installer le chart. Mettez à jour les dépendances de 'requirements.yaml' vers dir 'charts/' avant la création du package", + "loc.input.label.save": "Enregistrer", + "loc.input.help.save": "Enregistrer le chart empaqueté dans le dépôt de charts local (vrai par défaut)​", + "loc.input.label.install": "Effectuez l'installation si la mise en production n'est pas présente.", + "loc.input.help.install": "S'il n'existe aucune mise en production portant ce nom, effectuez une installation.", + "loc.input.label.recreate": "Recréez les pods.", + "loc.input.help.recreate": "Effectue le redémarrage des pods pour la ressource, le cas échéant.", + "loc.input.label.resetValues": "Réinitialisez les valeurs.", + "loc.input.help.resetValues": "Réinitialisez les valeurs en fonction de celles intégrées dans le chart.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Forcer la mise à jour des ressources par suppression/recréation si nécessaire​", + "loc.input.label.waitForExecution": "Attendre", + "loc.input.help.waitForExecution": "Bloquez l'opération jusqu'à la fin de l'exécution de la commande.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Options de commande Helm.", + "loc.input.label.enableTls": "Activer TLS", + "loc.input.help.enableTls": "Permet d'utiliser SSL entre Helm et Tiller.", + "loc.input.label.caCert": "Certificat d'autorité de certification", + "loc.input.help.caCert": "Certificat d'autorité de certification permettant d'émettre un certificat pour le client tiller et helm.", + "loc.input.label.certificate": "Certificat", + "loc.input.help.certificate": "Spécifier un certificat Tiller ou un certificat client Helm", + "loc.input.label.privatekey": "Clé", + "loc.input.help.privatekey": "Spécifier la clé Tiller ou la clé cliente Helm", + "loc.input.label.tillernamespace": "Espace de noms Tiller", + "loc.input.help.tillernamespace": "Spécifiez l'espace de noms K8 de tiller.", + "loc.input.label.failOnStderr": "Échec sur une erreur standard", + "loc.input.help.failOnStderr": "Si la valeur est true, et si des erreurs sont écrites dans le pipeline d'erreurs ou si des données sont écrites dans le flux d'erreurs standard, cette tâche se solde par un échec. Sinon, la tâche se base sur le code de sortie pour déterminer la cause de l'échec.", + "loc.input.label.publishPipelineMetadata": "Publier des métadonnées de pipeline", + "loc.input.help.publishPipelineMetadata": "Si cette condition est vérifiée, la tâche collecte et publie les métadonnées de déploiement", + "loc.input.label.chartNameForACR": "Nom de chart pour Azure Container Registry", + "loc.input.help.chartNameForACR": "Nom du chart qui sera stocké dans Azure Container Registry.", + "loc.input.label.chartPathForACR": "Chemin du chart pour Azure Container Registry", + "loc.input.help.chartPathForACR": "Chemin du répertoire du chart.", + "loc.messages.CantDownloadAccessProfile": "Impossible de télécharger le fichier config de profil d'accès/kube pour le cluster %s. Raison : %s.", + "loc.messages.KubeConfigFilePath": "Chemin de fichier Kubeconfig : %s", + "loc.messages.KubernetesClusterInfo": "ID de cluster Kubernetes : %s, version de serveur kubernetes : %s, état de provisionnement kubernetes : %s", + "loc.messages.KubernetesClusterResourceGroup": "Cluster Kubernetes : %s, groupe de ressources : %s.", + "loc.messages.ClusterNotProvisioned": "Observation indiquant que le cluster %s est à l'état %s.", + "loc.messages.ClusterNotFound": "Le cluster %s n'existe pas", + "loc.messages.FailedToListClusters": "Échec du listage des clusters managés dans l'abonnement. %s", + "loc.messages.RetryingRequest": "Nouvelle tentative d'interrogation après %s.", + "loc.messages.PatternNotFoundInFilePath": "Modèle introuvable dans le chemin de fichier %s.", + "loc.messages.CantResolvePatternInPath": "Impossible de résoudre le modèle du chemin de fichier %s.", + "loc.messages.PatternFoundInPath": "Modèle trouvé dans le chemin de fichier %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Configurez MSI (Managed Service Identity) pour la machine virtuelle 'https://aka.ms/azure-msi-docs'. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Code d'état : %s, message d'état : %s", + "loc.messages.SkipDeleteSecureFiles": "TLS non activé dans la tâche. Suppression des certificats ignorée.", + "loc.messages.SkipDownloadSecureFiles": "TLS non activé dans la tâche. Téléchargement des certificats ignoré.", + "loc.messages.FileNotFound": "Fichier introuvable sur %s", + "loc.messages.KubernetesServiceConnectionNotFound": "Les détails de la connexion de service Kubernetes sont introuvables.", + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", + "loc.messages.SaveSupportedInHelmsV3Only": "L'enregistrement du chart dans Azure Container Registry est pris en charge uniquement dans Helms V3.", + "loc.messages.OutputVariableDataSizeExceeded": "La variable de sortie non définie en tant que sortie de la commande Helm a dépassé la longueur maximale prise en charge. Longueur de sortie : %s. Longueur maximale prise en charge : %s", + "loc.messages.KubeloginFailed": "Échec de l’authentification Kubelogin. Exception : %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/it-IT/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..19722c0ba998 --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Crea pacchetto e distribuisci grafici Helm", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?linkid=851275). In alternativa [vedere la documentazione di Helm](https://helm.sh/docs/)", + "loc.description": "Consente di distribuire, configurare e aggiornare un cluster Kubernetes nel servizio contenitore di Azure eseguendo i comandi di Helm", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Cluster Kubernetes", + "loc.group.displayName.commands": "Comandi", + "loc.group.displayName.azureContainerRegistry": "Registro Azure Container", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.connectionType": "Tipo di connessione", + "loc.input.help.connectionType": "Selezionare 'Azure Resource Manager' per connettersi a un servizio Azure Kubernetes tramite la connessione al servizio di Azure. Selezionare 'Connessione al servizio Kubernetes' per connettersi a qualsiasi cluster Kubernetes tramite kubeconfig o l'account del servizio", + "loc.input.label.azureSubscriptionEndpoint": "Sottoscrizione di Azure", + "loc.input.help.azureSubscriptionEndpoint": "Consente di selezionare una sottoscrizione di Azure in cui è presente il registro contenitori di Azure.", + "loc.input.label.azureResourceGroup": "Gruppo di risorse", + "loc.input.help.azureResourceGroup": "Consente di selezionare un gruppo di risorse di Azure.", + "loc.input.label.kubernetesCluster": "Cluster Kubernetes", + "loc.input.help.kubernetesCluster": "Consente di selezionare un cluster gestito di Azure.", + "loc.input.label.useClusterAdmin": "Usa credenziali dell'amministratore del cluster", + "loc.input.help.useClusterAdmin": "Consente di usare le credenziali dell'amministratore del cluster invece delle credenziali utente del cluster predefinite.", + "loc.input.label.kubernetesServiceEndpoint": "Connessione a servizio Kubernetes", + "loc.input.help.kubernetesServiceEndpoint": "Consente di selezionare una connessione al servizio Kubernetes.", + "loc.input.label.namespace": "Spazio dei nomi", + "loc.input.help.namespace": "Consente di specificare lo spazio dei nomi K8 da usare. Per specificare l'uso dello spazio dei nomi Tiller, è possibile indicarlo nella sezione delle impostazioni avanzate dell'attività oppure passare come argomento l'opzione --tiller-namespace.", + "loc.input.label.azureSubscriptionEndpointForACR": "Sottoscrizione di Azure per Registro Container", + "loc.input.help.azureSubscriptionEndpointForACR": "Consente di selezionare una sottoscrizione di Azure in cui è presente il registro contenitori di Azure.", + "loc.input.label.azureResourceGroupForACR": "Gruppo di risorse", + "loc.input.help.azureResourceGroupForACR": "Consente di selezionare un gruppo di risorse di Azure in cui è presente l'istanza di Registro Container.", + "loc.input.label.azureContainerRegistry": "Registro contenitori di Azure", + "loc.input.help.azureContainerRegistry": "Consente di selezionare un'istanza di Registro Azure Container che verrà usata per il push dei grafici Helm.", + "loc.input.label.command": "Comando", + "loc.input.help.command": "Consente di selezionare un comando di Helm.", + "loc.input.label.chartType": "Tipo di grafico", + "loc.input.help.chartType": "Consente di selezionare come immettere le informazioni sul grafico. È possibile specificare il nome oppure il percorso della cartella o del file del grafico.", + "loc.input.label.chartName": "Nome del grafico", + "loc.input.help.chartName": "Riferimento al grafico da installare. Può essere un URL o un nome di grafico. Se ad esempio il nome del grafico è 'stable/mysql', l'attività eseguirà 'helm install stable/mysql'.", + "loc.input.label.chartPath": "Percorso del grafico", + "loc.input.help.chartPath": "Percorso del grafico da installare. Può essere un percorso di un grafico incluso in un pacchetto oppure il percorso di una directory di grafici non inclusi in un pacchetto. Se ad esempio si specifica './redis', l'attività eseguirà 'helm install ./redis'.", + "loc.input.label.version": "Versione", + "loc.input.help.version": "Consente di specificare la versione esatta del grafico da installare. Se non viene specificata, verrà installata la versione più recente. Impostare la versione nel grafico su questa versione di semver", + "loc.input.label.releaseName": "Nome della versione", + "loc.input.help.releaseName": "Nome della versione. Se non viene specificato, ne verrà generato uno automaticamente.", + "loc.input.label.overrideValues": "Imposta valori", + "loc.input.help.overrideValues": "Consente di impostare valori sulla riga di comando. È possibile specificare più valori distinti delimitati da virgole o caratteri di nuova riga: chiave1=val1,chiave2=val2 o
chiave1=val1
chiave2=val2
. L'attività costruirà il comando helm usando questi valori impostati, ad esempio helm install --set chiave1=val1 ./redis.", + "loc.input.label.valueFile": "File di valori", + "loc.input.help.valueFile": "Consente di specificare i valori in un file YAML o un URL. Se ad esempio si specifica myvalues.yaml, si otterrà 'helm install --values=myvals.yaml'.", + "loc.input.label.destination": "Destinazione", + "loc.input.help.destination": "Consente di specificare i valori in un file YAML o in un URL.", + "loc.input.label.canaryimage": "Usa la versione canary dell'immagine.", + "loc.input.help.canaryimage": "Consente di usare l'immagine canary di Tiller, la versione preliminare più recente di Tiller.", + "loc.input.label.upgradetiller": "Aggiorna Tiller", + "loc.input.help.upgradetiller": "Esegue l'aggiornamento se Tiller è già installato.", + "loc.input.label.updatedependency": "Aggiorna la dipendenza", + "loc.input.help.updatedependency": "Esegue l'aggiornamento delle dipendenze di Helm prima di installare il grafico. Aggiornare le dipendenze da 'requirements.yaml' alla directory 'charts/' prima di creare il pacchetto", + "loc.input.label.save": "Salva", + "loc.input.help.save": "Consente di salvare il grafico aggiunto a un pacchetto nel repository di grafici locale (impostazione predefinita: true)", + "loc.input.label.install": "Installa la versione se non è presente.", + "loc.input.help.install": "Se non esiste alcuna risorsa con questo nome, esegue un'installazione.", + "loc.input.label.recreate": "Ricrea i pod.", + "loc.input.help.recreate": "Se applicabile, esegue il riavvio dei pod per la risorsa.", + "loc.input.label.resetValues": "Ripristina i valori.", + "loc.input.help.resetValues": "Consente di ripristinare i valori predefiniti nel grafico.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Se necessario, forza l'aggiornamento delle risorse tramite delete/recreate", + "loc.input.label.waitForExecution": "Attendi", + "loc.input.help.waitForExecution": "Blocca finché non viene completata l'esecuzione del comando.", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Opzioni dei comandi di Helm.", + "loc.input.label.enableTls": "Abilita TLS", + "loc.input.help.enableTls": "Abilita l'uso di SSL tra Helm e Tiller.", + "loc.input.label.caCert": "Certificato della CA", + "loc.input.help.caCert": "Certificato della CA usato per rilasciare il certificato per Tiller o il client Helm.", + "loc.input.label.certificate": "Certificato", + "loc.input.help.certificate": "Consente di specificare il certificato di Tiller o del client Helm", + "loc.input.label.privatekey": "Chiave", + "loc.input.help.privatekey": "Consente di specificare la chiave di Tiller o del client Helm", + "loc.input.label.tillernamespace": "Spazio dei nomi di Tiller", + "loc.input.help.tillernamespace": "Consente di specificare lo spazio dei nomi K8 di Tiller.", + "loc.input.label.failOnStderr": "Interrompi in caso di errore standard", + "loc.input.help.failOnStderr": "Se il valore è true, questa attività non riuscirà nel caso in cui vengano scritti errori nella pipeline degli errori oppure se vengono scritti dati nel flusso Errore standard. In caso contrario, l'attività si baserà sul codice di uscita per determinare l'errore.", + "loc.input.label.publishPipelineMetadata": "Pubblica i metadati della pipeline", + "loc.input.help.publishPipelineMetadata": "Se è true, l'attività raccoglierà e pubblicherà i metadati della distribuzione", + "loc.input.label.chartNameForACR": "Nome del grafico per Registro Azure Container", + "loc.input.help.chartNameForACR": "Nome del grafico con il quale il grafico verrà archiviato nell'istanza di Registro Azure Container.", + "loc.input.label.chartPathForACR": "Percorso del grafico per Registro Azure Container", + "loc.input.help.chartPathForACR": "Percorso della directory del grafico.", + "loc.messages.CantDownloadAccessProfile": "Non è possibile scaricare il profilo di accesso o il file di configurazione kube per il cluster %s. Motivo: %s.", + "loc.messages.KubeConfigFilePath": "Percorso del file kubeconfig: %s", + "loc.messages.KubernetesClusterInfo": "ID cluster Kubernetes: %s. Versione del server Kubernetes: %s. Stato di provisioning di Kubernetes: %s", + "loc.messages.KubernetesClusterResourceGroup": "Cluster Kubernetes %s, gruppo di risorse %s.", + "loc.messages.ClusterNotProvisioned": "È stato notato che il cluster %s si trova nello stato %s.", + "loc.messages.ClusterNotFound": "Il cluster %s non esiste", + "loc.messages.FailedToListClusters": "Non è stato possibile elencare i cluster gestiti nella sottoscrizione. %s", + "loc.messages.RetryingRequest": "La richiesta verrà ripetuta dopo %s secondi.", + "loc.messages.PatternNotFoundInFilePath": "Criterio non trovato nel percorso file %s.", + "loc.messages.CantResolvePatternInPath": "Non è possibile risolvere il criterio nel percorso file %s.", + "loc.messages.PatternFoundInPath": "Criterio trovato nel percorso file %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Non è stato possibile recuperare il token di accesso per Azure. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Configurare l'identità del servizio gestita per la macchina virtuale 'https://aka.ms/azure-msi-docs'. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS non è abilitato nell'attività. L'eliminazione dei certificati verrà ignorata.", + "loc.messages.SkipDownloadSecureFiles": "TLS non è abilitato nell'attività. Il download dei certificati verrà ignorato.", + "loc.messages.FileNotFound": "Il file non è stato trovato in %s", + "loc.messages.KubernetesServiceConnectionNotFound": "I dettagli della connessione al servizio Kubernetes non sono stati trovati.", + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", + "loc.messages.SaveSupportedInHelmsV3Only": "Il salvataggio del grafico in Registro Azure Container è supportato solo Helm V3.", + "loc.messages.OutputVariableDataSizeExceeded": "La variabile di output non impostata come output del comando Helm supera la lunghezza massima supportata. Lunghezza dell'output: %s. Lunghezza massima supportata: %s", + "loc.messages.KubeloginFailed": "Autenticazione Kubelogin non riuscita. Eccezione: %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/ja-JP/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..e969cca5eb29 --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Helm Charts のパッケージ化と配置", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?linkid=851275)、または [Helm のドキュメントを参照](https://helm.sh/docs/)", + "loc.description": "helm コマンドを実行して、Azure Container Service で Kubernetes クラスターをデプロイ、構成、更新します", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes クラスター", + "loc.group.displayName.commands": "コマンド", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.connectionType": "接続の種類", + "loc.input.help.connectionType": "Azure サービス接続を使用して Azure Kubernetes Service に接続するには、[Azure Resource Manager] を選択します。kubeconfig またはサービス アカウントを使用して任意の Kubernetes クラスターに接続するには、[Kubernetes サービス接続] を選択します。", + "loc.input.label.azureSubscriptionEndpoint": "Azure サブスクリプション", + "loc.input.help.azureSubscriptionEndpoint": "Azure Container Registry が含まれる Azure サブスクリプションを選択します。", + "loc.input.label.azureResourceGroup": "リソース グループ", + "loc.input.help.azureResourceGroup": "Azure リソース グループを選択します。", + "loc.input.label.kubernetesCluster": "Kubernetes クラスター", + "loc.input.help.kubernetesCluster": "Azure 管理対象クラスターを選択します。", + "loc.input.label.useClusterAdmin": "クラスター管理者の資格情報を使用する", + "loc.input.help.useClusterAdmin": "既定のクラスター ユーザーの資格情報ではなく、クラスター管理者の資格情報をご使用ください。", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes サービス接続", + "loc.input.help.kubernetesServiceEndpoint": "Kubernetes サービス接続を選択します。", + "loc.input.label.namespace": "名前空間", + "loc.input.help.namespace": "使用する K8 名前空間を指定します。Tiller 名前空間は、タスクの詳細セクションで指定するか、引数として --tiller-namespace オプションを渡すことで指定できます。", + "loc.input.label.azureSubscriptionEndpointForACR": "Container Registry の Azure サブスクリプション", + "loc.input.help.azureSubscriptionEndpointForACR": "Azure Container Registry が含まれる Azure サブスクリプションを選択します。", + "loc.input.label.azureResourceGroupForACR": "リソース グループ", + "loc.input.help.azureResourceGroupForACR": "ご使用のコンテナー レジストリが含まれる Azure リソース グループを選択します。", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Helm chart のプッシュに使用される Azure コンテナー レジストリを選択します。", + "loc.input.label.command": "コマンド", + "loc.input.help.command": "helm コマンドを選択します。", + "loc.input.label.chartType": "グラフの種類", + "loc.input.help.chartType": "Chart 情報を入力する方法を選択します。Chart 名または Chart のフォルダー/ファイルのパスを指定できます。", + "loc.input.label.chartName": "Chart 名", + "loc.input.help.chartName": "インストールする Chart の参照で、url または Chart 名。たとえば、Chart 名が 'stable/mysql' の場合、タスクは 'helm install stable/mysql' を実行します。", + "loc.input.label.chartPath": "Chart パス", + "loc.input.help.chartPath": "インストールする Chart へのパス。これは、パッケージ化された Chart またはアンパックした Chart ディレクトリへのパスです。たとえば、'./redis' が指定された場合、タスクは 'helm install ./redis' を実行します。", + "loc.input.label.version": "バージョン", + "loc.input.help.version": "インストールする正確な Chart のバージョンを指定します。指定されていない場合は、最新バージョンがインストールされます。この semver バージョンに Chart のバージョンを設定します", + "loc.input.label.releaseName": "リリース名", + "loc.input.help.releaseName": "リリース名です。指定しない場合、自動生成されます。", + "loc.input.label.overrideValues": "設定された値", + "loc.input.help.overrideValues": "コマンド ラインで設定される値 (コンマまたは改行を使用して、複数または別個の値を指定できます。key1=val1,key2=val2 または
key1=val1
key2=val2
)。このタスクにより、これらの設定された値を使用して helm コマンドが構築されます。たとえば、helm install --set key1=val1 ./redis です。", + "loc.input.label.valueFile": "値ファイル", + "loc.input.help.valueFile": "YAML ファイルまたは URL の値を指定します。たとえば、myvalues.yaml と指定すると、'helm install --values=myvals.yaml' になります。", + "loc.input.label.destination": "宛先", + "loc.input.help.destination": "YAML ファイルまたは URL の値を指定します。", + "loc.input.label.canaryimage": "カナリア イメージのバージョンを使用します。", + "loc.input.help.canaryimage": "カナリア Tiller イメージ、Tiller の最新プレリリース バージョンを使用します。", + "loc.input.label.upgradetiller": "Tiller をアップグレードする", + "loc.input.help.upgradetiller": "Tiller が既にインストールされている場合、アップグレードします。", + "loc.input.label.updatedependency": "依存関係を更新する", + "loc.input.help.updatedependency": "Chart をインストールする前に、Helm の依存関係の更新を実行します。パッケージ化の前に依存関係を 'requirements.yaml' からディレクトリ 'charts/' に更新します", + "loc.input.label.save": "保存", + "loc.input.help.save": "パッケージ化された Chart をローカル Chart リポジトリに保存する (既定値は true) ", + "loc.input.label.install": "リリースがない場合、インストールします。", + "loc.input.help.install": "この名前のリリースがまだ存在しない場合は、インストールを実行します。", + "loc.input.label.recreate": "ポッドを再作成します。", + "loc.input.help.recreate": "該当する場合は、リソースに対してポッドの再起動を実行します。", + "loc.input.label.resetValues": "値をリセットします。", + "loc.input.help.resetValues": "値を Chart に組み込まれている値にリセットします。", + "loc.input.label.force": "Force", + "loc.input.help.force": "必要に応じて、削除/再作成によりリソースの更新を強制する", + "loc.input.label.waitForExecution": "待機", + "loc.input.help.waitForExecution": "コマンドの実行が完了するまでブロックします。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "Helm コマンド オプションです。", + "loc.input.label.enableTls": "TLS を有効にする", + "loc.input.help.enableTls": "Helm と Tiller との間の SSL の使用を有効にします。", + "loc.input.label.caCert": "CA 証明書", + "loc.input.help.caCert": "Tiller と Helm クライアントに証明書を発行するために使用される CA Cert です。", + "loc.input.label.certificate": "証明書", + "loc.input.help.certificate": "Tiller 証明書または Helm クライアント証明書を指定します", + "loc.input.label.privatekey": "キー", + "loc.input.help.privatekey": "Tiller キーまたは Helm クライアント キーを指定します", + "loc.input.label.tillernamespace": "Tiller 名前空間", + "loc.input.help.tillernamespace": "Tiller の K8 名前空間を指定します。", + "loc.input.label.failOnStderr": "標準エラーで失敗", + "loc.input.help.failOnStderr": "これが true の場合、エラーがエラー パイプラインに書き込まれるか、データが標準エラー ストリームに書き込まれると、このタスクは失敗します。それ以外の場合、タスクは終了コードに応じて失敗を判別します。", + "loc.input.label.publishPipelineMetadata": "パイプライン メタデータの公開", + "loc.input.help.publishPipelineMetadata": "これが true の場合、タスクによってデプロイのメタデータが収集および公開されます", + "loc.input.label.chartNameForACR": "Azure Container Registry の chart 名", + "loc.input.help.chartNameForACR": "Azure Container Registry に格納される chart の名前。", + "loc.input.label.chartPathForACR": "Azure Container Registry の chart パス", + "loc.input.help.chartPathForACR": "chart ディレクトリへのパス。", + "loc.messages.CantDownloadAccessProfile": "クラスター %s のアクセス プロファイルまたは kube 構成ファイルをダウンロードできません。理由 %s。", + "loc.messages.KubeConfigFilePath": "Kubeconfig ファイル パス: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes クラスター ID: %s、Kubernetes サーバー バージョン %s、Kuberenettes プロビジョニングの状態 %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes クラスター %s、リソース グループ %s。", + "loc.messages.ClusterNotProvisioned": "クラスター %s の状態が %s であることが確認されました。", + "loc.messages.ClusterNotFound": "クラスター %s は存在しません", + "loc.messages.FailedToListClusters": "サブスクリプション内のマネージド クラスターを一覧表示できませんでした。%s", + "loc.messages.RetryingRequest": "%s 秒後に要求を再試行しています。", + "loc.messages.PatternNotFoundInFilePath": "パターンがファイル パス %s で見つかりませんでした。", + "loc.messages.CantResolvePatternInPath": "ファイル パス %s のパターンを解決できません。", + "loc.messages.PatternFoundInPath": "パターンがファイル パス %s で見つかりました。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure 用のアクセス トークンをフェッチできませんでした。状態コード: %s、状態メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。仮想マシンのマネージド サービス ID (MSI) を構成してください 'https://aka.ms/azure-msi-docs'。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.SkipDeleteSecureFiles": "タスクで TLS が有効になっていません。証明書の削除をスキップしています。", + "loc.messages.SkipDownloadSecureFiles": "タスクで TLS が有効になっていません。証明書のダウンロードをスキップしています。", + "loc.messages.FileNotFound": "%s でファイルが見つかりませんでした", + "loc.messages.KubernetesServiceConnectionNotFound": "Kubernetes サービス接続の詳細が見つかりませんでした。", + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", + "loc.messages.SaveSupportedInHelmsV3Only": "Azure Container Registry への chart の保存は、Helm V3 でのみサポートされています。", + "loc.messages.OutputVariableDataSizeExceeded": "Helm コマンドの出力がサポートされている最大長を超えたため、出力変数が設定されませんでした。出力の長さ: %s、サポートされている最大長: %s", + "loc.messages.KubeloginFailed": "Kubelogin 認証に失敗しました。例外: %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/ko-KR/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..f234e8bd3f38 --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Helm 차트 패키지 및 배포", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?linkid=851275) 또는 [Helm 설명서 참조](https://helm.sh/docs/)", + "loc.description": "helm 명령을 실행하여 Azure Container Service에서 Kubernetes 클러스터를 배포, 구성, 업데이트합니다.", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes 클러스터", + "loc.group.displayName.commands": "명령", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "고급", + "loc.input.label.connectionType": "연결 형식", + "loc.input.help.connectionType": "Azure 서비스 연결을 사용하여 Azure Kubernetes Service에 연결하려면 'Azure Resource Manager'를 선택합니다. Kubeconfig 또는 서비스 계정을 사용하여 Kubernetes 클러스터에 연결하려면 'Kubernetes 서비스 연결'을 선택합니다.", + "loc.input.label.azureSubscriptionEndpoint": "Azure 구독", + "loc.input.help.azureSubscriptionEndpoint": "Azure Container Registry가 있는 Azure 구독을 선택하세요.", + "loc.input.label.azureResourceGroup": "리소스 그룹", + "loc.input.help.azureResourceGroup": "Azure 리소스 그룹을 선택합니다.", + "loc.input.label.kubernetesCluster": "Kubernetes 클러스터", + "loc.input.help.kubernetesCluster": "Azure 관리 클러스터를 선택합니다.", + "loc.input.label.useClusterAdmin": "클러스터 관리자 자격 증명 사용", + "loc.input.help.useClusterAdmin": "기본 클러스터 사용자 자격 증명 대신 클러스터 관리자 자격 증명을 사용합니다.", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes 서비스 연결", + "loc.input.help.kubernetesServiceEndpoint": "Kubernetes 서비스 연결을 선택합니다.", + "loc.input.label.namespace": "네임스페이스", + "loc.input.help.namespace": "사용할 K8 네임스페이스를 지정합니다. 작업의 고급 섹션에서 또는 --tiller-namespace 옵션을 인수로 전달하여 Tiller 네임스페이스 사용을 지정할 수 있습니다.", + "loc.input.label.azureSubscriptionEndpointForACR": "Container Registry에 대한 Azure 구독", + "loc.input.help.azureSubscriptionEndpointForACR": "Azure Container Registry가 있는 Azure 구독을 선택하세요.", + "loc.input.label.azureResourceGroupForACR": "리소스 그룹", + "loc.input.help.azureResourceGroupForACR": "Container Registry가 포함된 Azure 리소스 그룹을 선택합니다.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Helm 차트를 푸시하는 데 사용할 Azure Container Registry를 선택합니다.", + "loc.input.label.command": "명령", + "loc.input.help.command": "helm 명령을 선택합니다.", + "loc.input.label.chartType": "차트 종류", + "loc.input.help.chartType": "차트 정보를 입력하는 방법을 선택합니다. 차트 이름이나 차트에 대한 폴더/파일 경로를 입력할 수 있습니다.", + "loc.input.label.chartName": "차트 이름", + "loc.input.help.chartName": "설치할 차트 참조입니다. URL 또는 차트 이름일 수 있습니다. 예를 들어 차트 이름이 'stable/mysql'이면 작업은 'helm install stable/mysql'을 실행합니다.", + "loc.input.label.chartPath": "차트 경로", + "loc.input.help.chartPath": "설치할 차트의 경로입니다. 패키지된 차트의 경로 또는 압축을 푼 차트 디렉터리의 경로일 수 있습니다. 예를 들어 './redis'를 지정하면 작업은 'helm install ./redis'를 실행합니다.", + "loc.input.label.version": "버전", + "loc.input.help.version": "설치할 차트 버전을 정확하게 지정합니다. 지정하지 않으면 최신 버전이 설치됩니다. 차트의 버전을 이 semver 버전으로 설정합니다.", + "loc.input.label.releaseName": "릴리스 이름", + "loc.input.help.releaseName": "릴리스 이름입니다. 지정하지 않으면 자동으로 생성됩니다.", + "loc.input.label.overrideValues": "값 설정", + "loc.input.help.overrideValues": "명령줄에서 값을 설정합니다(값을 여러 개 지정하거나 key1=val1,key2=val2 또는
key1=val1
key2=val2
와 같이 쉼표나 줄 바꿈으로 구분할 수 있음). 작업은 이렇게 설정된 값을 사용하여 Helm 명령을 생성합니다(예: helm install --set key1=val1 ./redis).", + "loc.input.label.valueFile": "값 파일", + "loc.input.help.valueFile": "YAML 파일에 값을 지정하거나, URL을 지정합니다. 예를 들어 myvalues.yaml을 지정하면 'helm install --values=myvals.yaml'이 실행됩니다.", + "loc.input.label.destination": "대상", + "loc.input.help.destination": "YAML 파일에 값을 지정하거나, URL을 지정합니다.", + "loc.input.label.canaryimage": "카나리아 이미지 버전을 사용합니다.", + "loc.input.help.canaryimage": "Tiller의 최신 시험판 버전인 카나리아 Tiller 이미지를 사용합니다.", + "loc.input.label.upgradetiller": "Tiller 업그레이드", + "loc.input.help.upgradetiller": "Tiller가 이미 설치된 경우 업그레이드합니다.", + "loc.input.label.updatedependency": "종속성 업데이트", + "loc.input.help.updatedependency": "차트를 설치하기 전에 helm 종속성 업데이트를 실행합니다. 패키지 전에 종속성을 'requirements.yaml'에서 dir 'charts/'로 업데이트합니다.", + "loc.input.label.save": "저장", + "loc.input.help.save": "패키지된 차트를 로컬 차트 리포지토리에 저장합니다(기본값 true).", + "loc.input.label.install": "릴리스가 없는 경우 설치", + "loc.input.help.install": "이 이름을 가진 릴리스가 없는 경우 설치를 실행합니다.", + "loc.input.label.recreate": "Pod 다시 만들기", + "loc.input.help.recreate": "해당하는 경우 리소스에 대해 Pod 다시 시작을 수행합니다.", + "loc.input.label.resetValues": "값 다시 설정", + "loc.input.help.resetValues": "값을 차트에 기본 제공된 값으로 다시 설정합니다.", + "loc.input.label.force": "Force", + "loc.input.help.force": "필요한 경우 삭제/다시 만들기를 통해 리소스를 강제로 업데이트합니다.", + "loc.input.label.waitForExecution": "대기", + "loc.input.help.waitForExecution": "명령 실행이 완료될 때까지 차단합니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "Helm 명령 옵션입니다.", + "loc.input.label.enableTls": "TLS 사용", + "loc.input.help.enableTls": "Helm 및 Tiller 간에 SSL을 사용하도록 설정합니다.", + "loc.input.label.caCert": "CA 인증서", + "loc.input.help.caCert": "tiller 및 helm 클라이언트에 대한 인증서를 발급하는 데 사용되는 CA 인증서입니다.", + "loc.input.label.certificate": "인증서", + "loc.input.help.certificate": "Tiller 인증서 또는 Helm 클라이언트 인증서를 지정합니다.", + "loc.input.label.privatekey": "키", + "loc.input.help.privatekey": "Tiller 키 또는 Helm 클라이언트 키를 지정합니다.", + "loc.input.label.tillernamespace": "Tiller 네임스페이스", + "loc.input.help.tillernamespace": "tiller의 K8 네임스페이스를 지정합니다.", + "loc.input.label.failOnStderr": "표준 오류 시 실패", + "loc.input.help.failOnStderr": "true이면 오류 파이프라인에 오류가 작성되거나 표준 오류 스트림에 데이터가 작성될 경우 이 작업이 실패하게 됩니다. false이면 작업이 종료 코드를 사용하여 실패를 결정합니다.", + "loc.input.label.publishPipelineMetadata": "파이프라인 메타데이터 게시", + "loc.input.help.publishPipelineMetadata": "true이면 작업이 배포 메타데이터를 수집하고 게시합니다.", + "loc.input.label.chartNameForACR": "Azure Container Registry에 대한 차트 이름", + "loc.input.help.chartNameForACR": "Azure Container Registry에서 차트가 저장될 때 사용할 차트 이름입니다.", + "loc.input.label.chartPathForACR": "Azure Container Registry에 대한 차트 경로", + "loc.input.help.chartPathForACR": "차트 디렉터리의 경로입니다.", + "loc.messages.CantDownloadAccessProfile": "%s 클러스터의 액세스 프로필/kube 구성 파일을 다운로드할 수 없습니다. 이유: %s.", + "loc.messages.KubeConfigFilePath": "Kubeconfig 파일 경로: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes 클러스터 ID: %s, kubernetes 서버 버전 %s, kuberenetes 프로비전 상태 %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes 클러스터 %s, 리소스 그룹 %s.", + "loc.messages.ClusterNotProvisioned": "%s 클러스터는 %s 상태인 것으로 확인되었습니다.", + "loc.messages.ClusterNotFound": "%s 클러스터가 없습니다.", + "loc.messages.FailedToListClusters": "구독의 관리 클러스터를 나열하지 못했습니다. %s", + "loc.messages.RetryingRequest": "%s초 후에 요청을 다시 시도합니다.", + "loc.messages.PatternNotFoundInFilePath": "파일 경로 %s에 패턴이 없습니다.", + "loc.messages.CantResolvePatternInPath": "파일 경로 %s의 패턴을 확인할 수 없습니다.", + "loc.messages.PatternFoundInPath": "파일 경로 %s에 패턴이 있습니다.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 가상 머신에 대한 MSI(관리 서비스 ID)를 구성하세요('https://aka.ms/azure-msi-docs'). 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.SkipDeleteSecureFiles": "작업에서 TLS를 사용할 수 없습니다. 인증서 삭제를 건너뜁니다.", + "loc.messages.SkipDownloadSecureFiles": "작업에서 TLS를 사용할 수 없습니다. 인증서 다운로드를 건너뜁니다.", + "loc.messages.FileNotFound": "%s에 파일에 없습니다.", + "loc.messages.KubernetesServiceConnectionNotFound": "Kubernetes 서비스 연결 정보를 찾을 수 없습니다.", + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", + "loc.messages.SaveSupportedInHelmsV3Only": "Helms V3에서만 Azure Container Registry에 차트를 저장할 수 있습니다.", + "loc.messages.OutputVariableDataSizeExceeded": "Helm 명령 출력으로 설정되지 않은 출력 변수가 지원되는 최대 길이를 초과했습니다. 출력 길이: %s, 지원되는 최대 길이: %s", + "loc.messages.KubeloginFailed": "Kubelogin 인증에 실패했습니다. 예외: %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/ru-RU/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..5a2c786be1ef --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Упаковка и развертывание диаграмм Helm", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?linkid=851275) или [документацию по Helm](https://helm.sh/docs/)", + "loc.description": "Развертывание, настройка и обновление кластера Kubernetes в Службе контейнеров Azure с помощью команд helm", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Кластер Kubernetes", + "loc.group.displayName.commands": "Команды", + "loc.group.displayName.azureContainerRegistry": "Реестр контейнеров Azure", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.connectionType": "Тип подключения", + "loc.input.help.connectionType": "Выберите Azure Resource Manager, чтобы подключиться к Службе Azure Kubernetes с помощью подключения к службе Azure. Выберите \"Подключение к службе Kubernetes\", чтобы подключиться к любому кластеру Kubernetes с помощью kubeconfig или учетной записи службы", + "loc.input.label.azureSubscriptionEndpoint": "Подписка Azure", + "loc.input.help.azureSubscriptionEndpoint": "Выберите подписку Azure, которая содержит реестр контейнеров Azure.", + "loc.input.label.azureResourceGroup": "Группа ресурсов", + "loc.input.help.azureResourceGroup": "Выберите группу ресурсов Azure.", + "loc.input.label.kubernetesCluster": "Кластер Kubernetes", + "loc.input.help.kubernetesCluster": "Выберите управляемый кластер Azure.", + "loc.input.label.useClusterAdmin": "Использовать учетные данные администратора кластера", + "loc.input.help.useClusterAdmin": "Используйте учетные данные администратора кластера вместо учетных данных пользователя кластера по умолчанию.", + "loc.input.label.kubernetesServiceEndpoint": "Подключение службы Kubernetes", + "loc.input.help.kubernetesServiceEndpoint": "Выберите подключение службы Kubernetes.", + "loc.input.label.namespace": "Пространство имен", + "loc.input.help.namespace": "Укажите пространство имен K8, которое необходимо использовать. Пространство имен Tiller можно указать в разделе \"Дополнительно\" задачи или передав параметр --tiller-namespace в качестве аргумента.", + "loc.input.label.azureSubscriptionEndpointForACR": "Подписка Azure для Реестра контейнеров", + "loc.input.help.azureSubscriptionEndpointForACR": "Выберите подписку Azure, которая содержит реестр контейнеров Azure.", + "loc.input.label.azureResourceGroupForACR": "Группа ресурсов", + "loc.input.help.azureResourceGroupForACR": "Выберите группу ресурсов Azure, в которой находится Реестр контейнеров.", + "loc.input.label.azureContainerRegistry": "Реестр контейнеров Azure", + "loc.input.help.azureContainerRegistry": "Выберите Реестр контейнеров Azure, который будет использоваться для отправки диаграмм Helm.", + "loc.input.label.command": "Команда", + "loc.input.help.command": "Выберите команду helm.", + "loc.input.label.chartType": "Тип диаграммы", + "loc.input.help.chartType": "Выберите способ ввода сведений о диаграмме. Можно указать имя диаграммы либо путь к файлу диаграммы.", + "loc.input.label.chartName": "Имя диаграммы", + "loc.input.help.chartName": "Ссылка на устанавливаемую диаграмму. Это может быть URL-адрес или имя диаграммы. Например, если указано имя диаграммы stable/mysql, задача выполнит команду helm install stable/mysql.", + "loc.input.label.chartPath": "Путь к диаграмме", + "loc.input.help.chartPath": "Путь к диаграмме, которую необходимо установить. Это может быть путь к упакованной диаграмме или к каталогу с распакованной диаграммой. Например, если указано значение \"./redis\", задача выполнит команду \"helm install ./redis\".", + "loc.input.label.version": "Версия", + "loc.input.help.version": "Укажите точную версию диаграммы для установки. Если этот параметр не указан, будет установлена последняя версия. Присвойте эту версию SemVer диаграмме​", + "loc.input.label.releaseName": "Имя выпуска", + "loc.input.help.releaseName": "Имя выпуска. Если имя не указано, оно будет создано автоматически.", + "loc.input.label.overrideValues": "Настройка значений", + "loc.input.help.overrideValues": "Задайте значения в командной строке (можно указать несколько значений через запятую или каждое значение с новой строки: key1=val1,key2=val2 или
key1=val1
key2=val2
). Задача сформирует команду helm с использованием этих значений. Пример: helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Файл значений", + "loc.input.help.valueFile": "Укажите значения в файле YAML или по URL-адресу. Например, если указать myvalues.yaml, будет выполнена команда \"helm install --values=myvals.yaml\".", + "loc.input.label.destination": "Назначение", + "loc.input.help.destination": "Укажите значения в файле YAML или по URL-адресу.", + "loc.input.label.canaryimage": "Используйте версию canary образа.", + "loc.input.help.canaryimage": "Используйте образ canary Tiller, последнюю предварительную версию Tiller.", + "loc.input.label.upgradetiller": "Обновить Tiller", + "loc.input.help.upgradetiller": "Выполните обновление, если Tiller уже установлен.", + "loc.input.label.updatedependency": "Обновить зависимость", + "loc.input.help.updatedependency": "Обновите зависимости helm перед установкой диаграммы. Обновите зависимости из файла requirements.yaml в каталоге charts/ перед упаковкой", + "loc.input.label.save": "Сохранить", + "loc.input.help.save": "Сохранить упакованную диаграмму в локальном репозитории диаграмм (по умолчанию true)​", + "loc.input.label.install": "Установите, если выпуск отсутствует.", + "loc.input.help.install": "Если выпуск с таким именем еще не существует, запустите установку.", + "loc.input.label.recreate": "Повторно создайте pod.", + "loc.input.help.recreate": "Выполняет перезапуск pod для ресурса, если это возможно.", + "loc.input.label.resetValues": "Сбросьте значения.", + "loc.input.help.resetValues": "Сброс значений во встроенные в диаграмму.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Принудительное обновление ресурса посредством удаления и повторного создания в случае необходимости​", + "loc.input.label.waitForExecution": "Ждать", + "loc.input.help.waitForExecution": "Блокировка до завершения выполнения команды.", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Параметры команды helm.", + "loc.input.label.enableTls": "Включить TLS", + "loc.input.help.enableTls": "Разрешает использовать SSL между Helm и Tiller.", + "loc.input.label.caCert": "Сертификат ЦС", + "loc.input.help.caCert": "Сертификат ЦС, используемый для выдачи сертификата для tiller и клиента helm.", + "loc.input.label.certificate": "Сертификат", + "loc.input.help.certificate": "Укажите сертификат Tiller или сертификат клиента Helm", + "loc.input.label.privatekey": "Ключ", + "loc.input.help.privatekey": "Укажите ключ Tiller или ключ клиента Helm", + "loc.input.label.tillernamespace": "Пространство имен Tiller", + "loc.input.help.tillernamespace": "Укажите пространство имен K8 для Tiller.", + "loc.input.label.failOnStderr": "Сбой со стандартной ошибкой", + "loc.input.help.failOnStderr": "Если задано значение True, задача будет завершаться сбоем при записи каких-либо ошибок в конвейер ошибок или записи каких-либо данных в стандартный поток ошибок. В противном случае для определения сбоя задача будет использовать код выхода.", + "loc.input.label.publishPipelineMetadata": "Опубликовать метаданные конвейера", + "loc.input.help.publishPipelineMetadata": "Если задано значение true, задача будет собирать и публиковать метаданные развертывания.", + "loc.input.label.chartNameForACR": "Имя диаграммы для Реестра контейнеров Azure", + "loc.input.help.chartNameForACR": "Имя диаграммы, под которым она будет храниться в Реестре контейнеров Azure.", + "loc.input.label.chartPathForACR": "Путь к диаграмме для Реестра контейнеров Azure", + "loc.input.help.chartPathForACR": "Путь к каталогу диаграммы.", + "loc.messages.CantDownloadAccessProfile": "Не удается скачать файл доступа к профилю или файл kube config для кластера %s. Причина: %s.", + "loc.messages.KubeConfigFilePath": "Путь к файлу Kubeconfig: %s", + "loc.messages.KubernetesClusterInfo": "Идентификатор кластера Kubernetes: %s; версия сервера Kubernetes: %s; состояние подготовки Kubernetes: %s", + "loc.messages.KubernetesClusterResourceGroup": "Кластер Kubernetes %s, группа ресурсов %s.", + "loc.messages.ClusterNotProvisioned": "Для кластера %s наблюдается состояние %s.", + "loc.messages.ClusterNotFound": "Кластер %s не существует", + "loc.messages.FailedToListClusters": "Не удалось получить список управляемых кластеров в подписке. %s", + "loc.messages.RetryingRequest": "Повторная попытка запроса будет выполнена через %s сек.", + "loc.messages.PatternNotFoundInFilePath": "Шаблон не найден в пути к файлу %s.", + "loc.messages.CantResolvePatternInPath": "Не удается разрешить шаблон в пути к файлу %s.", + "loc.messages.PatternFoundInPath": "Шаблон найден в пути к файлу %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Не удалось получить маркер доступа для Azure. Код состояния: %s, сообщение о состоянии: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Настройте управляемое удостоверение службы (MSI) для виртуальной машины \"https://aka.ms/azure-msi-docs\". Код состояния: %s; сообщения о состоянии: %s.", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Код состояния: %s, сообщение о состоянии: %s.", + "loc.messages.SkipDeleteSecureFiles": "TLS не включен в задаче. Удаление сертификатов пропускается.", + "loc.messages.SkipDownloadSecureFiles": "TLS не включен в задаче. Скачивание сертификатов пропускается.", + "loc.messages.FileNotFound": "Файл не найден в %s", + "loc.messages.KubernetesServiceConnectionNotFound": "Сведения о подключении к службе Kubernetes не найдены.", + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", + "loc.messages.SaveSupportedInHelmsV3Only": "Сохранение диаграммы в Реестре контейнеров Azure поддерживается только в диаграммах Helm версии 3.", + "loc.messages.OutputVariableDataSizeExceeded": "Выходная переменная не установлена, так как для выходных данных команды Helm превышена максимальная поддерживаемая длина. Длина выходных данных: %s, максимальная поддерживаемая длина: %s.", + "loc.messages.KubeloginFailed": "Сбой проверки подлинности Kubelogin. Исключение: %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/zh-CN/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..e0aafbd2b635 --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "打包和部署 Helm 图表", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?linkid=851275)或[参阅 Helm 文档](https://helm.sh/docs/)", + "loc.description": "通过运行 helm 命令在 Azure 容器服务中部署、配置和更新 Kubernetes 群集", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes 群集", + "loc.group.displayName.commands": "命令", + "loc.group.displayName.azureContainerRegistry": "Azure 容器注册表", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "高级", + "loc.input.label.connectionType": "连接类型", + "loc.input.help.connectionType": "选择“Azure 资源管理器”,通过 Azure 服务连接功能连接到 Azure Kubernetes 服务。选择“Kubernetes 服务连接”,通过使用 kubeconfig 或服务帐户连接到任何 Kubernetes 群集", + "loc.input.label.azureSubscriptionEndpoint": "Azure 订阅", + "loc.input.help.azureSubscriptionEndpoint": "选择 Azure 订阅,其中包含你的 Azure 容器注册表。", + "loc.input.label.azureResourceGroup": "资源组", + "loc.input.help.azureResourceGroup": "选择 Azure 资源组。", + "loc.input.label.kubernetesCluster": "Kubernetes 群集", + "loc.input.help.kubernetesCluster": "选择 Azure 托管的群集。", + "loc.input.label.useClusterAdmin": "使用群集管理员凭据", + "loc.input.help.useClusterAdmin": "使用群集管理员凭据而不是默认的群集用户凭据。", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes 服务连接", + "loc.input.help.kubernetesServiceEndpoint": "选择 Kubernetes 服务连接。", + "loc.input.label.namespace": "命名空间", + "loc.input.help.namespace": "指定要使用的 K8 命名空间。可以在任务的高级部分或通过传递 --tiller-namespace 选项作为参数来指定使用 Tiller 命名空间。", + "loc.input.label.azureSubscriptionEndpointForACR": "适合容器注册表的 Azure 订阅", + "loc.input.help.azureSubscriptionEndpointForACR": "选择 Azure 订阅,其中包含你的 Azure 容器注册表。", + "loc.input.label.azureResourceGroupForACR": "资源组", + "loc.input.help.azureResourceGroupForACR": "选择具有容器注册表的 Azure 资源组。", + "loc.input.label.azureContainerRegistry": "Azure 容器注册表", + "loc.input.help.azureContainerRegistry": "选择将用于推送 helm 图表的 Azure 容器注册表。", + "loc.input.label.command": "命令", + "loc.input.help.command": "选择一个 helm 命令。", + "loc.input.label.chartType": "图表类型", + "loc.input.help.chartType": "选择要如何输入图表信息。可以提供图表的名称或图表的文件夹/文件路径。", + "loc.input.label.chartName": "图表名称", + "loc.input.help.chartName": "要安装的图表参考,这可以是 URL 或图表名称。例如,如果图表名称为 \"stable/mysql\",则该任务将运行 \"helm install stable/mysql\"。", + "loc.input.label.chartPath": "图表路径", + "loc.input.help.chartPath": "要安装的图表的路径。这可以是打包图表的路径或解包图表目录的路径。例如,如果指定了 \"./redis\",则该任务将运行 \"helm install ./redis\"。", + "loc.input.label.version": "版本", + "loc.input.help.version": "指定要安装的图表的准确版本。如果未指定,则安装最新版本。将图表上的版本设置为此 semver 版本", + "loc.input.label.releaseName": "发布名称", + "loc.input.help.releaseName": "发布名称。如果未指定,则将自动生成一个名称。", + "loc.input.label.overrideValues": "设置值", + "loc.input.help.overrideValues": "在命令行上设置值(可指定多个值或单独的值并用逗号隔开或另起新行: key1=val1,key2=val2 or
key1=val1
key2=val2
)。此任务将使用所设置的这些值构造 helm 命令,例如 helm install --set key1=val1 ./redis。", + "loc.input.label.valueFile": "值文件", + "loc.input.help.valueFile": "指定 YAML 文件或 URL 中的值。例如,如果指定 myvalues.yaml,则为 \"helm install --values=myvals.yaml\"。", + "loc.input.label.destination": "目标", + "loc.input.help.destination": "指定 YAML 文件或 URL 中的值。", + "loc.input.label.canaryimage": "使用 canary 映像版本。", + "loc.input.help.canaryimage": "使用 canary Tiller 映像,该映像是 Tiller 的最新预发布版本。", + "loc.input.label.upgradetiller": "升级 Tiller", + "loc.input.help.upgradetiller": "如果已安装 Tiller,则进行升级。", + "loc.input.label.updatedependency": "更新依赖项", + "loc.input.help.updatedependency": "在安装图表之前运行 helm 依赖项更新。在打包之前将依赖项从 \"requirements.yaml\" 更新为 dir \"charts/\"", + "loc.input.label.save": "保存", + "loc.input.help.save": "将打包图表保存到本地图表存储库(默认为 true)", + "loc.input.label.install": "如果不存在发布,请进行安装。", + "loc.input.help.install": "如果不存在具有此名称的发布,请运行安装程序。", + "loc.input.label.recreate": "重新创建 Pod。", + "loc.input.help.recreate": "对资源执行 pod 重启(如果适用)。", + "loc.input.label.resetValues": "重置值。", + "loc.input.help.resetValues": "将值重置为内置于图表中的值。", + "loc.input.label.force": "强制", + "loc.input.help.force": "如果需要,通过删除/重新创建执行资源更新", + "loc.input.label.waitForExecution": "等待", + "loc.input.help.waitForExecution": "阻止,直至命令执行完成。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "Helm 命令选项。", + "loc.input.label.enableTls": "启用 TLS", + "loc.input.help.enableTls": "允许在 Helm 和 Tiller 之间使用 SSL。", + "loc.input.label.caCert": "CA 证书", + "loc.input.help.caCert": "用于为 tiller 和 helm 客户端颁发证书的 CA 证书。", + "loc.input.label.certificate": "证书", + "loc.input.help.certificate": "指定 Tiller 证书或 Helm 客户端证书", + "loc.input.label.privatekey": "密钥", + "loc.input.help.privatekey": "指定 Tiller 密钥或 Helm 客户端密钥", + "loc.input.label.tillernamespace": "Tiller 命名空间", + "loc.input.help.tillernamespace": "指定 tiller 的 K8 命名空间。", + "loc.input.label.failOnStderr": "因标准错误而失败", + "loc.input.help.failOnStderr": "如果为 true,那么将任何错误写入错误管道或将任何数据写入标准错误流时,此任务会失败。否则,此任务将仅依靠退出代码来确定故障。", + "loc.input.label.publishPipelineMetadata": "发布管道元数据", + "loc.input.help.publishPipelineMetadata": "如果为 true,任务将收集和发布部署元数据", + "loc.input.label.chartNameForACR": "适合 Azure 容器注册表的图表名称", + "loc.input.help.chartNameForACR": "在 Azure 容器注册表中存储图表时使用的图表名称。", + "loc.input.label.chartPathForACR": "适合 Azure 容器注册表的图表路径", + "loc.input.help.chartPathForACR": "图表目录的路径。", + "loc.messages.CantDownloadAccessProfile": "无法下载群集 %s 的访问配置文件/kube 配置文件。原因为 %s。", + "loc.messages.KubeConfigFilePath": "Kubeconfig 文件路径: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes 群集 ID: %s,kubernetes 服务器版本 %s,kuberenettes 预配状态 %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes 群集 %s,资源组 %s。", + "loc.messages.ClusterNotProvisioned": "观察到群集 %s 处于 %s 状态。", + "loc.messages.ClusterNotFound": "%s 群集不存在", + "loc.messages.FailedToListClusters": "未能列出订阅中的托管群集。%s", + "loc.messages.RetryingRequest": "在 %s 秒后重试请求。", + "loc.messages.PatternNotFoundInFilePath": "在文件路径 %s 中找不到模式。", + "loc.messages.CantResolvePatternInPath": "无法解析文件路径 %s 中的模式。", + "loc.messages.PatternFoundInPath": "在文件路径 %s 中找到的模式。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "无法提取 Azure 的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "无法提取托管服务主体的访问令牌。请为虚拟机配置托管服务标识(MSI)(https://aka.ms/azure-msi-docs)。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "无法提取托管服务主体的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.SkipDeleteSecureFiles": "任务中未启用 TLS。正在跳过删除证书。", + "loc.messages.SkipDownloadSecureFiles": "任务中未启用 TLS。正在跳过下载证书。", + "loc.messages.FileNotFound": "在 %s 中找不到文件", + "loc.messages.KubernetesServiceConnectionNotFound": "找不到 Kubernetes 服务连接详细信息。", + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", + "loc.messages.SaveSupportedInHelmsV3Only": "只有 Helms V3 中支持将图表保存到 Azure 容器注册表。", + "loc.messages.OutputVariableDataSizeExceeded": "未设置为 Helm 命令输出的输出变量超出了支持的最大长度。输出长度: %s,支持的最大长度: %s", + "loc.messages.KubeloginFailed": "Kubelogin 身份验证失败。异常: %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Strings/resources.resjson/zh-TW/resources.resjson b/Tasks/HelmDeployV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..a38e78eb2209 --- /dev/null +++ b/Tasks/HelmDeployV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "封裝和部署 Helm 圖表", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?linkid=851275)或[參閱 Helm 文件](https://helm.sh/docs/)", + "loc.description": "執行 helm 命令以在 Azure Container Service 中部署、設定、更新 Kubernetes 叢集", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes 叢集", + "loc.group.displayName.commands": "命令", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "進階", + "loc.input.label.connectionType": "連線類型", + "loc.input.help.connectionType": "選取 [Azure Resource Manager] 會透過使用 Azure 服務連線來連線至 Azure Kubernetes Service。選取 [Kubernetes 服務連線] 會透過使用 kubeconfig 或服務帳戶來連線至任意 Kubernetes 叢集", + "loc.input.label.azureSubscriptionEndpoint": "Azure 訂用帳戶", + "loc.input.help.azureSubscriptionEndpoint": "選取有您 Azure Container Registry 的 Azure 訂用帳戶。", + "loc.input.label.azureResourceGroup": "資源群組", + "loc.input.help.azureResourceGroup": "請選取 Azure 資源群組。", + "loc.input.label.kubernetesCluster": "Kubernetes 叢集", + "loc.input.help.kubernetesCluster": "請選取 Azure 受控叢集。", + "loc.input.label.useClusterAdmin": "使用叢集系統管理員認證", + "loc.input.help.useClusterAdmin": "使用叢集系統管理員認證而非預設叢集使用者認證。", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes 服務連線", + "loc.input.help.kubernetesServiceEndpoint": "選取 Kubernetes 服務連線。", + "loc.input.label.namespace": "命名空間", + "loc.input.help.namespace": "請指定要使用的 K8 命名空間。您可指定使用 Tiller 命名空間,方式為: 在工作的進階區段指定,或將 --tiller-namespace 選項作為引數傳遞。", + "loc.input.label.azureSubscriptionEndpointForACR": "Container Registry 的 Azure 訂閱", + "loc.input.help.azureSubscriptionEndpointForACR": "選取有您 Azure Container Registry 的 Azure 訂用帳戶。", + "loc.input.label.azureResourceGroupForACR": "資源群組", + "loc.input.help.azureResourceGroupForACR": "選取有您 Container Registry 的 Azure 資源群組。", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "選取將用以推送 Helm 圖表的 Azure Container Registry。", + "loc.input.label.command": "命令", + "loc.input.help.command": "選取 helm 命令。", + "loc.input.label.chartType": "圖表類型", + "loc.input.help.chartType": "請選取您要輸入圖表資訊的方式。您可提供圖表的名稱,或圖表的資料夾/檔案路徑。", + "loc.input.label.chartName": "圖表名稱", + "loc.input.help.chartName": "要安裝的圖表參考,這可以是 URL 或圖表名稱。例如,如果圖表名稱是 'stable/mysql',則工作會執行 'helm install stable/mysql'。", + "loc.input.label.chartPath": "圖表路徑", + "loc.input.help.chartPath": "要安裝的圖表路徑。這可以是套件圖表的路徑或解壓縮圖表目錄的路徑。例如,如有指定 './redis',工作就會執行 'helm install ./redis'。", + "loc.input.label.version": "版本", + "loc.input.help.version": "請指定要安裝的完全符合版本。若未指定,則會安裝最新版本。請在圖表上設定此 SemVer 版本的版本", + "loc.input.label.releaseName": "發行名稱", + "loc.input.help.releaseName": "版本名稱。若未指定,會為您自動產生一個名稱。", + "loc.input.label.overrideValues": "設定值", + "loc.input.help.overrideValues": "請在命令列上設定值 (可使用逗點或新行字元指定多個值或分隔值: key1=val1,key2=val2 或
key1=val1
key2=val2
)。工作會使用這些設定的值建構 Helm 命令。例如: helm install --set key1=val1 ./redis。", + "loc.input.label.valueFile": "值檔案", + "loc.input.help.valueFile": "請指定 YAML 檔案或 URL 中的值。例如,指定 myvalues.yaml 會產生 'helm install --values=myvals.yaml'。", + "loc.input.label.destination": "目的地", + "loc.input.help.destination": "請指定 YAML 檔案或 URL 中的值。", + "loc.input.label.canaryimage": "請使用 Canary 映像版本。", + "loc.input.help.canaryimage": "請使用 Canary Tiller 映像,即最新發行前版本的 Tiller。", + "loc.input.label.upgradetiller": "升級 Tiller", + "loc.input.help.upgradetiller": "若已經安裝 Tiller 即升級。", + "loc.input.label.updatedependency": "更新相依性", + "loc.input.help.updatedependency": "在安裝圖表之前執行 helm 相依性更新。請在封裝之前,將相依性從 'requirements.yaml' 更新為 dir 'charts/'", + "loc.input.label.save": "儲存", + "loc.input.help.save": "將封裝的圖表儲存至本機圖表存放庫 (預設為 true)​", + "loc.input.label.install": "若版本不存在即安裝。", + "loc.input.help.install": "如果使用這個名稱的版本不存在,會執行 install。", + "loc.input.label.recreate": "重新建立 Pod。", + "loc.input.help.recreate": "如果適用,會為資源執行 Pod 重新啟動。", + "loc.input.label.resetValues": "重設值。", + "loc.input.help.resetValues": "將值重設為圖表內建的值。", + "loc.input.label.force": "強制", + "loc.input.help.force": "如有必要,會透過刪除/重新建立來強制資源更新", + "loc.input.label.waitForExecution": "等候", + "loc.input.help.waitForExecution": "封鎖到命令執行完成為止。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "Helm 命令選項。", + "loc.input.label.enableTls": "啟用 TLS", + "loc.input.help.enableTls": "允許在 Helm 與 Tiller 之間使用 SSL。", + "loc.input.label.caCert": "CA 憑證", + "loc.input.help.caCert": "用來為 tiller 和 helm 用戶端發行憑證的 CA 憑證。", + "loc.input.label.certificate": "憑證", + "loc.input.help.certificate": "請指定 Tiller 憑證或 Helm 用戶端憑證", + "loc.input.label.privatekey": "金鑰", + "loc.input.help.privatekey": "請指定 Tiller 金鑰或 Helm 用戶端金鑰", + "loc.input.label.tillernamespace": "Tiller 命名空間", + "loc.input.help.tillernamespace": "請指定 tiller 的 K8 命名空間。", + "loc.input.label.failOnStderr": "發生標準錯誤的失敗", + "loc.input.help.failOnStderr": "若此為 true,如果在錯誤管線中寫入任何錯誤,或對標準錯誤資料流寫入任何資料,此工作即會失敗。否則,工作將依據結束代碼來判斷失敗。", + "loc.input.label.publishPipelineMetadata": "發佈管線中繼資料", + "loc.input.help.publishPipelineMetadata": "若為 true,則此工作會收集及發佈部署中繼資料", + "loc.input.label.chartNameForACR": "Azure Container Registry 的圖表名稱", + "loc.input.help.chartNameForACR": "將要儲存在 Azure Container Registry 中之圖表的圖表名稱。", + "loc.input.label.chartPathForACR": "Azure Container Registry 的圖表路徑", + "loc.input.help.chartPathForACR": "圖表目錄的路徑。", + "loc.messages.CantDownloadAccessProfile": "無法下載叢集 %s 的存取設定檔/Kube 組態檔。原因 %s。", + "loc.messages.KubeConfigFilePath": "Kubeconfig 檔案路徑: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes 叢集識別碼: %s,kubernetes 伺服器版本%s,kuberenettes 佈建狀態 %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes 叢集 %s,資源群組 %s。", + "loc.messages.ClusterNotProvisioned": "觀察到叢集 %s 處於 %s 狀態。", + "loc.messages.ClusterNotFound": "%s 叢集不存在", + "loc.messages.FailedToListClusters": "無法列出訂用帳戶中的受控叢集。%s", + "loc.messages.RetryingRequest": "即將在 %s 秒後重試要求。", + "loc.messages.PatternNotFoundInFilePath": "在檔案路徑 %s 中找不到模式。", + "loc.messages.CantResolvePatternInPath": "無法解析檔案路徑 %s 中的模式。", + "loc.messages.PatternFoundInPath": "在檔案路徑 %s 中找到模式。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "無法擷取 Azure 的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "無法擷取受控服務主體的存取權杖。請設定虛擬機器的受控服務識別 (MSI) (https://aka.ms/azure-msi-docs)。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "無法擷取受控服務主體的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.SkipDeleteSecureFiles": "未在工作中啟用 TLS。正在跳過刪除憑證。", + "loc.messages.SkipDownloadSecureFiles": "未在工作中啟用 TLS。正在跳過下載憑證。", + "loc.messages.FileNotFound": "在 %s 找不到檔案", + "loc.messages.KubernetesServiceConnectionNotFound": "找不到 Kubernetes 服務連線詳細資料。", + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", + "loc.messages.SaveSupportedInHelmsV3Only": "只有 Helms V3 支援將圖表儲存至 Azure Container Registry。", + "loc.messages.OutputVariableDataSizeExceeded": "因為 Helm 命令輸出超過了支援的長度上限,所以未設定輸出變數。輸出長度: %s,支援的長度上限: %s", + "loc.messages.KubeloginFailed": "Kubelogin 驗證失敗。例外狀況: %s" +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Tests/L0.ts b/Tasks/HelmDeployV1/Tests/L0.ts new file mode 100644 index 000000000000..37bc89c03ce4 --- /dev/null +++ b/Tasks/HelmDeployV1/Tests/L0.ts @@ -0,0 +1,266 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import * as shared from './TestShared'; +import * as tl from 'azure-pipelines-task-lib'; + +describe("HelmDeployV0 Suite", function () { + this.timeout(30000); + + before(async () => { + process.env[shared.TestEnvVars.operatingSystem] = tl.osType().match(/^Win/) ? shared.OperatingSystems.Windows : shared.OperatingSystems.Other; + }); + + beforeEach(async () => { + delete process.env[shared.TestEnvVars.namespace]; + delete process.env[shared.TestEnvVars.valueFile]; + delete process.env[shared.TestEnvVars.overrideValues]; + delete process.env[shared.TestEnvVars.updatedependency]; + delete process.env[shared.isHelmV3]; + delete process.env[shared.TestEnvVars.releaseName]; + delete process.env[shared.TestEnvVars.waitForExecution]; + delete process.env[shared.TestEnvVars.arguments]; + delete process.env[shared.TestEnvVars.chartName]; + delete process.env[shared.TestEnvVars.chartPath]; + delete process.env[shared.TestEnvVars.connectionType]; + delete process.env[shared.TestEnvVars.command]; + delete process.env[shared.TestEnvVars.chartType]; + delete process.env[shared.TestEnvVars.version]; + }); + + after(async () => { }); + + it("Run successfully with Helm install (version 3) with chart name", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.version] = shared.testChartVersion; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "true"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("changed mode of file") != -1, "Mode of kubeconfig file should have been changed to 600"); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, `Release should have been created with NAME: ${shared.testReleaseName}`); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 3) with chart name when publishPipelineMetadata is set to false", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.version] = shared.testChartVersion; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "true"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "false"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("changed mode of file") != -1, "Mode of kubeconfig file should have been changed to 600"); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, `Release should have been created with NAME: ${shared.testReleaseName}`); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) == -1, "Web response should not have been received for pushing metadata to evidence store when publishPipelineMetadata is false"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 2) with chart name", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.TestEnvVars.namespace] = shared.testNamespace; + + await tr.runAsync(); + assert(tr.stdout.indexOf("v2") != -1, "Helm version 2 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, `Release should have been created with NAME: ${shared.testReleaseName}`); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 3) with chart path", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.FilePath; + process.env[shared.TestEnvVars.chartPath] = shared.testChartPath; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, `Release should have been created with NAME: ${shared.testReleaseName}`); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 3) when release name is not given", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, "Release should have been created"); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 3) when invalid chart version is given", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.version] = "abcd"; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, "Release should have been created"); + assert(tr.stdout.indexOf("The given version " + process.env[shared.TestEnvVars.version] + " is not valid. Running the helm install command with latest version") != -1, "Version should not have been accepted"); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm upgrade (version 3) when chart name is given and release name is not", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.upgrade; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf(`Release "${shared.testReleaseName}" has been upgraded`) != -1, "Release should have been upgraded"); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm upgrade (version 3) when chart name and release name are given", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.upgrade; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf(`Release "${shared.testReleaseName}" has been upgraded`) != -1, "Release should have been upgraded"); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm init (version 2)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.init; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("$HELM_HOME has been configured") != -1, "Helm init should have run successfully"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Helm init should fail (version 3)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.init; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("Common actions for Helm:") != -1, "Available commands information should have been received"); + assert(tr.failed, "task should have failed"); + }); + + it("Run successfully with Helm package command (version 3)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.package; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.FilePath; + process.env[shared.TestEnvVars.chartPath] = shared.testChartPath; + process.env[shared.TestEnvVars.destination] = shared.testDestinationPath; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf(`Successfully packaged chart and saved it to: ${shared.testDestinationPath}/testChartName.tgz`) != -1, "Chart should have been successfully packaged"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm save command (version 3)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.command] = shared.Commands.save; + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.None; + process.env[shared.TestEnvVars.chartPathForACR] = shared.testChartPathForACR; + process.env[shared.TestEnvVars.chartNameForACR] = shared.testChartNameForACR; + process.env[shared.TestEnvVars.azureSubscriptionEndpointForACR] = shared.testAzureSubscriptionEndpointForACR; + process.env[shared.testEndpointAuthVar] = "ServicePrincipal"; + process.env[shared.TestEnvVars.azureResourceGroupForACR] = shared.testAzureResourceGroupForACR; + process.env[shared.TestEnvVars.azureContainerRegistry] = shared.testAzureContainerRegistry; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("Successfully saved the helm chart to local registry cache.") != -1, "Chart should have been successfully saved to local registry cache."); + assert(tr.stdout.indexOf(`Successfully logged in to ${process.env[shared.TestEnvVars.azureContainerRegistry]}.`) != -1, "Azure container registry login should have been successful."); + assert(tr.stdout.indexOf("Successfully pushed to the chart to container registry.") != -1, "Chart should have been successfully pushed to container registry."); + assert(tr.stdout.indexOf("Successfully removed the chart from local cache.") != -1, "Chart should have been successfully removed from local cache."); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Helm same should fail (version 2)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.command] = shared.Commands.save; + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.None; + process.env[shared.TestEnvVars.chartPathForACR] = shared.testChartPathForACR; + process.env[shared.TestEnvVars.chartNameForACR] = shared.testChartNameForACR; + process.env[shared.TestEnvVars.azureSubscriptionEndpointForACR] = shared.testAzureSubscriptionEndpointForACR; + process.env[shared.TestEnvVars.azureResourceGroupForACR] = shared.testAzureResourceGroupForACR; + process.env[shared.TestEnvVars.azureContainerRegistry] = shared.testAzureContainerRegistry; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + + await tr.runAsync(); + assert(tr.failed, "task should have failed"); + assert(tr.stdout.indexOf("loc_mock_SaveSupportedInHelmsV3Only") != -1, "Chart save should have failed when helm version is not 3."); + }) +}); diff --git a/Tasks/HelmDeployV1/Tests/TestSetup.ts b/Tasks/HelmDeployV1/Tests/TestSetup.ts new file mode 100644 index 000000000000..f94e7ccc67c8 --- /dev/null +++ b/Tasks/HelmDeployV1/Tests/TestSetup.ts @@ -0,0 +1,366 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import * as path from 'path'; +import * as semver from 'semver'; + +import * as shared from './TestShared'; +import { formatDebugFlag } from './TestShared'; + +const buildNumber = "123"; +const buildId = "1"; +const buildReason = "schedule"; +const teamProject = "project1"; +const collectionId = "collection1"; +const definitionName = "test"; +const definitionId = "123"; +const teamFoundationCollectionUri = "https://abc.visualstudio.com/"; +const jobName = "jobName"; +const accessToken = "testAccessToken"; + +const testnamespaceWorkingDirectory: string = shared.formatPath("a/w"); +const kubectlPath = shared.formatPath("newUserDir/kubectl.exe"); +const helmPath = shared.formatPath("newUserDir/helm.exe"); + +const taskPath = path.join(__dirname, "../src", "helm.js"); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("kubernetesServiceEndpoint", "kubernetesConnection"); +tr.setInput("connectionType", process.env[shared.TestEnvVars.connectionType] || ""); +tr.setInput("azureSubscriptionEndpoint", process.env[shared.TestEnvVars.azureSubscriptionEndpoint] || ""); +tr.setInput("azureResourceGroup", process.env[shared.TestEnvVars.azureResourceGroup] || ""); +tr.setInput("kubernetesCluster", process.env[shared.TestEnvVars.kubernetesCluster] || ""); +tr.setInput("useClusterAdmin", process.env[shared.TestEnvVars.useClusterAdmin] || ""); +tr.setInput("namespace", process.env[shared.TestEnvVars.namespace] || ""); +tr.setInput("azureSubscriptionEndpointForACR", process.env[shared.TestEnvVars.azureSubscriptionEndpointForACR] || ""); +tr.setInput("azureResourceGroupForACR", process.env[shared.TestEnvVars.azureResourceGroupForACR] || ""); +tr.setInput("azureContainerRegistry", process.env[shared.TestEnvVars.azureContainerRegistry] || ""); +tr.setInput("command", process.env[shared.TestEnvVars.command] || ""); +tr.setInput("chartType", process.env[shared.TestEnvVars.chartType] || ""); +tr.setInput("chartName", process.env[shared.TestEnvVars.chartName] || ""); +tr.setInput("chartPath", process.env[shared.TestEnvVars.chartPath] || ""); +tr.setInput("version", process.env[shared.TestEnvVars.version] || ""); +tr.setInput("releaseName", process.env[shared.TestEnvVars.releaseName] || ""); +tr.setInput("overrideValues", process.env[shared.TestEnvVars.overrideValues] || ""); +tr.setInput("valueFile", process.env[shared.TestEnvVars.valueFile] || ""); +tr.setInput("destination", process.env[shared.TestEnvVars.destination] || ""); +tr.setInput("canaryimage", process.env[shared.TestEnvVars.canaryimage] || ""); +tr.setInput("upgradetiller", process.env[shared.TestEnvVars.upgradetiller] || ""); +tr.setInput("updatedependency", process.env[shared.TestEnvVars.updatedependency] || ""); +tr.setInput("save", process.env[shared.TestEnvVars.save] || ""); +tr.setInput("install", process.env[shared.TestEnvVars.install] || ""); +tr.setInput("recreate", process.env[shared.TestEnvVars.recreate] || ""); +tr.setInput("resetValues", process.env[shared.TestEnvVars.resetValues] || ""); +tr.setInput("force", process.env[shared.TestEnvVars.force] || ""); +tr.setInput("waitForExecution", process.env[shared.TestEnvVars.waitForExecution] || ""); +tr.setInput("arguments", process.env[shared.TestEnvVars.arguments] || ""); +tr.setInput("failOnStderr", process.env[shared.TestEnvVars.failOnStderr] || "true"); +tr.setInput("publishPipelineMetadata", process.env[shared.TestEnvVars.publishPipelineMetadata] || "true"); +tr.setInput("chartNameForACR", process.env[shared.TestEnvVars.chartNameForACR] || ""); +tr.setInput("chartPathForACR", process.env[shared.TestEnvVars.chartPathForACR] || ""); + +process.env.SYSTEM_DEFAULTWORKINGDIRECTORY = testnamespaceWorkingDirectory; +process.env.AGENT_TEMPDIRECTORY = path.resolve(__dirname, "../../../../Tests"); +process.env.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI = teamFoundationCollectionUri; +process.env.SYSTEM_TEAMPROJECT = teamProject; +process.env.SYSTEM_COLLECTIONID = collectionId; +process.env.SYSTEM_DEFINITIONID = definitionId; +process.env.ENDPOINT_AUTH_PARAMETER_SYSTEMVSSCONNECTION_ACCESSTOKEN = accessToken; + +process.env.BUILD_BUILDID = buildId; +process.env.BUILD_BUILDNUMBER = buildNumber; +process.env.BUILD_DEFINITIONNAME = definitionName; +process.env.BUILD_REASON = buildReason; + +process.env.AGENT_JOBNAME = jobName; +process.env.SYSTEM_HOSTTYPE = "build"; + +process.env.ENDPOINT_DATA_kubernetesConnection_AUTHORIZATIONTYPE = "Kubeconfig"; +process.env.ENDPOINT_AUTH_PARAMETER_kubernetesConnection_KUBECONFIG = `{"apiVersion":"v1", "clusters": [{"cluster": {"insecure-skip-tls-verify":"true", "server":"https://5.6.7.8", "name" : "scratch"}}], "contexts": [{"context" : {"cluster": "scratch", "namespace" : "default", "user": "experimenter", "name" : "exp-scratch"}], "current-context" : "exp-scratch", "kind": "Config", "users" : [{"user": {"password": "regpassword", "username" : "test"}]}`; +process.env.ENDPOINT_DATA_kubernetesConnection_NAMESPACE = "testnamespace"; + +if (process.env.RemoveNamespaceFromEndpoint) { + process.env.ENDPOINT_DATA_kubernetesConnection_NAMESPACE = ""; +} + +const a: ma.TaskLibAnswers = { + "checkPath": { + "helm": true, + "kubectl": true + }, + "exec": { + }, + "findMatch": {}, + "which": { + "helm": "helm", + "kubectl": "kubectl" + } +}; + +if (process.env[shared.TestEnvVars.command] === shared.Commands.install) { + let helmInstallCommand = `helm install${formatDebugFlag()}`; + + if (process.env[shared.TestEnvVars.namespace]) + helmInstallCommand = helmInstallCommand.concat(` --namespace ${process.env[shared.TestEnvVars.namespace]}`); + + if (process.env[shared.TestEnvVars.valueFile]) + helmInstallCommand = helmInstallCommand.concat(` --values ${process.env[shared.TestEnvVars.valueFile]}`); + + if (process.env[shared.TestEnvVars.overrideValues]) + helmInstallCommand = helmInstallCommand.concat(` --set ${process.env[shared.TestEnvVars.overrideValues]}`); + + if (process.env[shared.TestEnvVars.updatedependency]) + helmInstallCommand = helmInstallCommand.concat(" --dep-up"); + + if (process.env[shared.isHelmV3] === "true") { + if (process.env[shared.TestEnvVars.releaseName]) + helmInstallCommand = helmInstallCommand.concat(` ${process.env[shared.TestEnvVars.releaseName]}`); + else + helmInstallCommand = helmInstallCommand.concat(" --generate-name"); + } + else if (process.env[shared.TestEnvVars.releaseName]) + helmInstallCommand = helmInstallCommand.concat(` --name ${process.env[shared.TestEnvVars.releaseName]}`); + + if (process.env[shared.TestEnvVars.waitForExecution]) + helmInstallCommand = helmInstallCommand.concat(" --wait"); + + if (process.env[shared.TestEnvVars.arguments]) + helmInstallCommand = helmInstallCommand.concat(` ${process.env[shared.TestEnvVars.arguments]}`); + + if (process.env[shared.TestEnvVars.chartName]) + helmInstallCommand = helmInstallCommand.concat(` ${process.env[shared.TestEnvVars.chartName]}`); + else if (process.env[shared.TestEnvVars.chartPath]) + helmInstallCommand = helmInstallCommand.concat(` ${process.env[shared.TestEnvVars.chartPath]}`); + + if (process.env[shared.TestEnvVars.version] && semver.valid(process.env[shared.TestEnvVars.version])) + helmInstallCommand = helmInstallCommand.concat(` --version ${process.env[shared.TestEnvVars.version]}`); + + a.exec[helmInstallCommand] = { + "code": 0, + "stdout": `NAME: ${shared.testReleaseName} \nLAST DEPLOYED: Mon Jun 8 10:30:31 2020 \nNAMESPACE: ${process.env[shared.TestEnvVars.namespace]} \nSTATUS: deployed \nREVISION: 1 \nNOTES: \n1. Get the application URL by running these commands: \n export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=demo-chart,app.kubernetes.io/ \n instance=mytestv2" -o jsonpath="{.items[0].metadata.name}") \n echo "Visit http://127.0.0.1:8080 to use your application" \n kubectl --namespace default port-forward $POD_NAME 8080:80` + }; +} + +if (process.env[shared.TestEnvVars.command] === shared.Commands.upgrade) { + let helmUpgradeCommand = `helm upgrade${formatDebugFlag()}`; + + if (process.env[shared.TestEnvVars.namespace]) + helmUpgradeCommand = helmUpgradeCommand.concat(` --namespace ${process.env[shared.TestEnvVars.namespace]}`); + + if (process.env[shared.TestEnvVars.install]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --install"); + + if (process.env[shared.TestEnvVars.recreate]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --recreate-pods"); + + if (process.env[shared.TestEnvVars.resetValues]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --reset-values"); + + if (process.env[shared.TestEnvVars.force]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --force"); + + if (process.env[shared.TestEnvVars.valueFile]) + helmUpgradeCommand = helmUpgradeCommand.concat(` --values ${process.env[shared.TestEnvVars.valueFile]}`); + + if (process.env[shared.TestEnvVars.overrideValues]) + helmUpgradeCommand = helmUpgradeCommand.concat(` --set ${process.env[shared.TestEnvVars.overrideValues]}`); + + if (process.env[shared.TestEnvVars.waitForExecution]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --wait"); + + if (process.env[shared.TestEnvVars.arguments]) + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env[shared.TestEnvVars.arguments]}`); + + if (process.env[shared.TestEnvVars.releaseName]) + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env[shared.TestEnvVars.releaseName]}`); + else + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env.BUILD_BUILDNUMBER}`); + + if (process.env[shared.TestEnvVars.chartName]) + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env[shared.TestEnvVars.chartName]}`); + else if (process.env[shared.TestEnvVars.chartPath]) + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env[shared.TestEnvVars.chartPath]}`); + + if (process.env[shared.TestEnvVars.version] && semver.valid(process.env[shared.TestEnvVars.version])) + helmUpgradeCommand = helmUpgradeCommand.concat(` --version ${process.env[shared.TestEnvVars.version]}`); + + a.exec[helmUpgradeCommand] = { + "code": 0, + "stdout": `Release "${shared.testReleaseName}" has been upgraded. Happy Helming!\nNAME: ${shared.testReleaseName} \nLAST DEPLOYED: Mon Jun 8 10:30:31 2020 \nNAMESPACE: ${process.env[shared.TestEnvVars.namespace]} \nSTATUS: deployed \nREVISION: 1 \nNOTES: \n1. Get the application URL by running these commands: \n export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=demo-chart,app.kubernetes.io/ \n instance=mytestv2" -o jsonpath="{.items[0].metadata.name}") \n echo "Visit http://127.0.0.1:8080 to use your application" \n kubectl --namespace default port-forward $POD_NAME 8080:80` + }; +} + +if (process.env[shared.TestEnvVars.command] === shared.Commands.init) { + let helmInitCommand = `helm init${formatDebugFlag()}`; + + if (process.env[shared.TestEnvVars.canaryimage]) + helmInitCommand = helmInitCommand.concat(" --canary-image"); + + if (process.env[shared.TestEnvVars.upgradetiller]) + helmInitCommand = helmInitCommand.concat(" --upgrade"); + + if (process.env[shared.TestEnvVars.waitForExecution]) + helmInitCommand = helmInitCommand.concat(" --wait"); + + if (process.env[shared.TestEnvVars.arguments]) + helmInitCommand = helmInitCommand.concat(` ${process.env[shared.TestEnvVars.arguments]}`); + + if (process.env[shared.isHelmV3] === "true") { + a.exec[helmInitCommand] = { + "code": 1, + "stdout": "The Kubernetes package manager\n\nCommon actions for Helm:\n\n- helm search: search for charts\n- helm pull: download a chart to your local directory to view\n- helm install: upload the chart to Kubernetes\n- helm list: list releases of charts\n" + }; + } else { + a.exec[helmInitCommand] = { + "code": 0, + "stdout": `$HELM_HOME has been configured at testPath\\.helm.` + }; + } +} + +if (process.env[shared.TestEnvVars.command] === shared.Commands.package) { + let helmPackageCommand = `helm package${formatDebugFlag()}`; + + if (process.env[shared.TestEnvVars.updatedependency]) + helmPackageCommand = helmPackageCommand.concat(" --dependency-update"); + + if (process.env[shared.TestEnvVars.save]) { + if (process.env[shared.isHelmV3]) + helmPackageCommand = helmPackageCommand.concat(" --save"); + } + + if (process.env[shared.TestEnvVars.version]) + helmPackageCommand = helmPackageCommand.concat(` --version ${process.env[shared.TestEnvVars.version]}`); + + if (process.env[shared.TestEnvVars.destination]) + helmPackageCommand = helmPackageCommand.concat(` --destination ${process.env[shared.TestEnvVars.destination]}`); + + if (process.env[shared.TestEnvVars.arguments]) + helmPackageCommand = helmPackageCommand.concat(` ${process.env[shared.TestEnvVars.arguments]}`); + + if (process.env[shared.TestEnvVars.chartPath]) + helmPackageCommand = helmPackageCommand.concat(` ${process.env[shared.TestEnvVars.chartPath]}`); + a.exec[helmPackageCommand] = { + "code": 0, + "stdout": "Successfully packaged chart and saved it to: testDestinationPath/testChartName.tgz" + } +} + +const helmVersionCommand = "helm version --client --short"; +if (process.env[shared.isHelmV3]) { + a.exec[helmVersionCommand] = { + "code": 0, + "stdout": "v3.2.1+ge29ce2a" + }; +} +else { + a.exec[helmVersionCommand] = { + "code": 0, + "stdout": "Client: v2.16.7+g5f2584f" + }; +} + +if (process.env[shared.TestEnvVars.namespace]) { + const helmGetManifestCommand = `helm get manifest ${shared.testReleaseName} --namespace ${process.env[shared.TestEnvVars.namespace]}`; + a.exec[helmGetManifestCommand] = { + "code": 0, + "stdout": `---\n# Source: testChartName/templates/serviceaccount.yaml\n{apiVersion: v1, kind: ServiceAccount, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}}\n---\n# Source: testChartName/templates/service.yaml\n{apiVersion: v1, kind: Service, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {type: ClusterIP, ports: [{port: 80, targetPort: http, protocol: TCP, name: http}], selector: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}}\n---\n# Source: demo-chart/templates/deployment.yaml\n{apiVersion: apps/v1, kind: Deployment, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {replicas: 1, selector: {matchLabels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, template: {metadata: {labels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, spec: {serviceAccountName: testReleaseName-testChartName, securityContext: {}, containers: [{name: testChartName, securityContext: {}, image: "testImage:1.17.0", imagePullPolicy: Always, ports: [{name: http, containerPort: 80, protocol: TCP}], livenessProbe: {httpGet: {path: /, port: http}}, readinessProbe: {httpGet: {path: /, port: http}}, resources: {}}]}}}}\n` + } + + const kubectlGetPods = `kubectl get pods -o json --namespace ${process.env[shared.TestEnvVars.namespace]}`; + a.exec[kubectlGetPods] = { + "code": 0, + "stdout": `{"apiVersion":"v1","items":[{"apiVersion":"v1","kind":"Pod","metadata":{"creationTimestamp":"2020-06-10T18:20:57Z","generateName":"testReleaseName-testChartName-7966fd9bdb-","labels":{"app":"demo","pod-template-hash":"7966fd9bdb"},"name":"testReleaseName-testChartName-7966fd9bdb-wvz9w","namespace":"default","ownerReferences":[{"apiVersion":"apps/v1","blockOwnerDeletion":true,"controller":true,"kind":"ReplicaSet","name":"testReleaseName-testChartName-7966fd9bdb","uid":"ceb16411-6edc-4598-827e-027e8c68304e"}],"resourceVersion":"987","selfLink":"/api/v1/namespaces/default/pods/testReleaseName-testChartName-7966fd9bdb-wvz9w","uid":"ac838bab-a280-4189-b3e9-45bf9d8df920"},"spec":{"containers":[{"image":"nginx:latest","imagePullPolicy":"Always","name":"demo-cont","ports":[{"containerPort":80,"protocol":"TCP"}],"resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","volumeMounts":[{"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount","name":"default-token-xp8jh","readOnly":true}]}],"dnsPolicy":"ClusterFirst","enableServiceLinks":true,"nodeName":"minikube","priority":0,"restartPolicy":"Always","schedulerName":"default-scheduler","securityContext":{},"serviceAccount":"default","serviceAccountName":"default","terminationGracePeriodSeconds":30,"tolerations":[{"effect":"NoExecute","key":"node.kubernetes.io/not-ready","operator":"Exists","tolerationSeconds":300},{"effect":"NoExecute","key":"node.kubernetes.io/unreachable","operator":"Exists","tolerationSeconds":300}],"volumes":[{"name":"default-token-xp8jh","secret":{"defaultMode":420,"secretName":"default-token-xp8jh"}}]},"status":{"conditions":[{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"Initialized"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"Ready"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"ContainersReady"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"PodScheduled"}],"containerStatuses":[{"containerID":"docker://9be62c1a895983aefde3b62c33f12a692ab3749fd841a1f9b7c813b4246d1ac7","image":"nginx:latest","imageID":"docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133","lastState":{},"name":"demo-cont","ready":true,"restartCount":0,"started":true,"state":{"running":{"startedAt":"2020-06-10T18:21:20Z"}}}],"hostIP":"192.168.105.196","phase":"Running","podIP":"172.17.0.6","podIPs":[{"ip":"172.17.0.6"}],"qosClass":"BestEffort","startTime":"2020-06-10T18:20:57Z"}}],"kind":"List","metadata":{"resourceVersion":"","selfLink":""}}\n` + } +} +else { + const helmGetManifestCommand = `helm get manifest ${shared.testReleaseName}`; + a.exec[helmGetManifestCommand] = { + "code": 0, + "stdout": `---\n# Source: testChartName/templates/serviceaccount.yaml\n{apiVersion: v1, kind: ServiceAccount, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}}\n---\n# Source: testChartName/templates/service.yaml\n{apiVersion: v1, kind: Service, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {type: ClusterIP, ports: [{port: 80, targetPort: http, protocol: TCP, name: http}], selector: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}}\n---\n# Source: demo-chart/templates/deployment.yaml\n{apiVersion: apps/v1, kind: Deployment, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {replicas: 1, selector: {matchLabels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, template: {metadata: {labels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, spec: {serviceAccountName: testReleaseName-testChartName, securityContext: {}, containers: [{name: testChartName, securityContext: {}, image: "testImage:1.17.0", imagePullPolicy: Always, ports: [{name: http, containerPort: 80, protocol: TCP}], livenessProbe: {httpGet: {path: /, port: http}}, readinessProbe: {httpGet: {path: /, port: http}}, resources: {}}]}}}}\n` + } + + const kubectlGetPods = "kubectl get pods -o json"; + a.exec[kubectlGetPods] = { + "code": 0, + "stdout": `{"apiVersion":"v1","items":[{"apiVersion":"v1","kind":"Pod","metadata":{"creationTimestamp":"2020-06-10T18:20:57Z","generateName":"testReleaseName-testChartName-7966fd9bdb-","labels":{"app":"demo","pod-template-hash":"7966fd9bdb"},"name":"testReleaseName-testChartName-7966fd9bdb-wvz9w","namespace":"default","ownerReferences":[{"apiVersion":"apps/v1","blockOwnerDeletion":true,"controller":true,"kind":"ReplicaSet","name":"testReleaseName-testChartName-7966fd9bdb","uid":"ceb16411-6edc-4598-827e-027e8c68304e"}],"resourceVersion":"987","selfLink":"/api/v1/namespaces/default/pods/testReleaseName-testChartName-7966fd9bdb-wvz9w","uid":"ac838bab-a280-4189-b3e9-45bf9d8df920"},"spec":{"containers":[{"image":"nginx:latest","imagePullPolicy":"Always","name":"demo-cont","ports":[{"containerPort":80,"protocol":"TCP"}],"resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","volumeMounts":[{"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount","name":"default-token-xp8jh","readOnly":true}]}],"dnsPolicy":"ClusterFirst","enableServiceLinks":true,"nodeName":"minikube","priority":0,"restartPolicy":"Always","schedulerName":"default-scheduler","securityContext":{},"serviceAccount":"default","serviceAccountName":"default","terminationGracePeriodSeconds":30,"tolerations":[{"effect":"NoExecute","key":"node.kubernetes.io/not-ready","operator":"Exists","tolerationSeconds":300},{"effect":"NoExecute","key":"node.kubernetes.io/unreachable","operator":"Exists","tolerationSeconds":300}],"volumes":[{"name":"default-token-xp8jh","secret":{"defaultMode":420,"secretName":"default-token-xp8jh"}}]},"status":{"conditions":[{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"Initialized"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"Ready"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"ContainersReady"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"PodScheduled"}],"containerStatuses":[{"containerID":"docker://9be62c1a895983aefde3b62c33f12a692ab3749fd841a1f9b7c813b4246d1ac7","image":"nginx:latest","imageID":"docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133","lastState":{},"name":"demo-cont","ready":true,"restartCount":0,"started":true,"state":{"running":{"startedAt":"2020-06-10T18:21:20Z"}}}],"hostIP":"192.168.105.196","phase":"Running","podIP":"172.17.0.6","podIPs":[{"ip":"172.17.0.6"}],"qosClass":"BestEffort","startTime":"2020-06-10T18:20:57Z"}}],"kind":"List","metadata":{"resourceVersion":"","selfLink":""}}\n` + } +} + + + +const kubectlClusterInfo = "kubectl cluster-info"; +a.exec[kubectlClusterInfo] = { + "code": 0, + "stdout": `Kubernetes master is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443 \nhealthmodel-replicaset-service is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443/api/v1/namespaces/kube-system/services/healthmodel-replicaset-service/proxy \nCoreDNS is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy \nkubernetes-dashboard is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy \nMetrics-server is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy\n\nTo further debug and diagnose cluster problems, use "kubectl cluster-info dump".\n` +} + +const helmSaveCommand = `helm chart${formatDebugFlag()} save ${process.env[shared.TestEnvVars.chartPathForACR]} ${process.env[shared.TestEnvVars.azureContainerRegistry]}/helm/${process.env[shared.TestEnvVars.chartNameForACR]}`; +a.exec[helmSaveCommand] = { + "code": 0, + "stdout": `ref: ${process.env[shared.TestEnvVars.azureContainerRegistry]}/helm/${process.env[shared.TestEnvVars.chartNameForACR]}:0.1.0 \n Successfully saved the helm chart to local registry cache.` +} + +const helmRegistryLoginCommand = `helm registry${formatDebugFlag()} login ${process.env[shared.TestEnvVars.azureContainerRegistry]} --username --password`; +a.exec[helmRegistryLoginCommand] = { + "code": 0, + "stdout": `Successfully logged in to ${process.env[shared.TestEnvVars.azureContainerRegistry]}.` +}; + +const helmChartPushCommand = `helm chart${formatDebugFlag()} push ${process.env[shared.TestEnvVars.azureContainerRegistry]}/helm/${process.env[shared.TestEnvVars.chartNameForACR]}:0.1.0`; +a.exec[helmChartPushCommand] = { + "code": 0, + "stdout": "Successfully pushed to the chart to container registry." +} + +const helmChartRemoveCommand = `helm chart${formatDebugFlag()} remove ${process.env[shared.TestEnvVars.azureContainerRegistry]}/helm/${process.env[shared.TestEnvVars.chartNameForACR]}:0.1.0`; +a.exec[helmChartRemoveCommand] = { + "code": 0, + "stdout": "Successfully removed the chart from local cache." +} + +tr.setAnswers(a); +tr.registerMock("azure-pipelines-task-lib/toolrunner", require("azure-pipelines-task-lib/mock-toolrunner")); + + +// Create mocks for required modules +import * as fs from 'fs'; +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function (path, data) { + console.log(`wrote to ${path}`); +}; +fsClone.chmodSync = function (path, mode) { + console.log(`changed mode of file at ${path} to ${mode}`); +}; +tr.registerMock('fs', fsClone); + +import * as util from '../src/utils'; +tr.registerMock('../src/utils', { + + getTaskTempDir: function () { + return path.join("tempdirectory", "helmTask"); + }, + getTempDirectory: function () { + return "tempdirectory"; + }, + deleteFile: function (path: string) { + console.log(`${path} deleted`); + }, + getCurrentTime: util.getCurrentTime, + resolvePath: util.resolvePath, + extractReleaseNameFromHelmOutput: util.extractReleaseNameFromHelmOutput, + getManifestsFromRelease: util.getManifestsFromRelease, + getHelmPathForACR: util.getHelmPathForACR +}); + +import * as webUtil from 'azure-pipelines-tasks-utility-common/restutilities'; +import { command } from 'azure-pipelines-task-lib'; +tr.registerMock('azure-pipelines-tasks-utility-common/restutilities', { + WebRequest: webUtil.WebRequest, + WebResponse: webUtil.WebResponse, + sendRequest: async function (request: webUtil.WebRequest) { + console.log("Mock request sent"); + return { "mockKey": "mockValue" }; + } +}) + +tr.run(); \ No newline at end of file diff --git a/Tasks/HelmDeployV1/Tests/TestShared.ts b/Tasks/HelmDeployV1/Tests/TestShared.ts new file mode 100644 index 000000000000..86fa13a4bff8 --- /dev/null +++ b/Tasks/HelmDeployV1/Tests/TestShared.ts @@ -0,0 +1,96 @@ +import path = require('path'); + +export let TestEnvVars = { + operatingSystem: "__operating_system__", + connectionType: "__connectionType__", + azureSubscriptionEndpoint: "__azureSubscriptionEndpoint__", + azureResourceGroup: "__azureResourceGroup__", + kubernetesCluster: "__kubernetesCluster__", + useClusterAdmin: "__useClusterAdmin__", + kubernetesServiceEndpoint: "__kubernetesServiceEndpoint__", + namespace: "__namespace__", + azureSubscriptionEndpointForACR: "__azureSubscriptionEndpointForACR__", + azureResourceGroupForACR: "__azureResourceGroupForACR", + azureContainerRegistry: "__azureContainerRegistry__", + command: "__command__", + chartType: "__chartType__", + chartName: "__chartName__", + chartPath: "__chartPath__", + version: "__version__", + releaseName: "__releaseName__", + overrideValues: "__overrideValues__", + valueFile: "__valueFile__", + destination: "__destination__", + canaryimage: "__canaryimage__", + upgradetiller: "__upgradetiller__", + updatedependency: "__updatedependency__", + save: "__save__", + install: "__install__", + recreate: "__recreate__", + resetValues: "__resetValues__", + force: "__force__", + waitForExecution: "__waitForExecution__", + arguments: "__arguments__", + failOnStderr: "__failOnStderr__", + publishPipelineMetadata: "__publishPipelineMetadata__", + chartNameForACR: "__chartNameForACR__", + chartPathForACR: "__chartPathForACR__" +}; + +export let Commands = { + install: "install", + upgrade: "upgrade", + package: "package", + save: "save", + init: "init" +}; + +export let ChartTypes = { + Name: "Name", + FilePath: "FilePath" +}; + +export let ConnectionTypes = { + KubernetesServiceConnection: "Kubernetes Service Connection", + AzureResourceManager: "Azure Resource Manager", + None: "None" +} + +export let OperatingSystems = { + Windows: "Windows", + Other: "Other" +}; + +export const testChartName = "testChartName"; +export const testChartPath = "test/testChartPath"; +export const testChartVersion = "1.1.1"; +export const testReleaseName = "testReleaseName"; +export const isHelmV3 = "__isHelmV3__"; +export const testNamespace = "testNamespace"; +export const testDestinationPath = "testDestinationPath"; +export const testChartNameForACR = "testChartNameForACR"; +export const testChartPathForACR = "test/testChartPathForACR"; +export const testAzureResourceGroupForACR = "test-rg"; +export const testAzureSubscriptionEndpointForACR = "RMTest"; +export const testAzureSubscriptionEndpointAuthType = "SerivcePrincipal" +export const testAzureContainerRegistry = "sonayak.azurecr.io"; +export const testEndpointAuthVar = "ENDPOINT_AUTH_SCHEME_" + testAzureSubscriptionEndpointForACR; + +/** + * Formats the given path to be appropriate for the operating system. + * @param canonicalPath A non-rooted path using a forward slash (/) as a directory separator. + */ +export function formatPath(canonicalPath: string) { + if (process.env[TestEnvVars.operatingSystem] === OperatingSystems.Windows) { + return "F:\\" + canonicalPath.replace("/", "\\"); + } else { + return "/" + canonicalPath; + } +}; + +/** + * Returns '--debug' flag if the pipeline is in debug mode otherwise empty string is returned. + */ +export function formatDebugFlag(): string { + return process.env.SYSTEM_DEBUG === 'true' ? ' --debug' : ''; +} diff --git a/Tasks/HelmDeployV1/Tests/package-lock.json b/Tasks/HelmDeployV1/Tests/package-lock.json new file mode 100644 index 000000000000..bd186402ec87 --- /dev/null +++ b/Tasks/HelmDeployV1/Tests/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "helm-deploy-tests", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/Tasks/HelmDeployV1/Tests/package.json b/Tasks/HelmDeployV1/Tests/package.json new file mode 100644 index 000000000000..ddf323707762 --- /dev/null +++ b/Tasks/HelmDeployV1/Tests/package.json @@ -0,0 +1,19 @@ +{ + "name": "helm-deploy-tests", + "version": "1.0.0", + "description": "Azure Pipelines Helm Deploy V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme" +} diff --git a/Tasks/HelmDeployV1/ThirdPartyNotices.txt b/Tasks/HelmDeployV1/ThirdPartyNotices.txt new file mode 100644 index 000000000000..db0e487d9d00 --- /dev/null +++ b/Tasks/HelmDeployV1/ThirdPartyNotices.txt @@ -0,0 +1,1707 @@ + +THIRD PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +Package and deploy Helm charts task for Azure Pipelines or Azure DevOps Server + +This software incorporates material from third parties. Microsoft makes certain +open source code available at http://3rdpartysource.microsoft.com, or you may +send a check or money order for US $5.00, including the product name, the open +source component name, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the +extent required to debug changes to any libraries licensed under the GNU Lesser +General Public License. + + +1. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +2. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +3. array-union (https://github.com/sindresorhus/array-union) +4. array-uniq (https://github.com/sindresorhus/array-uniq) +5. arrify (https://github.com/sindresorhus/arrify) +6. balanced-match (https://github.com/juliangruber/balanced-match) +7. brace-expansion (https://github.com/juliangruber/brace-expansion) +8. buffer-equal-constant-time (https://github.com/salesforce/buffer-equal-constant-time) +9. concat-map (https://github.com/substack/node-concat-map) +10. del (https://github.com/sindresorhus/del) +11. ecdsa-sig-formatter (git+ssh://git@github.com/Brightspace/node-ecdsa-sig-formatter.git) +12. fs.realpath (https://github.com/isaacs/fs.realpath) +13. Glob (https://github.com/isaacs/node-glob) +14. globby (https://github.com/sindresorhus/globby) +15. hoek (https://github.com/hapijs/hoek) +16. inflight (https://github.com/npm/inflight) +17. inherits (https://github.com/isaacs/inherits) +18. is-path-cwd (https://github.com/sindresorhus/is-path-cwd) +19. is-path-in-cwd (https://github.com/sindresorhus/is-path-in-cwd) +20. is-path-inside (https://github.com/sindresorhus/is-path-inside) +21. isemail (https://github.com/hapijs/isemail) +22. joi (https://github.com/hapijs/joi) +23. jsonwebtoken (https://github.com/auth0/node-jsonwebtoken) +24. lodash.once (https://github.com/lodash/lodash) +25. minimatch (https://github.com/isaacs/minimatch) +26. Mockery (https://github.com/mfncooper/mockery) +27. Moment (https://github.com/moment/moment) +28. ms (https://github.com/zeit/ms) +29. node-jwa (https://github.com/brianloveswords/node-jwa) +30. node-jws (https://github.com/brianloveswords/node-jws) +31. node-uuid (https://github.com/broofa/node-uuid) +32. object-assign (https://github.com/sindresorhus/object-assign) +33. once (https://github.com/isaacs/once) +34. path-is-absolute (https://github.com/sindresorhus/path-is-absolute) +35. path-is-inside (https://github.com/domenic/path-is-inside) +36. pify (https://github.com/sindresorhus/pify) +37. pinkie (https://github.com/floatdrop/pinkie) +38. pinkie-promise (https://github.com/floatdrop/pinkie-promise) +39. q (https://github.com/kriskowal/q) +40. Rimraf (https://github.com/isaacs/rimraf) +41. safe-buffer (https://github.com/feross/safe-buffer) +42. semver (https://github.com/npm/node-semver/) +43. semver-compare (https://github.com/substack/semver-compare) +44. ShellJS (https://github.com/shelljs/shelljs) + Includes:wrench-js +45. topo (https://github.com/hapijs/topo) +46. tunnel (https://github.com/koichik/node-tunnel) +47. typed-rest-client (https://github.com/Microsoft/typed-rest-client) +48. underscore (https://github.com/jashkenas/underscore) +49. vso-node-api (https://github.com/Microsoft/vsts-node-api) +50. Azure-Pipelines-Task-Lib (https://github.com/Microsoft/azure-pipelines-task-lib) +51. vsts-task-tool-lib (git+https://github.com/microsoft/vsts-task-installer-lib.git) +51. wrappy (https://github.com/npm/wrappy) +53. xtend (https://github.com/Raynos/xtend) + + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE + +%% array-union NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF array-union NOTICES, INFORMATION, AND LICENSE + +%% array-uniq NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF array-uniq NOTICES, INFORMATION, AND LICENSE + +%% arrify NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF arrify NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% buffer-equal-constant-time NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF buffer-equal-constant-time NOTICES AND INFORMATION + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) James Halliday/substack + +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% del NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF del NOTICES, INFORMATION, AND LICENSE + +%% ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 D2L Corporation + + 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. +========================================= +END OF ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license, as follows: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% Glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF Glob NOTICES, INFORMATION, AND LICENSE + +%% globby NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF globby NOTICES, INFORMATION, AND LICENSE + +%% hoek NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. +========================================= +Includes code from Deep-eql + +Copyright (c) 2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF hoek NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% is-path-cwd NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF is-path-cwd NOTICES, INFORMATION, AND LICENSE + +%% is-path-in-cwd NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF is-path-in-cwd NOTICES, INFORMATION, AND LICENSE + +%% is-path-inside NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF is-path-inside NOTICES AND INFORMATION + +%% isemail NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2008-2011, Dominic Sayers +Copyright (c) 2013-2014, GlobeSherpa +Copyright (c) 2014-2015, Eli Skeggs + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF isemail NOTICES AND INFORMATION + +%% joi NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors +========================================= +END OF joi NOTICES AND INFORMATION + +%% jsonwebtoken NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2015 Auth0, Inc. (http://auth0.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF jsonwebtoken NOTICES AND INFORMATION + +%% lodash.once NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.once NOTICES AND INFORMATION + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% Mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF Mockery NOTICES, INFORMATION, AND LICENSE + +%% Moment NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +Files with code from Closure + +Copyright (c) 2006 The Closure Library Authors. All Rights Reserved. + +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. +========================================= +END OF Moment NOTICES AND INFORMATION + +%% ms NOTICES AND INFORMATION BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Guillermo Rauch +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the Software), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF ms NOTICES AND INFORMATION + +%% node-jwa NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jwa NOTICES AND INFORMATION + +%% node-jws NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jws NOTICES AND INFORMATION + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% object-assign NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF object-assign NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +path-is-absolute + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +node.js: + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +Software), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% path-is-inside NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2013-2014 Domenic Denicola +Licensed under the WTFPL Version 2 (http://www.wtfpl.net/about/) +========================================= +END OF path-is-inside NOTICES, INFORMATION, AND LICENSE + +%% pify NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF pify NOTICES, INFORMATION, AND LICENSE + +%% pinkie NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF pinkie NOTICES, INFORMATION, AND LICENSE + +%% pinkie-promise NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF pinkie-promise NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Copyright 2009–2014 Kristopher Michael Kowal. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +/*! + * + * Copyright 2009-2012 Kris Kowal under the terms of the MIT + * license found at http://github.com/kriskowal/q/raw/master/LICENSE + * + * With parts by Tyler Close + * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found + * at http://www.opensource.org/licenses/mit-license.html + * Forked at ref_send.js version: 2009-05-11 + * + * With parts by Mark Miller + * Copyright (C) 2011 Google 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. + * + */ +========================================= +END OF q NOTICES AND INFORMATION + +%% Rimraf NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Rimraf NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES AND INFORMATION + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% semver-compare NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2014 James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF semver-compare NOTICES AND INFORMATION + +%% ShellJS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +Includes wrench-js +The MIT License + +Copyright (c) 2010 Ryan McGrath + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF ShellJS NOTICES, INFORMATION, AND LICENSE + +%% topo NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/topo/graphs/contributors +========================================= +END OF topo NOTICES AND INFORMATION + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES AND INFORMATION BEGIN HERE +========================================= +Typed Rest Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES AND INFORMATION + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% Azure-Pipelines-Task-Lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +========================================= +END OF Azure-Pipelines-Task-Lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% xtend NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2012-2014 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF xtend NOTICES AND INFORMATION + diff --git a/Tasks/HelmDeployV1/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/HelmDeployV1/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..5554493fe26e --- /dev/null +++ b/Tasks/HelmDeployV1/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "helm-deploy-tests", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "helm-deploy-tests", + "version": "1.0.0", + "license": "MIT" + } + } +} diff --git a/Tasks/HelmDeployV1/_buildConfigs/Node20/Tests/package.json b/Tasks/HelmDeployV1/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..f09cf187192d --- /dev/null +++ b/Tasks/HelmDeployV1/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,19 @@ +{ + "name": "helm-deploy-tests", + "version": "1.0.0", + "description": "Azure Pipelines Helm Deploy V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme" +} diff --git a/Tasks/HelmDeployV1/_buildConfigs/Node20/package-lock.json b/Tasks/HelmDeployV1/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..3165063e6a3e --- /dev/null +++ b/Tasks/HelmDeployV1/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,1647 @@ +{ + "name": "HelmDeployV1_Node20", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "@types/q": "^1.5.0", + "@types/uuid": "^8.3.0", + "agent-base": "6.0.2", + "azure-pipelines-task-lib": "^4.13.0", + "azure-pipelines-tasks-azure-arm-rest": "3.239.0", + "azure-pipelines-tasks-docker-common": "^2.241.1", + "azure-pipelines-tasks-kubernetes-common": "^2.224.1", + "azure-pipelines-tasks-securefiles-common": "^2.207.0", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "del": "2.2.0", + "moment": "^2.29.4" + }, + "devDependencies": { + "typescript": "5.1.6" + } + }, + "node_modules/@azure/msal-common": { + "version": "14.12.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.12.0.tgz", + "integrity": "sha512-IDDXmzfdwmDkv4SSmMEyAniJf6fDu3FJ7ncOjlxkDuT85uSnLEhZi3fGZpoR7T4XZpOMx9teM9GXBgrfJgyeBw==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.9.2.tgz", + "integrity": "sha512-8tvi6Cos3m+0KmRbPjgkySXi+UQU/QiuVRFnrxIwt5xZlEEFa69O04RTaNESGgImyBBlYbo2mfE8/U8Bbdk1WQ==", + "dependencies": { + "@azure/msal-common": "14.12.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@azure/msal-node/node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/@azure/msal-node/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@azure/msal-node/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "node_modules/@types/mockery": { + "version": "1.4.33", + "resolved": "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.33.tgz", + "integrity": "sha512-vpuuVxCnCEM0OakYNoyFs40mjJFJFJahBHyx0Z0Piysof+YwlDJzNO4V1weRvYySAmtAvlb0UHtxVO2IfTcykw==" + }, + "node_modules/@types/node": { + "version": "20.14.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", + "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + }, + "node_modules/@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "node_modules/adm-zip": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.14.tgz", + "integrity": "sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/async-mutex": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/azure-devops-node-api": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/azure-pipelines-task-lib": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.13.0.tgz", + "integrity": "sha512-KVguui31If98vgokNepHUxE3/D8UFB4FHV1U6XxjGOkgxxwKxbupC3knVnEiZA/hNl7X+vmj9KrYOx79iwmezQ==", + "dependencies": { + "adm-zip": "^0.5.10", + "minimatch": "3.0.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "uuid": "^3.0.1" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest": { + "version": "3.239.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.239.0.tgz", + "integrity": "sha512-f24EoPheEED8yBx2MszDrPl/Tj5Wj3DQFR+SiP2ooeY6fxvxo278GEsqABtSDgJG7n6Pv24pKucT5pcVHsVsjw==", + "dependencies": { + "@azure/msal-node": "^2.7.0", + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^4.11.0", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "1.8.4", + "xml2js": "0.6.2" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common": { + "version": "2.241.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-docker-common/-/azure-pipelines-tasks-docker-common-2.241.1.tgz", + "integrity": "sha512-X1KhZr87bICWgjTWE+wZm3IDAN2dTzmAEd0n7O10xkVAJ7lbChoIfsz1eOkgOxR/gRl6ZuREUAm8pR+ncRntMw==", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "^4.13.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.241.2", + "del": "2.2.0", + "q": "1.4.1" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-task-lib": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.13.0.tgz", + "integrity": "sha512-KVguui31If98vgokNepHUxE3/D8UFB4FHV1U6XxjGOkgxxwKxbupC3knVnEiZA/hNl7X+vmj9KrYOx79iwmezQ==", + "dependencies": { + "adm-zip": "^0.5.10", + "minimatch": "3.0.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "uuid": "^3.0.1" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-task-lib/node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-tasks-azure-arm-rest": { + "version": "3.241.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.241.2.tgz", + "integrity": "sha512-mYTj2UwoIhgzMTR1Y144pk4hCsVwzglFV/AcfV60YrxYOdyDF5ZqTZjJrq1mcen2ND12F304TUKNvBU0TyP7Kg==", + "dependencies": { + "@azure/msal-node": "^2.7.0", + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^4.11.0", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "^1.8.6", + "xml2js": "0.6.2" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/azure-pipelines-tasks-kubernetes-common": { + "version": "2.235.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-kubernetes-common/-/azure-pipelines-tasks-kubernetes-common-2.235.0.tgz", + "integrity": "sha512-MNecd10J/+xnluYvHh+/5ozSOe/53BaNlq9bbSTyORCQLzFzKkbQva9WZQGeqUDJkSTIpiD/FAGDq5m7vQ0Dfw==", + "dependencies": { + "@types/mocha": "5.2.7", + "@types/node": "10.17.0", + "@types/node-forge": "^1.3.2", + "@types/uuid": "8.3.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^4.0.0-preview", + "azure-pipelines-tool-lib": "^2.0.7", + "js-yaml": "3.13.1", + "node-forge": "^1.3.1" + } + }, + "node_modules/azure-pipelines-tasks-kubernetes-common/node_modules/@types/node": { + "version": "10.17.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.0.tgz", + "integrity": "sha512-wuJwN2KV4tIRz1bu9vq5kSPasJ8IsEjZaP1ZR7KlmdUZvGF/rXy8DmXOVwUD0kAtvtJ7aqMKPqUXC0NUTDbrDg==" + }, + "node_modules/azure-pipelines-tasks-kubernetes-common/node_modules/@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "node_modules/azure-pipelines-tasks-securefiles-common": { + "version": "2.219.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.219.0.tgz", + "integrity": "sha512-S+ec/Qdz9WYL9UbEFYWY2UFkVL2Es43GGcYYE9DhIfRuRZ02Wm2ycR29uSq3QVOQvO01daGJX3Y/ZFpRZerdfQ==", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/mockery": "^1.4.30", + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0", + "mockery": "^2.1.0" + } + }, + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "dependencies": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "node_modules/azure-pipelines-tasks-utility-common": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.241.0.tgz", + "integrity": "sha512-7D9nJ2EaKcj5YtPOizOcpgOdxaYcI/Y+JeGrPk6ibtIalImYUBg7Otq337rkLJFkK1cEikC5abZV5YvOowJPsA==", + "dependencies": { + "@types/node": "^16.11.39", + "azure-pipelines-task-lib": "^4.11.0", + "azure-pipelines-tool-lib": "^2.0.7", + "js-yaml": "3.13.1", + "semver": "^5.7.2" + } + }, + "node_modules/azure-pipelines-tasks-utility-common/node_modules/@types/node": { + "version": "16.18.99", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.99.tgz", + "integrity": "sha512-X2Yc+NQaPXDuaR32UmFrTr3OXWaht756A6sJw56o4dehkySBZ0NWH30CCRviuC0KFwTDW/NTjrtbFHhYcHkd6g==" + }, + "node_modules/azure-pipelines-tool-lib": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.7.tgz", + "integrity": "sha512-1FN67ypNwNhgZllYSm4/pAQdffSfEZJhwW8YeNvm/cKDTS6t6bukTBIkt04c1CsaQe7Ot+eDOVMn41wX1ketXw==", + "dependencies": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.1.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + } + }, + "node_modules/azure-pipelines-tool-lib/node_modules/@types/uuid": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.13.tgz", + "integrity": "sha512-pAeZeUbLE4Z9Vi9wsWV2bYPTweEHeJJy0G4pEjOA/FSvy1Ad5U5Km8iDV6TKre1mjBiVNfAdVHKruP8bAh4Q5A==" + }, + "node_modules/azure-pipelines-tool-lib/node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.0.tgz", + "integrity": "sha512-AZDiRb78EEGYCsAZTG3v+CM5q8J0BIs+wI7QeUtyosm+zIMm4XSmp6aI/K7cU9l+YaKpDKN9dYP1xTrNjLQ+LA==", + "dependencies": { + "globby": "^4.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globby": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", + "integrity": "sha512-JPDtMSr0bt25W64q792rvlrSwIaZwqUAhqdYKSr57Wh/xBcQ5JDWLM85ndn+Q1WdBQXLb9YGCl0QN/T0HpqU0A==", + "dependencies": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^6.0.1", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dependencies": { + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/nodejs-file-downloader": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/nodejs-file-downloader/-/nodejs-file-downloader-4.13.0.tgz", + "integrity": "sha512-nI2fKnmJWWFZF6SgMPe1iBodKhfpztLKJTtCtNYGhm/9QXmWa/Pk9Sv00qHgzEvNLe1x7hjGDRor7gcm/ChaIQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^5.0.0", + "mime-types": "^2.1.27", + "sanitize-filename": "^1.6.3" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + } + } +} diff --git a/Tasks/HelmDeployV1/_buildConfigs/Node20/package.json b/Tasks/HelmDeployV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..9501031c7f00 --- /dev/null +++ b/Tasks/HelmDeployV1/_buildConfigs/Node20/package.json @@ -0,0 +1,20 @@ +{ + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "@types/q": "^1.5.0", + "@types/uuid": "^8.3.0", + "agent-base": "6.0.2", + "azure-pipelines-task-lib": "^4.13.0", + "azure-pipelines-tasks-azure-arm-rest": "3.239.0", + "azure-pipelines-tasks-docker-common": "^2.241.1", + "azure-pipelines-tasks-kubernetes-common": "^2.224.1", + "azure-pipelines-tasks-securefiles-common": "^2.207.0", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "del": "2.2.0", + "moment": "^2.29.4" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/HelmDeployV1/icon.png b/Tasks/HelmDeployV1/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5faba1eb7e09d1aab205883a38f266e36cd36179 GIT binary patch literal 936 zcmV;Z16TZsP)vR@*g-%G>CKP((uKJFiQx$ElP-z>w2S%`$a051*?E0P|&z1ux z9$+Kpd^#F>j^E7Z=nUK8#>3|Wx^CwvBE@#jCcYd)ITZ;8Vt23YLqt@jR)^Z$>X0eb zb@a8l<;5_JS(%;iuFg$A1U8hE6L=T7J<=x10E7-+Fc0IC^-O9RIygLb=c;2Pn@)%_ zfLyh$2T%HmmrJi6dy;cg{(K@H`2o$^26JsoyR*Kd*G)nmr4A>l5)Gp5XKpT8FN_t0 z01|7VQ_dBYaZNTlkNK1alRX)l@_%`H|8%(qWIoJKD)c6MHH8(qR%ZbwL^Bkz*CO*5byxl6JEoR zG-Z%z4A4^m5Yowsq_616n+fmA?91_@hg3Q-Mpay;yoV8@4M2fGB`oPFnv?IjP0_qW z*ikpaw=UXqiN!FSko-3SnAP%7S3|t>3 zzvcUp*|hxeZ$q@(0OJOO+l7j(66HcZmr1^z^sU9YuNs$p6JP)xfzjK&Y#N~e0000< KMNUMnLSTYcgRbZR literal 0 HcmV?d00001 diff --git a/Tasks/HelmDeployV1/icon.svg b/Tasks/HelmDeployV1/icon.svg new file mode 100644 index 000000000000..914cc0f58cbc --- /dev/null +++ b/Tasks/HelmDeployV1/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/Tasks/HelmDeployV1/make.json b/Tasks/HelmDeployV1/make.json new file mode 100644 index 000000000000..a88df49172d1 --- /dev/null +++ b/Tasks/HelmDeployV1/make.json @@ -0,0 +1,16 @@ +{ + "rm": [ + { + "items": [ + "node_modules/https-proxy-agent/node_modules/agent-base", + "node_modules/azure-pipelines-tasks-kubernetes-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-utility-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-task-lib" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/package-lock.json b/Tasks/HelmDeployV1/package-lock.json new file mode 100644 index 000000000000..828f5993c33a --- /dev/null +++ b/Tasks/HelmDeployV1/package-lock.json @@ -0,0 +1,1285 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@azure/msal-common": { + "version": "14.12.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.12.0.tgz", + "integrity": "sha512-IDDXmzfdwmDkv4SSmMEyAniJf6fDu3FJ7ncOjlxkDuT85uSnLEhZi3fGZpoR7T4XZpOMx9teM9GXBgrfJgyeBw==" + }, + "@azure/msal-node": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.9.2.tgz", + "integrity": "sha512-8tvi6Cos3m+0KmRbPjgkySXi+UQU/QiuVRFnrxIwt5xZlEEFa69O04RTaNESGgImyBBlYbo2mfE8/U8Bbdk1WQ==", + "requires": { + "@azure/msal-common": "14.12.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "dependencies": { + "jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + } + }, + "semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "requires": { + "@types/node": "*" + } + }, + "@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/mockery": { + "version": "1.4.30", + "resolved": "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.30.tgz", + "integrity": "sha512-uv53RrNdhbkV/3VmVCtfImfYCWC3GTTRn3R11Whni3EJ+gb178tkZBVNj2edLY5CMrB749dQi+SJkg87jsN8UQ==" + }, + "@types/node": { + "version": "16.18.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.39.tgz", + "integrity": "sha512-8q9ZexmdYYyc5/cfujaXb4YOucpQxAV4RMG0himLyDUOEr8Mr79VrqsFI+cQ2M2h89YIuy95lbxuYjxT4Hk4kQ==" + }, + "@types/node-forge": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-SWpOXtqCNKaDO4xY+ZHrU5ih7UeEeo6frW468B/G7eJ3d9t2r9Vi/9iLHUuuvdZdv5l2yvZ10R2NlY3cV/CuWQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "adm-zip": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.14.tgz", + "integrity": "sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "async-mutex": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "requires": { + "tslib": "^2.4.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "azure-devops-node-api": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.1.0.tgz", + "integrity": "sha512-VY+G45eNKVJfMIO0uyZfbi4PzUR8JHEfsHQjEUAXUGRkYhhBbhGHjy8cpiyYFxLXc3a4PL5cqgqqV/YD1SaCXg==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.13.0.tgz", + "integrity": "sha512-KVguui31If98vgokNepHUxE3/D8UFB4FHV1U6XxjGOkgxxwKxbupC3knVnEiZA/hNl7X+vmj9KrYOx79iwmezQ==", + "requires": { + "adm-zip": "^0.5.10", + "minimatch": "3.0.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-azure-arm-rest": { + "version": "3.239.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.239.0.tgz", + "integrity": "sha512-f24EoPheEED8yBx2MszDrPl/Tj5Wj3DQFR+SiP2ooeY6fxvxo278GEsqABtSDgJG7n6Pv24pKucT5pcVHsVsjw==", + "requires": { + "@azure/msal-node": "^2.7.0", + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^4.11.0", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "1.8.4", + "xml2js": "0.6.2" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + } + } + }, + "azure-pipelines-tasks-docker-common": { + "version": "2.241.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-docker-common/-/azure-pipelines-tasks-docker-common-2.241.1.tgz", + "integrity": "sha512-X1KhZr87bICWgjTWE+wZm3IDAN2dTzmAEd0n7O10xkVAJ7lbChoIfsz1eOkgOxR/gRl6ZuREUAm8pR+ncRntMw==", + "requires": { + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "^4.13.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.241.2", + "del": "2.2.0", + "q": "1.4.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "azure-pipelines-task-lib": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.13.0.tgz", + "integrity": "sha512-KVguui31If98vgokNepHUxE3/D8UFB4FHV1U6XxjGOkgxxwKxbupC3knVnEiZA/hNl7X+vmj9KrYOx79iwmezQ==", + "requires": { + "adm-zip": "^0.5.10", + "minimatch": "3.0.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "uuid": "^3.0.1" + }, + "dependencies": { + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tasks-azure-arm-rest": { + "version": "3.241.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.241.2.tgz", + "integrity": "sha512-mYTj2UwoIhgzMTR1Y144pk4hCsVwzglFV/AcfV60YrxYOdyDF5ZqTZjJrq1mcen2ND12F304TUKNvBU0TyP7Kg==", + "requires": { + "@azure/msal-node": "^2.7.0", + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^4.11.0", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "^1.8.6", + "xml2js": "0.6.2" + }, + "dependencies": { + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==" + }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + } + } + }, + "azure-pipelines-tasks-kubernetes-common": { + "version": "2.224.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-kubernetes-common/-/azure-pipelines-tasks-kubernetes-common-2.224.1.tgz", + "integrity": "sha512-UwVeSD1hZcPW9Z4CwAuNp6wmczdBCoWOa0saVv0DNejGVbOi0Nu7xBl+J3/N8xhcLnkD5G00LDY29G69yZFXUA==", + "requires": { + "@types/mocha": "5.2.7", + "@types/node": "10.17.0", + "@types/node-forge": "^1.3.2", + "@types/uuid": "8.3.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^3.1.0", + "azure-pipelines-tool-lib": "^1.0.2", + "js-yaml": "3.13.1", + "node-forge": "^1.3.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.0.tgz", + "integrity": "sha512-wuJwN2KV4tIRz1bu9vq5kSPasJ8IsEjZaP1ZR7KlmdUZvGF/rXy8DmXOVwUD0kAtvtJ7aqMKPqUXC0NUTDbrDg==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.219.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.219.0.tgz", + "integrity": "sha512-S+ec/Qdz9WYL9UbEFYWY2UFkVL2Es43GGcYYE9DhIfRuRZ02Wm2ycR29uSq3QVOQvO01daGJX3Y/ZFpRZerdfQ==", + "requires": { + "@types/mocha": "^5.2.7", + "@types/mockery": "^1.4.30", + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0", + "mockery": "^2.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.225.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.225.0.tgz", + "integrity": "sha512-Na7g1+zcsQpYogyex457QT6o9EB2+WQYwLUXPiszhTdf83hKJUmDMqvl2qm/mHqYuP1zg5KkRfJaPy4/09M8pA==", + "requires": { + "@types/node": "^16.11.39", + "azure-pipelines-task-lib": "^4.4.0", + "azure-pipelines-tool-lib": "^2.0.0-preview", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-tool-lib": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.4.tgz", + "integrity": "sha512-LgAelZKJe3k/t3NsKSKzjeRviphns0w0p5tgwz8uHN70I9m2TToiOKl+fogrdXcM6+jiLBk5KTqrcRBqPpv/XA==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.1.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + } + }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + } + } + }, + "azure-pipelines-tool-lib": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-1.3.2.tgz", + "integrity": "sha512-PtYcd3E2ouwZhLuaOpWA00FYoLjRuJs1V8mNu3u6lBnqeYd4jh/8VL/of6nchm8f2NM6Div+EEnbOcmWvcptPg==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^3.1.10", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "del": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.0.tgz", + "integrity": "sha1-mlDwS/NzJeKDtPROmFM2wlJFa9U=", + "requires": { + "globby": "^4.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "globby": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", + "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^6.0.1", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + }, + "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "nodejs-file-downloader": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/nodejs-file-downloader/-/nodejs-file-downloader-4.13.0.tgz", + "integrity": "sha512-nI2fKnmJWWFZF6SgMPe1iBodKhfpztLKJTtCtNYGhm/9QXmWa/Pk9Sv00qHgzEvNLe1x7hjGDRor7gcm/ChaIQ==", + "requires": { + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^5.0.0", + "mime-types": "^2.1.27", + "sanitize-filename": "^1.6.3" + }, + "dependencies": { + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + } + } +} diff --git a/Tasks/HelmDeployV1/package.json b/Tasks/HelmDeployV1/package.json new file mode 100644 index 000000000000..a54534bdc51f --- /dev/null +++ b/Tasks/HelmDeployV1/package.json @@ -0,0 +1,20 @@ +{ + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^16.11.39", + "@types/q": "^1.5.0", + "@types/uuid": "^8.3.0", + "agent-base": "6.0.2", + "azure-pipelines-task-lib": "^4.13.0", + "azure-pipelines-tasks-azure-arm-rest": "3.239.0", + "azure-pipelines-tasks-docker-common": "^2.241.1", + "azure-pipelines-tasks-kubernetes-common": "^2.224.1", + "azure-pipelines-tasks-securefiles-common": "^2.207.0", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "del": "2.2.0", + "moment": "^2.29.4" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/Tasks/HelmDeployV1/src/basecommand.ts b/Tasks/HelmDeployV1/src/basecommand.ts new file mode 100644 index 000000000000..89add599249d --- /dev/null +++ b/Tasks/HelmDeployV1/src/basecommand.ts @@ -0,0 +1,66 @@ +import path = require("path"); +import tl = require("azure-pipelines-task-lib/task"); +import fs = require("fs"); +import util = require("util"); +import os = require("os"); +import tr = require('azure-pipelines-task-lib/toolrunner'); + +abstract class basecommand { + private toolPath: string; + abstract getTool(): string; + abstract login(): void; + abstract logout(): void; + + constructor(required: boolean) { + this.toolPath = tl.which(this.getTool(), required); + } + + public getToolPath(): string { + return this.toolPath; + } + + public createCommand(): tr.ToolRunner { + var command = tl.tool(this.toolPath); + return command; + } + + public execCommand(command: tr.ToolRunner, options?: tr.IExecOptions) { + var errlines = []; + command.on("stderr", line => { + errlines.push(line); + }); + + command.on("error", line => { + errlines.push(line); + }); + + return command.exec(options).fail(error => { + errlines.forEach(line => tl.error(line)); + throw error; + }); + } + + public execCommandSync(command: tr.ToolRunner, options?: tr.IExecOptions): tr.IExecSyncResult { + return command.execSync(options); + } + + public IsInstalled(): boolean { + return !!this.getToolPath(); + } + + public static handleExecResult(execResult: tr.IExecSyncResult) { + if (execResult.code != tl.TaskResult.Succeeded) { + + tl.debug('execResult: ' + JSON.stringify(execResult)); + if(!!execResult.error || !!execResult.stderr) { + tl.setResult(tl.TaskResult.Failed, execResult.stderr); + } + else + { + tl.setResult(tl.TaskResult.Failed, ""); + } + } + } +} + +export default basecommand; \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/clusters/armkubernetescluster.ts b/Tasks/HelmDeployV1/src/clusters/armkubernetescluster.ts new file mode 100644 index 000000000000..56bb7717ade4 --- /dev/null +++ b/Tasks/HelmDeployV1/src/clusters/armkubernetescluster.ts @@ -0,0 +1,26 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import { AzureAksService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-aks-service'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { AzureEndpoint, AKSCluster, AKSClusterAccessProfile} from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; + +// get kubeconfig file content +async function getKubeConfigFromAKS(azureSubscriptionEndpoint: string, resourceGroup: string, clusterName: string, useClusterAdmin?: boolean) : Promise { + var azureEndpoint: AzureEndpoint = await (new AzureRMEndpoint(azureSubscriptionEndpoint)).getEndpoint(); + var aks = new AzureAksService(azureEndpoint); + + tl.debug(tl.loc("KubernetesClusterResourceGroup", clusterName, resourceGroup)); + + var clusterInfo : AKSClusterAccessProfile = await aks.getAccessProfile(resourceGroup, clusterName, useClusterAdmin); + var base64Kubeconfig = Buffer.from(clusterInfo.properties.kubeConfig, 'base64'); + return base64Kubeconfig.toString(); +} + +export async function getKubeConfig(): Promise { + var clusterName : string = tl.getInput("kubernetesCluster", true); + var azureSubscriptionEndpoint : string = tl.getInput("azureSubscriptionEndpoint", true); + var resourceGroup : string = tl.getInput("azureResourceGroup", true); + var useClusterAdmin: boolean = tl.getBoolInput('useClusterAdmin'); + return getKubeConfigFromAKS(azureSubscriptionEndpoint, resourceGroup, clusterName, useClusterAdmin); +} diff --git a/Tasks/HelmDeployV1/src/clusters/generickubernetescluster.ts b/Tasks/HelmDeployV1/src/clusters/generickubernetescluster.ts new file mode 100644 index 000000000000..c7b68229c6fc --- /dev/null +++ b/Tasks/HelmDeployV1/src/clusters/generickubernetescluster.ts @@ -0,0 +1,17 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import kubectlutility = require("azure-pipelines-tasks-kubernetes-common/kubectlutility"); + +export async function getKubeConfig(): Promise { + var kubernetesServiceEndpoint = tl.getInput("kubernetesServiceEndpoint", true); + var authorizationType = tl.getEndpointDataParameter(kubernetesServiceEndpoint, 'authorizationType', true); + if (!authorizationType || authorizationType === "Kubeconfig") + { + return kubectlutility.getKubeconfigForCluster(kubernetesServiceEndpoint); + } + else if (authorizationType === "ServiceAccount" || authorizationType === "AzureSubscription") + { + return kubectlutility.createKubeconfig(kubernetesServiceEndpoint); + } +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/commoncommandoption.ts b/Tasks/HelmDeployV1/src/commoncommandoption.ts new file mode 100644 index 000000000000..cb8076c548e2 --- /dev/null +++ b/Tasks/HelmDeployV1/src/commoncommandoption.ts @@ -0,0 +1,17 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./helmcli"; + +export function addArguments(helmCli: helmcli) : void { + var tillernamespace = tl.getInput("tillernamespace", false); + var debugMode = tl.getVariable('system.debug'); + + if(tillernamespace) { + helmCli.addArgument("--tiller-namespace ".concat(tillernamespace)); + } + + if(debugMode === 'true') { + helmCli.addArgument("--debug"); + } +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/deletesecurefiles.ts b/Tasks/HelmDeployV1/src/deletesecurefiles.ts new file mode 100644 index 000000000000..5eb45360b512 --- /dev/null +++ b/Tasks/HelmDeployV1/src/deletesecurefiles.ts @@ -0,0 +1,36 @@ +"use strict"; + +import fs = require('fs'); +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); + +tl.setResourcePath(path.join(__dirname, '..' , 'task.json')); + +async function run() { + var enableTls = tl.getBoolInput('enableTls', false); + + if(!enableTls) { + tl.debug(tl.loc("SkipDeleteSecureFiles")); + } + + try { + var caCertFilePath = tl.getTaskVariable('CACERT_FILE_PATH'); + if (caCertFilePath && tl.exist(caCertFilePath)) { + fs.unlinkSync(caCertFilePath); + } + + var certFilePath = tl.getTaskVariable('CERT_FILE_PATH'); + if (certFilePath && tl.exist(certFilePath)) { + fs.unlinkSync(certFilePath); + } + + var keyFilePath = tl.getTaskVariable('KEY_FILE_PATH'); + if (keyFilePath && tl.exist(keyFilePath)) { + fs.unlinkSync(keyFilePath); + } + } catch(err) { + tl.warning(err); + } +} + +run(); \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/downloadsecurefiles.ts b/Tasks/HelmDeployV1/src/downloadsecurefiles.ts new file mode 100644 index 000000000000..fe11e4c502d0 --- /dev/null +++ b/Tasks/HelmDeployV1/src/downloadsecurefiles.ts @@ -0,0 +1,38 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import secureFilesCommon = require('azure-pipelines-tasks-securefiles-common/securefiles-common'); +import path = require('path'); + +tl.setResourcePath(path.join(__dirname, '..' , 'task.json')); + +async function run() { + var enableTls = tl.getBoolInput('enableTls', false); + + if(!enableTls) { + tl.debug(tl.loc("SkipDownloadSecureFiles")); + return; + } + + var caCert = tl.getInput('caCert', true); + var cert = tl.getInput('certificate', true); + var key = tl.getInput('privatekey', true); + + try { + var secureFileHelpers = new secureFilesCommon.SecureFileHelpers(); + var caCertFilePath: string = await secureFileHelpers.downloadSecureFile(caCert); + tl.setTaskVariable('CACERT_FILE_PATH', caCertFilePath); + var certFilePath: string = await secureFileHelpers.downloadSecureFile(cert); + tl.setTaskVariable('CERT_FILE_PATH', certFilePath); + var keyFilePath: string = await secureFileHelpers.downloadSecureFile(key); + tl.setTaskVariable('KEY_FILE_PATH', keyFilePath); + } catch(err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run().then(()=>{ + // do nothing +}, (reason)=> { + tl.setResult(tl.TaskResult.Failed, reason); +}); \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helm.ts b/Tasks/HelmDeployV1/src/helm.ts new file mode 100644 index 000000000000..c9983aa236af --- /dev/null +++ b/Tasks/HelmDeployV1/src/helm.ts @@ -0,0 +1,273 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); + +import * as commonCommandOptions from "./commoncommandoption"; +import * as helmutil from "./utils" + +import { AKSCluster, AKSClusterAccessProfile, AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { WebRequest, WebResponse, sendRequest } from 'azure-pipelines-tasks-utility-common/restutilities'; +import { extractManifestsFromHelmOutput, getDeploymentMetadata, getManifestFileUrlsFromHelmOutput, getPublishDeploymentRequestUrl, isDeploymentEntity } from 'azure-pipelines-tasks-kubernetes-common/image-metadata-helper'; + +import { AzureAksService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-aks-service'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { Kubelogin } from 'azure-pipelines-tasks-kubernetes-common/kubelogin'; +import helmcli from "./helmcli"; +import kubernetescli from "./kubernetescli" + +import fs = require('fs'); +import { fail } from 'assert'; + +const environmentVariableMaximumSize = 32766; + +tl.setResourcePath(path.join(__dirname, '..', 'task.json')); +tl.setResourcePath(path.join(__dirname, '../node_modules/azure-pipelines-tasks-azure-arm-rest/module.json')); + +function getKubeConfigFilePath(): string { + var userdir = helmutil.getTaskTempDir(); + return path.join(userdir, "config"); +} + +function getClusterType(): any { + var connectionType = tl.getInput("connectionType", true); + var endpoint = tl.getInput("azureSubscriptionEndpoint") + if (connectionType === "Azure Resource Manager" && endpoint) { + return require("./clusters/armkubernetescluster") + } + + return require("./clusters/generickubernetescluster") +} + +function isKubConfigSetupRequired(command: string): boolean { + var connectionType = tl.getInput("connectionType", true); + return command !== "package" && command !== "save" && connectionType !== "None"; +} + +function isKubConfigLogoutRequired(command: string): boolean { + var connectionType = tl.getInput("connectionType", true); + return command !== "package" && command !== "save" && command !== "login" && connectionType !== "None"; +} + +// get kubeconfig file path +async function getKubeConfigFile(): Promise { + return getClusterType().getKubeConfig().then((config) => { + var configFilePath = getKubeConfigFilePath(); + tl.debug(tl.loc("KubeConfigFilePath", configFilePath)); + fs.writeFileSync(configFilePath, config); + fs.chmodSync(configFilePath, '600'); + return configFilePath; + }); +} + +async function runHelmSaveCommand(helmCli: helmcli, kubectlCli: kubernetescli, failOnStderr: boolean): Promise { + if (!helmCli.isHelmV3()) { + //helm chart save and push commands are only supported in Helms v3 + throw new Error(tl.loc("SaveSupportedInHelmsV3Only")); + } + process.env.HELM_EXPERIMENTAL_OCI="1"; + await runHelm(helmCli, "saveChart", kubectlCli, failOnStderr); + helmCli.resetArguments(); + const chartRef = getHelmChartRef(tl.getVariable("helmOutput")); + tl.setVariable("helmChartRef", chartRef); + await runHelm(helmCli, "registry", kubectlCli, false); + helmCli.resetArguments(); + await runHelm(helmCli, "pushChart", kubectlCli, failOnStderr); + helmCli.resetArguments(); + await runHelm(helmCli, "removeChart", kubectlCli, failOnStderr); +} + +async function run() { + var command = tl.getInput("command", true).toLowerCase(); + var connectionType = tl.getInput("connectionType", true); + var isKubConfigRequired = isKubConfigSetupRequired(command); + var kubectlCli: kubernetescli; + var externalAuth = connectionType === "None" && (command === "install" || command === "upgrade"); + if (externalAuth && !tl.getVariable("KUBECONFIG")) { + const kubeConfigPath = path.join(process.env.HOME, '.kube', 'config'); + if (fs.existsSync(kubeConfigPath)) { + tl.setVariable("KUBECONFIG", kubeConfigPath); + } else { + tl.error("KUBECONFIG kube configuration file path must be set when connectionType is none and command is install or upgrade."); + } + } + if (isKubConfigRequired || externalAuth) { + var kubeconfigfilePath = (command === "logout" || externalAuth) ? tl.getVariable("KUBECONFIG") : await getKubeConfigFile(); + kubectlCli = new kubernetescli(kubeconfigfilePath); + kubectlCli.login(); + } + + const kubelogin = new Kubelogin(helmutil.getTaskTempDir()); + if (kubelogin.isAvailable() && !externalAuth) { + tl.debug('Kubelogin is installed. Converting kubeconfig.'); + const serviceConnection: string = tl.getInput('azureSubscriptionEndpoint', false); + try { + await kubelogin.login(serviceConnection); + } catch (err) { + tl.debug(tl.loc('KubeloginFailed', err)); + } + } + + var helmCli: helmcli = new helmcli(); + helmCli.login(); + var telemetry = { + connectionType: connectionType, + command: command, + jobId: tl.getVariable('SYSTEM_JOBID') + }; + var failOnStderr = tl.getBoolInput("failOnStderr"); + + console.log("##vso[telemetry.publish area=%s;feature=%s]%s", + "TaskEndpointId", + "HelmDeployV0", + JSON.stringify(telemetry)); + + try { + switch (command) { + case "login": + kubectlCli.setKubeConfigEnvVariable(); + break; + case "logout": + kubectlCli.unsetKubeConfigEnvVariable(); + break; + case "save": + await runHelmSaveCommand(helmCli, kubectlCli, failOnStderr); + break; + default: + await runHelm(helmCli, command, kubectlCli, failOnStderr); + } + } catch (err) { + // not throw error so that we can logout from helm and kubernetes + tl.setResult(tl.TaskResult.Failed, err.message); + } + finally { + if (isKubConfigLogoutRequired(command)) { + kubectlCli.logout(); + } + + helmCli.logout(); + } +} + +async function runHelm(helmCli: helmcli, command: string, kubectlCli: kubernetescli, failOnStderr: boolean): Promise { + var helmCommandMap = { + "init": "./helmcommands/helminit", + "install": "./helmcommands/helminstall", + "package": "./helmcommands/helmpackage", + "pushChart": "./helmcommands/helmchartpush", + "registry": "./helmcommands/helmregistrylogin", + "removeChart": "./helmcommands/helmchartremove", + "saveChart": "./helmcommands/helmchartsave", + "upgrade": "./helmcommands/helmupgrade" + } + + var commandImplementation = require("./helmcommands/uinotimplementedcommands"); + if (command in helmCommandMap) { + commandImplementation = require(helmCommandMap[command]); + } + + //set command + if (command === "saveChart" || command === "pushChart" || command === "removeChart") { + helmCli.setCommand("chart"); + } else { + helmCli.setCommand(command); + } + + // add arguments + commonCommandOptions.addArguments(helmCli); + await commandImplementation.addArguments(helmCli); + + const execResult = helmCli.execHelmCommand(); + tl.setVariable('helmExitCode', execResult.code.toString()); + + if (execResult.stdout) { + var commandOutputLength = execResult.stdout.length; + if (commandOutputLength > environmentVariableMaximumSize) { + tl.warning(tl.loc('OutputVariableDataSizeExceeded', commandOutputLength, environmentVariableMaximumSize)); + } else { + tl.setVariable("helmOutput", execResult.stdout); + } + } + + var publishPipelineMetadata = tl.getBoolInput("publishPipelineMetadata"); + + if (execResult.code != tl.TaskResult.Succeeded || !!execResult.error || (failOnStderr && !!execResult.stderr)) { + tl.debug('execResult: ' + JSON.stringify(execResult)); + tl.setResult(tl.TaskResult.Failed, execResult.stderr); + } + else if (publishPipelineMetadata && (command === "install" || command === "upgrade")) { + try { + let output = execResult.stdout; + let releaseName = helmutil.extractReleaseNameFromHelmOutput(output); + let manifests = helmutil.getManifestsFromRelease(helmCli, releaseName); + if (manifests && manifests.length > 0) { + const manifestUrls = getManifestFileUrlsFromHelmOutput(output); + const allPods = JSON.parse(kubectlCli.getAllPods().stdout); + const clusterInfo = kubectlCli.getClusterInfo().stdout; + + manifests.forEach(manifest => { + //Check if the manifest object contains a deployment entity + if (manifest.kind && isDeploymentEntity(manifest.kind)) { + try { + pushDeploymentDataToEvidenceStore(allPods, clusterInfo, manifest, manifestUrls).then((result) => { + tl.debug("DeploymentDetailsApiResponse: " + JSON.stringify(result)); + }, (error) => { + tl.warning("publishToImageMetadataStore failed with error: " + error); + }); + } + catch (e) { + tl.warning("publishToImageMetadataStore failed with error: " + e); + } + } + }); + } + } + catch (e) { + tl.error("Capturing deployment metadata failed with error: " + e); + } + } +} + +run().then(() => { + // do nothing +}, (reason) => { + tl.setResult(tl.TaskResult.Failed, reason); +}); + +async function pushDeploymentDataToEvidenceStore(allPods: any, clusterInfo: any, deploymentObject: any, manifestUrls: string[]): Promise { + const metadata = getDeploymentMetadata(deploymentObject, allPods, "None", clusterInfo, manifestUrls); + const requestUrl = getPublishDeploymentRequestUrl(); + const request = new WebRequest(); + const accessToken: string = tl.getEndpointAuthorizationParameter('SYSTEMVSSCONNECTION', 'ACCESSTOKEN', false); + + request.uri = requestUrl; + request.method = 'POST'; + request.body = JSON.stringify(metadata); + request.headers = { + "Content-Type": "application/json", + "Authorization": "Bearer " + accessToken + }; + + tl.debug("requestUrl: " + requestUrl); + tl.debug("requestBody: " + JSON.stringify(metadata)); + + try { + tl.debug("Sending request for pushing deployment data to Image meta data store"); + const response = await sendRequest(request); + return response; + } + catch (error) { + tl.debug("Unable to push to deployment details to Artifact Store, Error: " + error); + } + + return Promise.resolve(); +} + +function getHelmChartRef(helmOutput: string): string { + const refMarker = "ref:"; + const refIndex = helmOutput.indexOf(refMarker); + const lineEndingIndex = helmOutput.indexOf("\n", refIndex); + let helmRef = helmOutput.substring(refIndex + refMarker.length, lineEndingIndex); + helmRef.trim(); + return helmRef; +} diff --git a/Tasks/HelmDeployV1/src/helmcli.ts b/Tasks/HelmDeployV1/src/helmcli.ts new file mode 100644 index 000000000000..33c280157364 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcli.ts @@ -0,0 +1,77 @@ +import path = require("path"); +import tl = require("azure-pipelines-task-lib/task"); +import fs = require("fs"); +import util = require("util"); +import os = require("os"); +import * as tr from "azure-pipelines-task-lib/toolrunner"; +import basecommand from "./basecommand"; + +export default class helmcli extends basecommand { + + private command: string; + private arguments: string[] = []; + private helmVersion: string; + + constructor() { + super(true) + } + + public getTool(): string { + return "helm"; + } + + public login(): void { + + } + + public logout(): void { + + } + + public setCommand(command: string): void { + this.command = command; + } + + public getCommand(): string { + return this.command; + } + + public addArgument(argument: string): void { + this.arguments.push(argument); + } + + public getArguments(): string[] { + return this.arguments; + } + + public resetArguments(): void { + this.arguments = []; + } + + public getHelmVersion(): tr.IExecSyncResult { + var command = this.createCommand(); + command.arg('version'); + command.line('--client'); + command.line('--short'); + + return this.execCommandSync(command); + } + + public isHelmV3(): boolean { + if (!this.helmVersion) + this.helmVersion = this.getHelmVersion().stdout; + if (this.helmVersion.startsWith("v3")) + return true; + return false; + } + + public execHelmCommand(silent?: boolean): tr.IExecSyncResult { + var command = this.createCommand(); + command.arg(this.command); + this.arguments.forEach((value) => { + command.line(value); + }); + + return this.execCommandSync(command, { silent: !!silent } as tr.IExecOptions); + } +} diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmchartpush.ts b/Tasks/HelmDeployV1/src/helmcommands/helmchartpush.ts new file mode 100644 index 000000000000..8e377d89c4a3 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helmchartpush.ts @@ -0,0 +1,14 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +/* +Pushes a helm chart to ACR +*/ + +export async function addArguments(helmCli: helmcli): Promise { + helmCli.addArgument("push"); + + helmCli.addArgument(tl.getVariable("helmChartRef")); +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmchartremove.ts b/Tasks/HelmDeployV1/src/helmcommands/helmchartremove.ts new file mode 100644 index 000000000000..40ae75ed0ab8 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helmchartremove.ts @@ -0,0 +1,14 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +/* +Removes a helm chart from local + */ + +export async function addArguments(helmCli: helmcli): Promise { + helmCli.addArgument("remove"); + + helmCli.addArgument(tl.getVariable("helmChartRef")); +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmchartsave.ts b/Tasks/HelmDeployV1/src/helmcommands/helmchartsave.ts new file mode 100644 index 000000000000..4ce85aa70bce --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helmchartsave.ts @@ -0,0 +1,18 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; +import * as helmutil from "../utils"; + +/* +Saves a helm chart to local +*/ + +export async function addArguments(helmCli: helmcli): Promise { + helmCli.addArgument("save"); + + var chartPath = tl.getInput("chartPathForACR", true); + helmCli.addArgument(chartPath); + + helmCli.addArgument(helmutil.getHelmPathForACR()); +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helmcommands/helminit.ts b/Tasks/HelmDeployV1/src/helmcommands/helminit.ts new file mode 100644 index 000000000000..0ec0f81a0be2 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helminit.ts @@ -0,0 +1,33 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import {addTillerTlsSettings} from "./../tlssetting"; + +export async function addArguments(helmCli: helmcli) : Promise { + var waitForTiller = tl.getBoolInput('waitForExecution', false); + var canaryimage = tl.getBoolInput('canaryimage', false); + var upgradeTiller = tl.getBoolInput('upgradetiller', false); + var argumentsInput = tl.getInput("arguments", false); + var enableTls = tl.getBoolInput("enableTls", false); + + if(canaryimage) { + helmCli.addArgument("--canary-image"); + } + + if(upgradeTiller) { + helmCli.addArgument("--upgrade"); + } + + if(waitForTiller) { + helmCli.addArgument("--wait"); + } + + if(enableTls) { + addTillerTlsSettings(helmCli); + } + + if(argumentsInput) { + helmCli.addArgument(argumentsInput); + } +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helmcommands/helminstall.ts b/Tasks/HelmDeployV1/src/helmcommands/helminstall.ts new file mode 100644 index 000000000000..a3e32faed8cd --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helminstall.ts @@ -0,0 +1,93 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import * as helmutil from "./../utils"; +import { addHelmTlsSettings } from "./../tlssetting"; +import * as semver from 'semver'; + +/*supported chart install +By chart reference: helm install stable/mariadb +By path to a packaged chart: helm install ./nginx-1.2.3.tgz +By path to an unpacked chart directory: helm install ./nginx +By absolute URL: helm install https://example.com/charts/nginx-1.2.3.tgz + +Not supported + +chart reference and repo url: helm install –repo https://example.com/charts/ nginx + + */ + +export async function addArguments(helmCli: helmcli): Promise { + var chartType = tl.getInput("chartType", true); + var releaseName = tl.getInput("releaseName", false); + var overrideValues = tl.getInput("overrideValues", false); + var namespace = tl.getInput("namespace", false); + + var updatedependency = tl.getBoolInput('updatedependency', false); + var waitForExecution = tl.getBoolInput('waitForExecution', false); + var argumentsInput = tl.getInput("arguments", false); + var valueFile = tl.getInput("valueFile", false); + var rootFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var enableTls = tl.getBoolInput("enableTls", false); + var version = tl.getInput('version', false); + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } + + if (valueFile && valueFile != rootFolder) { + helmCli.addArgument("--values"); + helmCli.addArgument("\"" + helmutil.resolvePath(valueFile) + "\""); + } + + if (overrideValues) { + helmCli.addArgument("--set ".concat(helmutil.replaceNewlinesWithCommas(overrideValues))); + } + + if (updatedependency) { + helmCli.addArgument("--dep-up"); + } + + //Version check for Helm, as --name flag with install is no longer supported in Helm 3 + if (helmCli.isHelmV3()) { + if (releaseName) { + helmCli.addArgument(releaseName); + } + else { + helmCli.addArgument('--generate-name'); + } + } + else if (releaseName) { + helmCli.addArgument("--name ".concat(releaseName)); + } + + if (waitForExecution) { + helmCli.addArgument("--wait"); + } + + if (argumentsInput) { + helmCli.addArgument(argumentsInput); + } + + if (enableTls) { + addHelmTlsSettings(helmCli); + } + + if (chartType === "Name") { + var chartName = tl.getInput("chartName", true); + helmCli.addArgument(chartName); + + } + else { + var chartPath = tl.getInput("chartPath", true); + helmCli.addArgument("\"" + helmutil.resolvePath(chartPath) + "\""); + } + + if (version) { + if (semver.valid(version)) + helmCli.addArgument("--version ".concat(version)); + else + console.log("The given version " + version + " is not valid. Running the helm install command with latest version"); + } +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmpackage.ts b/Tasks/HelmDeployV1/src/helmcommands/helmpackage.ts new file mode 100644 index 000000000000..2270a717b974 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helmpackage.ts @@ -0,0 +1,42 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import * as helmutil from "./../utils"; + +export async function addArguments(helmCli: helmcli): Promise { + + var chart = tl.getInput("chartPath", true); + var version = tl.getInput("version", false); + var updatedependency = tl.getBoolInput('updatedependency', false); + var destination = tl.getInput("destination", false); + var save = tl.getBoolInput('save', false); + var argumentsInput = tl.getInput("arguments", false); + + if (updatedependency) { + helmCli.addArgument("--dependency-update"); + } + + if (save && !helmCli.isHelmV3()) { + helmCli.addArgument("--save "); + } + + if (version) { + helmCli.addArgument("--version ".concat(version)); + } + + if (destination) { + if (!tl.exist(destination)) { + tl.mkdirP(destination); + } + helmCli.addArgument("--destination \"" + destination + "\""); + } + + if (argumentsInput) { + helmCli.addArgument(argumentsInput); + } + + + helmCli.addArgument("\"" + helmutil.resolvePath(chart) + "\""); + +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmregistrylogin.ts b/Tasks/HelmDeployV1/src/helmcommands/helmregistrylogin.ts new file mode 100644 index 000000000000..7fd7d6c8e664 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helmregistrylogin.ts @@ -0,0 +1,39 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; +import ACRAuthenticationTokenProvider from "azure-pipelines-tasks-docker-common/registryauthenticationprovider/acrauthenticationtokenprovider"; + +/* +Signs into ACR helm registry using service principal +*/ + +export async function addArguments(helmCli: helmcli): Promise { + const acrEndpoint = tl.getInput("azureSubscriptionEndpointForACR"); + const acr = tl.getInput("azureContainerRegistry"); + const authScheme = tl.getEndpointAuthorizationScheme(acrEndpoint, false).toLowerCase() + + let user: string, password: string; + + if (authScheme === "workloadidentityfederation") { + const tokenProvider = new ACRAuthenticationTokenProvider(acrEndpoint, tl.getInput("azureContainerRegistry")); + const token = await tokenProvider.getToken(); + + user = token.getUsername(); + password = token.getPassword(); + + // Set the token as a secret to prevent it from being printed in the logs + tl.setSecret(password); + } + else { + user = tl.getEndpointAuthorizationParameter(acrEndpoint, 'serviceprincipalid', true); + password = tl.getEndpointAuthorizationParameter(acrEndpoint, 'serviceprincipalkey', true); + } + + helmCli.addArgument("login"); + helmCli.addArgument(acr); + helmCli.addArgument("--username"); + helmCli.addArgument(user); + helmCli.addArgument("--password") + helmCli.addArgument(password); +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helmcommands/helmupgrade.ts b/Tasks/HelmDeployV1/src/helmcommands/helmupgrade.ts new file mode 100644 index 000000000000..6cdaebdcffe8 --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/helmupgrade.ts @@ -0,0 +1,91 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import * as helmutil from "./../utils"; +import { addHelmTlsSettings } from "./../tlssetting"; +import * as semver from 'semver'; + +export async function addArguments(helmCli: helmcli): Promise { + var chartType = tl.getInput("chartType", true); + var releaseName = tl.getInput("releaseName", false); + var overrideValues = tl.getInput("overrideValues", false); + var namespace = tl.getInput("namespace", false); + + var waitForExecution = tl.getBoolInput('waitForExecution', false); + var argumentsInput = tl.getInput("arguments", false); + var valueFile = tl.getInput("valueFile", false); + var install = tl.getBoolInput("install", false); + var recreate = tl.getBoolInput("recreate", false); + var resetValues = tl.getBoolInput("resetValues", false); + var force = tl.getBoolInput("force", false); + var enableTls = tl.getBoolInput("enableTls", false); + var rootFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var version = tl.getInput("version", false); + + if (!releaseName) { + var hostType = tl.getVariable("SYSTEM_HOSTTYPE"); + releaseName = (hostType === "build") ? tl.getVariable("BUILD_BUILDNUMBER") : tl.getVariable("RELEASE_RELEASENAME"); + } + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } + + if (install) { + helmCli.addArgument("--install"); + } + + if (recreate) { + helmCli.addArgument("--recreate-pods"); + } + + if (resetValues) { + helmCli.addArgument("--reset-values"); + } + + if (force) { + helmCli.addArgument("--force"); + } + + if (valueFile && valueFile != rootFolder) { + helmCli.addArgument("--values"); + helmCli.addArgument("\"" + helmutil.resolvePath(valueFile) + "\""); + } + + if (overrideValues) { + helmCli.addArgument("--set ".concat(helmutil.replaceNewlinesWithCommas(overrideValues))); + } + + if (waitForExecution) { + helmCli.addArgument("--wait"); + } + + if (enableTls) { + addHelmTlsSettings(helmCli); + } + + if (argumentsInput) { + helmCli.addArgument(argumentsInput); + } + + if (releaseName) { + helmCli.addArgument(releaseName); + } + + if (chartType === "Name") { + var chartName = tl.getInput("chartName", true); + helmCli.addArgument(chartName); + } + else { + var chartPath = tl.getInput("chartPath", true); + helmCli.addArgument("\"" + helmutil.resolvePath(chartPath) + "\""); + } + + if (version) { + if (semver.valid(version)) + helmCli.addArgument("--version ".concat(version)); + else + tl.debug("The given version " + version + " is not valid. Running the helm upgrade command with latest version"); + } +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/helmcommands/uinotimplementedcommands.ts b/Tasks/HelmDeployV1/src/helmcommands/uinotimplementedcommands.ts new file mode 100644 index 000000000000..9f9018083e8e --- /dev/null +++ b/Tasks/HelmDeployV1/src/helmcommands/uinotimplementedcommands.ts @@ -0,0 +1,23 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import {addHelmTlsSettings} from "./../tlssetting"; + +export async function addArguments(helmCli: helmcli) : Promise { + var namespace = tl.getInput("namespace", false); + var argumentsInput = tl.getInput("arguments", false) + var enableTls = tl.getBoolInput("enableTls", false); + + if(namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } + + if(enableTls) { + addHelmTlsSettings(helmCli); + } + + if(argumentsInput) { + helmCli.addArgument(argumentsInput); + } +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/kubernetescli.ts b/Tasks/HelmDeployV1/src/kubernetescli.ts new file mode 100644 index 000000000000..dc9e69aa4736 --- /dev/null +++ b/Tasks/HelmDeployV1/src/kubernetescli.ts @@ -0,0 +1,68 @@ +import tl = require('azure-pipelines-task-lib/task'); +import fs = require("fs"); +import * as tr from "azure-pipelines-task-lib/toolrunner"; +import basecommand from "./basecommand" + +const EXIT_CODE_SUCCESS = 0; +const EXIT_CODE_FAILURE = 2; +const namespace = tl.getInput('namespace'); + +export default class kubernetescli extends basecommand { + + private kubeconfigPath: string; + + constructor(kubeconfigPath: string) { + super(true); + this.kubeconfigPath = kubeconfigPath; + } + public getTool(): string { + return "kubectl"; + } + + public login(): void { + process.env["KUBECONFIG"] = this.kubeconfigPath; + } + + public logout(): void { + if (this.kubeconfigPath != null && fs.existsSync(this.kubeconfigPath)) { + delete process.env["KUBECONFIG"]; + fs.unlinkSync(this.kubeconfigPath); + } + } + + public setKubeConfigEnvVariable() { + if (this.kubeconfigPath && fs.existsSync(this.kubeconfigPath)) { + tl.setVariable("KUBECONFIG", this.kubeconfigPath); + tl.setVariable('helmExitCode', EXIT_CODE_SUCCESS.toString()); + } + else { + tl.error(tl.loc('KubernetesServiceConnectionNotFound')); + tl.setVariable('helmExitCode', EXIT_CODE_FAILURE.toString()); + throw new Error(tl.loc('KubernetesServiceConnectionNotFound')); + } + } + + public unsetKubeConfigEnvVariable() { + var kubeConfigPath = tl.getVariable("KUBECONFIG"); + if (kubeConfigPath) { + tl.setVariable("KUBECONFIG", ""); + } + tl.setVariable('helmExitCode', EXIT_CODE_SUCCESS.toString()); + } + + public getAllPods(): tr.IExecSyncResult { + var command = this.createCommand(); + command.arg('get'); + command.arg('pods'); + command.arg(['-o', 'json']); + if (namespace) + command.arg(['--namespace', namespace]); + return this.execCommandSync(command, { silent: true } as tr.IExecOptions); + } + + public getClusterInfo(): tr.IExecSyncResult { + const command = this.createCommand(); + command.arg('cluster-info'); + return this.execCommandSync(command); + } +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/tlssetting.ts b/Tasks/HelmDeployV1/src/tlssetting.ts new file mode 100644 index 000000000000..6e2a6c9f219e --- /dev/null +++ b/Tasks/HelmDeployV1/src/tlssetting.ts @@ -0,0 +1,53 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./helmcli"; + +export function addHelmTlsSettings(helmCli: helmcli) : void { + //path to TLS certificate file + var tlsCert = "--tls-cert"; + //path to TLS CA certificate file + var tlsCaCert = "--tls-ca-cert"; + //path to TLS key file + var tlsCertKey = "--tls-key"; + //enable TLS for request + var tls = "--tls" + + addTlsSetting(helmCli, tls, tlsCaCert, tlsCert, tlsCertKey); +} + +export function addTillerTlsSettings(helmCli: helmcli) : void { + var tls = "--tiller-tls"; + var tlsCert = "--tiller-tls-cert"; + var tlsCaCert = "--tls-ca-cert"; + var tlsCertKey= "--tiller-tls-key"; + + addTlsSetting(helmCli, tls, tlsCaCert, tlsCert, tlsCertKey); +} + + +function addTlsSetting(helmCli: helmcli, tlsFlag: string, tlsCaCertFlag: string, tlsCertFlag: string, tlsCertKeyFlag: string ) { + + var caCertFilePath = tl.getTaskVariable('CACERT_FILE_PATH'); + if (!(caCertFilePath && tl.exist(caCertFilePath))) { + throw new Error(tl.loc("FileNotFound", caCertFilePath)); + } + + var certFilePath = tl.getTaskVariable('CERT_FILE_PATH'); + if (!(certFilePath && tl.exist(certFilePath))) { + throw new Error(tl.loc("FileNotFound", certFilePath)); + } + + var keyFilePath = tl.getTaskVariable('KEY_FILE_PATH'); + if (!(keyFilePath && tl.exist(keyFilePath))) { + throw new Error(tl.loc("FileNotFound", keyFilePath)); + } + + helmCli.addArgument(tlsFlag); + helmCli.addArgument(tlsCaCertFlag); + helmCli.addArgument("\""+caCertFilePath+"\""); + helmCli.addArgument(tlsCertFlag); + helmCli.addArgument("\""+certFilePath+"\""); + helmCli.addArgument(tlsCertKeyFlag); + helmCli.addArgument("\""+keyFilePath+"\""); +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/src/utils.ts b/Tasks/HelmDeployV1/src/utils.ts new file mode 100644 index 000000000000..4070b99b1f36 --- /dev/null +++ b/Tasks/HelmDeployV1/src/utils.ts @@ -0,0 +1,106 @@ +"use strict"; + +var fs = require('fs'); +import * as path from "path"; +import * as tl from "azure-pipelines-task-lib/task"; +import * as os from "os"; +import * as yaml from 'js-yaml'; +import * as semver from 'semver'; + +import helmcli from "./helmcli"; + +const matchPatternForReleaseName = new RegExp(/NAME:(.+)/i); +const namespace = tl.getInput('namespace', false); + +export function getTempDirectory(): string { + return tl.getVariable('agent.tempDirectory') || os.tmpdir(); +} + +export function getCurrentTime(): number { + return new Date().getTime(); +} + +export function getTaskTempDir(): string { + var userDir = path.join(getTempDirectory(), "helmTask"); + ensureDirExists(userDir); + + userDir = path.join(userDir, getCurrentTime().toString()); + ensureDirExists(userDir); + + return userDir; +} +export function deleteFile(filepath: string): void { + if (fs.existsSync(filepath)) { + fs.unlinkSync(filepath); + } +} + +export function resolvePath(path: string): string { + if (path.indexOf('*') >= 0 || path.indexOf('?') >= 0) { + tl.debug(tl.loc('PatternFoundInPath', path)); + var rootFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var allPaths = tl.find(rootFolder); + var matchingResultsFiles = tl.match(allPaths, path, rootFolder, { matchBase: true }); + + if (!matchingResultsFiles || matchingResultsFiles.length == 0) { + throw new Error(tl.loc('CantResolvePatternInPath', path)); + } + + return matchingResultsFiles[0]; + } + else { + tl.debug(tl.loc('PatternNotFoundInFilePath', path)); + return path; + } +} + +export function extractReleaseNameFromHelmOutput(output: string) { + const releaseNameMatch = output.match(matchPatternForReleaseName); + if (releaseNameMatch && releaseNameMatch.length >= 1) + return releaseNameMatch[1]; + return ''; +} + +export function getManifestsFromRelease(helmCli: helmcli, releaseName: string): any { + let manifests = []; + if (releaseName.length == 0) + return manifests; + + helmCli.resetArguments(); + helmCli.setCommand('get'); + helmCli.addArgument('manifest'); + helmCli.addArgument(releaseName); + if (namespace) + helmCli.addArgument('--namespace '.concat(namespace)); + + const execResult = helmCli.execHelmCommand(true); + yaml.safeLoadAll(execResult.stdout, (doc) => { + manifests.push(doc); + }); + + return manifests; +} + +function ensureDirExists(dirPath: string): void { + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath); + } +} + +export function getHelmPathForACR() { + const chartName = tl.getInput("chartNameForACR", true); + const acr = tl.getInput("azureContainerRegistry"); + return acr + "/helm/" + chartName; +} + +export function addVersion(helmCli: helmcli, version: string) { + if (semver.valid(version)) + helmCli.addArgument("--version ".concat(version)); + else + console.log("The given version is not valid. Running the helm install command with latest version"); +} + +export function replaceNewlinesWithCommas(overrideValues: string): string { + const keyValuePairs = overrideValues.split("\n").filter(pair => pair); + return keyValuePairs.join(","); +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/task.json b/Tasks/HelmDeployV1/task.json new file mode 100644 index 000000000000..7ba786a1c81a --- /dev/null +++ b/Tasks/HelmDeployV1/task.json @@ -0,0 +1,563 @@ +{ + "id": "AFA7D54D-537B-4DC8-B60A-E0EEEA2C9A87", + "name": "HelmDeploy", + "friendlyName": "Package and deploy Helm charts", + "description": "Deploy, configure, update a Kubernetes cluster in Azure Container Service by running helm commands", + "helpUrl": "https://aka.ms/azpipes-helm-tsg", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=851275) or [see the Helm documentation](https://helm.sh/docs/)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 242, + "Patch": 0 + }, + "demands": [], + "groups": [ + { + "name": "cluster", + "displayName": "Kubernetes Cluster", + "isExpanded": true, + "visibleRule": "command != logout && command != package && command != save" + }, + { + "name": "commands", + "displayName": "Commands", + "isExpanded": true + }, + { + "name": "azureContainerRegistry", + "displayName": "Azure Container Registry", + "isExpanded": true, + "visibleRule": "command == save" + }, + { + "name": "tls", + "displayName": "TLS", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package && command != save" + }, + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package && command != save" + } + ], + "inputs": [ + { + "name": "connectionType", + "type": "pickList", + "label": "Connection Type", + "defaultValue": "Azure Resource Manager", + "required": true, + "options": { + "Azure Resource Manager": "Azure Resource Manager", + "Kubernetes Service Connection": "Kubernetes Service Connection", + "None": "None" + }, + "helpMarkDown": "Select 'Azure Resource Manager' to connect to an Azure Kubernetes Service by using Azure Service Connection. Select 'Kubernetes Service Connection' to connect to any Kubernetes cluster by using kubeconfig or Service Account", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpoint", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription", + "helpMarkDown": "Select an Azure subscription, which has your Azure Container Registry.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster" + }, + { + "name": "azureResourceGroup", + "label": "Resource group", + "type": "pickList", + "helpMarkDown": "Select an Azure Resource Group.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "kubernetesCluster", + "label": "Kubernetes cluster", + "type": "pickList", + "helpMarkDown": "Select an Azure Managed Cluster.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "useClusterAdmin", + "type": "boolean", + "label": "Use cluster admin credentials", + "defaultValue": "false", + "visibleRule": "connectionType = Azure Resource Manager", + "groupName": "cluster", + "helpMarkDown": "Use cluster administrator credentials instead of default cluster user credentials." + }, + { + "name": "kubernetesServiceEndpoint", + "aliases": [ + "kubernetesServiceConnection" + ], + "type": "connectedService:kubernetes", + "label": "Kubernetes Service Connection", + "helpMarkDown": "Select a Kubernetes service connection.", + "visibleRule": "connectionType = Kubernetes Service Connection", + "required": true, + "groupName": "cluster" + }, + { + "name": "namespace", + "label": "Namespace", + "type": "string", + "helpMarkDown": "Specify K8 namespace to use. Use Tiller namespace can be specified in the advanced section of the task or by passing the --tiller-namespace option as argument.", + "defaultValue": "", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpointForACR", + "aliases": [ + "azureSubscriptionForACR" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription for Container Registry", + "helpMarkDown": "Select an Azure subscription, which has your Azure Container Registry.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "azureResourceGroupForACR", + "label": "Resource group", + "type": "pickList", + "helpMarkDown": "Select an Azure Resource Group, which has your Container Registry.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "azureContainerRegistry", + "label": "Azure Container Registry", + "type": "pickList", + "helpMarkDown": "Select an Azure Container Registry which will be used for pushing helm charts.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "command", + "type": "pickList", + "label": "Command", + "defaultValue": "ls", + "required": true, + "options": { + "create": "create", + "delete": "delete", + "expose": "expose", + "get": "get", + "init": "init", + "install": "install", + "login": "login", + "logout": "logout", + "ls": "ls", + "package": "package", + "rollback": "rollback", + "save": "save", + "upgrade": "upgrade", + "uninstall": "uninstall" + }, + "helpMarkDown": "Select a helm command.", + "groupName": "commands", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "chartType", + "type": "pickList", + "label": "Chart Type", + "required": true, + "options": { + "Name": "Name", + "FilePath": "File Path" + }, + "helpMarkDown": "Select how you want to enter chart info. You can either provide name of the chart or folder/file path to the chart.", + "groupName": "commands", + "visibleRule": "command == install || command == upgrade", + "defaultValue": "Name", + "properties": { + "EditableOptions": "False" + } + }, + { + "name": "chartName", + "label": "Chart Name", + "type": "string", + "helpMarkDown": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", + "defaultValue": "", + "visibleRule": "chartType == Name", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPath", + "label": "Chart Path", + "type": "filePath", + "helpMarkDown": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", + "defaultValue": "", + "visibleRule": "chartType == FilePath || command == package", + "required": "true", + "groupName": "commands" + }, + { + "name": "version", + "label": "Version", + "aliases": [ + "chartVersion" + ], + "type": "string", + "helpMarkDown": "Specify the exact chart version to install. If this is not specified, the latest version is installed. Set the version on the chart to this semver version​", + "defaultValue": "", + "visibleRule": "command == package || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "releaseName", + "label": "Release Name", + "type": "string", + "helpMarkDown": "Release name. If unspecified, it will autogenerate one for you.", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "overrideValues", + "label": "Set Values", + "type": "string", + "helpMarkDown": "Set values on the command line (can specify multiple or separate values with commas or newlines: key1=val1,key2=val2 or
key1=val1
key2=val2
). The task will construct the helm command by using these set values. For example, helm install --set key1=val1 ./redis.", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "valueFile", + "label": "Value File", + "type": "filePath", + "defaultValue": "", + "helpMarkDown": "Specify values in a YAML file or a URL. For example, specifying myvalues.yaml will result in 'helm install --values=myvals.yaml'.", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "destination", + "label": "Destination", + "type": "string", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "helpMarkDown": "Specify values in a YAML file or a URL.", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "canaryimage", + "aliases": [ + "canaryImage" + ], + "type": "boolean", + "label": "Use canary image version.", + "defaultValue": "false", + "helpMarkDown": "Use the canary Tiller image, the latest pre-release version of Tiller.", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "upgradetiller", + "aliases": [ + "upgradeTiller" + ], + "type": "boolean", + "label": "Upgrade Tiller", + "defaultValue": "true", + "helpMarkDown": "Upgrade if Tiller is already installed.", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "updatedependency", + "aliases": [ + "updateDependency" + ], + "type": "boolean", + "label": "Update Dependency", + "defaultValue": "false", + "helpMarkDown": "Run helm dependency update before installing the chart. Update dependencies from 'requirements.yaml' to dir 'charts/' before packaging", + "visibleRule": "command == install || command == package", + "groupName": "commands" + }, + { + "name": "save", + "type": "boolean", + "label": "Save", + "defaultValue": "true", + "helpMarkDown": "Save packaged chart to local chart repository (default true)​", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "install", + "type": "boolean", + "label": "Install if release not present.", + "defaultValue": "true", + "helpMarkDown": "If a release by this name doesn't already exist, run an install​.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "recreate", + "type": "boolean", + "label": "Recreate Pods.", + "defaultValue": "false", + "helpMarkDown": "Performs pods restart for the resource if applicable.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "resetValues", + "type": "boolean", + "label": "Reset Values.", + "defaultValue": "false", + "helpMarkDown": "Reset the values to the ones built into the chart.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "force", + "type": "boolean", + "label": "Force", + "defaultValue": "false", + "helpMarkDown": "Force resource update through delete/recreate if needed​", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "waitForExecution", + "type": "boolean", + "label": "Wait", + "defaultValue": "true", + "helpMarkDown": "Block till command execution completes.", + "visibleRule": "command == init || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "arguments", + "type": "multiLine", + "properties": { + "resizable": "true", + "rows": "2" + }, + "label": "Arguments", + "helpMarkDown": "Helm command options.", + "groupName": "commands", + "visibleRule": "command != login && command != logout" + }, + { + "name": "enableTls", + "type": "boolean", + "label": "Enable TLS", + "defaultValue": "false", + "helpMarkDown": "Enables using SSL between Helm and Tiller.", + "groupName": "tls" + }, + { + "name": "caCert", + "type": "secureFile", + "label": "CA certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "CA cert used to issue certificate for tiller and helm client.", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "certificate", + "type": "secureFile", + "label": "Certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify Tiller certificate or Helm client certificate", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "privatekey", + "type": "secureFile", + "label": "Key", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify Tiller Key or Helm client key", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "tillernamespace", + "aliases": [ + "tillerNamespace" + ], + "label": "Tiller namespace", + "helpMarkDown": "Specify K8 namespace of tiller.", + "type": "string", + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "Fail on Standard Error", + "defaultValue": "false", + "helpMarkDown": "If this is true, this task will fail if any errors are written to the error pipeline, or if any data is written to the Standard Error stream. Otherwise the task will rely on the exit code to determine failure.", + "groupName": "advanced" + }, + { + "name": "publishPipelineMetadata", + "type": "boolean", + "label": "Publish pipeline metadata", + "defaultValue": "true", + "helpMarkDown": "If this is true, the task will collect and publish deployment metadata", + "groupName": "advanced" + }, + { + "name": "chartNameForACR", + "label": "Chart Name For Azure Container Registry", + "type": "string", + "helpMarkDown": "Chart name with which the chart will be stored in Azure Container Registry.", + "defaultValue": "", + "visibleRule": "command == save", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPathForACR", + "label": "Chart Path for Azure Container Registry", + "type": "filePath", + "helpMarkDown": "Path to the chart directory.", + "defaultValue": "", + "visibleRule": "command == save", + "required": "true", + "groupName": "commands" + } + ], + "dataSourceBindings": [ + { + "target": "kubernetesCluster", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroup)/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{name}}}" + }, + { + "target": "azureResourceGroup", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31&$skiptoken={{{skiptoken}}}", + "callbackContextTemplate": "{\"skiptoken\": \"{{#getTokenValue response.nextLink}}{{extractUrlQueryParameter %24skiptoken}}{{/getTokenValue}}\"}", + "callbackRequiredTemplate": "{{isTokenPresent response.nextLink}}", + "initialContextTemplate": "{\"skiptoken\": \"\"}", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureResourceGroupForACR", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureContainerRegistry", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroupForACR)/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{ \"Value\" : \"{{{properties.loginServer}}}\", \"DisplayValue\" : \"{{{name}}}\" }" + } + ], + "instanceNameFormat": "helm $(command)", + "showEnvironmentVariables": true, + "outputVariables": [ + { + "name": "helmExitCode", + "description": "Exit code emitted from the execution of specified Helm command" + }, + { + "name": "helmOutput", + "description": "Output emitted from the execution of specified Helm command" + } + ], + "prejobexecution": { + "Node16": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//downloadsecurefiles.js" + } + }, + "execution": { + "Node16": { + "target": "src//helm.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//helm.js" + } + }, + "postjobexecution": { + "Node16": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//deletesecurefiles.js" + } + }, + "messages": { + "CantDownloadAccessProfile": "Cannot download access profile/kube config file for the cluster %s. Reason %s.", + "KubeConfigFilePath": "Kubeconfig file path: %s", + "KubernetesClusterInfo": "Kubernetes cluster Id : %s, kubernetes server version %s, kuberenettes provision state %s", + "KubernetesClusterResourceGroup": "Kubernetes cluster %s, resource group %s.", + "ClusterNotProvisioned": "Observed that the cluster %s is in %s state.", + "ClusterNotFound": "%s cluster does not exists", + "FailedToListClusters": "Failed to list managed clusters in the subscription. %s", + "RetryingRequest": "Retrying request after %s seconds.", + "PatternNotFoundInFilePath": "Pattern not found in file path %s.", + "CantResolvePatternInPath": "Can not resolve pattern in file path %s.", + "PatternFoundInPath": "Pattern found in file path %s.", + "CouldNotFetchAccessTokenforAzureStatusCode": "Could not fetch access token for Azure. Status code: %s, status message: %s", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Could not fetch access token for Managed Service Principal. Please configure Managed Service Identity (MSI) for virtual machine 'https://aka.ms/azure-msi-docs'. Status code: %s, status message: %s", + "CouldNotFetchAccessTokenforMSIStatusCode": "Could not fetch access token for Managed Service Principal. Status code: %s, status message: %s", + "SkipDeleteSecureFiles": "TLS not enabled in the Task. Skipping delete of certificates.", + "SkipDownloadSecureFiles": "TLS not enabled in the Task. Skipping download of certificates.", + "FileNotFound": "File not found at %s", + "KubernetesServiceConnectionNotFound": "Kubernetes service connection details not found.", + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "SaveSupportedInHelmsV3Only": "Save chart to Azure Container Registry is only supported in Helms V3.", + "OutputVariableDataSizeExceeded": "Output variable not set as Helm command output exceeded the maximum supported length. Output length: %s, Maximum supported length: %s", + "KubeloginFailed": "Kubelogin authentication failed. Exception: %s" + } +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/task.loc.json b/Tasks/HelmDeployV1/task.loc.json new file mode 100644 index 000000000000..a6da620207e3 --- /dev/null +++ b/Tasks/HelmDeployV1/task.loc.json @@ -0,0 +1,563 @@ +{ + "id": "AFA7D54D-537B-4DC8-B60A-E0EEEA2C9A87", + "name": "HelmDeploy", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/azpipes-helm-tsg", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 242, + "Patch": 0 + }, + "demands": [], + "groups": [ + { + "name": "cluster", + "displayName": "ms-resource:loc.group.displayName.cluster", + "isExpanded": true, + "visibleRule": "command != logout && command != package && command != save" + }, + { + "name": "commands", + "displayName": "ms-resource:loc.group.displayName.commands", + "isExpanded": true + }, + { + "name": "azureContainerRegistry", + "displayName": "ms-resource:loc.group.displayName.azureContainerRegistry", + "isExpanded": true, + "visibleRule": "command == save" + }, + { + "name": "tls", + "displayName": "ms-resource:loc.group.displayName.tls", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package && command != save" + }, + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package && command != save" + } + ], + "inputs": [ + { + "name": "connectionType", + "type": "pickList", + "label": "ms-resource:loc.input.label.connectionType", + "defaultValue": "Azure Resource Manager", + "required": true, + "options": { + "Azure Resource Manager": "Azure Resource Manager", + "Kubernetes Service Connection": "Kubernetes Service Connection", + "None": "None" + }, + "helpMarkDown": "ms-resource:loc.input.help.connectionType", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpoint", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.azureSubscriptionEndpoint", + "helpMarkDown": "ms-resource:loc.input.help.azureSubscriptionEndpoint", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster" + }, + { + "name": "azureResourceGroup", + "label": "ms-resource:loc.input.label.azureResourceGroup", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureResourceGroup", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "kubernetesCluster", + "label": "ms-resource:loc.input.label.kubernetesCluster", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.kubernetesCluster", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "useClusterAdmin", + "type": "boolean", + "label": "ms-resource:loc.input.label.useClusterAdmin", + "defaultValue": "false", + "visibleRule": "connectionType = Azure Resource Manager", + "groupName": "cluster", + "helpMarkDown": "ms-resource:loc.input.help.useClusterAdmin" + }, + { + "name": "kubernetesServiceEndpoint", + "aliases": [ + "kubernetesServiceConnection" + ], + "type": "connectedService:kubernetes", + "label": "ms-resource:loc.input.label.kubernetesServiceEndpoint", + "helpMarkDown": "ms-resource:loc.input.help.kubernetesServiceEndpoint", + "visibleRule": "connectionType = Kubernetes Service Connection", + "required": true, + "groupName": "cluster" + }, + { + "name": "namespace", + "label": "ms-resource:loc.input.label.namespace", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.namespace", + "defaultValue": "", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpointForACR", + "aliases": [ + "azureSubscriptionForACR" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.azureSubscriptionEndpointForACR", + "helpMarkDown": "ms-resource:loc.input.help.azureSubscriptionEndpointForACR", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "azureResourceGroupForACR", + "label": "ms-resource:loc.input.label.azureResourceGroupForACR", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureResourceGroupForACR", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "azureContainerRegistry", + "label": "ms-resource:loc.input.label.azureContainerRegistry", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureContainerRegistry", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "command", + "type": "pickList", + "label": "ms-resource:loc.input.label.command", + "defaultValue": "ls", + "required": true, + "options": { + "create": "create", + "delete": "delete", + "expose": "expose", + "get": "get", + "init": "init", + "install": "install", + "login": "login", + "logout": "logout", + "ls": "ls", + "package": "package", + "rollback": "rollback", + "save": "save", + "upgrade": "upgrade", + "uninstall": "uninstall" + }, + "helpMarkDown": "ms-resource:loc.input.help.command", + "groupName": "commands", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "chartType", + "type": "pickList", + "label": "ms-resource:loc.input.label.chartType", + "required": true, + "options": { + "Name": "Name", + "FilePath": "File Path" + }, + "helpMarkDown": "ms-resource:loc.input.help.chartType", + "groupName": "commands", + "visibleRule": "command == install || command == upgrade", + "defaultValue": "Name", + "properties": { + "EditableOptions": "False" + } + }, + { + "name": "chartName", + "label": "ms-resource:loc.input.label.chartName", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.chartName", + "defaultValue": "", + "visibleRule": "chartType == Name", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPath", + "label": "ms-resource:loc.input.label.chartPath", + "type": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.chartPath", + "defaultValue": "", + "visibleRule": "chartType == FilePath || command == package", + "required": "true", + "groupName": "commands" + }, + { + "name": "version", + "label": "ms-resource:loc.input.label.version", + "aliases": [ + "chartVersion" + ], + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.version", + "defaultValue": "", + "visibleRule": "command == package || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "releaseName", + "label": "ms-resource:loc.input.label.releaseName", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.releaseName", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "overrideValues", + "label": "ms-resource:loc.input.label.overrideValues", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.overrideValues", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "valueFile", + "label": "ms-resource:loc.input.label.valueFile", + "type": "filePath", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.valueFile", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "destination", + "label": "ms-resource:loc.input.label.destination", + "type": "string", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "helpMarkDown": "ms-resource:loc.input.help.destination", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "canaryimage", + "aliases": [ + "canaryImage" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.canaryimage", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.canaryimage", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "upgradetiller", + "aliases": [ + "upgradeTiller" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.upgradetiller", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.upgradetiller", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "updatedependency", + "aliases": [ + "updateDependency" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.updatedependency", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.updatedependency", + "visibleRule": "command == install || command == package", + "groupName": "commands" + }, + { + "name": "save", + "type": "boolean", + "label": "ms-resource:loc.input.label.save", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.save", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "install", + "type": "boolean", + "label": "ms-resource:loc.input.label.install", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.install", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "recreate", + "type": "boolean", + "label": "ms-resource:loc.input.label.recreate", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.recreate", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "resetValues", + "type": "boolean", + "label": "ms-resource:loc.input.label.resetValues", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.resetValues", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "force", + "type": "boolean", + "label": "ms-resource:loc.input.label.force", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.force", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "waitForExecution", + "type": "boolean", + "label": "ms-resource:loc.input.label.waitForExecution", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.waitForExecution", + "visibleRule": "command == init || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "arguments", + "type": "multiLine", + "properties": { + "resizable": "true", + "rows": "2" + }, + "label": "ms-resource:loc.input.label.arguments", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "groupName": "commands", + "visibleRule": "command != login && command != logout" + }, + { + "name": "enableTls", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableTls", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.enableTls", + "groupName": "tls" + }, + { + "name": "caCert", + "type": "secureFile", + "label": "ms-resource:loc.input.label.caCert", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.caCert", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "certificate", + "type": "secureFile", + "label": "ms-resource:loc.input.label.certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.certificate", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "privatekey", + "type": "secureFile", + "label": "ms-resource:loc.input.label.privatekey", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.privatekey", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "tillernamespace", + "aliases": [ + "tillerNamespace" + ], + "label": "ms-resource:loc.input.label.tillernamespace", + "helpMarkDown": "ms-resource:loc.input.help.tillernamespace", + "type": "string", + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnStderr", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.failOnStderr", + "groupName": "advanced" + }, + { + "name": "publishPipelineMetadata", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishPipelineMetadata", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.publishPipelineMetadata", + "groupName": "advanced" + }, + { + "name": "chartNameForACR", + "label": "ms-resource:loc.input.label.chartNameForACR", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.chartNameForACR", + "defaultValue": "", + "visibleRule": "command == save", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPathForACR", + "label": "ms-resource:loc.input.label.chartPathForACR", + "type": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.chartPathForACR", + "defaultValue": "", + "visibleRule": "command == save", + "required": "true", + "groupName": "commands" + } + ], + "dataSourceBindings": [ + { + "target": "kubernetesCluster", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroup)/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{name}}}" + }, + { + "target": "azureResourceGroup", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31&$skiptoken={{{skiptoken}}}", + "callbackContextTemplate": "{\"skiptoken\": \"{{#getTokenValue response.nextLink}}{{extractUrlQueryParameter %24skiptoken}}{{/getTokenValue}}\"}", + "callbackRequiredTemplate": "{{isTokenPresent response.nextLink}}", + "initialContextTemplate": "{\"skiptoken\": \"\"}", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureResourceGroupForACR", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureContainerRegistry", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroupForACR)/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{ \"Value\" : \"{{{properties.loginServer}}}\", \"DisplayValue\" : \"{{{name}}}\" }" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "showEnvironmentVariables": true, + "outputVariables": [ + { + "name": "helmExitCode", + "description": "Exit code emitted from the execution of specified Helm command" + }, + { + "name": "helmOutput", + "description": "Output emitted from the execution of specified Helm command" + } + ], + "prejobexecution": { + "Node16": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//downloadsecurefiles.js" + } + }, + "execution": { + "Node16": { + "target": "src//helm.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//helm.js" + } + }, + "postjobexecution": { + "Node16": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//deletesecurefiles.js" + } + }, + "messages": { + "CantDownloadAccessProfile": "ms-resource:loc.messages.CantDownloadAccessProfile", + "KubeConfigFilePath": "ms-resource:loc.messages.KubeConfigFilePath", + "KubernetesClusterInfo": "ms-resource:loc.messages.KubernetesClusterInfo", + "KubernetesClusterResourceGroup": "ms-resource:loc.messages.KubernetesClusterResourceGroup", + "ClusterNotProvisioned": "ms-resource:loc.messages.ClusterNotProvisioned", + "ClusterNotFound": "ms-resource:loc.messages.ClusterNotFound", + "FailedToListClusters": "ms-resource:loc.messages.FailedToListClusters", + "RetryingRequest": "ms-resource:loc.messages.RetryingRequest", + "PatternNotFoundInFilePath": "ms-resource:loc.messages.PatternNotFoundInFilePath", + "CantResolvePatternInPath": "ms-resource:loc.messages.CantResolvePatternInPath", + "PatternFoundInPath": "ms-resource:loc.messages.PatternFoundInPath", + "CouldNotFetchAccessTokenforAzureStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforAzureStatusCode", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode", + "CouldNotFetchAccessTokenforMSIStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIStatusCode", + "SkipDeleteSecureFiles": "ms-resource:loc.messages.SkipDeleteSecureFiles", + "SkipDownloadSecureFiles": "ms-resource:loc.messages.SkipDownloadSecureFiles", + "FileNotFound": "ms-resource:loc.messages.FileNotFound", + "KubernetesServiceConnectionNotFound": "ms-resource:loc.messages.KubernetesServiceConnectionNotFound", + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", + "SaveSupportedInHelmsV3Only": "ms-resource:loc.messages.SaveSupportedInHelmsV3Only", + "OutputVariableDataSizeExceeded": "ms-resource:loc.messages.OutputVariableDataSizeExceeded", + "KubeloginFailed": "ms-resource:loc.messages.KubeloginFailed" + } +} \ No newline at end of file diff --git a/Tasks/HelmDeployV1/tsconfig.json b/Tasks/HelmDeployV1/tsconfig.json new file mode 100644 index 000000000000..79a868c8d1e3 --- /dev/null +++ b/Tasks/HelmDeployV1/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/_generated/HelmDeployV1.versionmap.txt b/_generated/HelmDeployV1.versionmap.txt new file mode 100644 index 000000000000..01754b8e1a9c --- /dev/null +++ b/_generated/HelmDeployV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.242.0 +Node20_229_3|1.242.1 diff --git a/_generated/HelmDeployV1_Node20/.npmrc b/_generated/HelmDeployV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..c6f5ace27147 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Helm Charts paketieren und bereitstellen", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?linkid=851275) oder [Helm-Dokumentation anzeigen](https://helm.sh/docs/)", + "loc.description": "Hiermit werden Helm-Befehle ausgeführt, um einen Kubernetes-Cluster in Azure Container Service bereitzustellen, zu konfigurieren oder zu aktualisieren.", + "loc.instanceNameFormat": "Helm $(command)", + "loc.group.displayName.cluster": "Kubernetes-Cluster", + "loc.group.displayName.commands": "Befehle", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.connectionType": "Verbindungstyp", + "loc.input.help.connectionType": "Wählen Sie \"Azure Resource Manager\" aus, um unter Verwendung einer Azure-Dienstverbindung eine Verbindung mit einer Azure Kubernetes Service-Instanz herzustellen. Wählen Sie \"Kubernetes-Dienstverbindung\" aus, um unter Verwendung von kubeconfig oder einem Dienstkonto eine Verbindung mit einem Kubernetes-Cluster herzustellen.", + "loc.input.label.azureSubscriptionEndpoint": "Azure-Abonnement", + "loc.input.help.azureSubscriptionEndpoint": "Wählen Sie ein Azure-Abonnement aus, das Ihre Azure Container Registry enthält.", + "loc.input.label.azureResourceGroup": "Ressourcengruppe", + "loc.input.help.azureResourceGroup": "Wählen Sie eine Azure-Ressourcengruppe aus.", + "loc.input.label.kubernetesCluster": "Kubernetes-Cluster", + "loc.input.help.kubernetesCluster": "Wählen Sie einen verwalteten Azure-Cluster aus.", + "loc.input.label.useClusterAdmin": "Anmeldeinformationen für Clusteradministrator verwenden", + "loc.input.help.useClusterAdmin": "Verwenden Sie anstelle der standardmäßigen Anmeldeinformationen für Clusterbenutzer Anmeldeinformationen für Clusteradministratoren.", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes-Dienstverbindung", + "loc.input.help.kubernetesServiceEndpoint": "Wählen Sie eine Kubernetes-Dienstverbindung aus.", + "loc.input.label.namespace": "Namespace", + "loc.input.help.namespace": "Geben Sie den zu verwendenden K8-Namespace an. Der Tiller-Namespace kann im erweiterten Abschnitt der Aufgabe oder durch Übergabe der Option \"--tiller-namespace\" als Argument angegeben werden.", + "loc.input.label.azureSubscriptionEndpointForACR": "Azure-Abonnement für Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Wählen Sie ein Azure-Abonnement aus, das Ihre Azure Container Registry enthält.", + "loc.input.label.azureResourceGroupForACR": "Ressourcengruppe", + "loc.input.help.azureResourceGroupForACR": "Wählen Sie eine Azure-Ressourcengruppe aus, die Ihre Containerregistrierung enthält.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Wählen Sie eine Azure Container Registry-Instanz aus, die zum Pushen von Helm-Diagrammen verwendet wird.", + "loc.input.label.command": "Befehl", + "loc.input.help.command": "Wählen Sie Helm-Befehl aus.", + "loc.input.label.chartType": "Charttyp", + "loc.input.help.chartType": "Wählen Sie aus, wie Chartinformationen eingegeben werden sollen. Sie können entweder einen Chartnamen oder einen Ordner-/Dateipfad zum Chart angeben.", + "loc.input.label.chartName": "Chartname", + "loc.input.help.chartName": "Chartverweis für die Installation, es kann sich um eine URL oder um einen Chartnamen handeln. Wenn der Chartname beispielsweise \"stable/mysql\" lautet, führt die Aufgabe \"helm install stable/mysql\" aus.", + "loc.input.label.chartPath": "Chartpfad", + "loc.input.help.chartPath": "Pfad zum Chart, das installiert werden soll. Es kann sich um einen Pfad zu einem paketierten Chart oder um einen Pfad zu einem nicht paketierten Chartverzeichnis handeln. Wenn beispielsweise \"./redis\" angegeben wird, führt die Aufgabe \"helm install ./redis\" aus.", + "loc.input.label.version": "Version", + "loc.input.help.version": "Geben Sie die genaue Chartversion an, die installiert werden soll. Sofern nicht angegeben, wird die aktuelle Version installiert. Legen Sie die Chartversion auf diese semver-Version fest.", + "loc.input.label.releaseName": "Releasename", + "loc.input.help.releaseName": "Der Releasename. Sofern nicht angegeben, wird automatisch ein Name generiert.", + "loc.input.label.overrideValues": "Werte festlegen", + "loc.input.help.overrideValues": "Legen Sie Werte in der Befehlszeile fest (Mehrfacheingabe oder Trennung von Werten durch Kommas oder Zeilenumbrüche: \"key1=val1,key2=val2\" oder \"
key1=val1
key2=val2
\"). Die Aufgabe erstellt den Helm-Befehl durch Verwendung dieser festgelegten Werte. Beispiel: helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Datei mit Werten", + "loc.input.help.valueFile": "Geben Sie Werte in einer YAML-Datei oder eine URL an. Beispielsweise führt die Angabe von \"myvalues.yaml\" zu \"helm install --values=myvals.yaml\".", + "loc.input.label.destination": "Ziel", + "loc.input.help.destination": "Geben Sie Werte in einer YAML-Datei oder eine URL an.", + "loc.input.label.canaryimage": "Hiermit wird die Imageversion \"canary\" verwendet.", + "loc.input.help.canaryimage": "Verwenden Sie das Tiller-Image \"canary\", die aktuelle Vorabversion von Tiller.", + "loc.input.label.upgradetiller": "Tiller-Upgrade durchführen", + "loc.input.help.upgradetiller": "Führen Sie ein Upgrade durch, wenn Tiller bereits installiert ist.", + "loc.input.label.updatedependency": "Abhängigkeiten aktualisieren", + "loc.input.help.updatedependency": "Führen Sie eine Helm-Abhängigkeitsaktualisierung aus, bevor Sie das Chart installieren. Aktualisieren Sie vor der Paketierung Abhängigkeiten von \"requirements.yaml\" mit dem Verzeichnis \"charts/\".", + "loc.input.label.save": "Speichern", + "loc.input.help.save": "Paketiertes Chart im lokalen Chartrepository speichern (Standardwert: TRUE)", + "loc.input.label.install": "Hiermit wird eine Installation durchgeführt, wenn das Release nicht vorhanden ist.", + "loc.input.help.install": "Falls noch kein Release mit diesem Namen vorhanden ist, führen Sie eine Installation aus.", + "loc.input.label.recreate": "Hiermit werden Pods neu erstellt.", + "loc.input.help.recreate": "Hiermit wird ein Podneustart für die Ressource durchgeführt (sofern zutreffend).", + "loc.input.label.resetValues": "Hiermit werden die Werte zurückgesetzt.", + "loc.input.help.resetValues": "Setzen Sie die Werte auf die integrierten Werte im Chart zurück.", + "loc.input.label.force": "Erzwingen", + "loc.input.help.force": "Erzwingen Sie ggf. über \"delete/recreate\" eine Ressourcenaktualisierung.", + "loc.input.label.waitForExecution": "Warten", + "loc.input.help.waitForExecution": "Führt zu einer Blockierung, bis die Befehlsausführung abgeschlossen ist.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "Helm-Befehlsoptionen.", + "loc.input.label.enableTls": "TLS aktivieren", + "loc.input.help.enableTls": "Hiermit wird die Verwendung von SSL zwischen Helm und Tiller aktiviert.", + "loc.input.label.caCert": "Zertifikat der Zertifizierungsstelle", + "loc.input.help.caCert": "Zertifikat der Zertifizierungsstelle, das zum Ausstellen von Zertifikaten für Tiller und Helm-Clients verwendet wird.", + "loc.input.label.certificate": "Zertifikat", + "loc.input.help.certificate": "Tiller-Zertifikat oder Helm-Clientzertifikat angeben", + "loc.input.label.privatekey": "Schlüssel", + "loc.input.help.privatekey": "Tiller-Schlüssel oder Helm-Clientschlüssel angeben", + "loc.input.label.tillernamespace": "Tiller-Namespace", + "loc.input.help.tillernamespace": "Geben Sie den K8-Namespace von Tiller an.", + "loc.input.label.failOnStderr": "Fehler aufgrund von Standardfehler.", + "loc.input.help.failOnStderr": "Wenn dieser Wert TRUE ist, tritt ein Aufgabenfehler auf, wenn Fehler in die Fehlerpipeline oder Daten in den Standard-Fehlerdatenstrom geschrieben werden. Andernfalls verwendet die Aufgabe ausschließlich den Exitcode zum Ermitteln von Fehlern.", + "loc.input.label.publishPipelineMetadata": "Pipelinemetadaten veröffentlichen", + "loc.input.help.publishPipelineMetadata": "Wenn diese Einstellung auf TRUE festgelegt ist, werden Bereitstellungsmetadaten durch die Aufgabe erfasst und veröffentlicht.", + "loc.input.label.chartNameForACR": "Diagrammname für Azure Container Registry", + "loc.input.help.chartNameForACR": "Der Diagrammname, unter dem das Diagramm in Azure Container Registry gespeichert wird.", + "loc.input.label.chartPathForACR": "Diagrammpfad für Azure Container Registry", + "loc.input.help.chartPathForACR": "Pfad zum Diagrammverzeichnis.", + "loc.messages.CantDownloadAccessProfile": "Zugriffsprofil/Kube-Konfigurationsdatei für den Cluster \"%s\" kann nicht heruntergeladen werden. Ursache: %s.", + "loc.messages.KubeConfigFilePath": "Pfad der Kubeconfig-Datei: %s", + "loc.messages.KubernetesClusterInfo": "ID des Kubernetes-Clusters: %s, Kubernetes-Serverversion: %s, Kubernetes-Bereitstellungszustand: %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes-Cluster \"%s\", Ressourcengruppe \"%s\".", + "loc.messages.ClusterNotProvisioned": "Es wurde festgestellt, dass sich der Cluster \"%s\" im Zustand \"%s\" befindet.", + "loc.messages.ClusterNotFound": "Der Cluster \"%s\" ist nicht vorhanden.", + "loc.messages.FailedToListClusters": "Fehler beim Auflisten der verwalteten Cluster im Abonnement. %s", + "loc.messages.RetryingRequest": "Anforderung wird nach %s Sekunden wiederholt.", + "loc.messages.PatternNotFoundInFilePath": "Muster nicht im Dateipfad \"%s\" gefunden.", + "loc.messages.CantResolvePatternInPath": "Das Muster im Dateipfad \"%s\" kann nicht aufgelöst werden.", + "loc.messages.PatternFoundInPath": "Muster im Dateipfad \"%s\" gefunden.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Ein Zugriffstoken für Azure konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Konfigurieren Sie die verwaltete Dienstidentität (MSI) für den virtuellen Computer (https://aka.ms/azure-msi-docs). Statuscode: %s, Statusmeldung: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Ein Zugriffstoken für den verwalteten Dienstprinzipal konnte nicht abgerufen werden. Statuscode: %s, Statusmeldung: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS ist nicht in der Aufgabe aktiviert. Das Löschen von Zertifikaten wird übersprungen.", + "loc.messages.SkipDownloadSecureFiles": "TLS ist nicht in der Aufgabe aktiviert. Das Herunterladen von Zertifikaten wird übersprungen.", + "loc.messages.FileNotFound": "Datei nicht unter \"%s\" gefunden.", + "loc.messages.KubernetesServiceConnectionNotFound": "Die Details zur Kubernetes-Dienstverbindung wurden nicht gefunden.", + "loc.messages.ExpiredServicePrincipal": "Das Zugriffstoken für Azure konnte nicht abgerufen werden. Stellen Sie sicher, dass der verwendete Dienstprinzipal gültig und nicht abgelaufen ist.", + "loc.messages.SaveSupportedInHelmsV3Only": "Das Speichern des Diagramms in Azure Container Registry wird nur in Helm V3 unterstützt.", + "loc.messages.OutputVariableDataSizeExceeded": "Die Ausgabevariable wurde nicht festgelegt, weil die Helm-Befehlsausgabe die maximal unterstützte Länge überschritten hat. Ausgabelänge: %s, maximal unterstützte Länge: %s", + "loc.messages.KubeloginFailed": "Fehler bei der Kubelogin-Authentifizierung. Ausnahme: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..32acb6a587db --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Package and deploy Helm charts", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=851275) or [see the Helm documentation](https://helm.sh/docs/)", + "loc.description": "Deploy, configure, update a Kubernetes cluster in Azure Container Service by running helm commands", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes Cluster", + "loc.group.displayName.commands": "Commands", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.connectionType": "Connection Type", + "loc.input.help.connectionType": "Select 'Azure Resource Manager' to connect to an Azure Kubernetes Service by using Azure Service Connection. Select 'Kubernetes Service Connection' to connect to any Kubernetes cluster by using kubeconfig or Service Account", + "loc.input.label.azureSubscriptionEndpoint": "Azure subscription", + "loc.input.help.azureSubscriptionEndpoint": "Select an Azure subscription, which has your Azure Container Registry.", + "loc.input.label.azureResourceGroup": "Resource group", + "loc.input.help.azureResourceGroup": "Select an Azure Resource Group.", + "loc.input.label.kubernetesCluster": "Kubernetes cluster", + "loc.input.help.kubernetesCluster": "Select an Azure Managed Cluster.", + "loc.input.label.useClusterAdmin": "Use cluster admin credentials", + "loc.input.help.useClusterAdmin": "Use cluster administrator credentials instead of default cluster user credentials.", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes Service Connection", + "loc.input.help.kubernetesServiceEndpoint": "Select a Kubernetes service connection.", + "loc.input.label.namespace": "Namespace", + "loc.input.help.namespace": "Specify K8 namespace to use. Use Tiller namespace can be specified in the advanced section of the task or by passing the --tiller-namespace option as argument.", + "loc.input.label.azureSubscriptionEndpointForACR": "Azure subscription for Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Select an Azure subscription, which has your Azure Container Registry.", + "loc.input.label.azureResourceGroupForACR": "Resource group", + "loc.input.help.azureResourceGroupForACR": "Select an Azure Resource Group, which has your Container Registry.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Select an Azure Container Registry which will be used for pushing helm charts.", + "loc.input.label.command": "Command", + "loc.input.help.command": "Select a helm command.", + "loc.input.label.chartType": "Chart Type", + "loc.input.help.chartType": "Select how you want to enter chart info. You can either provide name of the chart or folder/file path to the chart.", + "loc.input.label.chartName": "Chart Name", + "loc.input.help.chartName": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", + "loc.input.label.chartPath": "Chart Path", + "loc.input.help.chartPath": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", + "loc.input.label.version": "Version", + "loc.input.help.version": "Specify the exact chart version to install. If this is not specified, the latest version is installed. Set the version on the chart to this semver version​", + "loc.input.label.releaseName": "Release Name", + "loc.input.help.releaseName": "Release name. If unspecified, it will autogenerate one for you.", + "loc.input.label.overrideValues": "Set Values", + "loc.input.help.overrideValues": "Set values on the command line (can specify multiple or separate values with commas or newlines: key1=val1,key2=val2 or
key1=val1
key2=val2
). The task will construct the helm command by using these set values. For example, helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Value File", + "loc.input.help.valueFile": "Specify values in a YAML file or a URL. For example, specifying myvalues.yaml will result in 'helm install --values=myvals.yaml'.", + "loc.input.label.destination": "Destination", + "loc.input.help.destination": "Specify values in a YAML file or a URL.", + "loc.input.label.canaryimage": "Use canary image version.", + "loc.input.help.canaryimage": "Use the canary Tiller image, the latest pre-release version of Tiller.", + "loc.input.label.upgradetiller": "Upgrade Tiller", + "loc.input.help.upgradetiller": "Upgrade if Tiller is already installed.", + "loc.input.label.updatedependency": "Update Dependency", + "loc.input.help.updatedependency": "Run helm dependency update before installing the chart. Update dependencies from 'requirements.yaml' to dir 'charts/' before packaging", + "loc.input.label.save": "Save", + "loc.input.help.save": "Save packaged chart to local chart repository (default true)​", + "loc.input.label.install": "Install if release not present.", + "loc.input.help.install": "If a release by this name doesn't already exist, run an install​.", + "loc.input.label.recreate": "Recreate Pods.", + "loc.input.help.recreate": "Performs pods restart for the resource if applicable.", + "loc.input.label.resetValues": "Reset Values.", + "loc.input.help.resetValues": "Reset the values to the ones built into the chart.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Force resource update through delete/recreate if needed​", + "loc.input.label.waitForExecution": "Wait", + "loc.input.help.waitForExecution": "Block till command execution completes.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Helm command options.", + "loc.input.label.enableTls": "Enable TLS", + "loc.input.help.enableTls": "Enables using SSL between Helm and Tiller.", + "loc.input.label.caCert": "CA certificate", + "loc.input.help.caCert": "CA cert used to issue certificate for tiller and helm client.", + "loc.input.label.certificate": "Certificate", + "loc.input.help.certificate": "Specify Tiller certificate or Helm client certificate", + "loc.input.label.privatekey": "Key", + "loc.input.help.privatekey": "Specify Tiller Key or Helm client key", + "loc.input.label.tillernamespace": "Tiller namespace", + "loc.input.help.tillernamespace": "Specify K8 namespace of tiller.", + "loc.input.label.failOnStderr": "Fail on Standard Error", + "loc.input.help.failOnStderr": "If this is true, this task will fail if any errors are written to the error pipeline, or if any data is written to the Standard Error stream. Otherwise the task will rely on the exit code to determine failure.", + "loc.input.label.publishPipelineMetadata": "Publish pipeline metadata", + "loc.input.help.publishPipelineMetadata": "If this is true, the task will collect and publish deployment metadata", + "loc.input.label.chartNameForACR": "Chart Name For Azure Container Registry", + "loc.input.help.chartNameForACR": "Chart name with which the chart will be stored in Azure Container Registry.", + "loc.input.label.chartPathForACR": "Chart Path for Azure Container Registry", + "loc.input.help.chartPathForACR": "Path to the chart directory.", + "loc.messages.CantDownloadAccessProfile": "Cannot download access profile/kube config file for the cluster %s. Reason %s.", + "loc.messages.KubeConfigFilePath": "Kubeconfig file path: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes cluster Id : %s, kubernetes server version %s, kuberenettes provision state %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes cluster %s, resource group %s.", + "loc.messages.ClusterNotProvisioned": "Observed that the cluster %s is in %s state.", + "loc.messages.ClusterNotFound": "%s cluster does not exists", + "loc.messages.FailedToListClusters": "Failed to list managed clusters in the subscription. %s", + "loc.messages.RetryingRequest": "Retrying request after %s seconds.", + "loc.messages.PatternNotFoundInFilePath": "Pattern not found in file path %s.", + "loc.messages.CantResolvePatternInPath": "Can not resolve pattern in file path %s.", + "loc.messages.PatternFoundInPath": "Pattern found in file path %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Could not fetch access token for Azure. Status code: %s, status message: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Could not fetch access token for Managed Service Principal. Please configure Managed Service Identity (MSI) for virtual machine 'https://aka.ms/azure-msi-docs'. Status code: %s, status message: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Could not fetch access token for Managed Service Principal. Status code: %s, status message: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS not enabled in the Task. Skipping delete of certificates.", + "loc.messages.SkipDownloadSecureFiles": "TLS not enabled in the Task. Skipping download of certificates.", + "loc.messages.FileNotFound": "File not found at %s", + "loc.messages.KubernetesServiceConnectionNotFound": "Kubernetes service connection details not found.", + "loc.messages.ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "loc.messages.SaveSupportedInHelmsV3Only": "Save chart to Azure Container Registry is only supported in Helms V3.", + "loc.messages.OutputVariableDataSizeExceeded": "Output variable not set as Helm command output exceeded the maximum supported length. Output length: %s, Maximum supported length: %s", + "loc.messages.KubeloginFailed": "Kubelogin authentication failed. Exception: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..90cf582fd8cf --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Empaquetar e implementar los gráficos de Helm", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?linkid=851275) o [consultar la documentación de Helm](https://helm.sh/docs/)", + "loc.description": "Implementa, configura y actualiza un clúster de Kubernetes en Azure Container Service mediante la ejecución de comandos helm.", + "loc.instanceNameFormat": "helm $(comando)", + "loc.group.displayName.cluster": "Clúster de Kubernetes", + "loc.group.displayName.commands": "Comandos", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.connectionType": "Tipo de conexión", + "loc.input.help.connectionType": "Seleccione \"Azure Resource Manager\" para conectarse a un servicio de Azure Kubernetes Service mediante la conexión del servicio de Azure. Seleccione \"Conexión de servicio de Kubernetes\" para conectarse a cualquier clúster de Kubernetes mediante kubeconfig o la cuenta de servicio", + "loc.input.label.azureSubscriptionEndpoint": "Suscripción a Azure", + "loc.input.help.azureSubscriptionEndpoint": "Seleccione una suscripción de Azure, que tiene instancia de Azure Container Registry.", + "loc.input.label.azureResourceGroup": "Grupo de recursos", + "loc.input.help.azureResourceGroup": "Seleccione un grupo de recursos de Azure.", + "loc.input.label.kubernetesCluster": "Clúster de Kubernetes", + "loc.input.help.kubernetesCluster": "Seleccione un clúster de Azure administrado.", + "loc.input.label.useClusterAdmin": "Usar credenciales de administrador del clúster", + "loc.input.help.useClusterAdmin": "Use las credenciales de administrador del clúster en lugar de las credenciales predeterminadas de usuario de clúster.", + "loc.input.label.kubernetesServiceEndpoint": "Conexión de servicio de Kubernetes", + "loc.input.help.kubernetesServiceEndpoint": "Seleccione una conexión del servicio de Kubernetes.", + "loc.input.label.namespace": "Espacio de nombres", + "loc.input.help.namespace": "Especificar el espacio de nombres de K8 para usar. Se puede especificar el uso del espacio de nombres de Tiller en la sección de opciones avanzadas de la tarea pasando la opción --tiller-namespace como argumento.", + "loc.input.label.azureSubscriptionEndpointForACR": "Suscripción de Azure para Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Seleccione una suscripción de Azure, que tiene instancia de Azure Container Registry.", + "loc.input.label.azureResourceGroupForACR": "Grupo de recursos", + "loc.input.help.azureResourceGroupForACR": "Seleccione un grupo de recursos de Azure que tenga su instancia de Container Registry.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Seleccione una instancia de Azure Container Registry que se usará para insertar gráficos de Helm.", + "loc.input.label.command": "Comando", + "loc.input.help.command": "Seleccione un comando helm.", + "loc.input.label.chartType": "Tipo de gráfico", + "loc.input.help.chartType": "Seleccione cómo desea escribir la información de gráfico. Puede proporcionar el nombre de la ruta de acceso o la ruta de acceso de la carpeta/archivo al gráfico.", + "loc.input.label.chartName": "Nombre del gráfico", + "loc.input.help.chartName": "Gráfico de referencia para instalar, puede ser una dirección URL o el nombre de un gráfico. Por ejemplo, si el nombre del gráfico es \" stable/mysql\", la tarea ejecutará \"helm install stable/mysql\".", + "loc.input.label.chartPath": "Ruta de acceso del gráfico", + "loc.input.help.chartPath": "Ruta de acceso del gráfico para instalar. Puede ser una ruta de acceso a un gráfico empaquetado o una ruta de acceso a un directorio de gráfico desempaquetado. Por ejemplo, si se especifica \"./redis\", la tarea ejecutará \"helm install ./redis\".", + "loc.input.label.version": "Versión", + "loc.input.help.version": "Especifique la versión exacta del gráfico para instalar. Si no se especifica, se instala la versión más reciente. Establezca la versión del gráfico en esta versión de semver", + "loc.input.label.releaseName": "Nombre de versión", + "loc.input.help.releaseName": "Nombre de la versión. Si no se especifica, se generará una automáticamente.", + "loc.input.label.overrideValues": "Valores establecidos", + "loc.input.help.overrideValues": "Establezca los valores en la línea de comandos (puede especificar valores múltiples o separados con comas o líneas nuevas: key1=val1,key2=val2 o
key1=val1
key2=val2
). La tarea construirá el comando helm con estos valores establecidos. Por ejemplo, helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Archivo de valores", + "loc.input.help.valueFile": "Especifique valores en un archivo YAML o una dirección URL. Por ejemplo, la especificación de myvalues.yaml dará como resultado \"helm install --values=myvals.yaml\".", + "loc.input.label.destination": "Destino", + "loc.input.help.destination": "Especificar valores en un archivo YAML o una dirección URL.", + "loc.input.label.canaryimage": "Use la versión de la imagen del valor controlado.", + "loc.input.help.canaryimage": "Usar la imagen del valor controlado de Tiller, la versión anterior a la publicación más reciente de Tiller.", + "loc.input.label.upgradetiller": "Actualizar Tiller", + "loc.input.help.upgradetiller": "Actualice si Tiller ya está instalado.", + "loc.input.label.updatedependency": "Actualizar dependencia", + "loc.input.help.updatedependency": "Ejecute la actualización de la dependencia de helm antes de instalar el gráfico. Actualice las dependencias de \"requirements.yaml\" al directorio \"charts/\" antes del empaquetado", + "loc.input.label.save": "Guardar", + "loc.input.help.save": "Guardar gráfico empaquetado en el repositorio de gráfico local (true de forma predeterminada)", + "loc.input.label.install": "Instale si la versión no está presente.", + "loc.input.help.install": "Si ya no existe una versión con este nombre, ejecute una instalación.", + "loc.input.label.recreate": "Volver a crear pods.", + "loc.input.help.recreate": "Realiza el reinicio de pods para el recurso, si procede.", + "loc.input.label.resetValues": "Restablezca valores.", + "loc.input.help.resetValues": "Restablezca los valores a los que figuran integrados en el gráfico.", + "loc.input.label.force": "Forzar", + "loc.input.help.force": "Forzar la actualización de recursos a través de eliminar/volver a crear si es necesario", + "loc.input.label.waitForExecution": "Esperar", + "loc.input.help.waitForExecution": "Bloquear hasta que se complete la ejecución del comando.", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Opciones de comando de Helm.", + "loc.input.label.enableTls": "Habilitar TLS", + "loc.input.help.enableTls": "Habilita el uso de SSL entre Helm y Tiller.", + "loc.input.label.caCert": "Certificado de CA", + "loc.input.help.caCert": "Certificado de CA que se usó para emitir el certificado para el cliente tiller y helm.", + "loc.input.label.certificate": "Certificado", + "loc.input.help.certificate": "Especificar el certificado de Tiller o el certificado de cliente de Helm", + "loc.input.label.privatekey": "Llave", + "loc.input.help.privatekey": "Especifique la clave Tiller o la clave de cliente Helm", + "loc.input.label.tillernamespace": "Espacio de nombres de Tiller", + "loc.input.help.tillernamespace": "Especifique el espacio de nombres K8 de tiller.", + "loc.input.label.failOnStderr": "Error si se produce un error estándar", + "loc.input.help.failOnStderr": "Si es true, se producirá un error en la tarea si se escriben errores en la canalización de errores o si se escriben datos en la secuencia de error estándar. De lo contrario, la tarea se basará en el código de salida para determinar el error.", + "loc.input.label.publishPipelineMetadata": "Publicar los metadatos de canalización", + "loc.input.help.publishPipelineMetadata": "Si es true, la tarea recopilará y publicará los metadatos de implementación.", + "loc.input.label.chartNameForACR": "Nombre del gráfico para Azure Container Registry", + "loc.input.help.chartNameForACR": "Nombre del gráfico con el que este se almacenará en Azure Container Registry.", + "loc.input.label.chartPathForACR": "Ruta de acceso del gráfico para Azure Container Registry", + "loc.input.help.chartPathForACR": "Ruta de acceso al directorio del gráfico.", + "loc.messages.CantDownloadAccessProfile": "No se puede descargar el archivo de configuración del perfil de acceso o kube para el clúster %s. Motivo %s.", + "loc.messages.KubeConfigFilePath": "Ruta de acceso de archivo de Kubeconfig: %s", + "loc.messages.KubernetesClusterInfo": "Id. de clúster Kubernetes: %s, versión del servidor kubernetes %s, estado de aprovisionamiento de kubernetes %s", + "loc.messages.KubernetesClusterResourceGroup": "Clúster de Kubernetes %s, grupo de recursos %s.", + "loc.messages.ClusterNotProvisioned": "Observó que el clúster %s está en estado %s.", + "loc.messages.ClusterNotFound": "No existe el clúster %s", + "loc.messages.FailedToListClusters": "Error al enumerar los clústeres administrados en la suscripción. %s", + "loc.messages.RetryingRequest": "Reintentando solicitud después de %s segundos.", + "loc.messages.PatternNotFoundInFilePath": "El patrón no se encontró en la ruta de acceso de archivos %s.", + "loc.messages.CantResolvePatternInPath": "No se puede resolver el patrón en la ruta de archivo %s.", + "loc.messages.PatternFoundInPath": "Patrón encontrado en la ruta de acceso de archivos %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "No se pudo capturar el token de acceso para Azure. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Configure Managed Service Identity (MSI) para la máquina virtual \"https://aka.ms/azure-msi-docs\". Código de estado: %s. Mensaje de estado: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "No se pudo capturar el token de acceso para la entidad de servicio administrada. Código de estado: %s. Mensaje de estado: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS no habilitado en la tarea. Omitiendo la eliminación de certificados.", + "loc.messages.SkipDownloadSecureFiles": "TLS no habilitado en la tarea. Omitiendo la descarga de certificados.", + "loc.messages.FileNotFound": "No se encuentra en el archivo en %s", + "loc.messages.KubernetesServiceConnectionNotFound": "No se encontraron los detalles de la conexión de servicio de Kubernetes.", + "loc.messages.ExpiredServicePrincipal": "No se pudo capturar el token de acceso de Azure. Compruebe que la entidad de servicio usada es válida y no ha expirado.", + "loc.messages.SaveSupportedInHelmsV3Only": "Guardar un gráfico en Azure Container Registry solo se admite en Helms V3.", + "loc.messages.OutputVariableDataSizeExceeded": "La variable de salida no establecida como salida del comando de Helm superó la longitud máxima admitida. Longitud de salida: %s. Longitud máxima admitida: %s", + "loc.messages.KubeloginFailed": "Error de autenticación de Kubelogin. Excepción: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..be5a3211e1b7 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Créer des packages de charts Helm et les déployer", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?linkid=851275) ou [consulter la documentation de Helm](https://helm.sh/docs/)", + "loc.description": "Déployer, configurer et mettre à jour un cluster Kubernetes dans Azure Container Service en exécutant des commandes Helm", + "loc.instanceNameFormat": "helm $(commande)", + "loc.group.displayName.cluster": "Cluster Kubernetes", + "loc.group.displayName.commands": "Commandes", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.connectionType": "Type de connexion", + "loc.input.help.connectionType": "Sélectionnez 'Azure Resource Manager' pour vous connecter à Azure Kubernetes Service via une connexion de service Azure. Sélectionnez 'Connexion de service Kubernetes' pour vous connecter à un cluster Kubernetes via kubeconfig ou un compte de service", + "loc.input.label.azureSubscriptionEndpoint": "Abonnement Azure", + "loc.input.help.azureSubscriptionEndpoint": "Sélectionnez un abonnement Azure ayant votre service Azure Container Registry.", + "loc.input.label.azureResourceGroup": "Groupe de ressources", + "loc.input.help.azureResourceGroup": "Sélectionnez un groupe de ressources Azure.", + "loc.input.label.kubernetesCluster": "Cluster Kubernetes", + "loc.input.help.kubernetesCluster": "Sélectionnez un cluster managé Azure.", + "loc.input.label.useClusterAdmin": "Utiliser les informations d'identification de l'administrateur de cluster", + "loc.input.help.useClusterAdmin": "Utilisez les informations d'identification de l'administrateur de cluster à la place des informations d'identification de l'utilisateur de cluster par défaut.", + "loc.input.label.kubernetesServiceEndpoint": "Connexion au service Kubernetes", + "loc.input.help.kubernetesServiceEndpoint": "Sélectionnez une connexion au service Kubernetes.", + "loc.input.label.namespace": "Espace de noms", + "loc.input.help.namespace": "Spécifiez l'espace de noms K8 à utiliser. Vous pouvez spécifier l'utilisation de l'espace de noms Tiller dans la section avancée de la tâche, ou en passant l'option --tiller-namespace en tant qu'argument.", + "loc.input.label.azureSubscriptionEndpointForACR": "Abonnement Azure pour Container Registry", + "loc.input.help.azureSubscriptionEndpointForACR": "Sélectionnez un abonnement Azure ayant votre service Azure Container Registry.", + "loc.input.label.azureResourceGroupForACR": "Groupe de ressources", + "loc.input.help.azureResourceGroupForACR": "Sélectionnez le groupe de ressources Azure comportant votre registre de conteneurs.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Sélectionnez le registre de conteneurs Azure à utiliser pour l'envoi (push) des charts Helm.", + "loc.input.label.command": "Commande", + "loc.input.help.command": "Sélectionnez une commande helm.", + "loc.input.label.chartType": "Type de chart", + "loc.input.help.chartType": "Sélectionnez la façon dont vous souhaitez entrer les informations relatives au chart. Vous pouvez fournir le nom du chart ou le chemin de dossier/fichier du chart.", + "loc.input.label.chartName": "Nom de chart", + "loc.input.help.chartName": "Référence de chart à installer. Il peut s'agir d'une URL ou d'un nom de chart. Par exemple, si le nom du chart est 'stable/mysql', la tâche exécute 'helm install stable/mysql'.", + "loc.input.label.chartPath": "Chemin de chart", + "loc.input.help.chartPath": "Chemin du chart à installer. Il peut s'agir du chemin d'un chart empaqueté ou du chemin d'un répertoire de chart décompressé. Par exemple, si './redis' est spécifié, la tâche exécute 'helm install ./redis'.", + "loc.input.label.version": "Version", + "loc.input.help.version": "Spécifiez la version exacte du chart à installer. Si vous n'indiquez rien, la dernière version est installée. Définissez la version du chart en fonction de cette version SemVer​", + "loc.input.label.releaseName": "Nom de mise en production", + "loc.input.help.releaseName": "Nom de la mise en production. Si vous n'indiquez rien, il est automatiquement généré.", + "loc.input.label.overrideValues": "Définir des valeurs", + "loc.input.help.overrideValues": "Définissez les valeurs sur la ligne de commande (vous pouvez spécifier plusieurs valeurs et les séparer à l'aide de virgules ou de nouvelles lignes : key1=val1,key2=val2 ou
key1=val1
key2=val2
). La tâche construit la commande helm à l'aide des valeurs définies. Par exemple, helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Fichier de valeurs", + "loc.input.help.valueFile": "Spécifiez les valeurs dans un fichier YAML ou une URL. Par exemple, la spécification de myvalues.yaml correspond à 'helm install --values=myvals.yaml'.", + "loc.input.label.destination": "Destination", + "loc.input.help.destination": "Spécifiez les valeurs dans un fichier YAML ou une URL.", + "loc.input.label.canaryimage": "Utilisez une version d'image canary.", + "loc.input.help.canaryimage": "Utilisez l'image Tiller canary, la dernière version préliminaire de Tiller.", + "loc.input.label.upgradetiller": "Mettre à niveau Tiller", + "loc.input.help.upgradetiller": "Effectuez la mise à niveau si Tiller est déjà installé.", + "loc.input.label.updatedependency": "Mettre à jour la dépendance", + "loc.input.help.updatedependency": "Exécutez la mise à jour des dépendances helm avant d'installer le chart. Mettez à jour les dépendances de 'requirements.yaml' vers dir 'charts/' avant la création du package", + "loc.input.label.save": "Enregistrer", + "loc.input.help.save": "Enregistrer le chart empaqueté dans le dépôt de charts local (vrai par défaut)​", + "loc.input.label.install": "Effectuez l'installation si la mise en production n'est pas présente.", + "loc.input.help.install": "S'il n'existe aucune mise en production portant ce nom, effectuez une installation.", + "loc.input.label.recreate": "Recréez les pods.", + "loc.input.help.recreate": "Effectue le redémarrage des pods pour la ressource, le cas échéant.", + "loc.input.label.resetValues": "Réinitialisez les valeurs.", + "loc.input.help.resetValues": "Réinitialisez les valeurs en fonction de celles intégrées dans le chart.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Forcer la mise à jour des ressources par suppression/recréation si nécessaire​", + "loc.input.label.waitForExecution": "Attendre", + "loc.input.help.waitForExecution": "Bloquez l'opération jusqu'à la fin de l'exécution de la commande.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Options de commande Helm.", + "loc.input.label.enableTls": "Activer TLS", + "loc.input.help.enableTls": "Permet d'utiliser SSL entre Helm et Tiller.", + "loc.input.label.caCert": "Certificat d'autorité de certification", + "loc.input.help.caCert": "Certificat d'autorité de certification permettant d'émettre un certificat pour le client tiller et helm.", + "loc.input.label.certificate": "Certificat", + "loc.input.help.certificate": "Spécifier un certificat Tiller ou un certificat client Helm", + "loc.input.label.privatekey": "Clé", + "loc.input.help.privatekey": "Spécifier la clé Tiller ou la clé cliente Helm", + "loc.input.label.tillernamespace": "Espace de noms Tiller", + "loc.input.help.tillernamespace": "Spécifiez l'espace de noms K8 de tiller.", + "loc.input.label.failOnStderr": "Échec sur une erreur standard", + "loc.input.help.failOnStderr": "Si la valeur est true, et si des erreurs sont écrites dans le pipeline d'erreurs ou si des données sont écrites dans le flux d'erreurs standard, cette tâche se solde par un échec. Sinon, la tâche se base sur le code de sortie pour déterminer la cause de l'échec.", + "loc.input.label.publishPipelineMetadata": "Publier des métadonnées de pipeline", + "loc.input.help.publishPipelineMetadata": "Si cette condition est vérifiée, la tâche collecte et publie les métadonnées de déploiement", + "loc.input.label.chartNameForACR": "Nom de chart pour Azure Container Registry", + "loc.input.help.chartNameForACR": "Nom du chart qui sera stocké dans Azure Container Registry.", + "loc.input.label.chartPathForACR": "Chemin du chart pour Azure Container Registry", + "loc.input.help.chartPathForACR": "Chemin du répertoire du chart.", + "loc.messages.CantDownloadAccessProfile": "Impossible de télécharger le fichier config de profil d'accès/kube pour le cluster %s. Raison : %s.", + "loc.messages.KubeConfigFilePath": "Chemin de fichier Kubeconfig : %s", + "loc.messages.KubernetesClusterInfo": "ID de cluster Kubernetes : %s, version de serveur kubernetes : %s, état de provisionnement kubernetes : %s", + "loc.messages.KubernetesClusterResourceGroup": "Cluster Kubernetes : %s, groupe de ressources : %s.", + "loc.messages.ClusterNotProvisioned": "Observation indiquant que le cluster %s est à l'état %s.", + "loc.messages.ClusterNotFound": "Le cluster %s n'existe pas", + "loc.messages.FailedToListClusters": "Échec du listage des clusters managés dans l'abonnement. %s", + "loc.messages.RetryingRequest": "Nouvelle tentative d'interrogation après %s.", + "loc.messages.PatternNotFoundInFilePath": "Modèle introuvable dans le chemin de fichier %s.", + "loc.messages.CantResolvePatternInPath": "Impossible de résoudre le modèle du chemin de fichier %s.", + "loc.messages.PatternFoundInPath": "Modèle trouvé dans le chemin de fichier %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Configurez MSI (Managed Service Identity) pour la machine virtuelle 'https://aka.ms/azure-msi-docs'. Code d'état : %s, message d'état : %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Impossible de récupérer (fetch) le jeton d'accès pour le principal du service managé. Code d'état : %s, message d'état : %s", + "loc.messages.SkipDeleteSecureFiles": "TLS non activé dans la tâche. Suppression des certificats ignorée.", + "loc.messages.SkipDownloadSecureFiles": "TLS non activé dans la tâche. Téléchargement des certificats ignoré.", + "loc.messages.FileNotFound": "Fichier introuvable sur %s", + "loc.messages.KubernetesServiceConnectionNotFound": "Les détails de la connexion de service Kubernetes sont introuvables.", + "loc.messages.ExpiredServicePrincipal": "Impossible de récupérer (fetch) le jeton d'accès pour Azure. Vérifiez si le principal de service utilisé est valide et s'il n'a pas expiré.", + "loc.messages.SaveSupportedInHelmsV3Only": "L'enregistrement du chart dans Azure Container Registry est pris en charge uniquement dans Helms V3.", + "loc.messages.OutputVariableDataSizeExceeded": "La variable de sortie non définie en tant que sortie de la commande Helm a dépassé la longueur maximale prise en charge. Longueur de sortie : %s. Longueur maximale prise en charge : %s", + "loc.messages.KubeloginFailed": "Échec de l’authentification Kubelogin. Exception : %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..19722c0ba998 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Crea pacchetto e distribuisci grafici Helm", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?linkid=851275). In alternativa [vedere la documentazione di Helm](https://helm.sh/docs/)", + "loc.description": "Consente di distribuire, configurare e aggiornare un cluster Kubernetes nel servizio contenitore di Azure eseguendo i comandi di Helm", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Cluster Kubernetes", + "loc.group.displayName.commands": "Comandi", + "loc.group.displayName.azureContainerRegistry": "Registro Azure Container", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.connectionType": "Tipo di connessione", + "loc.input.help.connectionType": "Selezionare 'Azure Resource Manager' per connettersi a un servizio Azure Kubernetes tramite la connessione al servizio di Azure. Selezionare 'Connessione al servizio Kubernetes' per connettersi a qualsiasi cluster Kubernetes tramite kubeconfig o l'account del servizio", + "loc.input.label.azureSubscriptionEndpoint": "Sottoscrizione di Azure", + "loc.input.help.azureSubscriptionEndpoint": "Consente di selezionare una sottoscrizione di Azure in cui è presente il registro contenitori di Azure.", + "loc.input.label.azureResourceGroup": "Gruppo di risorse", + "loc.input.help.azureResourceGroup": "Consente di selezionare un gruppo di risorse di Azure.", + "loc.input.label.kubernetesCluster": "Cluster Kubernetes", + "loc.input.help.kubernetesCluster": "Consente di selezionare un cluster gestito di Azure.", + "loc.input.label.useClusterAdmin": "Usa credenziali dell'amministratore del cluster", + "loc.input.help.useClusterAdmin": "Consente di usare le credenziali dell'amministratore del cluster invece delle credenziali utente del cluster predefinite.", + "loc.input.label.kubernetesServiceEndpoint": "Connessione a servizio Kubernetes", + "loc.input.help.kubernetesServiceEndpoint": "Consente di selezionare una connessione al servizio Kubernetes.", + "loc.input.label.namespace": "Spazio dei nomi", + "loc.input.help.namespace": "Consente di specificare lo spazio dei nomi K8 da usare. Per specificare l'uso dello spazio dei nomi Tiller, è possibile indicarlo nella sezione delle impostazioni avanzate dell'attività oppure passare come argomento l'opzione --tiller-namespace.", + "loc.input.label.azureSubscriptionEndpointForACR": "Sottoscrizione di Azure per Registro Container", + "loc.input.help.azureSubscriptionEndpointForACR": "Consente di selezionare una sottoscrizione di Azure in cui è presente il registro contenitori di Azure.", + "loc.input.label.azureResourceGroupForACR": "Gruppo di risorse", + "loc.input.help.azureResourceGroupForACR": "Consente di selezionare un gruppo di risorse di Azure in cui è presente l'istanza di Registro Container.", + "loc.input.label.azureContainerRegistry": "Registro contenitori di Azure", + "loc.input.help.azureContainerRegistry": "Consente di selezionare un'istanza di Registro Azure Container che verrà usata per il push dei grafici Helm.", + "loc.input.label.command": "Comando", + "loc.input.help.command": "Consente di selezionare un comando di Helm.", + "loc.input.label.chartType": "Tipo di grafico", + "loc.input.help.chartType": "Consente di selezionare come immettere le informazioni sul grafico. È possibile specificare il nome oppure il percorso della cartella o del file del grafico.", + "loc.input.label.chartName": "Nome del grafico", + "loc.input.help.chartName": "Riferimento al grafico da installare. Può essere un URL o un nome di grafico. Se ad esempio il nome del grafico è 'stable/mysql', l'attività eseguirà 'helm install stable/mysql'.", + "loc.input.label.chartPath": "Percorso del grafico", + "loc.input.help.chartPath": "Percorso del grafico da installare. Può essere un percorso di un grafico incluso in un pacchetto oppure il percorso di una directory di grafici non inclusi in un pacchetto. Se ad esempio si specifica './redis', l'attività eseguirà 'helm install ./redis'.", + "loc.input.label.version": "Versione", + "loc.input.help.version": "Consente di specificare la versione esatta del grafico da installare. Se non viene specificata, verrà installata la versione più recente. Impostare la versione nel grafico su questa versione di semver", + "loc.input.label.releaseName": "Nome della versione", + "loc.input.help.releaseName": "Nome della versione. Se non viene specificato, ne verrà generato uno automaticamente.", + "loc.input.label.overrideValues": "Imposta valori", + "loc.input.help.overrideValues": "Consente di impostare valori sulla riga di comando. È possibile specificare più valori distinti delimitati da virgole o caratteri di nuova riga: chiave1=val1,chiave2=val2 o
chiave1=val1
chiave2=val2
. L'attività costruirà il comando helm usando questi valori impostati, ad esempio helm install --set chiave1=val1 ./redis.", + "loc.input.label.valueFile": "File di valori", + "loc.input.help.valueFile": "Consente di specificare i valori in un file YAML o un URL. Se ad esempio si specifica myvalues.yaml, si otterrà 'helm install --values=myvals.yaml'.", + "loc.input.label.destination": "Destinazione", + "loc.input.help.destination": "Consente di specificare i valori in un file YAML o in un URL.", + "loc.input.label.canaryimage": "Usa la versione canary dell'immagine.", + "loc.input.help.canaryimage": "Consente di usare l'immagine canary di Tiller, la versione preliminare più recente di Tiller.", + "loc.input.label.upgradetiller": "Aggiorna Tiller", + "loc.input.help.upgradetiller": "Esegue l'aggiornamento se Tiller è già installato.", + "loc.input.label.updatedependency": "Aggiorna la dipendenza", + "loc.input.help.updatedependency": "Esegue l'aggiornamento delle dipendenze di Helm prima di installare il grafico. Aggiornare le dipendenze da 'requirements.yaml' alla directory 'charts/' prima di creare il pacchetto", + "loc.input.label.save": "Salva", + "loc.input.help.save": "Consente di salvare il grafico aggiunto a un pacchetto nel repository di grafici locale (impostazione predefinita: true)", + "loc.input.label.install": "Installa la versione se non è presente.", + "loc.input.help.install": "Se non esiste alcuna risorsa con questo nome, esegue un'installazione.", + "loc.input.label.recreate": "Ricrea i pod.", + "loc.input.help.recreate": "Se applicabile, esegue il riavvio dei pod per la risorsa.", + "loc.input.label.resetValues": "Ripristina i valori.", + "loc.input.help.resetValues": "Consente di ripristinare i valori predefiniti nel grafico.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Se necessario, forza l'aggiornamento delle risorse tramite delete/recreate", + "loc.input.label.waitForExecution": "Attendi", + "loc.input.help.waitForExecution": "Blocca finché non viene completata l'esecuzione del comando.", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Opzioni dei comandi di Helm.", + "loc.input.label.enableTls": "Abilita TLS", + "loc.input.help.enableTls": "Abilita l'uso di SSL tra Helm e Tiller.", + "loc.input.label.caCert": "Certificato della CA", + "loc.input.help.caCert": "Certificato della CA usato per rilasciare il certificato per Tiller o il client Helm.", + "loc.input.label.certificate": "Certificato", + "loc.input.help.certificate": "Consente di specificare il certificato di Tiller o del client Helm", + "loc.input.label.privatekey": "Chiave", + "loc.input.help.privatekey": "Consente di specificare la chiave di Tiller o del client Helm", + "loc.input.label.tillernamespace": "Spazio dei nomi di Tiller", + "loc.input.help.tillernamespace": "Consente di specificare lo spazio dei nomi K8 di Tiller.", + "loc.input.label.failOnStderr": "Interrompi in caso di errore standard", + "loc.input.help.failOnStderr": "Se il valore è true, questa attività non riuscirà nel caso in cui vengano scritti errori nella pipeline degli errori oppure se vengono scritti dati nel flusso Errore standard. In caso contrario, l'attività si baserà sul codice di uscita per determinare l'errore.", + "loc.input.label.publishPipelineMetadata": "Pubblica i metadati della pipeline", + "loc.input.help.publishPipelineMetadata": "Se è true, l'attività raccoglierà e pubblicherà i metadati della distribuzione", + "loc.input.label.chartNameForACR": "Nome del grafico per Registro Azure Container", + "loc.input.help.chartNameForACR": "Nome del grafico con il quale il grafico verrà archiviato nell'istanza di Registro Azure Container.", + "loc.input.label.chartPathForACR": "Percorso del grafico per Registro Azure Container", + "loc.input.help.chartPathForACR": "Percorso della directory del grafico.", + "loc.messages.CantDownloadAccessProfile": "Non è possibile scaricare il profilo di accesso o il file di configurazione kube per il cluster %s. Motivo: %s.", + "loc.messages.KubeConfigFilePath": "Percorso del file kubeconfig: %s", + "loc.messages.KubernetesClusterInfo": "ID cluster Kubernetes: %s. Versione del server Kubernetes: %s. Stato di provisioning di Kubernetes: %s", + "loc.messages.KubernetesClusterResourceGroup": "Cluster Kubernetes %s, gruppo di risorse %s.", + "loc.messages.ClusterNotProvisioned": "È stato notato che il cluster %s si trova nello stato %s.", + "loc.messages.ClusterNotFound": "Il cluster %s non esiste", + "loc.messages.FailedToListClusters": "Non è stato possibile elencare i cluster gestiti nella sottoscrizione. %s", + "loc.messages.RetryingRequest": "La richiesta verrà ripetuta dopo %s secondi.", + "loc.messages.PatternNotFoundInFilePath": "Criterio non trovato nel percorso file %s.", + "loc.messages.CantResolvePatternInPath": "Non è possibile risolvere il criterio nel percorso file %s.", + "loc.messages.PatternFoundInPath": "Criterio trovato nel percorso file %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Non è stato possibile recuperare il token di accesso per Azure. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Configurare l'identità del servizio gestita per la macchina virtuale 'https://aka.ms/azure-msi-docs'. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Non è stato possibile recuperare il token di accesso per l'entità servizio gestita. Codice di stato: %s. Messaggio di stato: %s", + "loc.messages.SkipDeleteSecureFiles": "TLS non è abilitato nell'attività. L'eliminazione dei certificati verrà ignorata.", + "loc.messages.SkipDownloadSecureFiles": "TLS non è abilitato nell'attività. Il download dei certificati verrà ignorato.", + "loc.messages.FileNotFound": "Il file non è stato trovato in %s", + "loc.messages.KubernetesServiceConnectionNotFound": "I dettagli della connessione al servizio Kubernetes non sono stati trovati.", + "loc.messages.ExpiredServicePrincipal": "Non è stato possibile recuperare il token di accesso per Azure. Verificare che l'entità servizio usata sia valida e non sia scaduta.", + "loc.messages.SaveSupportedInHelmsV3Only": "Il salvataggio del grafico in Registro Azure Container è supportato solo Helm V3.", + "loc.messages.OutputVariableDataSizeExceeded": "La variabile di output non impostata come output del comando Helm supera la lunghezza massima supportata. Lunghezza dell'output: %s. Lunghezza massima supportata: %s", + "loc.messages.KubeloginFailed": "Autenticazione Kubelogin non riuscita. Eccezione: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..e969cca5eb29 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Helm Charts のパッケージ化と配置", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?linkid=851275)、または [Helm のドキュメントを参照](https://helm.sh/docs/)", + "loc.description": "helm コマンドを実行して、Azure Container Service で Kubernetes クラスターをデプロイ、構成、更新します", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes クラスター", + "loc.group.displayName.commands": "コマンド", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.connectionType": "接続の種類", + "loc.input.help.connectionType": "Azure サービス接続を使用して Azure Kubernetes Service に接続するには、[Azure Resource Manager] を選択します。kubeconfig またはサービス アカウントを使用して任意の Kubernetes クラスターに接続するには、[Kubernetes サービス接続] を選択します。", + "loc.input.label.azureSubscriptionEndpoint": "Azure サブスクリプション", + "loc.input.help.azureSubscriptionEndpoint": "Azure Container Registry が含まれる Azure サブスクリプションを選択します。", + "loc.input.label.azureResourceGroup": "リソース グループ", + "loc.input.help.azureResourceGroup": "Azure リソース グループを選択します。", + "loc.input.label.kubernetesCluster": "Kubernetes クラスター", + "loc.input.help.kubernetesCluster": "Azure 管理対象クラスターを選択します。", + "loc.input.label.useClusterAdmin": "クラスター管理者の資格情報を使用する", + "loc.input.help.useClusterAdmin": "既定のクラスター ユーザーの資格情報ではなく、クラスター管理者の資格情報をご使用ください。", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes サービス接続", + "loc.input.help.kubernetesServiceEndpoint": "Kubernetes サービス接続を選択します。", + "loc.input.label.namespace": "名前空間", + "loc.input.help.namespace": "使用する K8 名前空間を指定します。Tiller 名前空間は、タスクの詳細セクションで指定するか、引数として --tiller-namespace オプションを渡すことで指定できます。", + "loc.input.label.azureSubscriptionEndpointForACR": "Container Registry の Azure サブスクリプション", + "loc.input.help.azureSubscriptionEndpointForACR": "Azure Container Registry が含まれる Azure サブスクリプションを選択します。", + "loc.input.label.azureResourceGroupForACR": "リソース グループ", + "loc.input.help.azureResourceGroupForACR": "ご使用のコンテナー レジストリが含まれる Azure リソース グループを選択します。", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Helm chart のプッシュに使用される Azure コンテナー レジストリを選択します。", + "loc.input.label.command": "コマンド", + "loc.input.help.command": "helm コマンドを選択します。", + "loc.input.label.chartType": "グラフの種類", + "loc.input.help.chartType": "Chart 情報を入力する方法を選択します。Chart 名または Chart のフォルダー/ファイルのパスを指定できます。", + "loc.input.label.chartName": "Chart 名", + "loc.input.help.chartName": "インストールする Chart の参照で、url または Chart 名。たとえば、Chart 名が 'stable/mysql' の場合、タスクは 'helm install stable/mysql' を実行します。", + "loc.input.label.chartPath": "Chart パス", + "loc.input.help.chartPath": "インストールする Chart へのパス。これは、パッケージ化された Chart またはアンパックした Chart ディレクトリへのパスです。たとえば、'./redis' が指定された場合、タスクは 'helm install ./redis' を実行します。", + "loc.input.label.version": "バージョン", + "loc.input.help.version": "インストールする正確な Chart のバージョンを指定します。指定されていない場合は、最新バージョンがインストールされます。この semver バージョンに Chart のバージョンを設定します", + "loc.input.label.releaseName": "リリース名", + "loc.input.help.releaseName": "リリース名です。指定しない場合、自動生成されます。", + "loc.input.label.overrideValues": "設定された値", + "loc.input.help.overrideValues": "コマンド ラインで設定される値 (コンマまたは改行を使用して、複数または別個の値を指定できます。key1=val1,key2=val2 または
key1=val1
key2=val2
)。このタスクにより、これらの設定された値を使用して helm コマンドが構築されます。たとえば、helm install --set key1=val1 ./redis です。", + "loc.input.label.valueFile": "値ファイル", + "loc.input.help.valueFile": "YAML ファイルまたは URL の値を指定します。たとえば、myvalues.yaml と指定すると、'helm install --values=myvals.yaml' になります。", + "loc.input.label.destination": "宛先", + "loc.input.help.destination": "YAML ファイルまたは URL の値を指定します。", + "loc.input.label.canaryimage": "カナリア イメージのバージョンを使用します。", + "loc.input.help.canaryimage": "カナリア Tiller イメージ、Tiller の最新プレリリース バージョンを使用します。", + "loc.input.label.upgradetiller": "Tiller をアップグレードする", + "loc.input.help.upgradetiller": "Tiller が既にインストールされている場合、アップグレードします。", + "loc.input.label.updatedependency": "依存関係を更新する", + "loc.input.help.updatedependency": "Chart をインストールする前に、Helm の依存関係の更新を実行します。パッケージ化の前に依存関係を 'requirements.yaml' からディレクトリ 'charts/' に更新します", + "loc.input.label.save": "保存", + "loc.input.help.save": "パッケージ化された Chart をローカル Chart リポジトリに保存する (既定値は true) ", + "loc.input.label.install": "リリースがない場合、インストールします。", + "loc.input.help.install": "この名前のリリースがまだ存在しない場合は、インストールを実行します。", + "loc.input.label.recreate": "ポッドを再作成します。", + "loc.input.help.recreate": "該当する場合は、リソースに対してポッドの再起動を実行します。", + "loc.input.label.resetValues": "値をリセットします。", + "loc.input.help.resetValues": "値を Chart に組み込まれている値にリセットします。", + "loc.input.label.force": "Force", + "loc.input.help.force": "必要に応じて、削除/再作成によりリソースの更新を強制する", + "loc.input.label.waitForExecution": "待機", + "loc.input.help.waitForExecution": "コマンドの実行が完了するまでブロックします。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "Helm コマンド オプションです。", + "loc.input.label.enableTls": "TLS を有効にする", + "loc.input.help.enableTls": "Helm と Tiller との間の SSL の使用を有効にします。", + "loc.input.label.caCert": "CA 証明書", + "loc.input.help.caCert": "Tiller と Helm クライアントに証明書を発行するために使用される CA Cert です。", + "loc.input.label.certificate": "証明書", + "loc.input.help.certificate": "Tiller 証明書または Helm クライアント証明書を指定します", + "loc.input.label.privatekey": "キー", + "loc.input.help.privatekey": "Tiller キーまたは Helm クライアント キーを指定します", + "loc.input.label.tillernamespace": "Tiller 名前空間", + "loc.input.help.tillernamespace": "Tiller の K8 名前空間を指定します。", + "loc.input.label.failOnStderr": "標準エラーで失敗", + "loc.input.help.failOnStderr": "これが true の場合、エラーがエラー パイプラインに書き込まれるか、データが標準エラー ストリームに書き込まれると、このタスクは失敗します。それ以外の場合、タスクは終了コードに応じて失敗を判別します。", + "loc.input.label.publishPipelineMetadata": "パイプライン メタデータの公開", + "loc.input.help.publishPipelineMetadata": "これが true の場合、タスクによってデプロイのメタデータが収集および公開されます", + "loc.input.label.chartNameForACR": "Azure Container Registry の chart 名", + "loc.input.help.chartNameForACR": "Azure Container Registry に格納される chart の名前。", + "loc.input.label.chartPathForACR": "Azure Container Registry の chart パス", + "loc.input.help.chartPathForACR": "chart ディレクトリへのパス。", + "loc.messages.CantDownloadAccessProfile": "クラスター %s のアクセス プロファイルまたは kube 構成ファイルをダウンロードできません。理由 %s。", + "loc.messages.KubeConfigFilePath": "Kubeconfig ファイル パス: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes クラスター ID: %s、Kubernetes サーバー バージョン %s、Kuberenettes プロビジョニングの状態 %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes クラスター %s、リソース グループ %s。", + "loc.messages.ClusterNotProvisioned": "クラスター %s の状態が %s であることが確認されました。", + "loc.messages.ClusterNotFound": "クラスター %s は存在しません", + "loc.messages.FailedToListClusters": "サブスクリプション内のマネージド クラスターを一覧表示できませんでした。%s", + "loc.messages.RetryingRequest": "%s 秒後に要求を再試行しています。", + "loc.messages.PatternNotFoundInFilePath": "パターンがファイル パス %s で見つかりませんでした。", + "loc.messages.CantResolvePatternInPath": "ファイル パス %s のパターンを解決できません。", + "loc.messages.PatternFoundInPath": "パターンがファイル パス %s で見つかりました。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure 用のアクセス トークンをフェッチできませんでした。状態コード: %s、状態メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。仮想マシンのマネージド サービス ID (MSI) を構成してください 'https://aka.ms/azure-msi-docs'。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "マネージド サービス プリンシパルのアクセス トークンをフェッチできませんでした。状態コード: %s、ステータス メッセージ: %s", + "loc.messages.SkipDeleteSecureFiles": "タスクで TLS が有効になっていません。証明書の削除をスキップしています。", + "loc.messages.SkipDownloadSecureFiles": "タスクで TLS が有効になっていません。証明書のダウンロードをスキップしています。", + "loc.messages.FileNotFound": "%s でファイルが見つかりませんでした", + "loc.messages.KubernetesServiceConnectionNotFound": "Kubernetes サービス接続の詳細が見つかりませんでした。", + "loc.messages.ExpiredServicePrincipal": "Azure のアクセス トークンをフェッチできませんでした。使用されているサービス プリンシパルが有効であり、有効期限が切れていないことを確認してください。", + "loc.messages.SaveSupportedInHelmsV3Only": "Azure Container Registry への chart の保存は、Helm V3 でのみサポートされています。", + "loc.messages.OutputVariableDataSizeExceeded": "Helm コマンドの出力がサポートされている最大長を超えたため、出力変数が設定されませんでした。出力の長さ: %s、サポートされている最大長: %s", + "loc.messages.KubeloginFailed": "Kubelogin 認証に失敗しました。例外: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..f234e8bd3f38 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Helm 차트 패키지 및 배포", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?linkid=851275) 또는 [Helm 설명서 참조](https://helm.sh/docs/)", + "loc.description": "helm 명령을 실행하여 Azure Container Service에서 Kubernetes 클러스터를 배포, 구성, 업데이트합니다.", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes 클러스터", + "loc.group.displayName.commands": "명령", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "고급", + "loc.input.label.connectionType": "연결 형식", + "loc.input.help.connectionType": "Azure 서비스 연결을 사용하여 Azure Kubernetes Service에 연결하려면 'Azure Resource Manager'를 선택합니다. Kubeconfig 또는 서비스 계정을 사용하여 Kubernetes 클러스터에 연결하려면 'Kubernetes 서비스 연결'을 선택합니다.", + "loc.input.label.azureSubscriptionEndpoint": "Azure 구독", + "loc.input.help.azureSubscriptionEndpoint": "Azure Container Registry가 있는 Azure 구독을 선택하세요.", + "loc.input.label.azureResourceGroup": "리소스 그룹", + "loc.input.help.azureResourceGroup": "Azure 리소스 그룹을 선택합니다.", + "loc.input.label.kubernetesCluster": "Kubernetes 클러스터", + "loc.input.help.kubernetesCluster": "Azure 관리 클러스터를 선택합니다.", + "loc.input.label.useClusterAdmin": "클러스터 관리자 자격 증명 사용", + "loc.input.help.useClusterAdmin": "기본 클러스터 사용자 자격 증명 대신 클러스터 관리자 자격 증명을 사용합니다.", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes 서비스 연결", + "loc.input.help.kubernetesServiceEndpoint": "Kubernetes 서비스 연결을 선택합니다.", + "loc.input.label.namespace": "네임스페이스", + "loc.input.help.namespace": "사용할 K8 네임스페이스를 지정합니다. 작업의 고급 섹션에서 또는 --tiller-namespace 옵션을 인수로 전달하여 Tiller 네임스페이스 사용을 지정할 수 있습니다.", + "loc.input.label.azureSubscriptionEndpointForACR": "Container Registry에 대한 Azure 구독", + "loc.input.help.azureSubscriptionEndpointForACR": "Azure Container Registry가 있는 Azure 구독을 선택하세요.", + "loc.input.label.azureResourceGroupForACR": "리소스 그룹", + "loc.input.help.azureResourceGroupForACR": "Container Registry가 포함된 Azure 리소스 그룹을 선택합니다.", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "Helm 차트를 푸시하는 데 사용할 Azure Container Registry를 선택합니다.", + "loc.input.label.command": "명령", + "loc.input.help.command": "helm 명령을 선택합니다.", + "loc.input.label.chartType": "차트 종류", + "loc.input.help.chartType": "차트 정보를 입력하는 방법을 선택합니다. 차트 이름이나 차트에 대한 폴더/파일 경로를 입력할 수 있습니다.", + "loc.input.label.chartName": "차트 이름", + "loc.input.help.chartName": "설치할 차트 참조입니다. URL 또는 차트 이름일 수 있습니다. 예를 들어 차트 이름이 'stable/mysql'이면 작업은 'helm install stable/mysql'을 실행합니다.", + "loc.input.label.chartPath": "차트 경로", + "loc.input.help.chartPath": "설치할 차트의 경로입니다. 패키지된 차트의 경로 또는 압축을 푼 차트 디렉터리의 경로일 수 있습니다. 예를 들어 './redis'를 지정하면 작업은 'helm install ./redis'를 실행합니다.", + "loc.input.label.version": "버전", + "loc.input.help.version": "설치할 차트 버전을 정확하게 지정합니다. 지정하지 않으면 최신 버전이 설치됩니다. 차트의 버전을 이 semver 버전으로 설정합니다.", + "loc.input.label.releaseName": "릴리스 이름", + "loc.input.help.releaseName": "릴리스 이름입니다. 지정하지 않으면 자동으로 생성됩니다.", + "loc.input.label.overrideValues": "값 설정", + "loc.input.help.overrideValues": "명령줄에서 값을 설정합니다(값을 여러 개 지정하거나 key1=val1,key2=val2 또는
key1=val1
key2=val2
와 같이 쉼표나 줄 바꿈으로 구분할 수 있음). 작업은 이렇게 설정된 값을 사용하여 Helm 명령을 생성합니다(예: helm install --set key1=val1 ./redis).", + "loc.input.label.valueFile": "값 파일", + "loc.input.help.valueFile": "YAML 파일에 값을 지정하거나, URL을 지정합니다. 예를 들어 myvalues.yaml을 지정하면 'helm install --values=myvals.yaml'이 실행됩니다.", + "loc.input.label.destination": "대상", + "loc.input.help.destination": "YAML 파일에 값을 지정하거나, URL을 지정합니다.", + "loc.input.label.canaryimage": "카나리아 이미지 버전을 사용합니다.", + "loc.input.help.canaryimage": "Tiller의 최신 시험판 버전인 카나리아 Tiller 이미지를 사용합니다.", + "loc.input.label.upgradetiller": "Tiller 업그레이드", + "loc.input.help.upgradetiller": "Tiller가 이미 설치된 경우 업그레이드합니다.", + "loc.input.label.updatedependency": "종속성 업데이트", + "loc.input.help.updatedependency": "차트를 설치하기 전에 helm 종속성 업데이트를 실행합니다. 패키지 전에 종속성을 'requirements.yaml'에서 dir 'charts/'로 업데이트합니다.", + "loc.input.label.save": "저장", + "loc.input.help.save": "패키지된 차트를 로컬 차트 리포지토리에 저장합니다(기본값 true).", + "loc.input.label.install": "릴리스가 없는 경우 설치", + "loc.input.help.install": "이 이름을 가진 릴리스가 없는 경우 설치를 실행합니다.", + "loc.input.label.recreate": "Pod 다시 만들기", + "loc.input.help.recreate": "해당하는 경우 리소스에 대해 Pod 다시 시작을 수행합니다.", + "loc.input.label.resetValues": "값 다시 설정", + "loc.input.help.resetValues": "값을 차트에 기본 제공된 값으로 다시 설정합니다.", + "loc.input.label.force": "Force", + "loc.input.help.force": "필요한 경우 삭제/다시 만들기를 통해 리소스를 강제로 업데이트합니다.", + "loc.input.label.waitForExecution": "대기", + "loc.input.help.waitForExecution": "명령 실행이 완료될 때까지 차단합니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "Helm 명령 옵션입니다.", + "loc.input.label.enableTls": "TLS 사용", + "loc.input.help.enableTls": "Helm 및 Tiller 간에 SSL을 사용하도록 설정합니다.", + "loc.input.label.caCert": "CA 인증서", + "loc.input.help.caCert": "tiller 및 helm 클라이언트에 대한 인증서를 발급하는 데 사용되는 CA 인증서입니다.", + "loc.input.label.certificate": "인증서", + "loc.input.help.certificate": "Tiller 인증서 또는 Helm 클라이언트 인증서를 지정합니다.", + "loc.input.label.privatekey": "키", + "loc.input.help.privatekey": "Tiller 키 또는 Helm 클라이언트 키를 지정합니다.", + "loc.input.label.tillernamespace": "Tiller 네임스페이스", + "loc.input.help.tillernamespace": "tiller의 K8 네임스페이스를 지정합니다.", + "loc.input.label.failOnStderr": "표준 오류 시 실패", + "loc.input.help.failOnStderr": "true이면 오류 파이프라인에 오류가 작성되거나 표준 오류 스트림에 데이터가 작성될 경우 이 작업이 실패하게 됩니다. false이면 작업이 종료 코드를 사용하여 실패를 결정합니다.", + "loc.input.label.publishPipelineMetadata": "파이프라인 메타데이터 게시", + "loc.input.help.publishPipelineMetadata": "true이면 작업이 배포 메타데이터를 수집하고 게시합니다.", + "loc.input.label.chartNameForACR": "Azure Container Registry에 대한 차트 이름", + "loc.input.help.chartNameForACR": "Azure Container Registry에서 차트가 저장될 때 사용할 차트 이름입니다.", + "loc.input.label.chartPathForACR": "Azure Container Registry에 대한 차트 경로", + "loc.input.help.chartPathForACR": "차트 디렉터리의 경로입니다.", + "loc.messages.CantDownloadAccessProfile": "%s 클러스터의 액세스 프로필/kube 구성 파일을 다운로드할 수 없습니다. 이유: %s.", + "loc.messages.KubeConfigFilePath": "Kubeconfig 파일 경로: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes 클러스터 ID: %s, kubernetes 서버 버전 %s, kuberenetes 프로비전 상태 %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes 클러스터 %s, 리소스 그룹 %s.", + "loc.messages.ClusterNotProvisioned": "%s 클러스터는 %s 상태인 것으로 확인되었습니다.", + "loc.messages.ClusterNotFound": "%s 클러스터가 없습니다.", + "loc.messages.FailedToListClusters": "구독의 관리 클러스터를 나열하지 못했습니다. %s", + "loc.messages.RetryingRequest": "%s초 후에 요청을 다시 시도합니다.", + "loc.messages.PatternNotFoundInFilePath": "파일 경로 %s에 패턴이 없습니다.", + "loc.messages.CantResolvePatternInPath": "파일 경로 %s의 패턴을 확인할 수 없습니다.", + "loc.messages.PatternFoundInPath": "파일 경로 %s에 패턴이 있습니다.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Azure에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 가상 머신에 대한 MSI(관리 서비스 ID)를 구성하세요('https://aka.ms/azure-msi-docs'). 상태 코드: %s, 상태 메시지: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "관리 서비스 주체에 대한 액세스 토큰을 페치할 수 없습니다. 상태 코드: %s, 상태 메시지: %s", + "loc.messages.SkipDeleteSecureFiles": "작업에서 TLS를 사용할 수 없습니다. 인증서 삭제를 건너뜁니다.", + "loc.messages.SkipDownloadSecureFiles": "작업에서 TLS를 사용할 수 없습니다. 인증서 다운로드를 건너뜁니다.", + "loc.messages.FileNotFound": "%s에 파일에 없습니다.", + "loc.messages.KubernetesServiceConnectionNotFound": "Kubernetes 서비스 연결 정보를 찾을 수 없습니다.", + "loc.messages.ExpiredServicePrincipal": "Azure의 액세스 토큰을 페치할 수 없습니다. 사용한 서비스 주체가 유효하고 만료되지 않았는지 확인하세요.", + "loc.messages.SaveSupportedInHelmsV3Only": "Helms V3에서만 Azure Container Registry에 차트를 저장할 수 있습니다.", + "loc.messages.OutputVariableDataSizeExceeded": "Helm 명령 출력으로 설정되지 않은 출력 변수가 지원되는 최대 길이를 초과했습니다. 출력 길이: %s, 지원되는 최대 길이: %s", + "loc.messages.KubeloginFailed": "Kubelogin 인증에 실패했습니다. 예외: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..5a2c786be1ef --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "Упаковка и развертывание диаграмм Helm", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?linkid=851275) или [документацию по Helm](https://helm.sh/docs/)", + "loc.description": "Развертывание, настройка и обновление кластера Kubernetes в Службе контейнеров Azure с помощью команд helm", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Кластер Kubernetes", + "loc.group.displayName.commands": "Команды", + "loc.group.displayName.azureContainerRegistry": "Реестр контейнеров Azure", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.connectionType": "Тип подключения", + "loc.input.help.connectionType": "Выберите Azure Resource Manager, чтобы подключиться к Службе Azure Kubernetes с помощью подключения к службе Azure. Выберите \"Подключение к службе Kubernetes\", чтобы подключиться к любому кластеру Kubernetes с помощью kubeconfig или учетной записи службы", + "loc.input.label.azureSubscriptionEndpoint": "Подписка Azure", + "loc.input.help.azureSubscriptionEndpoint": "Выберите подписку Azure, которая содержит реестр контейнеров Azure.", + "loc.input.label.azureResourceGroup": "Группа ресурсов", + "loc.input.help.azureResourceGroup": "Выберите группу ресурсов Azure.", + "loc.input.label.kubernetesCluster": "Кластер Kubernetes", + "loc.input.help.kubernetesCluster": "Выберите управляемый кластер Azure.", + "loc.input.label.useClusterAdmin": "Использовать учетные данные администратора кластера", + "loc.input.help.useClusterAdmin": "Используйте учетные данные администратора кластера вместо учетных данных пользователя кластера по умолчанию.", + "loc.input.label.kubernetesServiceEndpoint": "Подключение службы Kubernetes", + "loc.input.help.kubernetesServiceEndpoint": "Выберите подключение службы Kubernetes.", + "loc.input.label.namespace": "Пространство имен", + "loc.input.help.namespace": "Укажите пространство имен K8, которое необходимо использовать. Пространство имен Tiller можно указать в разделе \"Дополнительно\" задачи или передав параметр --tiller-namespace в качестве аргумента.", + "loc.input.label.azureSubscriptionEndpointForACR": "Подписка Azure для Реестра контейнеров", + "loc.input.help.azureSubscriptionEndpointForACR": "Выберите подписку Azure, которая содержит реестр контейнеров Azure.", + "loc.input.label.azureResourceGroupForACR": "Группа ресурсов", + "loc.input.help.azureResourceGroupForACR": "Выберите группу ресурсов Azure, в которой находится Реестр контейнеров.", + "loc.input.label.azureContainerRegistry": "Реестр контейнеров Azure", + "loc.input.help.azureContainerRegistry": "Выберите Реестр контейнеров Azure, который будет использоваться для отправки диаграмм Helm.", + "loc.input.label.command": "Команда", + "loc.input.help.command": "Выберите команду helm.", + "loc.input.label.chartType": "Тип диаграммы", + "loc.input.help.chartType": "Выберите способ ввода сведений о диаграмме. Можно указать имя диаграммы либо путь к файлу диаграммы.", + "loc.input.label.chartName": "Имя диаграммы", + "loc.input.help.chartName": "Ссылка на устанавливаемую диаграмму. Это может быть URL-адрес или имя диаграммы. Например, если указано имя диаграммы stable/mysql, задача выполнит команду helm install stable/mysql.", + "loc.input.label.chartPath": "Путь к диаграмме", + "loc.input.help.chartPath": "Путь к диаграмме, которую необходимо установить. Это может быть путь к упакованной диаграмме или к каталогу с распакованной диаграммой. Например, если указано значение \"./redis\", задача выполнит команду \"helm install ./redis\".", + "loc.input.label.version": "Версия", + "loc.input.help.version": "Укажите точную версию диаграммы для установки. Если этот параметр не указан, будет установлена последняя версия. Присвойте эту версию SemVer диаграмме​", + "loc.input.label.releaseName": "Имя выпуска", + "loc.input.help.releaseName": "Имя выпуска. Если имя не указано, оно будет создано автоматически.", + "loc.input.label.overrideValues": "Настройка значений", + "loc.input.help.overrideValues": "Задайте значения в командной строке (можно указать несколько значений через запятую или каждое значение с новой строки: key1=val1,key2=val2 или
key1=val1
key2=val2
). Задача сформирует команду helm с использованием этих значений. Пример: helm install --set key1=val1 ./redis.", + "loc.input.label.valueFile": "Файл значений", + "loc.input.help.valueFile": "Укажите значения в файле YAML или по URL-адресу. Например, если указать myvalues.yaml, будет выполнена команда \"helm install --values=myvals.yaml\".", + "loc.input.label.destination": "Назначение", + "loc.input.help.destination": "Укажите значения в файле YAML или по URL-адресу.", + "loc.input.label.canaryimage": "Используйте версию canary образа.", + "loc.input.help.canaryimage": "Используйте образ canary Tiller, последнюю предварительную версию Tiller.", + "loc.input.label.upgradetiller": "Обновить Tiller", + "loc.input.help.upgradetiller": "Выполните обновление, если Tiller уже установлен.", + "loc.input.label.updatedependency": "Обновить зависимость", + "loc.input.help.updatedependency": "Обновите зависимости helm перед установкой диаграммы. Обновите зависимости из файла requirements.yaml в каталоге charts/ перед упаковкой", + "loc.input.label.save": "Сохранить", + "loc.input.help.save": "Сохранить упакованную диаграмму в локальном репозитории диаграмм (по умолчанию true)​", + "loc.input.label.install": "Установите, если выпуск отсутствует.", + "loc.input.help.install": "Если выпуск с таким именем еще не существует, запустите установку.", + "loc.input.label.recreate": "Повторно создайте pod.", + "loc.input.help.recreate": "Выполняет перезапуск pod для ресурса, если это возможно.", + "loc.input.label.resetValues": "Сбросьте значения.", + "loc.input.help.resetValues": "Сброс значений во встроенные в диаграмму.", + "loc.input.label.force": "Force", + "loc.input.help.force": "Принудительное обновление ресурса посредством удаления и повторного создания в случае необходимости​", + "loc.input.label.waitForExecution": "Ждать", + "loc.input.help.waitForExecution": "Блокировка до завершения выполнения команды.", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Параметры команды helm.", + "loc.input.label.enableTls": "Включить TLS", + "loc.input.help.enableTls": "Разрешает использовать SSL между Helm и Tiller.", + "loc.input.label.caCert": "Сертификат ЦС", + "loc.input.help.caCert": "Сертификат ЦС, используемый для выдачи сертификата для tiller и клиента helm.", + "loc.input.label.certificate": "Сертификат", + "loc.input.help.certificate": "Укажите сертификат Tiller или сертификат клиента Helm", + "loc.input.label.privatekey": "Ключ", + "loc.input.help.privatekey": "Укажите ключ Tiller или ключ клиента Helm", + "loc.input.label.tillernamespace": "Пространство имен Tiller", + "loc.input.help.tillernamespace": "Укажите пространство имен K8 для Tiller.", + "loc.input.label.failOnStderr": "Сбой со стандартной ошибкой", + "loc.input.help.failOnStderr": "Если задано значение True, задача будет завершаться сбоем при записи каких-либо ошибок в конвейер ошибок или записи каких-либо данных в стандартный поток ошибок. В противном случае для определения сбоя задача будет использовать код выхода.", + "loc.input.label.publishPipelineMetadata": "Опубликовать метаданные конвейера", + "loc.input.help.publishPipelineMetadata": "Если задано значение true, задача будет собирать и публиковать метаданные развертывания.", + "loc.input.label.chartNameForACR": "Имя диаграммы для Реестра контейнеров Azure", + "loc.input.help.chartNameForACR": "Имя диаграммы, под которым она будет храниться в Реестре контейнеров Azure.", + "loc.input.label.chartPathForACR": "Путь к диаграмме для Реестра контейнеров Azure", + "loc.input.help.chartPathForACR": "Путь к каталогу диаграммы.", + "loc.messages.CantDownloadAccessProfile": "Не удается скачать файл доступа к профилю или файл kube config для кластера %s. Причина: %s.", + "loc.messages.KubeConfigFilePath": "Путь к файлу Kubeconfig: %s", + "loc.messages.KubernetesClusterInfo": "Идентификатор кластера Kubernetes: %s; версия сервера Kubernetes: %s; состояние подготовки Kubernetes: %s", + "loc.messages.KubernetesClusterResourceGroup": "Кластер Kubernetes %s, группа ресурсов %s.", + "loc.messages.ClusterNotProvisioned": "Для кластера %s наблюдается состояние %s.", + "loc.messages.ClusterNotFound": "Кластер %s не существует", + "loc.messages.FailedToListClusters": "Не удалось получить список управляемых кластеров в подписке. %s", + "loc.messages.RetryingRequest": "Повторная попытка запроса будет выполнена через %s сек.", + "loc.messages.PatternNotFoundInFilePath": "Шаблон не найден в пути к файлу %s.", + "loc.messages.CantResolvePatternInPath": "Не удается разрешить шаблон в пути к файлу %s.", + "loc.messages.PatternFoundInPath": "Шаблон найден в пути к файлу %s.", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "Не удалось получить маркер доступа для Azure. Код состояния: %s, сообщение о состоянии: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Настройте управляемое удостоверение службы (MSI) для виртуальной машины \"https://aka.ms/azure-msi-docs\". Код состояния: %s; сообщения о состоянии: %s.", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "Не удалось получить маркер доступа для управляемого субъекта-службы. Код состояния: %s, сообщение о состоянии: %s.", + "loc.messages.SkipDeleteSecureFiles": "TLS не включен в задаче. Удаление сертификатов пропускается.", + "loc.messages.SkipDownloadSecureFiles": "TLS не включен в задаче. Скачивание сертификатов пропускается.", + "loc.messages.FileNotFound": "Файл не найден в %s", + "loc.messages.KubernetesServiceConnectionNotFound": "Сведения о подключении к службе Kubernetes не найдены.", + "loc.messages.ExpiredServicePrincipal": "Не удалось получить маркер доступа для Azure. Убедитесь, что используемый субъект-служба является допустимым, а срок его действия не истек.", + "loc.messages.SaveSupportedInHelmsV3Only": "Сохранение диаграммы в Реестре контейнеров Azure поддерживается только в диаграммах Helm версии 3.", + "loc.messages.OutputVariableDataSizeExceeded": "Выходная переменная не установлена, так как для выходных данных команды Helm превышена максимальная поддерживаемая длина. Длина выходных данных: %s, максимальная поддерживаемая длина: %s.", + "loc.messages.KubeloginFailed": "Сбой проверки подлинности Kubelogin. Исключение: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..e0aafbd2b635 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "打包和部署 Helm 图表", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?linkid=851275)或[参阅 Helm 文档](https://helm.sh/docs/)", + "loc.description": "通过运行 helm 命令在 Azure 容器服务中部署、配置和更新 Kubernetes 群集", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes 群集", + "loc.group.displayName.commands": "命令", + "loc.group.displayName.azureContainerRegistry": "Azure 容器注册表", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "高级", + "loc.input.label.connectionType": "连接类型", + "loc.input.help.connectionType": "选择“Azure 资源管理器”,通过 Azure 服务连接功能连接到 Azure Kubernetes 服务。选择“Kubernetes 服务连接”,通过使用 kubeconfig 或服务帐户连接到任何 Kubernetes 群集", + "loc.input.label.azureSubscriptionEndpoint": "Azure 订阅", + "loc.input.help.azureSubscriptionEndpoint": "选择 Azure 订阅,其中包含你的 Azure 容器注册表。", + "loc.input.label.azureResourceGroup": "资源组", + "loc.input.help.azureResourceGroup": "选择 Azure 资源组。", + "loc.input.label.kubernetesCluster": "Kubernetes 群集", + "loc.input.help.kubernetesCluster": "选择 Azure 托管的群集。", + "loc.input.label.useClusterAdmin": "使用群集管理员凭据", + "loc.input.help.useClusterAdmin": "使用群集管理员凭据而不是默认的群集用户凭据。", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes 服务连接", + "loc.input.help.kubernetesServiceEndpoint": "选择 Kubernetes 服务连接。", + "loc.input.label.namespace": "命名空间", + "loc.input.help.namespace": "指定要使用的 K8 命名空间。可以在任务的高级部分或通过传递 --tiller-namespace 选项作为参数来指定使用 Tiller 命名空间。", + "loc.input.label.azureSubscriptionEndpointForACR": "适合容器注册表的 Azure 订阅", + "loc.input.help.azureSubscriptionEndpointForACR": "选择 Azure 订阅,其中包含你的 Azure 容器注册表。", + "loc.input.label.azureResourceGroupForACR": "资源组", + "loc.input.help.azureResourceGroupForACR": "选择具有容器注册表的 Azure 资源组。", + "loc.input.label.azureContainerRegistry": "Azure 容器注册表", + "loc.input.help.azureContainerRegistry": "选择将用于推送 helm 图表的 Azure 容器注册表。", + "loc.input.label.command": "命令", + "loc.input.help.command": "选择一个 helm 命令。", + "loc.input.label.chartType": "图表类型", + "loc.input.help.chartType": "选择要如何输入图表信息。可以提供图表的名称或图表的文件夹/文件路径。", + "loc.input.label.chartName": "图表名称", + "loc.input.help.chartName": "要安装的图表参考,这可以是 URL 或图表名称。例如,如果图表名称为 \"stable/mysql\",则该任务将运行 \"helm install stable/mysql\"。", + "loc.input.label.chartPath": "图表路径", + "loc.input.help.chartPath": "要安装的图表的路径。这可以是打包图表的路径或解包图表目录的路径。例如,如果指定了 \"./redis\",则该任务将运行 \"helm install ./redis\"。", + "loc.input.label.version": "版本", + "loc.input.help.version": "指定要安装的图表的准确版本。如果未指定,则安装最新版本。将图表上的版本设置为此 semver 版本", + "loc.input.label.releaseName": "发布名称", + "loc.input.help.releaseName": "发布名称。如果未指定,则将自动生成一个名称。", + "loc.input.label.overrideValues": "设置值", + "loc.input.help.overrideValues": "在命令行上设置值(可指定多个值或单独的值并用逗号隔开或另起新行: key1=val1,key2=val2 or
key1=val1
key2=val2
)。此任务将使用所设置的这些值构造 helm 命令,例如 helm install --set key1=val1 ./redis。", + "loc.input.label.valueFile": "值文件", + "loc.input.help.valueFile": "指定 YAML 文件或 URL 中的值。例如,如果指定 myvalues.yaml,则为 \"helm install --values=myvals.yaml\"。", + "loc.input.label.destination": "目标", + "loc.input.help.destination": "指定 YAML 文件或 URL 中的值。", + "loc.input.label.canaryimage": "使用 canary 映像版本。", + "loc.input.help.canaryimage": "使用 canary Tiller 映像,该映像是 Tiller 的最新预发布版本。", + "loc.input.label.upgradetiller": "升级 Tiller", + "loc.input.help.upgradetiller": "如果已安装 Tiller,则进行升级。", + "loc.input.label.updatedependency": "更新依赖项", + "loc.input.help.updatedependency": "在安装图表之前运行 helm 依赖项更新。在打包之前将依赖项从 \"requirements.yaml\" 更新为 dir \"charts/\"", + "loc.input.label.save": "保存", + "loc.input.help.save": "将打包图表保存到本地图表存储库(默认为 true)", + "loc.input.label.install": "如果不存在发布,请进行安装。", + "loc.input.help.install": "如果不存在具有此名称的发布,请运行安装程序。", + "loc.input.label.recreate": "重新创建 Pod。", + "loc.input.help.recreate": "对资源执行 pod 重启(如果适用)。", + "loc.input.label.resetValues": "重置值。", + "loc.input.help.resetValues": "将值重置为内置于图表中的值。", + "loc.input.label.force": "强制", + "loc.input.help.force": "如果需要,通过删除/重新创建执行资源更新", + "loc.input.label.waitForExecution": "等待", + "loc.input.help.waitForExecution": "阻止,直至命令执行完成。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "Helm 命令选项。", + "loc.input.label.enableTls": "启用 TLS", + "loc.input.help.enableTls": "允许在 Helm 和 Tiller 之间使用 SSL。", + "loc.input.label.caCert": "CA 证书", + "loc.input.help.caCert": "用于为 tiller 和 helm 客户端颁发证书的 CA 证书。", + "loc.input.label.certificate": "证书", + "loc.input.help.certificate": "指定 Tiller 证书或 Helm 客户端证书", + "loc.input.label.privatekey": "密钥", + "loc.input.help.privatekey": "指定 Tiller 密钥或 Helm 客户端密钥", + "loc.input.label.tillernamespace": "Tiller 命名空间", + "loc.input.help.tillernamespace": "指定 tiller 的 K8 命名空间。", + "loc.input.label.failOnStderr": "因标准错误而失败", + "loc.input.help.failOnStderr": "如果为 true,那么将任何错误写入错误管道或将任何数据写入标准错误流时,此任务会失败。否则,此任务将仅依靠退出代码来确定故障。", + "loc.input.label.publishPipelineMetadata": "发布管道元数据", + "loc.input.help.publishPipelineMetadata": "如果为 true,任务将收集和发布部署元数据", + "loc.input.label.chartNameForACR": "适合 Azure 容器注册表的图表名称", + "loc.input.help.chartNameForACR": "在 Azure 容器注册表中存储图表时使用的图表名称。", + "loc.input.label.chartPathForACR": "适合 Azure 容器注册表的图表路径", + "loc.input.help.chartPathForACR": "图表目录的路径。", + "loc.messages.CantDownloadAccessProfile": "无法下载群集 %s 的访问配置文件/kube 配置文件。原因为 %s。", + "loc.messages.KubeConfigFilePath": "Kubeconfig 文件路径: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes 群集 ID: %s,kubernetes 服务器版本 %s,kuberenettes 预配状态 %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes 群集 %s,资源组 %s。", + "loc.messages.ClusterNotProvisioned": "观察到群集 %s 处于 %s 状态。", + "loc.messages.ClusterNotFound": "%s 群集不存在", + "loc.messages.FailedToListClusters": "未能列出订阅中的托管群集。%s", + "loc.messages.RetryingRequest": "在 %s 秒后重试请求。", + "loc.messages.PatternNotFoundInFilePath": "在文件路径 %s 中找不到模式。", + "loc.messages.CantResolvePatternInPath": "无法解析文件路径 %s 中的模式。", + "loc.messages.PatternFoundInPath": "在文件路径 %s 中找到的模式。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "无法提取 Azure 的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "无法提取托管服务主体的访问令牌。请为虚拟机配置托管服务标识(MSI)(https://aka.ms/azure-msi-docs)。状态代码: %s,状态消息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "无法提取托管服务主体的访问令牌。状态代码: %s,状态消息: %s", + "loc.messages.SkipDeleteSecureFiles": "任务中未启用 TLS。正在跳过删除证书。", + "loc.messages.SkipDownloadSecureFiles": "任务中未启用 TLS。正在跳过下载证书。", + "loc.messages.FileNotFound": "在 %s 中找不到文件", + "loc.messages.KubernetesServiceConnectionNotFound": "找不到 Kubernetes 服务连接详细信息。", + "loc.messages.ExpiredServicePrincipal": "无法提取 Azure 的访问令牌。请确保使用的服务主体有效且未过期。", + "loc.messages.SaveSupportedInHelmsV3Only": "只有 Helms V3 中支持将图表保存到 Azure 容器注册表。", + "loc.messages.OutputVariableDataSizeExceeded": "未设置为 Helm 命令输出的输出变量超出了支持的最大长度。输出长度: %s,支持的最大长度: %s", + "loc.messages.KubeloginFailed": "Kubelogin 身份验证失败。异常: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..a38e78eb2209 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,109 @@ +{ + "loc.friendlyName": "封裝和部署 Helm 圖表", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?linkid=851275)或[參閱 Helm 文件](https://helm.sh/docs/)", + "loc.description": "執行 helm 命令以在 Azure Container Service 中部署、設定、更新 Kubernetes 叢集", + "loc.instanceNameFormat": "helm $(command)", + "loc.group.displayName.cluster": "Kubernetes 叢集", + "loc.group.displayName.commands": "命令", + "loc.group.displayName.azureContainerRegistry": "Azure Container Registry", + "loc.group.displayName.tls": "TLS", + "loc.group.displayName.advanced": "進階", + "loc.input.label.connectionType": "連線類型", + "loc.input.help.connectionType": "選取 [Azure Resource Manager] 會透過使用 Azure 服務連線來連線至 Azure Kubernetes Service。選取 [Kubernetes 服務連線] 會透過使用 kubeconfig 或服務帳戶來連線至任意 Kubernetes 叢集", + "loc.input.label.azureSubscriptionEndpoint": "Azure 訂用帳戶", + "loc.input.help.azureSubscriptionEndpoint": "選取有您 Azure Container Registry 的 Azure 訂用帳戶。", + "loc.input.label.azureResourceGroup": "資源群組", + "loc.input.help.azureResourceGroup": "請選取 Azure 資源群組。", + "loc.input.label.kubernetesCluster": "Kubernetes 叢集", + "loc.input.help.kubernetesCluster": "請選取 Azure 受控叢集。", + "loc.input.label.useClusterAdmin": "使用叢集系統管理員認證", + "loc.input.help.useClusterAdmin": "使用叢集系統管理員認證而非預設叢集使用者認證。", + "loc.input.label.kubernetesServiceEndpoint": "Kubernetes 服務連線", + "loc.input.help.kubernetesServiceEndpoint": "選取 Kubernetes 服務連線。", + "loc.input.label.namespace": "命名空間", + "loc.input.help.namespace": "請指定要使用的 K8 命名空間。您可指定使用 Tiller 命名空間,方式為: 在工作的進階區段指定,或將 --tiller-namespace 選項作為引數傳遞。", + "loc.input.label.azureSubscriptionEndpointForACR": "Container Registry 的 Azure 訂閱", + "loc.input.help.azureSubscriptionEndpointForACR": "選取有您 Azure Container Registry 的 Azure 訂用帳戶。", + "loc.input.label.azureResourceGroupForACR": "資源群組", + "loc.input.help.azureResourceGroupForACR": "選取有您 Container Registry 的 Azure 資源群組。", + "loc.input.label.azureContainerRegistry": "Azure Container Registry", + "loc.input.help.azureContainerRegistry": "選取將用以推送 Helm 圖表的 Azure Container Registry。", + "loc.input.label.command": "命令", + "loc.input.help.command": "選取 helm 命令。", + "loc.input.label.chartType": "圖表類型", + "loc.input.help.chartType": "請選取您要輸入圖表資訊的方式。您可提供圖表的名稱,或圖表的資料夾/檔案路徑。", + "loc.input.label.chartName": "圖表名稱", + "loc.input.help.chartName": "要安裝的圖表參考,這可以是 URL 或圖表名稱。例如,如果圖表名稱是 'stable/mysql',則工作會執行 'helm install stable/mysql'。", + "loc.input.label.chartPath": "圖表路徑", + "loc.input.help.chartPath": "要安裝的圖表路徑。這可以是套件圖表的路徑或解壓縮圖表目錄的路徑。例如,如有指定 './redis',工作就會執行 'helm install ./redis'。", + "loc.input.label.version": "版本", + "loc.input.help.version": "請指定要安裝的完全符合版本。若未指定,則會安裝最新版本。請在圖表上設定此 SemVer 版本的版本", + "loc.input.label.releaseName": "發行名稱", + "loc.input.help.releaseName": "版本名稱。若未指定,會為您自動產生一個名稱。", + "loc.input.label.overrideValues": "設定值", + "loc.input.help.overrideValues": "請在命令列上設定值 (可使用逗點或新行字元指定多個值或分隔值: key1=val1,key2=val2 或
key1=val1
key2=val2
)。工作會使用這些設定的值建構 Helm 命令。例如: helm install --set key1=val1 ./redis。", + "loc.input.label.valueFile": "值檔案", + "loc.input.help.valueFile": "請指定 YAML 檔案或 URL 中的值。例如,指定 myvalues.yaml 會產生 'helm install --values=myvals.yaml'。", + "loc.input.label.destination": "目的地", + "loc.input.help.destination": "請指定 YAML 檔案或 URL 中的值。", + "loc.input.label.canaryimage": "請使用 Canary 映像版本。", + "loc.input.help.canaryimage": "請使用 Canary Tiller 映像,即最新發行前版本的 Tiller。", + "loc.input.label.upgradetiller": "升級 Tiller", + "loc.input.help.upgradetiller": "若已經安裝 Tiller 即升級。", + "loc.input.label.updatedependency": "更新相依性", + "loc.input.help.updatedependency": "在安裝圖表之前執行 helm 相依性更新。請在封裝之前,將相依性從 'requirements.yaml' 更新為 dir 'charts/'", + "loc.input.label.save": "儲存", + "loc.input.help.save": "將封裝的圖表儲存至本機圖表存放庫 (預設為 true)​", + "loc.input.label.install": "若版本不存在即安裝。", + "loc.input.help.install": "如果使用這個名稱的版本不存在,會執行 install。", + "loc.input.label.recreate": "重新建立 Pod。", + "loc.input.help.recreate": "如果適用,會為資源執行 Pod 重新啟動。", + "loc.input.label.resetValues": "重設值。", + "loc.input.help.resetValues": "將值重設為圖表內建的值。", + "loc.input.label.force": "強制", + "loc.input.help.force": "如有必要,會透過刪除/重新建立來強制資源更新", + "loc.input.label.waitForExecution": "等候", + "loc.input.help.waitForExecution": "封鎖到命令執行完成為止。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "Helm 命令選項。", + "loc.input.label.enableTls": "啟用 TLS", + "loc.input.help.enableTls": "允許在 Helm 與 Tiller 之間使用 SSL。", + "loc.input.label.caCert": "CA 憑證", + "loc.input.help.caCert": "用來為 tiller 和 helm 用戶端發行憑證的 CA 憑證。", + "loc.input.label.certificate": "憑證", + "loc.input.help.certificate": "請指定 Tiller 憑證或 Helm 用戶端憑證", + "loc.input.label.privatekey": "金鑰", + "loc.input.help.privatekey": "請指定 Tiller 金鑰或 Helm 用戶端金鑰", + "loc.input.label.tillernamespace": "Tiller 命名空間", + "loc.input.help.tillernamespace": "請指定 tiller 的 K8 命名空間。", + "loc.input.label.failOnStderr": "發生標準錯誤的失敗", + "loc.input.help.failOnStderr": "若此為 true,如果在錯誤管線中寫入任何錯誤,或對標準錯誤資料流寫入任何資料,此工作即會失敗。否則,工作將依據結束代碼來判斷失敗。", + "loc.input.label.publishPipelineMetadata": "發佈管線中繼資料", + "loc.input.help.publishPipelineMetadata": "若為 true,則此工作會收集及發佈部署中繼資料", + "loc.input.label.chartNameForACR": "Azure Container Registry 的圖表名稱", + "loc.input.help.chartNameForACR": "將要儲存在 Azure Container Registry 中之圖表的圖表名稱。", + "loc.input.label.chartPathForACR": "Azure Container Registry 的圖表路徑", + "loc.input.help.chartPathForACR": "圖表目錄的路徑。", + "loc.messages.CantDownloadAccessProfile": "無法下載叢集 %s 的存取設定檔/Kube 組態檔。原因 %s。", + "loc.messages.KubeConfigFilePath": "Kubeconfig 檔案路徑: %s", + "loc.messages.KubernetesClusterInfo": "Kubernetes 叢集識別碼: %s,kubernetes 伺服器版本%s,kuberenettes 佈建狀態 %s", + "loc.messages.KubernetesClusterResourceGroup": "Kubernetes 叢集 %s,資源群組 %s。", + "loc.messages.ClusterNotProvisioned": "觀察到叢集 %s 處於 %s 狀態。", + "loc.messages.ClusterNotFound": "%s 叢集不存在", + "loc.messages.FailedToListClusters": "無法列出訂用帳戶中的受控叢集。%s", + "loc.messages.RetryingRequest": "即將在 %s 秒後重試要求。", + "loc.messages.PatternNotFoundInFilePath": "在檔案路徑 %s 中找不到模式。", + "loc.messages.CantResolvePatternInPath": "無法解析檔案路徑 %s 中的模式。", + "loc.messages.PatternFoundInPath": "在檔案路徑 %s 中找到模式。", + "loc.messages.CouldNotFetchAccessTokenforAzureStatusCode": "無法擷取 Azure 的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "無法擷取受控服務主體的存取權杖。請設定虛擬機器的受控服務識別 (MSI) (https://aka.ms/azure-msi-docs)。狀態碼: %s,狀態訊息: %s", + "loc.messages.CouldNotFetchAccessTokenforMSIStatusCode": "無法擷取受控服務主體的存取權杖。狀態碼: %s,狀態訊息: %s", + "loc.messages.SkipDeleteSecureFiles": "未在工作中啟用 TLS。正在跳過刪除憑證。", + "loc.messages.SkipDownloadSecureFiles": "未在工作中啟用 TLS。正在跳過下載憑證。", + "loc.messages.FileNotFound": "在 %s 找不到檔案", + "loc.messages.KubernetesServiceConnectionNotFound": "找不到 Kubernetes 服務連線詳細資料。", + "loc.messages.ExpiredServicePrincipal": "無法擷取 Azure 的存取權杖。請驗證使用的服務主體是否有效且未過期。", + "loc.messages.SaveSupportedInHelmsV3Only": "只有 Helms V3 支援將圖表儲存至 Azure Container Registry。", + "loc.messages.OutputVariableDataSizeExceeded": "因為 Helm 命令輸出超過了支援的長度上限,所以未設定輸出變數。輸出長度: %s,支援的長度上限: %s", + "loc.messages.KubeloginFailed": "Kubelogin 驗證失敗。例外狀況: %s" +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Tests/L0.ts b/_generated/HelmDeployV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..37bc89c03ce4 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Tests/L0.ts @@ -0,0 +1,266 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import * as shared from './TestShared'; +import * as tl from 'azure-pipelines-task-lib'; + +describe("HelmDeployV0 Suite", function () { + this.timeout(30000); + + before(async () => { + process.env[shared.TestEnvVars.operatingSystem] = tl.osType().match(/^Win/) ? shared.OperatingSystems.Windows : shared.OperatingSystems.Other; + }); + + beforeEach(async () => { + delete process.env[shared.TestEnvVars.namespace]; + delete process.env[shared.TestEnvVars.valueFile]; + delete process.env[shared.TestEnvVars.overrideValues]; + delete process.env[shared.TestEnvVars.updatedependency]; + delete process.env[shared.isHelmV3]; + delete process.env[shared.TestEnvVars.releaseName]; + delete process.env[shared.TestEnvVars.waitForExecution]; + delete process.env[shared.TestEnvVars.arguments]; + delete process.env[shared.TestEnvVars.chartName]; + delete process.env[shared.TestEnvVars.chartPath]; + delete process.env[shared.TestEnvVars.connectionType]; + delete process.env[shared.TestEnvVars.command]; + delete process.env[shared.TestEnvVars.chartType]; + delete process.env[shared.TestEnvVars.version]; + }); + + after(async () => { }); + + it("Run successfully with Helm install (version 3) with chart name", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.version] = shared.testChartVersion; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "true"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("changed mode of file") != -1, "Mode of kubeconfig file should have been changed to 600"); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, `Release should have been created with NAME: ${shared.testReleaseName}`); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 3) with chart name when publishPipelineMetadata is set to false", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.version] = shared.testChartVersion; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "true"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "false"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("changed mode of file") != -1, "Mode of kubeconfig file should have been changed to 600"); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, `Release should have been created with NAME: ${shared.testReleaseName}`); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) == -1, "Web response should not have been received for pushing metadata to evidence store when publishPipelineMetadata is false"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 2) with chart name", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.TestEnvVars.namespace] = shared.testNamespace; + + await tr.runAsync(); + assert(tr.stdout.indexOf("v2") != -1, "Helm version 2 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, `Release should have been created with NAME: ${shared.testReleaseName}`); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 3) with chart path", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.FilePath; + process.env[shared.TestEnvVars.chartPath] = shared.testChartPath; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, `Release should have been created with NAME: ${shared.testReleaseName}`); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 3) when release name is not given", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, "Release should have been created"); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm install (version 3) when invalid chart version is given", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.install; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.version] = "abcd"; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("v3") != -1, "Helm version 3 should have been installed"); + assert(tr.stdout.indexOf("STATUS: deployed") != -1, "Release should have been created"); + assert(tr.stdout.indexOf("The given version " + process.env[shared.TestEnvVars.version] + " is not valid. Running the helm install command with latest version") != -1, "Version should not have been accepted"); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm upgrade (version 3) when chart name is given and release name is not", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.upgrade; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf(`Release "${shared.testReleaseName}" has been upgraded`) != -1, "Release should have been upgraded"); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm upgrade (version 3) when chart name and release name are given", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.upgrade; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.Name; + process.env[shared.TestEnvVars.chartName] = shared.testChartName; + process.env[shared.TestEnvVars.releaseName] = shared.testReleaseName; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.TestEnvVars.publishPipelineMetadata] = "true"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf(`Release "${shared.testReleaseName}" has been upgraded`) != -1, "Release should have been upgraded"); + assert(tr.stdout.indexOf(`DeploymentDetailsApiResponse: {"mockKey":"mockValue"}`) != -1, "Web response should have been received for pushing metadata to evidence store"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm init (version 2)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.init; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("$HELM_HOME has been configured") != -1, "Helm init should have run successfully"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Helm init should fail (version 3)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.init; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("Common actions for Helm:") != -1, "Available commands information should have been received"); + assert(tr.failed, "task should have failed"); + }); + + it("Run successfully with Helm package command (version 3)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.KubernetesServiceConnection; + process.env[shared.TestEnvVars.command] = shared.Commands.package; + process.env[shared.TestEnvVars.chartType] = shared.ChartTypes.FilePath; + process.env[shared.TestEnvVars.chartPath] = shared.testChartPath; + process.env[shared.TestEnvVars.destination] = shared.testDestinationPath; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf(`Successfully packaged chart and saved it to: ${shared.testDestinationPath}/testChartName.tgz`) != -1, "Chart should have been successfully packaged"); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Run successfully with Helm save command (version 3)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.command] = shared.Commands.save; + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.None; + process.env[shared.TestEnvVars.chartPathForACR] = shared.testChartPathForACR; + process.env[shared.TestEnvVars.chartNameForACR] = shared.testChartNameForACR; + process.env[shared.TestEnvVars.azureSubscriptionEndpointForACR] = shared.testAzureSubscriptionEndpointForACR; + process.env[shared.testEndpointAuthVar] = "ServicePrincipal"; + process.env[shared.TestEnvVars.azureResourceGroupForACR] = shared.testAzureResourceGroupForACR; + process.env[shared.TestEnvVars.azureContainerRegistry] = shared.testAzureContainerRegistry; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + process.env[shared.isHelmV3] = "true"; + + await tr.runAsync(); + assert(tr.stdout.indexOf("Successfully saved the helm chart to local registry cache.") != -1, "Chart should have been successfully saved to local registry cache."); + assert(tr.stdout.indexOf(`Successfully logged in to ${process.env[shared.TestEnvVars.azureContainerRegistry]}.`) != -1, "Azure container registry login should have been successful."); + assert(tr.stdout.indexOf("Successfully pushed to the chart to container registry.") != -1, "Chart should have been successfully pushed to container registry."); + assert(tr.stdout.indexOf("Successfully removed the chart from local cache.") != -1, "Chart should have been successfully removed from local cache."); + assert(tr.succeeded, "task should have succeeded"); + }); + + it("Helm same should fail (version 2)", async function () { + const tp = path.join(__dirname, "TestSetup.js"); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + process.env[shared.TestEnvVars.command] = shared.Commands.save; + process.env[shared.TestEnvVars.connectionType] = shared.ConnectionTypes.None; + process.env[shared.TestEnvVars.chartPathForACR] = shared.testChartPathForACR; + process.env[shared.TestEnvVars.chartNameForACR] = shared.testChartNameForACR; + process.env[shared.TestEnvVars.azureSubscriptionEndpointForACR] = shared.testAzureSubscriptionEndpointForACR; + process.env[shared.TestEnvVars.azureResourceGroupForACR] = shared.testAzureResourceGroupForACR; + process.env[shared.TestEnvVars.azureContainerRegistry] = shared.testAzureContainerRegistry; + process.env[shared.TestEnvVars.failOnStderr] = "false"; + + await tr.runAsync(); + assert(tr.failed, "task should have failed"); + assert(tr.stdout.indexOf("loc_mock_SaveSupportedInHelmsV3Only") != -1, "Chart save should have failed when helm version is not 3."); + }) +}); diff --git a/_generated/HelmDeployV1_Node20/Tests/TestSetup.ts b/_generated/HelmDeployV1_Node20/Tests/TestSetup.ts new file mode 100644 index 000000000000..f94e7ccc67c8 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Tests/TestSetup.ts @@ -0,0 +1,366 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import * as path from 'path'; +import * as semver from 'semver'; + +import * as shared from './TestShared'; +import { formatDebugFlag } from './TestShared'; + +const buildNumber = "123"; +const buildId = "1"; +const buildReason = "schedule"; +const teamProject = "project1"; +const collectionId = "collection1"; +const definitionName = "test"; +const definitionId = "123"; +const teamFoundationCollectionUri = "https://abc.visualstudio.com/"; +const jobName = "jobName"; +const accessToken = "testAccessToken"; + +const testnamespaceWorkingDirectory: string = shared.formatPath("a/w"); +const kubectlPath = shared.formatPath("newUserDir/kubectl.exe"); +const helmPath = shared.formatPath("newUserDir/helm.exe"); + +const taskPath = path.join(__dirname, "../src", "helm.js"); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("kubernetesServiceEndpoint", "kubernetesConnection"); +tr.setInput("connectionType", process.env[shared.TestEnvVars.connectionType] || ""); +tr.setInput("azureSubscriptionEndpoint", process.env[shared.TestEnvVars.azureSubscriptionEndpoint] || ""); +tr.setInput("azureResourceGroup", process.env[shared.TestEnvVars.azureResourceGroup] || ""); +tr.setInput("kubernetesCluster", process.env[shared.TestEnvVars.kubernetesCluster] || ""); +tr.setInput("useClusterAdmin", process.env[shared.TestEnvVars.useClusterAdmin] || ""); +tr.setInput("namespace", process.env[shared.TestEnvVars.namespace] || ""); +tr.setInput("azureSubscriptionEndpointForACR", process.env[shared.TestEnvVars.azureSubscriptionEndpointForACR] || ""); +tr.setInput("azureResourceGroupForACR", process.env[shared.TestEnvVars.azureResourceGroupForACR] || ""); +tr.setInput("azureContainerRegistry", process.env[shared.TestEnvVars.azureContainerRegistry] || ""); +tr.setInput("command", process.env[shared.TestEnvVars.command] || ""); +tr.setInput("chartType", process.env[shared.TestEnvVars.chartType] || ""); +tr.setInput("chartName", process.env[shared.TestEnvVars.chartName] || ""); +tr.setInput("chartPath", process.env[shared.TestEnvVars.chartPath] || ""); +tr.setInput("version", process.env[shared.TestEnvVars.version] || ""); +tr.setInput("releaseName", process.env[shared.TestEnvVars.releaseName] || ""); +tr.setInput("overrideValues", process.env[shared.TestEnvVars.overrideValues] || ""); +tr.setInput("valueFile", process.env[shared.TestEnvVars.valueFile] || ""); +tr.setInput("destination", process.env[shared.TestEnvVars.destination] || ""); +tr.setInput("canaryimage", process.env[shared.TestEnvVars.canaryimage] || ""); +tr.setInput("upgradetiller", process.env[shared.TestEnvVars.upgradetiller] || ""); +tr.setInput("updatedependency", process.env[shared.TestEnvVars.updatedependency] || ""); +tr.setInput("save", process.env[shared.TestEnvVars.save] || ""); +tr.setInput("install", process.env[shared.TestEnvVars.install] || ""); +tr.setInput("recreate", process.env[shared.TestEnvVars.recreate] || ""); +tr.setInput("resetValues", process.env[shared.TestEnvVars.resetValues] || ""); +tr.setInput("force", process.env[shared.TestEnvVars.force] || ""); +tr.setInput("waitForExecution", process.env[shared.TestEnvVars.waitForExecution] || ""); +tr.setInput("arguments", process.env[shared.TestEnvVars.arguments] || ""); +tr.setInput("failOnStderr", process.env[shared.TestEnvVars.failOnStderr] || "true"); +tr.setInput("publishPipelineMetadata", process.env[shared.TestEnvVars.publishPipelineMetadata] || "true"); +tr.setInput("chartNameForACR", process.env[shared.TestEnvVars.chartNameForACR] || ""); +tr.setInput("chartPathForACR", process.env[shared.TestEnvVars.chartPathForACR] || ""); + +process.env.SYSTEM_DEFAULTWORKINGDIRECTORY = testnamespaceWorkingDirectory; +process.env.AGENT_TEMPDIRECTORY = path.resolve(__dirname, "../../../../Tests"); +process.env.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI = teamFoundationCollectionUri; +process.env.SYSTEM_TEAMPROJECT = teamProject; +process.env.SYSTEM_COLLECTIONID = collectionId; +process.env.SYSTEM_DEFINITIONID = definitionId; +process.env.ENDPOINT_AUTH_PARAMETER_SYSTEMVSSCONNECTION_ACCESSTOKEN = accessToken; + +process.env.BUILD_BUILDID = buildId; +process.env.BUILD_BUILDNUMBER = buildNumber; +process.env.BUILD_DEFINITIONNAME = definitionName; +process.env.BUILD_REASON = buildReason; + +process.env.AGENT_JOBNAME = jobName; +process.env.SYSTEM_HOSTTYPE = "build"; + +process.env.ENDPOINT_DATA_kubernetesConnection_AUTHORIZATIONTYPE = "Kubeconfig"; +process.env.ENDPOINT_AUTH_PARAMETER_kubernetesConnection_KUBECONFIG = `{"apiVersion":"v1", "clusters": [{"cluster": {"insecure-skip-tls-verify":"true", "server":"https://5.6.7.8", "name" : "scratch"}}], "contexts": [{"context" : {"cluster": "scratch", "namespace" : "default", "user": "experimenter", "name" : "exp-scratch"}], "current-context" : "exp-scratch", "kind": "Config", "users" : [{"user": {"password": "regpassword", "username" : "test"}]}`; +process.env.ENDPOINT_DATA_kubernetesConnection_NAMESPACE = "testnamespace"; + +if (process.env.RemoveNamespaceFromEndpoint) { + process.env.ENDPOINT_DATA_kubernetesConnection_NAMESPACE = ""; +} + +const a: ma.TaskLibAnswers = { + "checkPath": { + "helm": true, + "kubectl": true + }, + "exec": { + }, + "findMatch": {}, + "which": { + "helm": "helm", + "kubectl": "kubectl" + } +}; + +if (process.env[shared.TestEnvVars.command] === shared.Commands.install) { + let helmInstallCommand = `helm install${formatDebugFlag()}`; + + if (process.env[shared.TestEnvVars.namespace]) + helmInstallCommand = helmInstallCommand.concat(` --namespace ${process.env[shared.TestEnvVars.namespace]}`); + + if (process.env[shared.TestEnvVars.valueFile]) + helmInstallCommand = helmInstallCommand.concat(` --values ${process.env[shared.TestEnvVars.valueFile]}`); + + if (process.env[shared.TestEnvVars.overrideValues]) + helmInstallCommand = helmInstallCommand.concat(` --set ${process.env[shared.TestEnvVars.overrideValues]}`); + + if (process.env[shared.TestEnvVars.updatedependency]) + helmInstallCommand = helmInstallCommand.concat(" --dep-up"); + + if (process.env[shared.isHelmV3] === "true") { + if (process.env[shared.TestEnvVars.releaseName]) + helmInstallCommand = helmInstallCommand.concat(` ${process.env[shared.TestEnvVars.releaseName]}`); + else + helmInstallCommand = helmInstallCommand.concat(" --generate-name"); + } + else if (process.env[shared.TestEnvVars.releaseName]) + helmInstallCommand = helmInstallCommand.concat(` --name ${process.env[shared.TestEnvVars.releaseName]}`); + + if (process.env[shared.TestEnvVars.waitForExecution]) + helmInstallCommand = helmInstallCommand.concat(" --wait"); + + if (process.env[shared.TestEnvVars.arguments]) + helmInstallCommand = helmInstallCommand.concat(` ${process.env[shared.TestEnvVars.arguments]}`); + + if (process.env[shared.TestEnvVars.chartName]) + helmInstallCommand = helmInstallCommand.concat(` ${process.env[shared.TestEnvVars.chartName]}`); + else if (process.env[shared.TestEnvVars.chartPath]) + helmInstallCommand = helmInstallCommand.concat(` ${process.env[shared.TestEnvVars.chartPath]}`); + + if (process.env[shared.TestEnvVars.version] && semver.valid(process.env[shared.TestEnvVars.version])) + helmInstallCommand = helmInstallCommand.concat(` --version ${process.env[shared.TestEnvVars.version]}`); + + a.exec[helmInstallCommand] = { + "code": 0, + "stdout": `NAME: ${shared.testReleaseName} \nLAST DEPLOYED: Mon Jun 8 10:30:31 2020 \nNAMESPACE: ${process.env[shared.TestEnvVars.namespace]} \nSTATUS: deployed \nREVISION: 1 \nNOTES: \n1. Get the application URL by running these commands: \n export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=demo-chart,app.kubernetes.io/ \n instance=mytestv2" -o jsonpath="{.items[0].metadata.name}") \n echo "Visit http://127.0.0.1:8080 to use your application" \n kubectl --namespace default port-forward $POD_NAME 8080:80` + }; +} + +if (process.env[shared.TestEnvVars.command] === shared.Commands.upgrade) { + let helmUpgradeCommand = `helm upgrade${formatDebugFlag()}`; + + if (process.env[shared.TestEnvVars.namespace]) + helmUpgradeCommand = helmUpgradeCommand.concat(` --namespace ${process.env[shared.TestEnvVars.namespace]}`); + + if (process.env[shared.TestEnvVars.install]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --install"); + + if (process.env[shared.TestEnvVars.recreate]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --recreate-pods"); + + if (process.env[shared.TestEnvVars.resetValues]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --reset-values"); + + if (process.env[shared.TestEnvVars.force]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --force"); + + if (process.env[shared.TestEnvVars.valueFile]) + helmUpgradeCommand = helmUpgradeCommand.concat(` --values ${process.env[shared.TestEnvVars.valueFile]}`); + + if (process.env[shared.TestEnvVars.overrideValues]) + helmUpgradeCommand = helmUpgradeCommand.concat(` --set ${process.env[shared.TestEnvVars.overrideValues]}`); + + if (process.env[shared.TestEnvVars.waitForExecution]) + helmUpgradeCommand = helmUpgradeCommand.concat(" --wait"); + + if (process.env[shared.TestEnvVars.arguments]) + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env[shared.TestEnvVars.arguments]}`); + + if (process.env[shared.TestEnvVars.releaseName]) + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env[shared.TestEnvVars.releaseName]}`); + else + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env.BUILD_BUILDNUMBER}`); + + if (process.env[shared.TestEnvVars.chartName]) + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env[shared.TestEnvVars.chartName]}`); + else if (process.env[shared.TestEnvVars.chartPath]) + helmUpgradeCommand = helmUpgradeCommand.concat(` ${process.env[shared.TestEnvVars.chartPath]}`); + + if (process.env[shared.TestEnvVars.version] && semver.valid(process.env[shared.TestEnvVars.version])) + helmUpgradeCommand = helmUpgradeCommand.concat(` --version ${process.env[shared.TestEnvVars.version]}`); + + a.exec[helmUpgradeCommand] = { + "code": 0, + "stdout": `Release "${shared.testReleaseName}" has been upgraded. Happy Helming!\nNAME: ${shared.testReleaseName} \nLAST DEPLOYED: Mon Jun 8 10:30:31 2020 \nNAMESPACE: ${process.env[shared.TestEnvVars.namespace]} \nSTATUS: deployed \nREVISION: 1 \nNOTES: \n1. Get the application URL by running these commands: \n export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=demo-chart,app.kubernetes.io/ \n instance=mytestv2" -o jsonpath="{.items[0].metadata.name}") \n echo "Visit http://127.0.0.1:8080 to use your application" \n kubectl --namespace default port-forward $POD_NAME 8080:80` + }; +} + +if (process.env[shared.TestEnvVars.command] === shared.Commands.init) { + let helmInitCommand = `helm init${formatDebugFlag()}`; + + if (process.env[shared.TestEnvVars.canaryimage]) + helmInitCommand = helmInitCommand.concat(" --canary-image"); + + if (process.env[shared.TestEnvVars.upgradetiller]) + helmInitCommand = helmInitCommand.concat(" --upgrade"); + + if (process.env[shared.TestEnvVars.waitForExecution]) + helmInitCommand = helmInitCommand.concat(" --wait"); + + if (process.env[shared.TestEnvVars.arguments]) + helmInitCommand = helmInitCommand.concat(` ${process.env[shared.TestEnvVars.arguments]}`); + + if (process.env[shared.isHelmV3] === "true") { + a.exec[helmInitCommand] = { + "code": 1, + "stdout": "The Kubernetes package manager\n\nCommon actions for Helm:\n\n- helm search: search for charts\n- helm pull: download a chart to your local directory to view\n- helm install: upload the chart to Kubernetes\n- helm list: list releases of charts\n" + }; + } else { + a.exec[helmInitCommand] = { + "code": 0, + "stdout": `$HELM_HOME has been configured at testPath\\.helm.` + }; + } +} + +if (process.env[shared.TestEnvVars.command] === shared.Commands.package) { + let helmPackageCommand = `helm package${formatDebugFlag()}`; + + if (process.env[shared.TestEnvVars.updatedependency]) + helmPackageCommand = helmPackageCommand.concat(" --dependency-update"); + + if (process.env[shared.TestEnvVars.save]) { + if (process.env[shared.isHelmV3]) + helmPackageCommand = helmPackageCommand.concat(" --save"); + } + + if (process.env[shared.TestEnvVars.version]) + helmPackageCommand = helmPackageCommand.concat(` --version ${process.env[shared.TestEnvVars.version]}`); + + if (process.env[shared.TestEnvVars.destination]) + helmPackageCommand = helmPackageCommand.concat(` --destination ${process.env[shared.TestEnvVars.destination]}`); + + if (process.env[shared.TestEnvVars.arguments]) + helmPackageCommand = helmPackageCommand.concat(` ${process.env[shared.TestEnvVars.arguments]}`); + + if (process.env[shared.TestEnvVars.chartPath]) + helmPackageCommand = helmPackageCommand.concat(` ${process.env[shared.TestEnvVars.chartPath]}`); + a.exec[helmPackageCommand] = { + "code": 0, + "stdout": "Successfully packaged chart and saved it to: testDestinationPath/testChartName.tgz" + } +} + +const helmVersionCommand = "helm version --client --short"; +if (process.env[shared.isHelmV3]) { + a.exec[helmVersionCommand] = { + "code": 0, + "stdout": "v3.2.1+ge29ce2a" + }; +} +else { + a.exec[helmVersionCommand] = { + "code": 0, + "stdout": "Client: v2.16.7+g5f2584f" + }; +} + +if (process.env[shared.TestEnvVars.namespace]) { + const helmGetManifestCommand = `helm get manifest ${shared.testReleaseName} --namespace ${process.env[shared.TestEnvVars.namespace]}`; + a.exec[helmGetManifestCommand] = { + "code": 0, + "stdout": `---\n# Source: testChartName/templates/serviceaccount.yaml\n{apiVersion: v1, kind: ServiceAccount, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}}\n---\n# Source: testChartName/templates/service.yaml\n{apiVersion: v1, kind: Service, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {type: ClusterIP, ports: [{port: 80, targetPort: http, protocol: TCP, name: http}], selector: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}}\n---\n# Source: demo-chart/templates/deployment.yaml\n{apiVersion: apps/v1, kind: Deployment, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {replicas: 1, selector: {matchLabels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, template: {metadata: {labels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, spec: {serviceAccountName: testReleaseName-testChartName, securityContext: {}, containers: [{name: testChartName, securityContext: {}, image: "testImage:1.17.0", imagePullPolicy: Always, ports: [{name: http, containerPort: 80, protocol: TCP}], livenessProbe: {httpGet: {path: /, port: http}}, readinessProbe: {httpGet: {path: /, port: http}}, resources: {}}]}}}}\n` + } + + const kubectlGetPods = `kubectl get pods -o json --namespace ${process.env[shared.TestEnvVars.namespace]}`; + a.exec[kubectlGetPods] = { + "code": 0, + "stdout": `{"apiVersion":"v1","items":[{"apiVersion":"v1","kind":"Pod","metadata":{"creationTimestamp":"2020-06-10T18:20:57Z","generateName":"testReleaseName-testChartName-7966fd9bdb-","labels":{"app":"demo","pod-template-hash":"7966fd9bdb"},"name":"testReleaseName-testChartName-7966fd9bdb-wvz9w","namespace":"default","ownerReferences":[{"apiVersion":"apps/v1","blockOwnerDeletion":true,"controller":true,"kind":"ReplicaSet","name":"testReleaseName-testChartName-7966fd9bdb","uid":"ceb16411-6edc-4598-827e-027e8c68304e"}],"resourceVersion":"987","selfLink":"/api/v1/namespaces/default/pods/testReleaseName-testChartName-7966fd9bdb-wvz9w","uid":"ac838bab-a280-4189-b3e9-45bf9d8df920"},"spec":{"containers":[{"image":"nginx:latest","imagePullPolicy":"Always","name":"demo-cont","ports":[{"containerPort":80,"protocol":"TCP"}],"resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","volumeMounts":[{"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount","name":"default-token-xp8jh","readOnly":true}]}],"dnsPolicy":"ClusterFirst","enableServiceLinks":true,"nodeName":"minikube","priority":0,"restartPolicy":"Always","schedulerName":"default-scheduler","securityContext":{},"serviceAccount":"default","serviceAccountName":"default","terminationGracePeriodSeconds":30,"tolerations":[{"effect":"NoExecute","key":"node.kubernetes.io/not-ready","operator":"Exists","tolerationSeconds":300},{"effect":"NoExecute","key":"node.kubernetes.io/unreachable","operator":"Exists","tolerationSeconds":300}],"volumes":[{"name":"default-token-xp8jh","secret":{"defaultMode":420,"secretName":"default-token-xp8jh"}}]},"status":{"conditions":[{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"Initialized"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"Ready"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"ContainersReady"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"PodScheduled"}],"containerStatuses":[{"containerID":"docker://9be62c1a895983aefde3b62c33f12a692ab3749fd841a1f9b7c813b4246d1ac7","image":"nginx:latest","imageID":"docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133","lastState":{},"name":"demo-cont","ready":true,"restartCount":0,"started":true,"state":{"running":{"startedAt":"2020-06-10T18:21:20Z"}}}],"hostIP":"192.168.105.196","phase":"Running","podIP":"172.17.0.6","podIPs":[{"ip":"172.17.0.6"}],"qosClass":"BestEffort","startTime":"2020-06-10T18:20:57Z"}}],"kind":"List","metadata":{"resourceVersion":"","selfLink":""}}\n` + } +} +else { + const helmGetManifestCommand = `helm get manifest ${shared.testReleaseName}`; + a.exec[helmGetManifestCommand] = { + "code": 0, + "stdout": `---\n# Source: testChartName/templates/serviceaccount.yaml\n{apiVersion: v1, kind: ServiceAccount, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}}\n---\n# Source: testChartName/templates/service.yaml\n{apiVersion: v1, kind: Service, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {type: ClusterIP, ports: [{port: 80, targetPort: http, protocol: TCP, name: http}], selector: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}}\n---\n# Source: demo-chart/templates/deployment.yaml\n{apiVersion: apps/v1, kind: Deployment, metadata: {name: testReleaseName-testChartName, labels: {helm.sh/chart: testChartName-0.1.0, app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName, app.kubernetes.io/version: 1.17.0, app.kubernetes.io/managed-by: Helm}}, spec: {replicas: 1, selector: {matchLabels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, template: {metadata: {labels: {app.kubernetes.io/name: testChartName, app.kubernetes.io/instance: testReleaseName}}, spec: {serviceAccountName: testReleaseName-testChartName, securityContext: {}, containers: [{name: testChartName, securityContext: {}, image: "testImage:1.17.0", imagePullPolicy: Always, ports: [{name: http, containerPort: 80, protocol: TCP}], livenessProbe: {httpGet: {path: /, port: http}}, readinessProbe: {httpGet: {path: /, port: http}}, resources: {}}]}}}}\n` + } + + const kubectlGetPods = "kubectl get pods -o json"; + a.exec[kubectlGetPods] = { + "code": 0, + "stdout": `{"apiVersion":"v1","items":[{"apiVersion":"v1","kind":"Pod","metadata":{"creationTimestamp":"2020-06-10T18:20:57Z","generateName":"testReleaseName-testChartName-7966fd9bdb-","labels":{"app":"demo","pod-template-hash":"7966fd9bdb"},"name":"testReleaseName-testChartName-7966fd9bdb-wvz9w","namespace":"default","ownerReferences":[{"apiVersion":"apps/v1","blockOwnerDeletion":true,"controller":true,"kind":"ReplicaSet","name":"testReleaseName-testChartName-7966fd9bdb","uid":"ceb16411-6edc-4598-827e-027e8c68304e"}],"resourceVersion":"987","selfLink":"/api/v1/namespaces/default/pods/testReleaseName-testChartName-7966fd9bdb-wvz9w","uid":"ac838bab-a280-4189-b3e9-45bf9d8df920"},"spec":{"containers":[{"image":"nginx:latest","imagePullPolicy":"Always","name":"demo-cont","ports":[{"containerPort":80,"protocol":"TCP"}],"resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","volumeMounts":[{"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount","name":"default-token-xp8jh","readOnly":true}]}],"dnsPolicy":"ClusterFirst","enableServiceLinks":true,"nodeName":"minikube","priority":0,"restartPolicy":"Always","schedulerName":"default-scheduler","securityContext":{},"serviceAccount":"default","serviceAccountName":"default","terminationGracePeriodSeconds":30,"tolerations":[{"effect":"NoExecute","key":"node.kubernetes.io/not-ready","operator":"Exists","tolerationSeconds":300},{"effect":"NoExecute","key":"node.kubernetes.io/unreachable","operator":"Exists","tolerationSeconds":300}],"volumes":[{"name":"default-token-xp8jh","secret":{"defaultMode":420,"secretName":"default-token-xp8jh"}}]},"status":{"conditions":[{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"Initialized"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"Ready"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:21:21Z","status":"True","type":"ContainersReady"},{"lastProbeTime":null,"lastTransitionTime":"2020-06-10T18:20:57Z","status":"True","type":"PodScheduled"}],"containerStatuses":[{"containerID":"docker://9be62c1a895983aefde3b62c33f12a692ab3749fd841a1f9b7c813b4246d1ac7","image":"nginx:latest","imageID":"docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133","lastState":{},"name":"demo-cont","ready":true,"restartCount":0,"started":true,"state":{"running":{"startedAt":"2020-06-10T18:21:20Z"}}}],"hostIP":"192.168.105.196","phase":"Running","podIP":"172.17.0.6","podIPs":[{"ip":"172.17.0.6"}],"qosClass":"BestEffort","startTime":"2020-06-10T18:20:57Z"}}],"kind":"List","metadata":{"resourceVersion":"","selfLink":""}}\n` + } +} + + + +const kubectlClusterInfo = "kubectl cluster-info"; +a.exec[kubectlClusterInfo] = { + "code": 0, + "stdout": `Kubernetes master is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443 \nhealthmodel-replicaset-service is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443/api/v1/namespaces/kube-system/services/healthmodel-replicaset-service/proxy \nCoreDNS is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy \nkubernetes-dashboard is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy \nMetrics-server is running at https://shigupt-cluster-dns-7489360e.hcp.southindia.azmk8s.io:443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy\n\nTo further debug and diagnose cluster problems, use "kubectl cluster-info dump".\n` +} + +const helmSaveCommand = `helm chart${formatDebugFlag()} save ${process.env[shared.TestEnvVars.chartPathForACR]} ${process.env[shared.TestEnvVars.azureContainerRegistry]}/helm/${process.env[shared.TestEnvVars.chartNameForACR]}`; +a.exec[helmSaveCommand] = { + "code": 0, + "stdout": `ref: ${process.env[shared.TestEnvVars.azureContainerRegistry]}/helm/${process.env[shared.TestEnvVars.chartNameForACR]}:0.1.0 \n Successfully saved the helm chart to local registry cache.` +} + +const helmRegistryLoginCommand = `helm registry${formatDebugFlag()} login ${process.env[shared.TestEnvVars.azureContainerRegistry]} --username --password`; +a.exec[helmRegistryLoginCommand] = { + "code": 0, + "stdout": `Successfully logged in to ${process.env[shared.TestEnvVars.azureContainerRegistry]}.` +}; + +const helmChartPushCommand = `helm chart${formatDebugFlag()} push ${process.env[shared.TestEnvVars.azureContainerRegistry]}/helm/${process.env[shared.TestEnvVars.chartNameForACR]}:0.1.0`; +a.exec[helmChartPushCommand] = { + "code": 0, + "stdout": "Successfully pushed to the chart to container registry." +} + +const helmChartRemoveCommand = `helm chart${formatDebugFlag()} remove ${process.env[shared.TestEnvVars.azureContainerRegistry]}/helm/${process.env[shared.TestEnvVars.chartNameForACR]}:0.1.0`; +a.exec[helmChartRemoveCommand] = { + "code": 0, + "stdout": "Successfully removed the chart from local cache." +} + +tr.setAnswers(a); +tr.registerMock("azure-pipelines-task-lib/toolrunner", require("azure-pipelines-task-lib/mock-toolrunner")); + + +// Create mocks for required modules +import * as fs from 'fs'; +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function (path, data) { + console.log(`wrote to ${path}`); +}; +fsClone.chmodSync = function (path, mode) { + console.log(`changed mode of file at ${path} to ${mode}`); +}; +tr.registerMock('fs', fsClone); + +import * as util from '../src/utils'; +tr.registerMock('../src/utils', { + + getTaskTempDir: function () { + return path.join("tempdirectory", "helmTask"); + }, + getTempDirectory: function () { + return "tempdirectory"; + }, + deleteFile: function (path: string) { + console.log(`${path} deleted`); + }, + getCurrentTime: util.getCurrentTime, + resolvePath: util.resolvePath, + extractReleaseNameFromHelmOutput: util.extractReleaseNameFromHelmOutput, + getManifestsFromRelease: util.getManifestsFromRelease, + getHelmPathForACR: util.getHelmPathForACR +}); + +import * as webUtil from 'azure-pipelines-tasks-utility-common/restutilities'; +import { command } from 'azure-pipelines-task-lib'; +tr.registerMock('azure-pipelines-tasks-utility-common/restutilities', { + WebRequest: webUtil.WebRequest, + WebResponse: webUtil.WebResponse, + sendRequest: async function (request: webUtil.WebRequest) { + console.log("Mock request sent"); + return { "mockKey": "mockValue" }; + } +}) + +tr.run(); \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/Tests/TestShared.ts b/_generated/HelmDeployV1_Node20/Tests/TestShared.ts new file mode 100644 index 000000000000..86fa13a4bff8 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Tests/TestShared.ts @@ -0,0 +1,96 @@ +import path = require('path'); + +export let TestEnvVars = { + operatingSystem: "__operating_system__", + connectionType: "__connectionType__", + azureSubscriptionEndpoint: "__azureSubscriptionEndpoint__", + azureResourceGroup: "__azureResourceGroup__", + kubernetesCluster: "__kubernetesCluster__", + useClusterAdmin: "__useClusterAdmin__", + kubernetesServiceEndpoint: "__kubernetesServiceEndpoint__", + namespace: "__namespace__", + azureSubscriptionEndpointForACR: "__azureSubscriptionEndpointForACR__", + azureResourceGroupForACR: "__azureResourceGroupForACR", + azureContainerRegistry: "__azureContainerRegistry__", + command: "__command__", + chartType: "__chartType__", + chartName: "__chartName__", + chartPath: "__chartPath__", + version: "__version__", + releaseName: "__releaseName__", + overrideValues: "__overrideValues__", + valueFile: "__valueFile__", + destination: "__destination__", + canaryimage: "__canaryimage__", + upgradetiller: "__upgradetiller__", + updatedependency: "__updatedependency__", + save: "__save__", + install: "__install__", + recreate: "__recreate__", + resetValues: "__resetValues__", + force: "__force__", + waitForExecution: "__waitForExecution__", + arguments: "__arguments__", + failOnStderr: "__failOnStderr__", + publishPipelineMetadata: "__publishPipelineMetadata__", + chartNameForACR: "__chartNameForACR__", + chartPathForACR: "__chartPathForACR__" +}; + +export let Commands = { + install: "install", + upgrade: "upgrade", + package: "package", + save: "save", + init: "init" +}; + +export let ChartTypes = { + Name: "Name", + FilePath: "FilePath" +}; + +export let ConnectionTypes = { + KubernetesServiceConnection: "Kubernetes Service Connection", + AzureResourceManager: "Azure Resource Manager", + None: "None" +} + +export let OperatingSystems = { + Windows: "Windows", + Other: "Other" +}; + +export const testChartName = "testChartName"; +export const testChartPath = "test/testChartPath"; +export const testChartVersion = "1.1.1"; +export const testReleaseName = "testReleaseName"; +export const isHelmV3 = "__isHelmV3__"; +export const testNamespace = "testNamespace"; +export const testDestinationPath = "testDestinationPath"; +export const testChartNameForACR = "testChartNameForACR"; +export const testChartPathForACR = "test/testChartPathForACR"; +export const testAzureResourceGroupForACR = "test-rg"; +export const testAzureSubscriptionEndpointForACR = "RMTest"; +export const testAzureSubscriptionEndpointAuthType = "SerivcePrincipal" +export const testAzureContainerRegistry = "sonayak.azurecr.io"; +export const testEndpointAuthVar = "ENDPOINT_AUTH_SCHEME_" + testAzureSubscriptionEndpointForACR; + +/** + * Formats the given path to be appropriate for the operating system. + * @param canonicalPath A non-rooted path using a forward slash (/) as a directory separator. + */ +export function formatPath(canonicalPath: string) { + if (process.env[TestEnvVars.operatingSystem] === OperatingSystems.Windows) { + return "F:\\" + canonicalPath.replace("/", "\\"); + } else { + return "/" + canonicalPath; + } +}; + +/** + * Returns '--debug' flag if the pipeline is in debug mode otherwise empty string is returned. + */ +export function formatDebugFlag(): string { + return process.env.SYSTEM_DEBUG === 'true' ? ' --debug' : ''; +} diff --git a/_generated/HelmDeployV1_Node20/Tests/package-lock.json b/_generated/HelmDeployV1_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..5554493fe26e --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Tests/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "helm-deploy-tests", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "helm-deploy-tests", + "version": "1.0.0", + "license": "MIT" + } + } +} diff --git a/_generated/HelmDeployV1_Node20/Tests/package.json b/_generated/HelmDeployV1_Node20/Tests/package.json new file mode 100644 index 000000000000..f09cf187192d --- /dev/null +++ b/_generated/HelmDeployV1_Node20/Tests/package.json @@ -0,0 +1,19 @@ +{ + "name": "helm-deploy-tests", + "version": "1.0.0", + "description": "Azure Pipelines Helm Deploy V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme" +} diff --git a/_generated/HelmDeployV1_Node20/ThirdPartyNotices.txt b/_generated/HelmDeployV1_Node20/ThirdPartyNotices.txt new file mode 100644 index 000000000000..db0e487d9d00 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/ThirdPartyNotices.txt @@ -0,0 +1,1707 @@ + +THIRD PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +Package and deploy Helm charts task for Azure Pipelines or Azure DevOps Server + +This software incorporates material from third parties. Microsoft makes certain +open source code available at http://3rdpartysource.microsoft.com, or you may +send a check or money order for US $5.00, including the product name, the open +source component name, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the +extent required to debug changes to any libraries licensed under the GNU Lesser +General Public License. + + +1. @types/node (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +2. @types/q (https://www.github.com/DefinitelyTyped/DefinitelyTyped.git) +3. array-union (https://github.com/sindresorhus/array-union) +4. array-uniq (https://github.com/sindresorhus/array-uniq) +5. arrify (https://github.com/sindresorhus/arrify) +6. balanced-match (https://github.com/juliangruber/balanced-match) +7. brace-expansion (https://github.com/juliangruber/brace-expansion) +8. buffer-equal-constant-time (https://github.com/salesforce/buffer-equal-constant-time) +9. concat-map (https://github.com/substack/node-concat-map) +10. del (https://github.com/sindresorhus/del) +11. ecdsa-sig-formatter (git+ssh://git@github.com/Brightspace/node-ecdsa-sig-formatter.git) +12. fs.realpath (https://github.com/isaacs/fs.realpath) +13. Glob (https://github.com/isaacs/node-glob) +14. globby (https://github.com/sindresorhus/globby) +15. hoek (https://github.com/hapijs/hoek) +16. inflight (https://github.com/npm/inflight) +17. inherits (https://github.com/isaacs/inherits) +18. is-path-cwd (https://github.com/sindresorhus/is-path-cwd) +19. is-path-in-cwd (https://github.com/sindresorhus/is-path-in-cwd) +20. is-path-inside (https://github.com/sindresorhus/is-path-inside) +21. isemail (https://github.com/hapijs/isemail) +22. joi (https://github.com/hapijs/joi) +23. jsonwebtoken (https://github.com/auth0/node-jsonwebtoken) +24. lodash.once (https://github.com/lodash/lodash) +25. minimatch (https://github.com/isaacs/minimatch) +26. Mockery (https://github.com/mfncooper/mockery) +27. Moment (https://github.com/moment/moment) +28. ms (https://github.com/zeit/ms) +29. node-jwa (https://github.com/brianloveswords/node-jwa) +30. node-jws (https://github.com/brianloveswords/node-jws) +31. node-uuid (https://github.com/broofa/node-uuid) +32. object-assign (https://github.com/sindresorhus/object-assign) +33. once (https://github.com/isaacs/once) +34. path-is-absolute (https://github.com/sindresorhus/path-is-absolute) +35. path-is-inside (https://github.com/domenic/path-is-inside) +36. pify (https://github.com/sindresorhus/pify) +37. pinkie (https://github.com/floatdrop/pinkie) +38. pinkie-promise (https://github.com/floatdrop/pinkie-promise) +39. q (https://github.com/kriskowal/q) +40. Rimraf (https://github.com/isaacs/rimraf) +41. safe-buffer (https://github.com/feross/safe-buffer) +42. semver (https://github.com/npm/node-semver/) +43. semver-compare (https://github.com/substack/semver-compare) +44. ShellJS (https://github.com/shelljs/shelljs) + Includes:wrench-js +45. topo (https://github.com/hapijs/topo) +46. tunnel (https://github.com/koichik/node-tunnel) +47. typed-rest-client (https://github.com/Microsoft/typed-rest-client) +48. underscore (https://github.com/jashkenas/underscore) +49. vso-node-api (https://github.com/Microsoft/vsts-node-api) +50. Azure-Pipelines-Task-Lib (https://github.com/Microsoft/azure-pipelines-task-lib) +51. vsts-task-tool-lib (git+https://github.com/microsoft/vsts-task-installer-lib.git) +51. wrappy (https://github.com/npm/wrappy) +53. xtend (https://github.com/Raynos/xtend) + + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE + +%% array-union NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF array-union NOTICES, INFORMATION, AND LICENSE + +%% array-uniq NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF array-uniq NOTICES, INFORMATION, AND LICENSE + +%% arrify NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF arrify NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% buffer-equal-constant-time NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF buffer-equal-constant-time NOTICES AND INFORMATION + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) James Halliday/substack + +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% del NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF del NOTICES, INFORMATION, AND LICENSE + +%% ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 D2L Corporation + + 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. +========================================= +END OF ecdsa-sig-formatter NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license, as follows: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% Glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF Glob NOTICES, INFORMATION, AND LICENSE + +%% globby NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF globby NOTICES, INFORMATION, AND LICENSE + +%% hoek NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= + +Copyright (c) 2011-2014, Walmart and other contributors. +Copyright (c) 2011, Yahoo Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors +Portions of this project were initially based on the Yahoo! Inc. Postmile project, +published at https://github.com/yahoo/postmile. +========================================= +Includes code from Deep-eql + +Copyright (c) 2013 Jake Luer jake@alogicalparadox.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF hoek NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% is-path-cwd NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF is-path-cwd NOTICES, INFORMATION, AND LICENSE + +%% is-path-in-cwd NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF is-path-in-cwd NOTICES, INFORMATION, AND LICENSE + +%% is-path-inside NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF is-path-inside NOTICES AND INFORMATION + +%% isemail NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2008-2011, Dominic Sayers +Copyright (c) 2013-2014, GlobeSherpa +Copyright (c) 2014-2015, Eli Skeggs + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +- Neither the name of Dominic Sayers nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF isemail NOTICES AND INFORMATION + +%% joi NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/joi/graphs/contributors +========================================= +END OF joi NOTICES AND INFORMATION + +%% jsonwebtoken NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2015 Auth0, Inc. (http://auth0.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF jsonwebtoken NOTICES AND INFORMATION + +%% lodash.once NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.once NOTICES AND INFORMATION + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% Mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF Mockery NOTICES, INFORMATION, AND LICENSE + +%% Moment NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +Files with code from Closure + +Copyright (c) 2006 The Closure Library Authors. All Rights Reserved. + +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. +========================================= +END OF Moment NOTICES AND INFORMATION + +%% ms NOTICES AND INFORMATION BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Guillermo Rauch +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the Software), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF ms NOTICES AND INFORMATION + +%% node-jwa NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jwa NOTICES AND INFORMATION + +%% node-jws NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF node-jws NOTICES AND INFORMATION + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% object-assign NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF object-assign NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +path-is-absolute + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +node.js: + +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +Software), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% path-is-inside NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2013-2014 Domenic Denicola +Licensed under the WTFPL Version 2 (http://www.wtfpl.net/about/) +========================================= +END OF path-is-inside NOTICES, INFORMATION, AND LICENSE + +%% pify NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF pify NOTICES, INFORMATION, AND LICENSE + +%% pinkie NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF pinkie NOTICES, INFORMATION, AND LICENSE + +%% pinkie-promise NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF pinkie-promise NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Copyright 2009–2014 Kristopher Michael Kowal. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +/*! + * + * Copyright 2009-2012 Kris Kowal under the terms of the MIT + * license found at http://github.com/kriskowal/q/raw/master/LICENSE + * + * With parts by Tyler Close + * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found + * at http://www.opensource.org/licenses/mit-license.html + * Forked at ref_send.js version: 2009-05-11 + * + * With parts by Mark Miller + * Copyright (C) 2011 Google 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. + * + */ +========================================= +END OF q NOTICES AND INFORMATION + +%% Rimraf NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Rimraf NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES AND INFORMATION + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% semver-compare NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2014 James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF semver-compare NOTICES AND INFORMATION + +%% ShellJS NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +Includes wrench-js +The MIT License + +Copyright (c) 2010 Ryan McGrath + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF ShellJS NOTICES, INFORMATION, AND LICENSE + +%% topo NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2012-2014, Walmart and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/topo/graphs/contributors +========================================= +END OF topo NOTICES AND INFORMATION + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES AND INFORMATION BEGIN HERE +========================================= +Typed Rest Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES AND INFORMATION + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% Azure-Pipelines-Task-Lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +========================================= +END OF Azure-Pipelines-Task-Lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF vsts-task-tool-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% xtend NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright (c) 2012-2014 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the Software), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF xtend NOTICES AND INFORMATION + diff --git a/_generated/HelmDeployV1_Node20/icon.png b/_generated/HelmDeployV1_Node20/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5faba1eb7e09d1aab205883a38f266e36cd36179 GIT binary patch literal 936 zcmV;Z16TZsP)vR@*g-%G>CKP((uKJFiQx$ElP-z>w2S%`$a051*?E0P|&z1ux z9$+Kpd^#F>j^E7Z=nUK8#>3|Wx^CwvBE@#jCcYd)ITZ;8Vt23YLqt@jR)^Z$>X0eb zb@a8l<;5_JS(%;iuFg$A1U8hE6L=T7J<=x10E7-+Fc0IC^-O9RIygLb=c;2Pn@)%_ zfLyh$2T%HmmrJi6dy;cg{(K@H`2o$^26JsoyR*Kd*G)nmr4A>l5)Gp5XKpT8FN_t0 z01|7VQ_dBYaZNTlkNK1alRX)l@_%`H|8%(qWIoJKD)c6MHH8(qR%ZbwL^Bkz*CO*5byxl6JEoR zG-Z%z4A4^m5Yowsq_616n+fmA?91_@hg3Q-Mpay;yoV8@4M2fGB`oPFnv?IjP0_qW z*ikpaw=UXqiN!FSko-3SnAP%7S3|t>3 zzvcUp*|hxeZ$q@(0OJOO+l7j(66HcZmr1^z^sU9YuNs$p6JP)xfzjK&Y#N~e0000< KMNUMnLSTYcgRbZR literal 0 HcmV?d00001 diff --git a/_generated/HelmDeployV1_Node20/icon.svg b/_generated/HelmDeployV1_Node20/icon.svg new file mode 100644 index 000000000000..914cc0f58cbc --- /dev/null +++ b/_generated/HelmDeployV1_Node20/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/_generated/HelmDeployV1_Node20/make.json b/_generated/HelmDeployV1_Node20/make.json new file mode 100644 index 000000000000..a88df49172d1 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/make.json @@ -0,0 +1,16 @@ +{ + "rm": [ + { + "items": [ + "node_modules/https-proxy-agent/node_modules/agent-base", + "node_modules/azure-pipelines-tasks-kubernetes-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-utility-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-task-lib" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/package-lock.json b/_generated/HelmDeployV1_Node20/package-lock.json new file mode 100644 index 000000000000..3165063e6a3e --- /dev/null +++ b/_generated/HelmDeployV1_Node20/package-lock.json @@ -0,0 +1,1647 @@ +{ + "name": "HelmDeployV1_Node20", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "@types/q": "^1.5.0", + "@types/uuid": "^8.3.0", + "agent-base": "6.0.2", + "azure-pipelines-task-lib": "^4.13.0", + "azure-pipelines-tasks-azure-arm-rest": "3.239.0", + "azure-pipelines-tasks-docker-common": "^2.241.1", + "azure-pipelines-tasks-kubernetes-common": "^2.224.1", + "azure-pipelines-tasks-securefiles-common": "^2.207.0", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "del": "2.2.0", + "moment": "^2.29.4" + }, + "devDependencies": { + "typescript": "5.1.6" + } + }, + "node_modules/@azure/msal-common": { + "version": "14.12.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.12.0.tgz", + "integrity": "sha512-IDDXmzfdwmDkv4SSmMEyAniJf6fDu3FJ7ncOjlxkDuT85uSnLEhZi3fGZpoR7T4XZpOMx9teM9GXBgrfJgyeBw==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.9.2.tgz", + "integrity": "sha512-8tvi6Cos3m+0KmRbPjgkySXi+UQU/QiuVRFnrxIwt5xZlEEFa69O04RTaNESGgImyBBlYbo2mfE8/U8Bbdk1WQ==", + "dependencies": { + "@azure/msal-common": "14.12.0", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@azure/msal-node/node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/@azure/msal-node/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@azure/msal-node/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "node_modules/@types/mockery": { + "version": "1.4.33", + "resolved": "https://registry.npmjs.org/@types/mockery/-/mockery-1.4.33.tgz", + "integrity": "sha512-vpuuVxCnCEM0OakYNoyFs40mjJFJFJahBHyx0Z0Piysof+YwlDJzNO4V1weRvYySAmtAvlb0UHtxVO2IfTcykw==" + }, + "node_modules/@types/node": { + "version": "20.14.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", + "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + }, + "node_modules/@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "node_modules/adm-zip": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.14.tgz", + "integrity": "sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/async-mutex": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz", + "integrity": "sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/azure-devops-node-api": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/azure-pipelines-task-lib": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.13.0.tgz", + "integrity": "sha512-KVguui31If98vgokNepHUxE3/D8UFB4FHV1U6XxjGOkgxxwKxbupC3knVnEiZA/hNl7X+vmj9KrYOx79iwmezQ==", + "dependencies": { + "adm-zip": "^0.5.10", + "minimatch": "3.0.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "uuid": "^3.0.1" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest": { + "version": "3.239.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.239.0.tgz", + "integrity": "sha512-f24EoPheEED8yBx2MszDrPl/Tj5Wj3DQFR+SiP2ooeY6fxvxo278GEsqABtSDgJG7n6Pv24pKucT5pcVHsVsjw==", + "dependencies": { + "@azure/msal-node": "^2.7.0", + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^4.11.0", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "1.8.4", + "xml2js": "0.6.2" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common": { + "version": "2.241.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-docker-common/-/azure-pipelines-tasks-docker-common-2.241.1.tgz", + "integrity": "sha512-X1KhZr87bICWgjTWE+wZm3IDAN2dTzmAEd0n7O10xkVAJ7lbChoIfsz1eOkgOxR/gRl6ZuREUAm8pR+ncRntMw==", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "^4.13.0", + "azure-pipelines-tasks-azure-arm-rest": "^3.241.2", + "del": "2.2.0", + "q": "1.4.1" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-task-lib": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.13.0.tgz", + "integrity": "sha512-KVguui31If98vgokNepHUxE3/D8UFB4FHV1U6XxjGOkgxxwKxbupC3knVnEiZA/hNl7X+vmj9KrYOx79iwmezQ==", + "dependencies": { + "adm-zip": "^0.5.10", + "minimatch": "3.0.5", + "nodejs-file-downloader": "^4.11.1", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "uuid": "^3.0.1" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-task-lib/node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-tasks-azure-arm-rest": { + "version": "3.241.2", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.241.2.tgz", + "integrity": "sha512-mYTj2UwoIhgzMTR1Y144pk4hCsVwzglFV/AcfV60YrxYOdyDF5ZqTZjJrq1mcen2ND12F304TUKNvBU0TyP7Kg==", + "dependencies": { + "@azure/msal-node": "^2.7.0", + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^4.11.0", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "^1.8.6", + "xml2js": "0.6.2" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/azure-pipelines-tasks-azure-arm-rest/node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/azure-pipelines-tasks-docker-common/node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/azure-pipelines-tasks-kubernetes-common": { + "version": "2.235.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-kubernetes-common/-/azure-pipelines-tasks-kubernetes-common-2.235.0.tgz", + "integrity": "sha512-MNecd10J/+xnluYvHh+/5ozSOe/53BaNlq9bbSTyORCQLzFzKkbQva9WZQGeqUDJkSTIpiD/FAGDq5m7vQ0Dfw==", + "dependencies": { + "@types/mocha": "5.2.7", + "@types/node": "10.17.0", + "@types/node-forge": "^1.3.2", + "@types/uuid": "8.3.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^4.0.0-preview", + "azure-pipelines-tool-lib": "^2.0.7", + "js-yaml": "3.13.1", + "node-forge": "^1.3.1" + } + }, + "node_modules/azure-pipelines-tasks-kubernetes-common/node_modules/@types/node": { + "version": "10.17.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.0.tgz", + "integrity": "sha512-wuJwN2KV4tIRz1bu9vq5kSPasJ8IsEjZaP1ZR7KlmdUZvGF/rXy8DmXOVwUD0kAtvtJ7aqMKPqUXC0NUTDbrDg==" + }, + "node_modules/azure-pipelines-tasks-kubernetes-common/node_modules/@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "node_modules/azure-pipelines-tasks-securefiles-common": { + "version": "2.219.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.219.0.tgz", + "integrity": "sha512-S+ec/Qdz9WYL9UbEFYWY2UFkVL2Es43GGcYYE9DhIfRuRZ02Wm2ycR29uSq3QVOQvO01daGJX3Y/ZFpRZerdfQ==", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/mockery": "^1.4.30", + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0", + "mockery": "^2.1.0" + } + }, + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "dependencies": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "node_modules/azure-pipelines-tasks-utility-common": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.241.0.tgz", + "integrity": "sha512-7D9nJ2EaKcj5YtPOizOcpgOdxaYcI/Y+JeGrPk6ibtIalImYUBg7Otq337rkLJFkK1cEikC5abZV5YvOowJPsA==", + "dependencies": { + "@types/node": "^16.11.39", + "azure-pipelines-task-lib": "^4.11.0", + "azure-pipelines-tool-lib": "^2.0.7", + "js-yaml": "3.13.1", + "semver": "^5.7.2" + } + }, + "node_modules/azure-pipelines-tasks-utility-common/node_modules/@types/node": { + "version": "16.18.99", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.99.tgz", + "integrity": "sha512-X2Yc+NQaPXDuaR32UmFrTr3OXWaht756A6sJw56o4dehkySBZ0NWH30CCRviuC0KFwTDW/NTjrtbFHhYcHkd6g==" + }, + "node_modules/azure-pipelines-tool-lib": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.7.tgz", + "integrity": "sha512-1FN67ypNwNhgZllYSm4/pAQdffSfEZJhwW8YeNvm/cKDTS6t6bukTBIkt04c1CsaQe7Ot+eDOVMn41wX1ketXw==", + "dependencies": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.1.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + } + }, + "node_modules/azure-pipelines-tool-lib/node_modules/@types/uuid": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.13.tgz", + "integrity": "sha512-pAeZeUbLE4Z9Vi9wsWV2bYPTweEHeJJy0G4pEjOA/FSvy1Ad5U5Km8iDV6TKre1mjBiVNfAdVHKruP8bAh4Q5A==" + }, + "node_modules/azure-pipelines-tool-lib/node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.0.tgz", + "integrity": "sha512-AZDiRb78EEGYCsAZTG3v+CM5q8J0BIs+wI7QeUtyosm+zIMm4XSmp6aI/K7cU9l+YaKpDKN9dYP1xTrNjLQ+LA==", + "dependencies": { + "globby": "^4.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globby": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", + "integrity": "sha512-JPDtMSr0bt25W64q792rvlrSwIaZwqUAhqdYKSr57Wh/xBcQ5JDWLM85ndn+Q1WdBQXLb9YGCl0QN/T0HpqU0A==", + "dependencies": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^6.0.1", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dependencies": { + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/nodejs-file-downloader": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/nodejs-file-downloader/-/nodejs-file-downloader-4.13.0.tgz", + "integrity": "sha512-nI2fKnmJWWFZF6SgMPe1iBodKhfpztLKJTtCtNYGhm/9QXmWa/Pk9Sv00qHgzEvNLe1x7hjGDRor7gcm/ChaIQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "https-proxy-agent": "^5.0.0", + "mime-types": "^2.1.27", + "sanitize-filename": "^1.6.3" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + } + } +} diff --git a/_generated/HelmDeployV1_Node20/package.json b/_generated/HelmDeployV1_Node20/package.json new file mode 100644 index 000000000000..9501031c7f00 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/package.json @@ -0,0 +1,20 @@ +{ + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "@types/q": "^1.5.0", + "@types/uuid": "^8.3.0", + "agent-base": "6.0.2", + "azure-pipelines-task-lib": "^4.13.0", + "azure-pipelines-tasks-azure-arm-rest": "3.239.0", + "azure-pipelines-tasks-docker-common": "^2.241.1", + "azure-pipelines-tasks-kubernetes-common": "^2.224.1", + "azure-pipelines-tasks-securefiles-common": "^2.207.0", + "azure-pipelines-tasks-utility-common": "^3.210.0", + "del": "2.2.0", + "moment": "^2.29.4" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/HelmDeployV1_Node20/src/basecommand.ts b/_generated/HelmDeployV1_Node20/src/basecommand.ts new file mode 100644 index 000000000000..89add599249d --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/basecommand.ts @@ -0,0 +1,66 @@ +import path = require("path"); +import tl = require("azure-pipelines-task-lib/task"); +import fs = require("fs"); +import util = require("util"); +import os = require("os"); +import tr = require('azure-pipelines-task-lib/toolrunner'); + +abstract class basecommand { + private toolPath: string; + abstract getTool(): string; + abstract login(): void; + abstract logout(): void; + + constructor(required: boolean) { + this.toolPath = tl.which(this.getTool(), required); + } + + public getToolPath(): string { + return this.toolPath; + } + + public createCommand(): tr.ToolRunner { + var command = tl.tool(this.toolPath); + return command; + } + + public execCommand(command: tr.ToolRunner, options?: tr.IExecOptions) { + var errlines = []; + command.on("stderr", line => { + errlines.push(line); + }); + + command.on("error", line => { + errlines.push(line); + }); + + return command.exec(options).fail(error => { + errlines.forEach(line => tl.error(line)); + throw error; + }); + } + + public execCommandSync(command: tr.ToolRunner, options?: tr.IExecOptions): tr.IExecSyncResult { + return command.execSync(options); + } + + public IsInstalled(): boolean { + return !!this.getToolPath(); + } + + public static handleExecResult(execResult: tr.IExecSyncResult) { + if (execResult.code != tl.TaskResult.Succeeded) { + + tl.debug('execResult: ' + JSON.stringify(execResult)); + if(!!execResult.error || !!execResult.stderr) { + tl.setResult(tl.TaskResult.Failed, execResult.stderr); + } + else + { + tl.setResult(tl.TaskResult.Failed, ""); + } + } + } +} + +export default basecommand; \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/clusters/armkubernetescluster.ts b/_generated/HelmDeployV1_Node20/src/clusters/armkubernetescluster.ts new file mode 100644 index 000000000000..56bb7717ade4 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/clusters/armkubernetescluster.ts @@ -0,0 +1,26 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import { AzureAksService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-aks-service'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { AzureEndpoint, AKSCluster, AKSClusterAccessProfile} from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; + +// get kubeconfig file content +async function getKubeConfigFromAKS(azureSubscriptionEndpoint: string, resourceGroup: string, clusterName: string, useClusterAdmin?: boolean) : Promise { + var azureEndpoint: AzureEndpoint = await (new AzureRMEndpoint(azureSubscriptionEndpoint)).getEndpoint(); + var aks = new AzureAksService(azureEndpoint); + + tl.debug(tl.loc("KubernetesClusterResourceGroup", clusterName, resourceGroup)); + + var clusterInfo : AKSClusterAccessProfile = await aks.getAccessProfile(resourceGroup, clusterName, useClusterAdmin); + var base64Kubeconfig = Buffer.from(clusterInfo.properties.kubeConfig, 'base64'); + return base64Kubeconfig.toString(); +} + +export async function getKubeConfig(): Promise { + var clusterName : string = tl.getInput("kubernetesCluster", true); + var azureSubscriptionEndpoint : string = tl.getInput("azureSubscriptionEndpoint", true); + var resourceGroup : string = tl.getInput("azureResourceGroup", true); + var useClusterAdmin: boolean = tl.getBoolInput('useClusterAdmin'); + return getKubeConfigFromAKS(azureSubscriptionEndpoint, resourceGroup, clusterName, useClusterAdmin); +} diff --git a/_generated/HelmDeployV1_Node20/src/clusters/generickubernetescluster.ts b/_generated/HelmDeployV1_Node20/src/clusters/generickubernetescluster.ts new file mode 100644 index 000000000000..c7b68229c6fc --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/clusters/generickubernetescluster.ts @@ -0,0 +1,17 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import kubectlutility = require("azure-pipelines-tasks-kubernetes-common/kubectlutility"); + +export async function getKubeConfig(): Promise { + var kubernetesServiceEndpoint = tl.getInput("kubernetesServiceEndpoint", true); + var authorizationType = tl.getEndpointDataParameter(kubernetesServiceEndpoint, 'authorizationType', true); + if (!authorizationType || authorizationType === "Kubeconfig") + { + return kubectlutility.getKubeconfigForCluster(kubernetesServiceEndpoint); + } + else if (authorizationType === "ServiceAccount" || authorizationType === "AzureSubscription") + { + return kubectlutility.createKubeconfig(kubernetesServiceEndpoint); + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/commoncommandoption.ts b/_generated/HelmDeployV1_Node20/src/commoncommandoption.ts new file mode 100644 index 000000000000..cb8076c548e2 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/commoncommandoption.ts @@ -0,0 +1,17 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./helmcli"; + +export function addArguments(helmCli: helmcli) : void { + var tillernamespace = tl.getInput("tillernamespace", false); + var debugMode = tl.getVariable('system.debug'); + + if(tillernamespace) { + helmCli.addArgument("--tiller-namespace ".concat(tillernamespace)); + } + + if(debugMode === 'true') { + helmCli.addArgument("--debug"); + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/deletesecurefiles.ts b/_generated/HelmDeployV1_Node20/src/deletesecurefiles.ts new file mode 100644 index 000000000000..5eb45360b512 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/deletesecurefiles.ts @@ -0,0 +1,36 @@ +"use strict"; + +import fs = require('fs'); +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); + +tl.setResourcePath(path.join(__dirname, '..' , 'task.json')); + +async function run() { + var enableTls = tl.getBoolInput('enableTls', false); + + if(!enableTls) { + tl.debug(tl.loc("SkipDeleteSecureFiles")); + } + + try { + var caCertFilePath = tl.getTaskVariable('CACERT_FILE_PATH'); + if (caCertFilePath && tl.exist(caCertFilePath)) { + fs.unlinkSync(caCertFilePath); + } + + var certFilePath = tl.getTaskVariable('CERT_FILE_PATH'); + if (certFilePath && tl.exist(certFilePath)) { + fs.unlinkSync(certFilePath); + } + + var keyFilePath = tl.getTaskVariable('KEY_FILE_PATH'); + if (keyFilePath && tl.exist(keyFilePath)) { + fs.unlinkSync(keyFilePath); + } + } catch(err) { + tl.warning(err); + } +} + +run(); \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/downloadsecurefiles.ts b/_generated/HelmDeployV1_Node20/src/downloadsecurefiles.ts new file mode 100644 index 000000000000..fe11e4c502d0 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/downloadsecurefiles.ts @@ -0,0 +1,38 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import secureFilesCommon = require('azure-pipelines-tasks-securefiles-common/securefiles-common'); +import path = require('path'); + +tl.setResourcePath(path.join(__dirname, '..' , 'task.json')); + +async function run() { + var enableTls = tl.getBoolInput('enableTls', false); + + if(!enableTls) { + tl.debug(tl.loc("SkipDownloadSecureFiles")); + return; + } + + var caCert = tl.getInput('caCert', true); + var cert = tl.getInput('certificate', true); + var key = tl.getInput('privatekey', true); + + try { + var secureFileHelpers = new secureFilesCommon.SecureFileHelpers(); + var caCertFilePath: string = await secureFileHelpers.downloadSecureFile(caCert); + tl.setTaskVariable('CACERT_FILE_PATH', caCertFilePath); + var certFilePath: string = await secureFileHelpers.downloadSecureFile(cert); + tl.setTaskVariable('CERT_FILE_PATH', certFilePath); + var keyFilePath: string = await secureFileHelpers.downloadSecureFile(key); + tl.setTaskVariable('KEY_FILE_PATH', keyFilePath); + } catch(err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run().then(()=>{ + // do nothing +}, (reason)=> { + tl.setResult(tl.TaskResult.Failed, reason); +}); \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helm.ts b/_generated/HelmDeployV1_Node20/src/helm.ts new file mode 100644 index 000000000000..c9983aa236af --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helm.ts @@ -0,0 +1,273 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import path = require('path'); + +import * as commonCommandOptions from "./commoncommandoption"; +import * as helmutil from "./utils" + +import { AKSCluster, AKSClusterAccessProfile, AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { WebRequest, WebResponse, sendRequest } from 'azure-pipelines-tasks-utility-common/restutilities'; +import { extractManifestsFromHelmOutput, getDeploymentMetadata, getManifestFileUrlsFromHelmOutput, getPublishDeploymentRequestUrl, isDeploymentEntity } from 'azure-pipelines-tasks-kubernetes-common/image-metadata-helper'; + +import { AzureAksService } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-aks-service'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import { Kubelogin } from 'azure-pipelines-tasks-kubernetes-common/kubelogin'; +import helmcli from "./helmcli"; +import kubernetescli from "./kubernetescli" + +import fs = require('fs'); +import { fail } from 'assert'; + +const environmentVariableMaximumSize = 32766; + +tl.setResourcePath(path.join(__dirname, '..', 'task.json')); +tl.setResourcePath(path.join(__dirname, '../node_modules/azure-pipelines-tasks-azure-arm-rest/module.json')); + +function getKubeConfigFilePath(): string { + var userdir = helmutil.getTaskTempDir(); + return path.join(userdir, "config"); +} + +function getClusterType(): any { + var connectionType = tl.getInput("connectionType", true); + var endpoint = tl.getInput("azureSubscriptionEndpoint") + if (connectionType === "Azure Resource Manager" && endpoint) { + return require("./clusters/armkubernetescluster") + } + + return require("./clusters/generickubernetescluster") +} + +function isKubConfigSetupRequired(command: string): boolean { + var connectionType = tl.getInput("connectionType", true); + return command !== "package" && command !== "save" && connectionType !== "None"; +} + +function isKubConfigLogoutRequired(command: string): boolean { + var connectionType = tl.getInput("connectionType", true); + return command !== "package" && command !== "save" && command !== "login" && connectionType !== "None"; +} + +// get kubeconfig file path +async function getKubeConfigFile(): Promise { + return getClusterType().getKubeConfig().then((config) => { + var configFilePath = getKubeConfigFilePath(); + tl.debug(tl.loc("KubeConfigFilePath", configFilePath)); + fs.writeFileSync(configFilePath, config); + fs.chmodSync(configFilePath, '600'); + return configFilePath; + }); +} + +async function runHelmSaveCommand(helmCli: helmcli, kubectlCli: kubernetescli, failOnStderr: boolean): Promise { + if (!helmCli.isHelmV3()) { + //helm chart save and push commands are only supported in Helms v3 + throw new Error(tl.loc("SaveSupportedInHelmsV3Only")); + } + process.env.HELM_EXPERIMENTAL_OCI="1"; + await runHelm(helmCli, "saveChart", kubectlCli, failOnStderr); + helmCli.resetArguments(); + const chartRef = getHelmChartRef(tl.getVariable("helmOutput")); + tl.setVariable("helmChartRef", chartRef); + await runHelm(helmCli, "registry", kubectlCli, false); + helmCli.resetArguments(); + await runHelm(helmCli, "pushChart", kubectlCli, failOnStderr); + helmCli.resetArguments(); + await runHelm(helmCli, "removeChart", kubectlCli, failOnStderr); +} + +async function run() { + var command = tl.getInput("command", true).toLowerCase(); + var connectionType = tl.getInput("connectionType", true); + var isKubConfigRequired = isKubConfigSetupRequired(command); + var kubectlCli: kubernetescli; + var externalAuth = connectionType === "None" && (command === "install" || command === "upgrade"); + if (externalAuth && !tl.getVariable("KUBECONFIG")) { + const kubeConfigPath = path.join(process.env.HOME, '.kube', 'config'); + if (fs.existsSync(kubeConfigPath)) { + tl.setVariable("KUBECONFIG", kubeConfigPath); + } else { + tl.error("KUBECONFIG kube configuration file path must be set when connectionType is none and command is install or upgrade."); + } + } + if (isKubConfigRequired || externalAuth) { + var kubeconfigfilePath = (command === "logout" || externalAuth) ? tl.getVariable("KUBECONFIG") : await getKubeConfigFile(); + kubectlCli = new kubernetescli(kubeconfigfilePath); + kubectlCli.login(); + } + + const kubelogin = new Kubelogin(helmutil.getTaskTempDir()); + if (kubelogin.isAvailable() && !externalAuth) { + tl.debug('Kubelogin is installed. Converting kubeconfig.'); + const serviceConnection: string = tl.getInput('azureSubscriptionEndpoint', false); + try { + await kubelogin.login(serviceConnection); + } catch (err) { + tl.debug(tl.loc('KubeloginFailed', err)); + } + } + + var helmCli: helmcli = new helmcli(); + helmCli.login(); + var telemetry = { + connectionType: connectionType, + command: command, + jobId: tl.getVariable('SYSTEM_JOBID') + }; + var failOnStderr = tl.getBoolInput("failOnStderr"); + + console.log("##vso[telemetry.publish area=%s;feature=%s]%s", + "TaskEndpointId", + "HelmDeployV0", + JSON.stringify(telemetry)); + + try { + switch (command) { + case "login": + kubectlCli.setKubeConfigEnvVariable(); + break; + case "logout": + kubectlCli.unsetKubeConfigEnvVariable(); + break; + case "save": + await runHelmSaveCommand(helmCli, kubectlCli, failOnStderr); + break; + default: + await runHelm(helmCli, command, kubectlCli, failOnStderr); + } + } catch (err) { + // not throw error so that we can logout from helm and kubernetes + tl.setResult(tl.TaskResult.Failed, err.message); + } + finally { + if (isKubConfigLogoutRequired(command)) { + kubectlCli.logout(); + } + + helmCli.logout(); + } +} + +async function runHelm(helmCli: helmcli, command: string, kubectlCli: kubernetescli, failOnStderr: boolean): Promise { + var helmCommandMap = { + "init": "./helmcommands/helminit", + "install": "./helmcommands/helminstall", + "package": "./helmcommands/helmpackage", + "pushChart": "./helmcommands/helmchartpush", + "registry": "./helmcommands/helmregistrylogin", + "removeChart": "./helmcommands/helmchartremove", + "saveChart": "./helmcommands/helmchartsave", + "upgrade": "./helmcommands/helmupgrade" + } + + var commandImplementation = require("./helmcommands/uinotimplementedcommands"); + if (command in helmCommandMap) { + commandImplementation = require(helmCommandMap[command]); + } + + //set command + if (command === "saveChart" || command === "pushChart" || command === "removeChart") { + helmCli.setCommand("chart"); + } else { + helmCli.setCommand(command); + } + + // add arguments + commonCommandOptions.addArguments(helmCli); + await commandImplementation.addArguments(helmCli); + + const execResult = helmCli.execHelmCommand(); + tl.setVariable('helmExitCode', execResult.code.toString()); + + if (execResult.stdout) { + var commandOutputLength = execResult.stdout.length; + if (commandOutputLength > environmentVariableMaximumSize) { + tl.warning(tl.loc('OutputVariableDataSizeExceeded', commandOutputLength, environmentVariableMaximumSize)); + } else { + tl.setVariable("helmOutput", execResult.stdout); + } + } + + var publishPipelineMetadata = tl.getBoolInput("publishPipelineMetadata"); + + if (execResult.code != tl.TaskResult.Succeeded || !!execResult.error || (failOnStderr && !!execResult.stderr)) { + tl.debug('execResult: ' + JSON.stringify(execResult)); + tl.setResult(tl.TaskResult.Failed, execResult.stderr); + } + else if (publishPipelineMetadata && (command === "install" || command === "upgrade")) { + try { + let output = execResult.stdout; + let releaseName = helmutil.extractReleaseNameFromHelmOutput(output); + let manifests = helmutil.getManifestsFromRelease(helmCli, releaseName); + if (manifests && manifests.length > 0) { + const manifestUrls = getManifestFileUrlsFromHelmOutput(output); + const allPods = JSON.parse(kubectlCli.getAllPods().stdout); + const clusterInfo = kubectlCli.getClusterInfo().stdout; + + manifests.forEach(manifest => { + //Check if the manifest object contains a deployment entity + if (manifest.kind && isDeploymentEntity(manifest.kind)) { + try { + pushDeploymentDataToEvidenceStore(allPods, clusterInfo, manifest, manifestUrls).then((result) => { + tl.debug("DeploymentDetailsApiResponse: " + JSON.stringify(result)); + }, (error) => { + tl.warning("publishToImageMetadataStore failed with error: " + error); + }); + } + catch (e) { + tl.warning("publishToImageMetadataStore failed with error: " + e); + } + } + }); + } + } + catch (e) { + tl.error("Capturing deployment metadata failed with error: " + e); + } + } +} + +run().then(() => { + // do nothing +}, (reason) => { + tl.setResult(tl.TaskResult.Failed, reason); +}); + +async function pushDeploymentDataToEvidenceStore(allPods: any, clusterInfo: any, deploymentObject: any, manifestUrls: string[]): Promise { + const metadata = getDeploymentMetadata(deploymentObject, allPods, "None", clusterInfo, manifestUrls); + const requestUrl = getPublishDeploymentRequestUrl(); + const request = new WebRequest(); + const accessToken: string = tl.getEndpointAuthorizationParameter('SYSTEMVSSCONNECTION', 'ACCESSTOKEN', false); + + request.uri = requestUrl; + request.method = 'POST'; + request.body = JSON.stringify(metadata); + request.headers = { + "Content-Type": "application/json", + "Authorization": "Bearer " + accessToken + }; + + tl.debug("requestUrl: " + requestUrl); + tl.debug("requestBody: " + JSON.stringify(metadata)); + + try { + tl.debug("Sending request for pushing deployment data to Image meta data store"); + const response = await sendRequest(request); + return response; + } + catch (error) { + tl.debug("Unable to push to deployment details to Artifact Store, Error: " + error); + } + + return Promise.resolve(); +} + +function getHelmChartRef(helmOutput: string): string { + const refMarker = "ref:"; + const refIndex = helmOutput.indexOf(refMarker); + const lineEndingIndex = helmOutput.indexOf("\n", refIndex); + let helmRef = helmOutput.substring(refIndex + refMarker.length, lineEndingIndex); + helmRef.trim(); + return helmRef; +} diff --git a/_generated/HelmDeployV1_Node20/src/helmcli.ts b/_generated/HelmDeployV1_Node20/src/helmcli.ts new file mode 100644 index 000000000000..33c280157364 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcli.ts @@ -0,0 +1,77 @@ +import path = require("path"); +import tl = require("azure-pipelines-task-lib/task"); +import fs = require("fs"); +import util = require("util"); +import os = require("os"); +import * as tr from "azure-pipelines-task-lib/toolrunner"; +import basecommand from "./basecommand"; + +export default class helmcli extends basecommand { + + private command: string; + private arguments: string[] = []; + private helmVersion: string; + + constructor() { + super(true) + } + + public getTool(): string { + return "helm"; + } + + public login(): void { + + } + + public logout(): void { + + } + + public setCommand(command: string): void { + this.command = command; + } + + public getCommand(): string { + return this.command; + } + + public addArgument(argument: string): void { + this.arguments.push(argument); + } + + public getArguments(): string[] { + return this.arguments; + } + + public resetArguments(): void { + this.arguments = []; + } + + public getHelmVersion(): tr.IExecSyncResult { + var command = this.createCommand(); + command.arg('version'); + command.line('--client'); + command.line('--short'); + + return this.execCommandSync(command); + } + + public isHelmV3(): boolean { + if (!this.helmVersion) + this.helmVersion = this.getHelmVersion().stdout; + if (this.helmVersion.startsWith("v3")) + return true; + return false; + } + + public execHelmCommand(silent?: boolean): tr.IExecSyncResult { + var command = this.createCommand(); + command.arg(this.command); + this.arguments.forEach((value) => { + command.line(value); + }); + + return this.execCommandSync(command, { silent: !!silent } as tr.IExecOptions); + } +} diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmchartpush.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmchartpush.ts new file mode 100644 index 000000000000..8e377d89c4a3 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmchartpush.ts @@ -0,0 +1,14 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +/* +Pushes a helm chart to ACR +*/ + +export async function addArguments(helmCli: helmcli): Promise { + helmCli.addArgument("push"); + + helmCli.addArgument(tl.getVariable("helmChartRef")); +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmchartremove.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmchartremove.ts new file mode 100644 index 000000000000..40ae75ed0ab8 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmchartremove.ts @@ -0,0 +1,14 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; + +/* +Removes a helm chart from local + */ + +export async function addArguments(helmCli: helmcli): Promise { + helmCli.addArgument("remove"); + + helmCli.addArgument(tl.getVariable("helmChartRef")); +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmchartsave.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmchartsave.ts new file mode 100644 index 000000000000..4ce85aa70bce --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmchartsave.ts @@ -0,0 +1,18 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; +import * as helmutil from "../utils"; + +/* +Saves a helm chart to local +*/ + +export async function addArguments(helmCli: helmcli): Promise { + helmCli.addArgument("save"); + + var chartPath = tl.getInput("chartPathForACR", true); + helmCli.addArgument(chartPath); + + helmCli.addArgument(helmutil.getHelmPathForACR()); +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helminit.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helminit.ts new file mode 100644 index 000000000000..0ec0f81a0be2 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helminit.ts @@ -0,0 +1,33 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import {addTillerTlsSettings} from "./../tlssetting"; + +export async function addArguments(helmCli: helmcli) : Promise { + var waitForTiller = tl.getBoolInput('waitForExecution', false); + var canaryimage = tl.getBoolInput('canaryimage', false); + var upgradeTiller = tl.getBoolInput('upgradetiller', false); + var argumentsInput = tl.getInput("arguments", false); + var enableTls = tl.getBoolInput("enableTls", false); + + if(canaryimage) { + helmCli.addArgument("--canary-image"); + } + + if(upgradeTiller) { + helmCli.addArgument("--upgrade"); + } + + if(waitForTiller) { + helmCli.addArgument("--wait"); + } + + if(enableTls) { + addTillerTlsSettings(helmCli); + } + + if(argumentsInput) { + helmCli.addArgument(argumentsInput); + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helminstall.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helminstall.ts new file mode 100644 index 000000000000..a3e32faed8cd --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helminstall.ts @@ -0,0 +1,93 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import * as helmutil from "./../utils"; +import { addHelmTlsSettings } from "./../tlssetting"; +import * as semver from 'semver'; + +/*supported chart install +By chart reference: helm install stable/mariadb +By path to a packaged chart: helm install ./nginx-1.2.3.tgz +By path to an unpacked chart directory: helm install ./nginx +By absolute URL: helm install https://example.com/charts/nginx-1.2.3.tgz + +Not supported + +chart reference and repo url: helm install –repo https://example.com/charts/ nginx + + */ + +export async function addArguments(helmCli: helmcli): Promise { + var chartType = tl.getInput("chartType", true); + var releaseName = tl.getInput("releaseName", false); + var overrideValues = tl.getInput("overrideValues", false); + var namespace = tl.getInput("namespace", false); + + var updatedependency = tl.getBoolInput('updatedependency', false); + var waitForExecution = tl.getBoolInput('waitForExecution', false); + var argumentsInput = tl.getInput("arguments", false); + var valueFile = tl.getInput("valueFile", false); + var rootFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var enableTls = tl.getBoolInput("enableTls", false); + var version = tl.getInput('version', false); + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } + + if (valueFile && valueFile != rootFolder) { + helmCli.addArgument("--values"); + helmCli.addArgument("\"" + helmutil.resolvePath(valueFile) + "\""); + } + + if (overrideValues) { + helmCli.addArgument("--set ".concat(helmutil.replaceNewlinesWithCommas(overrideValues))); + } + + if (updatedependency) { + helmCli.addArgument("--dep-up"); + } + + //Version check for Helm, as --name flag with install is no longer supported in Helm 3 + if (helmCli.isHelmV3()) { + if (releaseName) { + helmCli.addArgument(releaseName); + } + else { + helmCli.addArgument('--generate-name'); + } + } + else if (releaseName) { + helmCli.addArgument("--name ".concat(releaseName)); + } + + if (waitForExecution) { + helmCli.addArgument("--wait"); + } + + if (argumentsInput) { + helmCli.addArgument(argumentsInput); + } + + if (enableTls) { + addHelmTlsSettings(helmCli); + } + + if (chartType === "Name") { + var chartName = tl.getInput("chartName", true); + helmCli.addArgument(chartName); + + } + else { + var chartPath = tl.getInput("chartPath", true); + helmCli.addArgument("\"" + helmutil.resolvePath(chartPath) + "\""); + } + + if (version) { + if (semver.valid(version)) + helmCli.addArgument("--version ".concat(version)); + else + console.log("The given version " + version + " is not valid. Running the helm install command with latest version"); + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmpackage.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmpackage.ts new file mode 100644 index 000000000000..2270a717b974 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmpackage.ts @@ -0,0 +1,42 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import * as helmutil from "./../utils"; + +export async function addArguments(helmCli: helmcli): Promise { + + var chart = tl.getInput("chartPath", true); + var version = tl.getInput("version", false); + var updatedependency = tl.getBoolInput('updatedependency', false); + var destination = tl.getInput("destination", false); + var save = tl.getBoolInput('save', false); + var argumentsInput = tl.getInput("arguments", false); + + if (updatedependency) { + helmCli.addArgument("--dependency-update"); + } + + if (save && !helmCli.isHelmV3()) { + helmCli.addArgument("--save "); + } + + if (version) { + helmCli.addArgument("--version ".concat(version)); + } + + if (destination) { + if (!tl.exist(destination)) { + tl.mkdirP(destination); + } + helmCli.addArgument("--destination \"" + destination + "\""); + } + + if (argumentsInput) { + helmCli.addArgument(argumentsInput); + } + + + helmCli.addArgument("\"" + helmutil.resolvePath(chart) + "\""); + +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmregistrylogin.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmregistrylogin.ts new file mode 100644 index 000000000000..7fd7d6c8e664 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmregistrylogin.ts @@ -0,0 +1,39 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "../helmcli"; +import ACRAuthenticationTokenProvider from "azure-pipelines-tasks-docker-common/registryauthenticationprovider/acrauthenticationtokenprovider"; + +/* +Signs into ACR helm registry using service principal +*/ + +export async function addArguments(helmCli: helmcli): Promise { + const acrEndpoint = tl.getInput("azureSubscriptionEndpointForACR"); + const acr = tl.getInput("azureContainerRegistry"); + const authScheme = tl.getEndpointAuthorizationScheme(acrEndpoint, false).toLowerCase() + + let user: string, password: string; + + if (authScheme === "workloadidentityfederation") { + const tokenProvider = new ACRAuthenticationTokenProvider(acrEndpoint, tl.getInput("azureContainerRegistry")); + const token = await tokenProvider.getToken(); + + user = token.getUsername(); + password = token.getPassword(); + + // Set the token as a secret to prevent it from being printed in the logs + tl.setSecret(password); + } + else { + user = tl.getEndpointAuthorizationParameter(acrEndpoint, 'serviceprincipalid', true); + password = tl.getEndpointAuthorizationParameter(acrEndpoint, 'serviceprincipalkey', true); + } + + helmCli.addArgument("login"); + helmCli.addArgument(acr); + helmCli.addArgument("--username"); + helmCli.addArgument(user); + helmCli.addArgument("--password") + helmCli.addArgument(password); +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/helmupgrade.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/helmupgrade.ts new file mode 100644 index 000000000000..6cdaebdcffe8 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/helmupgrade.ts @@ -0,0 +1,91 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import * as helmutil from "./../utils"; +import { addHelmTlsSettings } from "./../tlssetting"; +import * as semver from 'semver'; + +export async function addArguments(helmCli: helmcli): Promise { + var chartType = tl.getInput("chartType", true); + var releaseName = tl.getInput("releaseName", false); + var overrideValues = tl.getInput("overrideValues", false); + var namespace = tl.getInput("namespace", false); + + var waitForExecution = tl.getBoolInput('waitForExecution', false); + var argumentsInput = tl.getInput("arguments", false); + var valueFile = tl.getInput("valueFile", false); + var install = tl.getBoolInput("install", false); + var recreate = tl.getBoolInput("recreate", false); + var resetValues = tl.getBoolInput("resetValues", false); + var force = tl.getBoolInput("force", false); + var enableTls = tl.getBoolInput("enableTls", false); + var rootFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var version = tl.getInput("version", false); + + if (!releaseName) { + var hostType = tl.getVariable("SYSTEM_HOSTTYPE"); + releaseName = (hostType === "build") ? tl.getVariable("BUILD_BUILDNUMBER") : tl.getVariable("RELEASE_RELEASENAME"); + } + + if (namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } + + if (install) { + helmCli.addArgument("--install"); + } + + if (recreate) { + helmCli.addArgument("--recreate-pods"); + } + + if (resetValues) { + helmCli.addArgument("--reset-values"); + } + + if (force) { + helmCli.addArgument("--force"); + } + + if (valueFile && valueFile != rootFolder) { + helmCli.addArgument("--values"); + helmCli.addArgument("\"" + helmutil.resolvePath(valueFile) + "\""); + } + + if (overrideValues) { + helmCli.addArgument("--set ".concat(helmutil.replaceNewlinesWithCommas(overrideValues))); + } + + if (waitForExecution) { + helmCli.addArgument("--wait"); + } + + if (enableTls) { + addHelmTlsSettings(helmCli); + } + + if (argumentsInput) { + helmCli.addArgument(argumentsInput); + } + + if (releaseName) { + helmCli.addArgument(releaseName); + } + + if (chartType === "Name") { + var chartName = tl.getInput("chartName", true); + helmCli.addArgument(chartName); + } + else { + var chartPath = tl.getInput("chartPath", true); + helmCli.addArgument("\"" + helmutil.resolvePath(chartPath) + "\""); + } + + if (version) { + if (semver.valid(version)) + helmCli.addArgument("--version ".concat(version)); + else + tl.debug("The given version " + version + " is not valid. Running the helm upgrade command with latest version"); + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/helmcommands/uinotimplementedcommands.ts b/_generated/HelmDeployV1_Node20/src/helmcommands/uinotimplementedcommands.ts new file mode 100644 index 000000000000..9f9018083e8e --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/helmcommands/uinotimplementedcommands.ts @@ -0,0 +1,23 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./../helmcli"; +import {addHelmTlsSettings} from "./../tlssetting"; + +export async function addArguments(helmCli: helmcli) : Promise { + var namespace = tl.getInput("namespace", false); + var argumentsInput = tl.getInput("arguments", false) + var enableTls = tl.getBoolInput("enableTls", false); + + if(namespace) { + helmCli.addArgument("--namespace ".concat(namespace)); + } + + if(enableTls) { + addHelmTlsSettings(helmCli); + } + + if(argumentsInput) { + helmCli.addArgument(argumentsInput); + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/kubernetescli.ts b/_generated/HelmDeployV1_Node20/src/kubernetescli.ts new file mode 100644 index 000000000000..dc9e69aa4736 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/kubernetescli.ts @@ -0,0 +1,68 @@ +import tl = require('azure-pipelines-task-lib/task'); +import fs = require("fs"); +import * as tr from "azure-pipelines-task-lib/toolrunner"; +import basecommand from "./basecommand" + +const EXIT_CODE_SUCCESS = 0; +const EXIT_CODE_FAILURE = 2; +const namespace = tl.getInput('namespace'); + +export default class kubernetescli extends basecommand { + + private kubeconfigPath: string; + + constructor(kubeconfigPath: string) { + super(true); + this.kubeconfigPath = kubeconfigPath; + } + public getTool(): string { + return "kubectl"; + } + + public login(): void { + process.env["KUBECONFIG"] = this.kubeconfigPath; + } + + public logout(): void { + if (this.kubeconfigPath != null && fs.existsSync(this.kubeconfigPath)) { + delete process.env["KUBECONFIG"]; + fs.unlinkSync(this.kubeconfigPath); + } + } + + public setKubeConfigEnvVariable() { + if (this.kubeconfigPath && fs.existsSync(this.kubeconfigPath)) { + tl.setVariable("KUBECONFIG", this.kubeconfigPath); + tl.setVariable('helmExitCode', EXIT_CODE_SUCCESS.toString()); + } + else { + tl.error(tl.loc('KubernetesServiceConnectionNotFound')); + tl.setVariable('helmExitCode', EXIT_CODE_FAILURE.toString()); + throw new Error(tl.loc('KubernetesServiceConnectionNotFound')); + } + } + + public unsetKubeConfigEnvVariable() { + var kubeConfigPath = tl.getVariable("KUBECONFIG"); + if (kubeConfigPath) { + tl.setVariable("KUBECONFIG", ""); + } + tl.setVariable('helmExitCode', EXIT_CODE_SUCCESS.toString()); + } + + public getAllPods(): tr.IExecSyncResult { + var command = this.createCommand(); + command.arg('get'); + command.arg('pods'); + command.arg(['-o', 'json']); + if (namespace) + command.arg(['--namespace', namespace]); + return this.execCommandSync(command, { silent: true } as tr.IExecOptions); + } + + public getClusterInfo(): tr.IExecSyncResult { + const command = this.createCommand(); + command.arg('cluster-info'); + return this.execCommandSync(command); + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/tlssetting.ts b/_generated/HelmDeployV1_Node20/src/tlssetting.ts new file mode 100644 index 000000000000..6e2a6c9f219e --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/tlssetting.ts @@ -0,0 +1,53 @@ +"use strict"; + +import tl = require('azure-pipelines-task-lib/task'); +import helmcli from "./helmcli"; + +export function addHelmTlsSettings(helmCli: helmcli) : void { + //path to TLS certificate file + var tlsCert = "--tls-cert"; + //path to TLS CA certificate file + var tlsCaCert = "--tls-ca-cert"; + //path to TLS key file + var tlsCertKey = "--tls-key"; + //enable TLS for request + var tls = "--tls" + + addTlsSetting(helmCli, tls, tlsCaCert, tlsCert, tlsCertKey); +} + +export function addTillerTlsSettings(helmCli: helmcli) : void { + var tls = "--tiller-tls"; + var tlsCert = "--tiller-tls-cert"; + var tlsCaCert = "--tls-ca-cert"; + var tlsCertKey= "--tiller-tls-key"; + + addTlsSetting(helmCli, tls, tlsCaCert, tlsCert, tlsCertKey); +} + + +function addTlsSetting(helmCli: helmcli, tlsFlag: string, tlsCaCertFlag: string, tlsCertFlag: string, tlsCertKeyFlag: string ) { + + var caCertFilePath = tl.getTaskVariable('CACERT_FILE_PATH'); + if (!(caCertFilePath && tl.exist(caCertFilePath))) { + throw new Error(tl.loc("FileNotFound", caCertFilePath)); + } + + var certFilePath = tl.getTaskVariable('CERT_FILE_PATH'); + if (!(certFilePath && tl.exist(certFilePath))) { + throw new Error(tl.loc("FileNotFound", certFilePath)); + } + + var keyFilePath = tl.getTaskVariable('KEY_FILE_PATH'); + if (!(keyFilePath && tl.exist(keyFilePath))) { + throw new Error(tl.loc("FileNotFound", keyFilePath)); + } + + helmCli.addArgument(tlsFlag); + helmCli.addArgument(tlsCaCertFlag); + helmCli.addArgument("\""+caCertFilePath+"\""); + helmCli.addArgument(tlsCertFlag); + helmCli.addArgument("\""+certFilePath+"\""); + helmCli.addArgument(tlsCertKeyFlag); + helmCli.addArgument("\""+keyFilePath+"\""); +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/src/utils.ts b/_generated/HelmDeployV1_Node20/src/utils.ts new file mode 100644 index 000000000000..4070b99b1f36 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/src/utils.ts @@ -0,0 +1,106 @@ +"use strict"; + +var fs = require('fs'); +import * as path from "path"; +import * as tl from "azure-pipelines-task-lib/task"; +import * as os from "os"; +import * as yaml from 'js-yaml'; +import * as semver from 'semver'; + +import helmcli from "./helmcli"; + +const matchPatternForReleaseName = new RegExp(/NAME:(.+)/i); +const namespace = tl.getInput('namespace', false); + +export function getTempDirectory(): string { + return tl.getVariable('agent.tempDirectory') || os.tmpdir(); +} + +export function getCurrentTime(): number { + return new Date().getTime(); +} + +export function getTaskTempDir(): string { + var userDir = path.join(getTempDirectory(), "helmTask"); + ensureDirExists(userDir); + + userDir = path.join(userDir, getCurrentTime().toString()); + ensureDirExists(userDir); + + return userDir; +} +export function deleteFile(filepath: string): void { + if (fs.existsSync(filepath)) { + fs.unlinkSync(filepath); + } +} + +export function resolvePath(path: string): string { + if (path.indexOf('*') >= 0 || path.indexOf('?') >= 0) { + tl.debug(tl.loc('PatternFoundInPath', path)); + var rootFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var allPaths = tl.find(rootFolder); + var matchingResultsFiles = tl.match(allPaths, path, rootFolder, { matchBase: true }); + + if (!matchingResultsFiles || matchingResultsFiles.length == 0) { + throw new Error(tl.loc('CantResolvePatternInPath', path)); + } + + return matchingResultsFiles[0]; + } + else { + tl.debug(tl.loc('PatternNotFoundInFilePath', path)); + return path; + } +} + +export function extractReleaseNameFromHelmOutput(output: string) { + const releaseNameMatch = output.match(matchPatternForReleaseName); + if (releaseNameMatch && releaseNameMatch.length >= 1) + return releaseNameMatch[1]; + return ''; +} + +export function getManifestsFromRelease(helmCli: helmcli, releaseName: string): any { + let manifests = []; + if (releaseName.length == 0) + return manifests; + + helmCli.resetArguments(); + helmCli.setCommand('get'); + helmCli.addArgument('manifest'); + helmCli.addArgument(releaseName); + if (namespace) + helmCli.addArgument('--namespace '.concat(namespace)); + + const execResult = helmCli.execHelmCommand(true); + yaml.safeLoadAll(execResult.stdout, (doc) => { + manifests.push(doc); + }); + + return manifests; +} + +function ensureDirExists(dirPath: string): void { + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath); + } +} + +export function getHelmPathForACR() { + const chartName = tl.getInput("chartNameForACR", true); + const acr = tl.getInput("azureContainerRegistry"); + return acr + "/helm/" + chartName; +} + +export function addVersion(helmCli: helmcli, version: string) { + if (semver.valid(version)) + helmCli.addArgument("--version ".concat(version)); + else + console.log("The given version is not valid. Running the helm install command with latest version"); +} + +export function replaceNewlinesWithCommas(overrideValues: string): string { + const keyValuePairs = overrideValues.split("\n").filter(pair => pair); + return keyValuePairs.join(","); +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/task.json b/_generated/HelmDeployV1_Node20/task.json new file mode 100644 index 000000000000..0ba120f2bb10 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/task.json @@ -0,0 +1,579 @@ +{ + "id": "AFA7D54D-537B-4DC8-B60A-E0EEEA2C9A87", + "name": "HelmDeploy", + "friendlyName": "Package and deploy Helm charts", + "description": "Deploy, configure, update a Kubernetes cluster in Azure Container Service by running helm commands", + "helpUrl": "https://aka.ms/azpipes-helm-tsg", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=851275) or [see the Helm documentation](https://helm.sh/docs/)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 242, + "Patch": 1 + }, + "demands": [], + "groups": [ + { + "name": "cluster", + "displayName": "Kubernetes Cluster", + "isExpanded": true, + "visibleRule": "command != logout && command != package && command != save" + }, + { + "name": "commands", + "displayName": "Commands", + "isExpanded": true + }, + { + "name": "azureContainerRegistry", + "displayName": "Azure Container Registry", + "isExpanded": true, + "visibleRule": "command == save" + }, + { + "name": "tls", + "displayName": "TLS", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package && command != save" + }, + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package && command != save" + } + ], + "inputs": [ + { + "name": "connectionType", + "type": "pickList", + "label": "Connection Type", + "defaultValue": "Azure Resource Manager", + "required": true, + "options": { + "Azure Resource Manager": "Azure Resource Manager", + "Kubernetes Service Connection": "Kubernetes Service Connection", + "None": "None" + }, + "helpMarkDown": "Select 'Azure Resource Manager' to connect to an Azure Kubernetes Service by using Azure Service Connection. Select 'Kubernetes Service Connection' to connect to any Kubernetes cluster by using kubeconfig or Service Account", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpoint", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription", + "helpMarkDown": "Select an Azure subscription, which has your Azure Container Registry.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster" + }, + { + "name": "azureResourceGroup", + "label": "Resource group", + "type": "pickList", + "helpMarkDown": "Select an Azure Resource Group.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "kubernetesCluster", + "label": "Kubernetes cluster", + "type": "pickList", + "helpMarkDown": "Select an Azure Managed Cluster.", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "useClusterAdmin", + "type": "boolean", + "label": "Use cluster admin credentials", + "defaultValue": "false", + "visibleRule": "connectionType = Azure Resource Manager", + "groupName": "cluster", + "helpMarkDown": "Use cluster administrator credentials instead of default cluster user credentials." + }, + { + "name": "kubernetesServiceEndpoint", + "aliases": [ + "kubernetesServiceConnection" + ], + "type": "connectedService:kubernetes", + "label": "Kubernetes Service Connection", + "helpMarkDown": "Select a Kubernetes service connection.", + "visibleRule": "connectionType = Kubernetes Service Connection", + "required": true, + "groupName": "cluster" + }, + { + "name": "namespace", + "label": "Namespace", + "type": "string", + "helpMarkDown": "Specify K8 namespace to use. Use Tiller namespace can be specified in the advanced section of the task or by passing the --tiller-namespace option as argument.", + "defaultValue": "", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpointForACR", + "aliases": [ + "azureSubscriptionForACR" + ], + "type": "connectedService:AzureRM", + "label": "Azure subscription for Container Registry", + "helpMarkDown": "Select an Azure subscription, which has your Azure Container Registry.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "azureResourceGroupForACR", + "label": "Resource group", + "type": "pickList", + "helpMarkDown": "Select an Azure Resource Group, which has your Container Registry.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "azureContainerRegistry", + "label": "Azure Container Registry", + "type": "pickList", + "helpMarkDown": "Select an Azure Container Registry which will be used for pushing helm charts.", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "command", + "type": "pickList", + "label": "Command", + "defaultValue": "ls", + "required": true, + "options": { + "create": "create", + "delete": "delete", + "expose": "expose", + "get": "get", + "init": "init", + "install": "install", + "login": "login", + "logout": "logout", + "ls": "ls", + "package": "package", + "rollback": "rollback", + "save": "save", + "upgrade": "upgrade", + "uninstall": "uninstall" + }, + "helpMarkDown": "Select a helm command.", + "groupName": "commands", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "chartType", + "type": "pickList", + "label": "Chart Type", + "required": true, + "options": { + "Name": "Name", + "FilePath": "File Path" + }, + "helpMarkDown": "Select how you want to enter chart info. You can either provide name of the chart or folder/file path to the chart.", + "groupName": "commands", + "visibleRule": "command == install || command == upgrade", + "defaultValue": "Name", + "properties": { + "EditableOptions": "False" + } + }, + { + "name": "chartName", + "label": "Chart Name", + "type": "string", + "helpMarkDown": "Chart reference to install, this can be a url or a chart name. For example, if chart name is 'stable/mysql', the task will run 'helm install stable/mysql'.", + "defaultValue": "", + "visibleRule": "chartType == Name", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPath", + "label": "Chart Path", + "type": "filePath", + "helpMarkDown": "Path to the chart to install. This can be a path to a packaged chart or a path to an unpacked chart directory. For example, if './redis' is specified the task will run 'helm install ./redis'.", + "defaultValue": "", + "visibleRule": "chartType == FilePath || command == package", + "required": "true", + "groupName": "commands" + }, + { + "name": "version", + "label": "Version", + "aliases": [ + "chartVersion" + ], + "type": "string", + "helpMarkDown": "Specify the exact chart version to install. If this is not specified, the latest version is installed. Set the version on the chart to this semver version​", + "defaultValue": "", + "visibleRule": "command == package || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "releaseName", + "label": "Release Name", + "type": "string", + "helpMarkDown": "Release name. If unspecified, it will autogenerate one for you.", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "overrideValues", + "label": "Set Values", + "type": "string", + "helpMarkDown": "Set values on the command line (can specify multiple or separate values with commas or newlines: key1=val1,key2=val2 or
key1=val1
key2=val2
). The task will construct the helm command by using these set values. For example, helm install --set key1=val1 ./redis.", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "valueFile", + "label": "Value File", + "type": "filePath", + "defaultValue": "", + "helpMarkDown": "Specify values in a YAML file or a URL. For example, specifying myvalues.yaml will result in 'helm install --values=myvals.yaml'.", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "destination", + "label": "Destination", + "type": "string", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "helpMarkDown": "Specify values in a YAML file or a URL.", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "canaryimage", + "aliases": [ + "canaryImage" + ], + "type": "boolean", + "label": "Use canary image version.", + "defaultValue": "false", + "helpMarkDown": "Use the canary Tiller image, the latest pre-release version of Tiller.", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "upgradetiller", + "aliases": [ + "upgradeTiller" + ], + "type": "boolean", + "label": "Upgrade Tiller", + "defaultValue": "true", + "helpMarkDown": "Upgrade if Tiller is already installed.", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "updatedependency", + "aliases": [ + "updateDependency" + ], + "type": "boolean", + "label": "Update Dependency", + "defaultValue": "false", + "helpMarkDown": "Run helm dependency update before installing the chart. Update dependencies from 'requirements.yaml' to dir 'charts/' before packaging", + "visibleRule": "command == install || command == package", + "groupName": "commands" + }, + { + "name": "save", + "type": "boolean", + "label": "Save", + "defaultValue": "true", + "helpMarkDown": "Save packaged chart to local chart repository (default true)​", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "install", + "type": "boolean", + "label": "Install if release not present.", + "defaultValue": "true", + "helpMarkDown": "If a release by this name doesn't already exist, run an install​.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "recreate", + "type": "boolean", + "label": "Recreate Pods.", + "defaultValue": "false", + "helpMarkDown": "Performs pods restart for the resource if applicable.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "resetValues", + "type": "boolean", + "label": "Reset Values.", + "defaultValue": "false", + "helpMarkDown": "Reset the values to the ones built into the chart.", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "force", + "type": "boolean", + "label": "Force", + "defaultValue": "false", + "helpMarkDown": "Force resource update through delete/recreate if needed​", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "waitForExecution", + "type": "boolean", + "label": "Wait", + "defaultValue": "true", + "helpMarkDown": "Block till command execution completes.", + "visibleRule": "command == init || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "arguments", + "type": "multiLine", + "properties": { + "resizable": "true", + "rows": "2" + }, + "label": "Arguments", + "helpMarkDown": "Helm command options.", + "groupName": "commands", + "visibleRule": "command != login && command != logout" + }, + { + "name": "enableTls", + "type": "boolean", + "label": "Enable TLS", + "defaultValue": "false", + "helpMarkDown": "Enables using SSL between Helm and Tiller.", + "groupName": "tls" + }, + { + "name": "caCert", + "type": "secureFile", + "label": "CA certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "CA cert used to issue certificate for tiller and helm client.", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "certificate", + "type": "secureFile", + "label": "Certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify Tiller certificate or Helm client certificate", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "privatekey", + "type": "secureFile", + "label": "Key", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify Tiller Key or Helm client key", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "tillernamespace", + "aliases": [ + "tillerNamespace" + ], + "label": "Tiller namespace", + "helpMarkDown": "Specify K8 namespace of tiller.", + "type": "string", + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "Fail on Standard Error", + "defaultValue": "false", + "helpMarkDown": "If this is true, this task will fail if any errors are written to the error pipeline, or if any data is written to the Standard Error stream. Otherwise the task will rely on the exit code to determine failure.", + "groupName": "advanced" + }, + { + "name": "publishPipelineMetadata", + "type": "boolean", + "label": "Publish pipeline metadata", + "defaultValue": "true", + "helpMarkDown": "If this is true, the task will collect and publish deployment metadata", + "groupName": "advanced" + }, + { + "name": "chartNameForACR", + "label": "Chart Name For Azure Container Registry", + "type": "string", + "helpMarkDown": "Chart name with which the chart will be stored in Azure Container Registry.", + "defaultValue": "", + "visibleRule": "command == save", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPathForACR", + "label": "Chart Path for Azure Container Registry", + "type": "filePath", + "helpMarkDown": "Path to the chart directory.", + "defaultValue": "", + "visibleRule": "command == save", + "required": "true", + "groupName": "commands" + } + ], + "dataSourceBindings": [ + { + "target": "kubernetesCluster", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroup)/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{name}}}" + }, + { + "target": "azureResourceGroup", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31&$skiptoken={{{skiptoken}}}", + "callbackContextTemplate": "{\"skiptoken\": \"{{#getTokenValue response.nextLink}}{{extractUrlQueryParameter %24skiptoken}}{{/getTokenValue}}\"}", + "callbackRequiredTemplate": "{{isTokenPresent response.nextLink}}", + "initialContextTemplate": "{\"skiptoken\": \"\"}", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureResourceGroupForACR", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureContainerRegistry", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroupForACR)/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{ \"Value\" : \"{{{properties.loginServer}}}\", \"DisplayValue\" : \"{{{name}}}\" }" + } + ], + "instanceNameFormat": "helm $(command)", + "showEnvironmentVariables": true, + "outputVariables": [ + { + "name": "helmExitCode", + "description": "Exit code emitted from the execution of specified Helm command" + }, + { + "name": "helmOutput", + "description": "Output emitted from the execution of specified Helm command" + } + ], + "prejobexecution": { + "Node16": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//downloadsecurefiles.js" + }, + "Node20_1": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + } + }, + "execution": { + "Node16": { + "target": "src//helm.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//helm.js" + }, + "Node20_1": { + "target": "src//helm.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node16": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//deletesecurefiles.js" + }, + "Node20_1": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + } + }, + "messages": { + "CantDownloadAccessProfile": "Cannot download access profile/kube config file for the cluster %s. Reason %s.", + "KubeConfigFilePath": "Kubeconfig file path: %s", + "KubernetesClusterInfo": "Kubernetes cluster Id : %s, kubernetes server version %s, kuberenettes provision state %s", + "KubernetesClusterResourceGroup": "Kubernetes cluster %s, resource group %s.", + "ClusterNotProvisioned": "Observed that the cluster %s is in %s state.", + "ClusterNotFound": "%s cluster does not exists", + "FailedToListClusters": "Failed to list managed clusters in the subscription. %s", + "RetryingRequest": "Retrying request after %s seconds.", + "PatternNotFoundInFilePath": "Pattern not found in file path %s.", + "CantResolvePatternInPath": "Can not resolve pattern in file path %s.", + "PatternFoundInPath": "Pattern found in file path %s.", + "CouldNotFetchAccessTokenforAzureStatusCode": "Could not fetch access token for Azure. Status code: %s, status message: %s", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "Could not fetch access token for Managed Service Principal. Please configure Managed Service Identity (MSI) for virtual machine 'https://aka.ms/azure-msi-docs'. Status code: %s, status message: %s", + "CouldNotFetchAccessTokenforMSIStatusCode": "Could not fetch access token for Managed Service Principal. Status code: %s, status message: %s", + "SkipDeleteSecureFiles": "TLS not enabled in the Task. Skipping delete of certificates.", + "SkipDownloadSecureFiles": "TLS not enabled in the Task. Skipping download of certificates.", + "FileNotFound": "File not found at %s", + "KubernetesServiceConnectionNotFound": "Kubernetes service connection details not found.", + "ExpiredServicePrincipal": "Could not fetch access token for Azure. Verify if the Service Principal used is valid and not expired.", + "SaveSupportedInHelmsV3Only": "Save chart to Azure Container Registry is only supported in Helms V3.", + "OutputVariableDataSizeExceeded": "Output variable not set as Helm command output exceeded the maximum supported length. Output length: %s, Maximum supported length: %s", + "KubeloginFailed": "Kubelogin authentication failed. Exception: %s" + }, + "_buildConfigMapping": { + "Default": "1.242.0", + "Node20_229_3": "1.242.1" + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/task.loc.json b/_generated/HelmDeployV1_Node20/task.loc.json new file mode 100644 index 000000000000..35dedc0f8612 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/task.loc.json @@ -0,0 +1,579 @@ +{ + "id": "AFA7D54D-537B-4DC8-B60A-E0EEEA2C9A87", + "name": "HelmDeploy", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://aka.ms/azpipes-helm-tsg", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 242, + "Patch": 1 + }, + "demands": [], + "groups": [ + { + "name": "cluster", + "displayName": "ms-resource:loc.group.displayName.cluster", + "isExpanded": true, + "visibleRule": "command != logout && command != package && command != save" + }, + { + "name": "commands", + "displayName": "ms-resource:loc.group.displayName.commands", + "isExpanded": true + }, + { + "name": "azureContainerRegistry", + "displayName": "ms-resource:loc.group.displayName.azureContainerRegistry", + "isExpanded": true, + "visibleRule": "command == save" + }, + { + "name": "tls", + "displayName": "ms-resource:loc.group.displayName.tls", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package && command != save" + }, + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false, + "visibleRule": "command != login && command != logout && command != package && command != save" + } + ], + "inputs": [ + { + "name": "connectionType", + "type": "pickList", + "label": "ms-resource:loc.input.label.connectionType", + "defaultValue": "Azure Resource Manager", + "required": true, + "options": { + "Azure Resource Manager": "Azure Resource Manager", + "Kubernetes Service Connection": "Kubernetes Service Connection", + "None": "None" + }, + "helpMarkDown": "ms-resource:loc.input.help.connectionType", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpoint", + "aliases": [ + "azureSubscription" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.azureSubscriptionEndpoint", + "helpMarkDown": "ms-resource:loc.input.help.azureSubscriptionEndpoint", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster" + }, + { + "name": "azureResourceGroup", + "label": "ms-resource:loc.input.label.azureResourceGroup", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureResourceGroup", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "kubernetesCluster", + "label": "ms-resource:loc.input.label.kubernetesCluster", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.kubernetesCluster", + "visibleRule": "connectionType = Azure Resource Manager", + "defaultValue": "", + "required": true, + "groupName": "cluster", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "useClusterAdmin", + "type": "boolean", + "label": "ms-resource:loc.input.label.useClusterAdmin", + "defaultValue": "false", + "visibleRule": "connectionType = Azure Resource Manager", + "groupName": "cluster", + "helpMarkDown": "ms-resource:loc.input.help.useClusterAdmin" + }, + { + "name": "kubernetesServiceEndpoint", + "aliases": [ + "kubernetesServiceConnection" + ], + "type": "connectedService:kubernetes", + "label": "ms-resource:loc.input.label.kubernetesServiceEndpoint", + "helpMarkDown": "ms-resource:loc.input.help.kubernetesServiceEndpoint", + "visibleRule": "connectionType = Kubernetes Service Connection", + "required": true, + "groupName": "cluster" + }, + { + "name": "namespace", + "label": "ms-resource:loc.input.label.namespace", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.namespace", + "defaultValue": "", + "groupName": "cluster" + }, + { + "name": "azureSubscriptionEndpointForACR", + "aliases": [ + "azureSubscriptionForACR" + ], + "type": "connectedService:AzureRM", + "label": "ms-resource:loc.input.label.azureSubscriptionEndpointForACR", + "helpMarkDown": "ms-resource:loc.input.help.azureSubscriptionEndpointForACR", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "azureResourceGroupForACR", + "label": "ms-resource:loc.input.label.azureResourceGroupForACR", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureResourceGroupForACR", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "azureContainerRegistry", + "label": "ms-resource:loc.input.label.azureContainerRegistry", + "type": "pickList", + "helpMarkDown": "ms-resource:loc.input.help.azureContainerRegistry", + "defaultValue": "", + "required": true, + "groupName": "azureContainerRegistry" + }, + { + "name": "command", + "type": "pickList", + "label": "ms-resource:loc.input.label.command", + "defaultValue": "ls", + "required": true, + "options": { + "create": "create", + "delete": "delete", + "expose": "expose", + "get": "get", + "init": "init", + "install": "install", + "login": "login", + "logout": "logout", + "ls": "ls", + "package": "package", + "rollback": "rollback", + "save": "save", + "upgrade": "upgrade", + "uninstall": "uninstall" + }, + "helpMarkDown": "ms-resource:loc.input.help.command", + "groupName": "commands", + "properties": { + "EditableOptions": "True" + } + }, + { + "name": "chartType", + "type": "pickList", + "label": "ms-resource:loc.input.label.chartType", + "required": true, + "options": { + "Name": "Name", + "FilePath": "File Path" + }, + "helpMarkDown": "ms-resource:loc.input.help.chartType", + "groupName": "commands", + "visibleRule": "command == install || command == upgrade", + "defaultValue": "Name", + "properties": { + "EditableOptions": "False" + } + }, + { + "name": "chartName", + "label": "ms-resource:loc.input.label.chartName", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.chartName", + "defaultValue": "", + "visibleRule": "chartType == Name", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPath", + "label": "ms-resource:loc.input.label.chartPath", + "type": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.chartPath", + "defaultValue": "", + "visibleRule": "chartType == FilePath || command == package", + "required": "true", + "groupName": "commands" + }, + { + "name": "version", + "label": "ms-resource:loc.input.label.version", + "aliases": [ + "chartVersion" + ], + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.version", + "defaultValue": "", + "visibleRule": "command == package || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "releaseName", + "label": "ms-resource:loc.input.label.releaseName", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.releaseName", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "overrideValues", + "label": "ms-resource:loc.input.label.overrideValues", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.overrideValues", + "defaultValue": "", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "valueFile", + "label": "ms-resource:loc.input.label.valueFile", + "type": "filePath", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.valueFile", + "visibleRule": "command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "destination", + "label": "ms-resource:loc.input.label.destination", + "type": "string", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "helpMarkDown": "ms-resource:loc.input.help.destination", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "canaryimage", + "aliases": [ + "canaryImage" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.canaryimage", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.canaryimage", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "upgradetiller", + "aliases": [ + "upgradeTiller" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.upgradetiller", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.upgradetiller", + "visibleRule": "command == init", + "groupName": "commands" + }, + { + "name": "updatedependency", + "aliases": [ + "updateDependency" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.updatedependency", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.updatedependency", + "visibleRule": "command == install || command == package", + "groupName": "commands" + }, + { + "name": "save", + "type": "boolean", + "label": "ms-resource:loc.input.label.save", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.save", + "visibleRule": "command == package", + "groupName": "commands" + }, + { + "name": "install", + "type": "boolean", + "label": "ms-resource:loc.input.label.install", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.install", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "recreate", + "type": "boolean", + "label": "ms-resource:loc.input.label.recreate", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.recreate", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "resetValues", + "type": "boolean", + "label": "ms-resource:loc.input.label.resetValues", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.resetValues", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "force", + "type": "boolean", + "label": "ms-resource:loc.input.label.force", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.force", + "visibleRule": "command == upgrade", + "groupName": "commands" + }, + { + "name": "waitForExecution", + "type": "boolean", + "label": "ms-resource:loc.input.label.waitForExecution", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.waitForExecution", + "visibleRule": "command == init || command == install || command == upgrade", + "groupName": "commands" + }, + { + "name": "arguments", + "type": "multiLine", + "properties": { + "resizable": "true", + "rows": "2" + }, + "label": "ms-resource:loc.input.label.arguments", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "groupName": "commands", + "visibleRule": "command != login && command != logout" + }, + { + "name": "enableTls", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableTls", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.enableTls", + "groupName": "tls" + }, + { + "name": "caCert", + "type": "secureFile", + "label": "ms-resource:loc.input.label.caCert", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.caCert", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "certificate", + "type": "secureFile", + "label": "ms-resource:loc.input.label.certificate", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.certificate", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "privatekey", + "type": "secureFile", + "label": "ms-resource:loc.input.label.privatekey", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.privatekey", + "visibleRule": "enableTls == true", + "groupName": "tls" + }, + { + "name": "tillernamespace", + "aliases": [ + "tillerNamespace" + ], + "label": "ms-resource:loc.input.label.tillernamespace", + "helpMarkDown": "ms-resource:loc.input.help.tillernamespace", + "type": "string", + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnStderr", + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.failOnStderr", + "groupName": "advanced" + }, + { + "name": "publishPipelineMetadata", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishPipelineMetadata", + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.publishPipelineMetadata", + "groupName": "advanced" + }, + { + "name": "chartNameForACR", + "label": "ms-resource:loc.input.label.chartNameForACR", + "type": "string", + "helpMarkDown": "ms-resource:loc.input.help.chartNameForACR", + "defaultValue": "", + "visibleRule": "command == save", + "required": "true", + "groupName": "commands" + }, + { + "name": "chartPathForACR", + "label": "ms-resource:loc.input.label.chartPathForACR", + "type": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.chartPathForACR", + "defaultValue": "", + "visibleRule": "command == save", + "required": "true", + "groupName": "commands" + } + ], + "dataSourceBindings": [ + { + "target": "kubernetesCluster", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroup)/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{name}}}" + }, + { + "target": "azureResourceGroup", + "endpointId": "$(azureSubscriptionEndpoint)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31&$skiptoken={{{skiptoken}}}", + "callbackContextTemplate": "{\"skiptoken\": \"{{#getTokenValue response.nextLink}}{{extractUrlQueryParameter %24skiptoken}}{{/getTokenValue}}\"}", + "callbackRequiredTemplate": "{{isTokenPresent response.nextLink}}", + "initialContextTemplate": "{\"skiptoken\": \"\"}", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureResourceGroupForACR", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/providers/Microsoft.ContainerService/managedClusters?api-version=2017-08-31", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{{{ #extractResource id resourcegroups}}}" + }, + { + "target": "azureContainerRegistry", + "endpointId": "$(azureSubscriptionEndpointForACR)", + "endpointUrl": "{{{endpoint.url}}}/subscriptions/{{{endpoint.subscriptionId}}}/resourceGroups/$(azureResourceGroupForACR)/providers/Microsoft.ContainerRegistry/registries?api-version=2019-05-01", + "resultSelector": "jsonpath:$.value[*]", + "resultTemplate": "{ \"Value\" : \"{{{properties.loginServer}}}\", \"DisplayValue\" : \"{{{name}}}\" }" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "showEnvironmentVariables": true, + "outputVariables": [ + { + "name": "helmExitCode", + "description": "Exit code emitted from the execution of specified Helm command" + }, + { + "name": "helmOutput", + "description": "Output emitted from the execution of specified Helm command" + } + ], + "prejobexecution": { + "Node16": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//downloadsecurefiles.js" + }, + "Node20_1": { + "target": "src//downloadsecurefiles.js", + "argumentFormat": "" + } + }, + "execution": { + "Node16": { + "target": "src//helm.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//helm.js" + }, + "Node20_1": { + "target": "src//helm.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node16": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + }, + "Node10": { + "target": "src//deletesecurefiles.js" + }, + "Node20_1": { + "target": "src//deletesecurefiles.js", + "argumentFormat": "" + } + }, + "messages": { + "CantDownloadAccessProfile": "ms-resource:loc.messages.CantDownloadAccessProfile", + "KubeConfigFilePath": "ms-resource:loc.messages.KubeConfigFilePath", + "KubernetesClusterInfo": "ms-resource:loc.messages.KubernetesClusterInfo", + "KubernetesClusterResourceGroup": "ms-resource:loc.messages.KubernetesClusterResourceGroup", + "ClusterNotProvisioned": "ms-resource:loc.messages.ClusterNotProvisioned", + "ClusterNotFound": "ms-resource:loc.messages.ClusterNotFound", + "FailedToListClusters": "ms-resource:loc.messages.FailedToListClusters", + "RetryingRequest": "ms-resource:loc.messages.RetryingRequest", + "PatternNotFoundInFilePath": "ms-resource:loc.messages.PatternNotFoundInFilePath", + "CantResolvePatternInPath": "ms-resource:loc.messages.CantResolvePatternInPath", + "PatternFoundInPath": "ms-resource:loc.messages.PatternFoundInPath", + "CouldNotFetchAccessTokenforAzureStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforAzureStatusCode", + "CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIDueToMSINotConfiguredProperlyStatusCode", + "CouldNotFetchAccessTokenforMSIStatusCode": "ms-resource:loc.messages.CouldNotFetchAccessTokenforMSIStatusCode", + "SkipDeleteSecureFiles": "ms-resource:loc.messages.SkipDeleteSecureFiles", + "SkipDownloadSecureFiles": "ms-resource:loc.messages.SkipDownloadSecureFiles", + "FileNotFound": "ms-resource:loc.messages.FileNotFound", + "KubernetesServiceConnectionNotFound": "ms-resource:loc.messages.KubernetesServiceConnectionNotFound", + "ExpiredServicePrincipal": "ms-resource:loc.messages.ExpiredServicePrincipal", + "SaveSupportedInHelmsV3Only": "ms-resource:loc.messages.SaveSupportedInHelmsV3Only", + "OutputVariableDataSizeExceeded": "ms-resource:loc.messages.OutputVariableDataSizeExceeded", + "KubeloginFailed": "ms-resource:loc.messages.KubeloginFailed" + }, + "_buildConfigMapping": { + "Default": "1.242.0", + "Node20_229_3": "1.242.1" + } +} \ No newline at end of file diff --git a/_generated/HelmDeployV1_Node20/tsconfig.json b/_generated/HelmDeployV1_Node20/tsconfig.json new file mode 100644 index 000000000000..79a868c8d1e3 --- /dev/null +++ b/_generated/HelmDeployV1_Node20/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/make-options.json b/make-options.json index ff6b47a48536..733484f70dff 100644 --- a/make-options.json +++ b/make-options.json @@ -110,6 +110,7 @@ "GulpV0", "GulpV1", "HelmDeployV0", + "HelmDeployV1", "HelmInstallerV0", "HelmInstallerV1", "IISWebAppDeployment", @@ -341,6 +342,7 @@ "GoV0", "GoToolV0", "HelmDeployV0", + "HelmDeployV1", "HelmInstallerV0", "HelmInstallerV1", "IISWebAppDeploymentOnMachineGroupV0",