1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

wip: catalog helm repos

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
This commit is contained in:
Jari Kolehmainen 2021-07-14 13:39:48 +03:00
parent 538c6c2013
commit 6ae42af9ff
11 changed files with 209 additions and 5 deletions

View File

@ -0,0 +1,83 @@
/**
* Copyright (c) 2021 OpenLens Authors
*
* 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.
*/
import { CatalogCategory, CatalogEntity, CatalogEntityContextMenuContext, CatalogEntityMetadata, CatalogEntityStatus } from "../catalog";
import { catalogCategoryRegistry } from "../catalog/catalog-category-registry";
export interface HelmRepositoryStatus extends CatalogEntityStatus {
phase: "available" | "unavailable";
}
export type HelmRepositorySpec = {
url: string;
id?: string;
digest?: string;
cacheFilePath?: string
caFile?: string,
certFile?: string,
insecureSkipTlsVerify?: boolean,
keyFile?: string,
username?: string,
password?: string,
icon?: {
src: string
}
};
export class HelmRepository extends CatalogEntity<CatalogEntityMetadata, HelmRepositoryStatus, HelmRepositorySpec> {
public readonly apiVersion = "entity.k8slens.dev/v1alpha1";
public readonly kind = "HelmRepository";
async onRun() {
window.open(this.spec.url, "_blank");
}
public onSettingsOpen(): void {
return;
}
async onContextMenuOpen(context: CatalogEntityContextMenuContext) {
// todo
}
}
export class HelmRepositoryCategory extends CatalogCategory {
public readonly apiVersion = "catalog.k8slens.dev/v1alpha1";
public readonly kind = "CatalogCategory";
public metadata = {
name: "Helm Repositories",
icon: "apps"
};
public spec = {
group: "entity.k8slens.dev",
versions: [
{
name: "v1alpha1",
entityClass: HelmRepository
}
],
names: {
kind: "HelmRepository"
}
};
}
catalogCategoryRegistry.add(new HelmRepositoryCategory());

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -22,3 +22,4 @@
export * from "./general";
export * from "./kubernetes-cluster";
export * from "./web-link";
export * from "./helm-repository";

View File

@ -59,6 +59,8 @@ export type KubernetesClusterStatusPhase = "connected" | "connecting" | "disconn
export interface KubernetesClusterStatus extends CatalogEntityStatus {
phase: KubernetesClusterStatusPhase;
clusterVersion?: string;
clientVersion?: string;
}
export class KubernetesCluster extends CatalogEntity<CatalogEntityMetadata, KubernetesClusterStatus, KubernetesClusterSpec> {

View File

@ -0,0 +1,62 @@
/**
* Copyright (c) 2021 OpenLens Authors
*
* 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.
*/
import { observable } from "mobx";
import { HelmRepository } from "../../common/catalog-entities";
import { catalogEntityRegistry } from "../catalog";
import { HelmRepoManager } from "../helm/helm-repo-manager";
export function syncHelmRepositories() {
const repos = observable.array([]);
setTimeout(() => {
HelmRepoManager.loadAvailableRepos().then((helmRepos) => {
repos.replace(helmRepos.map((helmRepo) => {
const labels: Record<string, string> = {};
if (helmRepo.verifiedPublisher) {
labels["verified-publisher"] = "true";
}
if (helmRepo.official) {
labels["official"] = "true";
}
return new HelmRepository({
metadata: {
uid: helmRepo.id || helmRepo.url,
name: helmRepo.name,
source: "ArtifactHub.io",
labels
},
spec: {
...helmRepo
},
status: {
phase: "available"
}
});
}));
});
}, 5000);
catalogEntityRegistry.addObservableSource("helm-repositories", repos);
}

View File

@ -22,3 +22,4 @@
export { syncWeblinks } from "./weblinks";
export { KubeconfigSyncManager } from "./kubeconfig-sync";
export { syncGeneralEntities } from "./general";
export { syncHelmRepositories } from "./helm-repositories";

View File

@ -40,6 +40,8 @@ export interface HelmRepoConfig {
export interface HelmRepo {
name: string;
url: string;
id?: string;
digest?: string;
cacheFilePath?: string
caFile?: string,
certFile?: string,
@ -47,6 +49,9 @@ export interface HelmRepo {
keyFile?: string,
username?: string,
password?: string,
verifiedPublisher?: boolean,
official?: boolean,
lastScanned?: number
}
export class HelmRepoManager extends Singleton {
@ -64,7 +69,21 @@ export class HelmRepoManager extends Singleton {
timeout: 10000,
});
return orderBy<HelmRepo>(res.body, repo => repo.name);
const repos = res.body.map((repo: any) => {
const helmRepo: HelmRepo = {
id: repo.repository_id,
name: repo.name,
url: repo.url,
digest: repo.digest,
verifiedPublisher: repo.verified_publisher,
official: repo.official,
lastScanned: repo.last_scanned_ts
};
return helmRepo;
});
return orderBy<HelmRepo>(repos, repo => repo.name);
}
private async init() {

View File

@ -48,7 +48,7 @@ import { IpcRendererNavigationEvents } from "../renderer/navigation/events";
import { pushCatalogToRenderer } from "./catalog-pusher";
import { catalogEntityRegistry } from "./catalog";
import { HelmRepoManager } from "./helm/helm-repo-manager";
import { syncGeneralEntities, syncWeblinks, KubeconfigSyncManager } from "./catalog-sources";
import { syncGeneralEntities, syncWeblinks, KubeconfigSyncManager, syncHelmRepositories } from "./catalog-sources";
import { handleWsUpgrade } from "./proxy/ws-upgrade";
import configurePackages from "../common/configure-packages";
import { PrometheusProviderRegistry } from "./prometheus";
@ -152,9 +152,6 @@ app.on("ready", async () => {
ExtensionsStore.createInstance();
FilesystemProvisionerStore.createInstance();
WeblinkStore.createInstance();
syncWeblinks();
HelmRepoManager.createInstance(); // create the instance
const lensProxy = LensProxy.createInstance(
@ -195,6 +192,9 @@ app.on("ready", async () => {
ExtensionLoader.createInstance().init();
extensionDiscovery.init();
syncHelmRepositories();
syncWeblinks();
// Start the app without showing the main window when auto starting on login
// (On Windows and Linux, we get a flag. On MacOS, we get special API.)
const startHidden = process.argv.includes("--hidden") || (isMac && app.getLoginItemSettings().wasOpenedAsHidden);

View File

@ -20,6 +20,7 @@
*/
import React from "react";
import "../../common/catalog-entities/helm-repository";
import { WebLinkCategory } from "../../common/catalog-entities";
import { WeblinkAddCommand } from "../components/catalog-entities/weblink-add-command";
import { CommandOverlay } from "../components/command-palette";

View File

@ -0,0 +1,33 @@
/**
* Copyright (c) 2021 OpenLens Authors
*
* 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.
*/
import { CatalogEntityDetailRegistry } from "../../extensions/registries";
import { ConnectionDetails } from "../components/cluster-details/connection-details";
export function initEntityDetailsRegistry() {
CatalogEntityDetailRegistry.getInstance().add({
kind: "KubernetesCluster",
apiVersions: ["entity.k8slens.dev/v1alpha1"],
components: {
Details: ConnectionDetails
}
});
}

View File

@ -21,6 +21,7 @@
export * from "./command-registry";
export * from "./entity-settings-registry";
export * from "./entity-details-registry";
export * from "./kube-object-detail-registry";
export * from "./kube-object-menu-registry";
export * from "./registries";