Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions charts/ui/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ spec:
value: https://{{ include "unikorn.application.host" . }}
- name: PUBLIC_COMPUTE_HOST
value: https://{{ include "unikorn.compute.host" . }}
- name: PUBLIC_FEATURE_OBSERVABILITY_AGENT
value: {{ ternary "true" "false" .Values.features.observabilityAgent | quote }}
{{- if .Values.tls.private }}
- name: NODE_EXTRA_CA_CERTS
value: /var/run/secrets/unikorn-cloud.org/ca.crt
Expand Down
3 changes: 3 additions & 0 deletions charts/ui/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ compute:
# The API's hostname.
host: compute.unikorn-cloud.org

features:
observabilityAgent: false

oauth2:
# The client identifier assigned to this application.
clientID: 3fc34852-9186-4884-b580-78bf4bcf628a
Expand Down
2 changes: 1 addition & 1 deletion src/lib/layouts/ShellMetadataSection.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
/>
<TextInput
bind:value={metadata.description}
label="Resource decription."
label="Resource description."
hint="This is optional but may add more verbose information about the resource."
/>
</ShellSection>
1 change: 1 addition & 0 deletions src/lib/openapi/kubernetes/.openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ models/KubernetesClusterAutoUpgrade.ts
models/KubernetesClusterAutoUpgradeDaysOfWeek.ts
models/KubernetesClusterAutoUpgradeWindow.ts
models/KubernetesClusterAutoscaling.ts
models/KubernetesClusterFeatures.ts
models/KubernetesClusterNetwork.ts
models/KubernetesClusterRead.ts
models/KubernetesClusterSpec.ts
Expand Down
66 changes: 66 additions & 0 deletions src/lib/openapi/kubernetes/models/KubernetesClusterFeatures.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/* tslint:disable */
/* eslint-disable */
/**
* Kubernetes Service API
* The Kubernetes Service API provides services that allows provisioning and life cycle management of Kubernetes clusters.
*
* The version of the OpenAPI document: 1.6.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/

import { exists, mapValues } from '../runtime';
/**
* Kubernetes cluster features configuration.
* @export
* @interface KubernetesClusterFeatures
*/
export interface KubernetesClusterFeatures {
/**
* Enables the provision of the observability agent add-on.
* This deploys telemetry collectors for forwarding cluster observability data.
* @type {boolean}
* @memberof KubernetesClusterFeatures
*/
observabilityAgent?: boolean;
}

/**
* Check if a given object implements the KubernetesClusterFeatures interface.
*/
export function instanceOfKubernetesClusterFeatures(value: object): boolean {
let isInstance = true;

return isInstance;
}

export function KubernetesClusterFeaturesFromJSON(json: any): KubernetesClusterFeatures {
return KubernetesClusterFeaturesFromJSONTyped(json, false);
}

export function KubernetesClusterFeaturesFromJSONTyped(json: any, ignoreDiscriminator: boolean): KubernetesClusterFeatures {
if ((json === undefined) || (json === null)) {
return json;
}
return {

'observabilityAgent': !exists(json, 'observabilityAgent') ? undefined : json['observabilityAgent'],
};
}

export function KubernetesClusterFeaturesToJSON(value?: KubernetesClusterFeatures | null): any {
if (value === undefined) {
return undefined;
}
if (value === null) {
return null;
}
return {

'observabilityAgent': value.observabilityAgent,
};
}

14 changes: 14 additions & 0 deletions src/lib/openapi/kubernetes/models/KubernetesClusterSpec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ import {
KubernetesClusterAutoUpgradeFromJSONTyped,
KubernetesClusterAutoUpgradeToJSON,
} from './KubernetesClusterAutoUpgrade';
import type { KubernetesClusterFeatures } from './KubernetesClusterFeatures';
import {
KubernetesClusterFeaturesFromJSON,
KubernetesClusterFeaturesFromJSONTyped,
KubernetesClusterFeaturesToJSON,
} from './KubernetesClusterFeatures';
import type { KubernetesClusterNetwork } from './KubernetesClusterNetwork';
import {
KubernetesClusterNetworkFromJSON,
Expand Down Expand Up @@ -93,6 +99,12 @@ export interface KubernetesClusterSpec {
* @memberof KubernetesClusterSpec
*/
networking?: KubernetesClusterNetwork;
/**
*
* @type {KubernetesClusterFeatures}
* @memberof KubernetesClusterSpec
*/
features?: KubernetesClusterFeatures;
}

/**
Expand Down Expand Up @@ -125,6 +137,7 @@ export function KubernetesClusterSpecFromJSONTyped(json: any, ignoreDiscriminato
'workloadPools': ((json['workloadPools'] as Array<any>).map(KubernetesClusterWorkloadPoolFromJSON)),
'api': !exists(json, 'api') ? undefined : KubernetesClusterAPIFromJSON(json['api']),
'networking': !exists(json, 'networking') ? undefined : KubernetesClusterNetworkFromJSON(json['networking']),
'features': !exists(json, 'features') ? undefined : KubernetesClusterFeaturesFromJSON(json['features']),
};
}

Expand All @@ -145,6 +158,7 @@ export function KubernetesClusterSpecToJSON(value?: KubernetesClusterSpec | null
'workloadPools': ((value.workloadPools as Array<any>).map(KubernetesClusterWorkloadPoolToJSON)),
'api': KubernetesClusterAPIToJSON(value.api),
'networking': KubernetesClusterNetworkToJSON(value.networking),
'features': KubernetesClusterFeaturesToJSON(value.features),
};
}

1 change: 1 addition & 0 deletions src/lib/openapi/kubernetes/models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export * from './KubernetesClusterAutoUpgrade';
export * from './KubernetesClusterAutoUpgradeDaysOfWeek';
export * from './KubernetesClusterAutoUpgradeWindow';
export * from './KubernetesClusterAutoscaling';
export * from './KubernetesClusterFeatures';
export * from './KubernetesClusterNetwork';
export * from './KubernetesClusterRead';
export * from './KubernetesClusterSpec';
Expand Down
46 changes: 46 additions & 0 deletions src/routes/(shell)/kubernetes/clusters/create/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import * as Clients from '$lib/clients';
import * as Kubernetes from '$lib/openapi/kubernetes';

import { env as publicEnv } from '$env/dynamic/public';
import type { ShellPageSettings } from '$lib/layouts/types.ts';
import ShellPageHeader from '$lib/layouts/ShellPageHeader.svelte';
import ShellMetadataSection from '$lib/layouts/ShellMetadataSection.svelte';
Expand All @@ -20,6 +21,19 @@
import KubernetesWorkloadPool from '$lib/KubernetesWorkloadPool.svelte';
import Flavor from '$lib/Flavor.svelte';

type KubernetesClusterFeaturesUI = Kubernetes.KubernetesClusterFeatures & {
autoscaling?: boolean;
gpuOperator?: boolean;
};

const DEFAULT_CLUSTER_FEATURES: KubernetesClusterFeaturesUI = {
autoscaling: true,
gpuOperator: true,
observabilityAgent: false
};

const enableObservabilityAgent = publicEnv.PUBLIC_FEATURE_OBSERVABILITY_AGENT === 'true';

const settings: ShellPageSettings = {
feature: 'Infrastructure',
name: 'Create Kubernetes Cluster',
Expand All @@ -45,6 +59,7 @@
spec: {
regionId: data.regionID,
version: versions[0],
features: { ...DEFAULT_CLUSTER_FEATURES },
autoUpgrade: {
enabled: true
},
Expand All @@ -62,6 +77,20 @@
}
});

function clusterFeatures(): KubernetesClusterFeaturesUI {
if (!resource.spec.features) {
resource.spec.features = { ...DEFAULT_CLUSTER_FEATURES };
}

return resource.spec.features as KubernetesClusterFeaturesUI;
}

function observabilityAgentChange(e: { checked: boolean }) {
const features = clusterFeatures();

features.observabilityAgent = e.checked;
}

function autoUpgradeChange(e: { checked: boolean }) {
if (!resource.spec.autoUpgrade) {
resource.spec.autoUpgrade = { enabled: e.checked };
Expand Down Expand Up @@ -320,6 +349,23 @@
{:else if index === 2}
<h2 class="h2">Advanced Options</h2>

{#if enableObservabilityAgent}
<ShellSection title="Observability Agent">
<p>
Install the observability agent to collect Kubernetes metrics and telemetry and forward
them to your observability stack.
</p>

<Switch
name="observability-agent"
label="Deploy observability agent"
hint="Installs telemetry collectors in the cluster."
initial={Boolean(resource.spec.features?.observabilityAgent)}
onCheckedChange={observabilityAgentChange}
/>
</ShellSection>
{/if}

<ShellSection title="Auto Upgrade">
<p>
Kubernetes clusters are provisioned using pre-defined bundles of applications. These are
Expand Down
52 changes: 52 additions & 0 deletions src/routes/(shell)/kubernetes/clusters/view/[id]/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

let { data }: { data: PageData } = $props();

import { env as publicEnv } from '$env/dynamic/public';
import * as Clients from '$lib/clients';
import * as Kubernetes from '$lib/openapi/kubernetes';
import * as RegionUtil from '$lib/regionutil';
Expand All @@ -21,6 +22,19 @@
import KubernetesWorkloadPool from '$lib/KubernetesWorkloadPool.svelte';
import Flavor from '$lib/Flavor.svelte';

type KubernetesClusterFeaturesUI = Kubernetes.KubernetesClusterFeatures & {
autoscaling?: boolean;
gpuOperator?: boolean;
};

const DEFAULT_CLUSTER_FEATURES: KubernetesClusterFeaturesUI = {
autoscaling: true,
gpuOperator: true,
observabilityAgent: false
};

const enableObservabilityAgent = publicEnv.PUBLIC_FEATURE_OBSERVABILITY_AGENT === 'true';

const settings: ShellPageSettings = {
feature: 'Infrastructure',
name: 'View/update Kubernetes Cluster',
Expand All @@ -34,9 +48,24 @@
return cluster;
});

function clusterFeatures(): KubernetesClusterFeaturesUI {
if (!cluster.spec.features) {
cluster.spec.features = { ...DEFAULT_CLUSTER_FEATURES };
} else {
cluster.spec.features = {
...DEFAULT_CLUSTER_FEATURES,
...cluster.spec.features
} as KubernetesClusterFeaturesUI;
}

return cluster.spec.features as KubernetesClusterFeaturesUI;
}

$effect.pre(() => {
if (!cluster) return;

clusterFeatures();

// Upgrade legacy clusters...
if (!cluster.spec.autoUpgrade) {
cluster.spec.autoUpgrade = {
Expand All @@ -50,6 +79,12 @@
.sort()
.reverse();

function observabilityAgentChange(e: { checked: boolean }) {
const features = clusterFeatures();

features.observabilityAgent = e.checked;
}

function autoUpgradeChange(e: { checked: boolean }) {
if (!cluster.spec.autoUpgrade) {
cluster.spec.autoUpgrade = { enabled: e.checked };
Expand Down Expand Up @@ -321,6 +356,23 @@
{:else if index === 2}
<h2 class="h2">Advanced Options</h2>

{#if enableObservabilityAgent}
<ShellSection title="Observability Agent">
<p>
Install the observability agent to collect Kubernetes metrics and telemetry and forward
them to your observability stack.
</p>

<Switch
name="observability-agent"
label="Deploy observability agent"
hint="Installs telemetry collectors in the cluster."
initial={Boolean($state.snapshot(cluster.spec.features?.observabilityAgent))}
onCheckedChange={observabilityAgentChange}
/>
</ShellSection>
{/if}

<ShellSection title="Auto Upgrade">
<p>
Kubernetes clusters are provisioned using pre-defined bundles of applications. These are
Expand Down