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: 1 addition & 1 deletion .github/workflows/tests-deploy-k8s-clusterip.yml
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ jobs:
run: |
./occ app_api:daemon:register \
k8s_test "K8s Test" "kubernetes-install" "http" "${{ env.NODE_IP }}:8780" "http://${{ env.NODE_IP }}" \
--harp --harp_shared_key "${{ env.HP_SHARED_KEY }}" --harp_frp_address "${{ env.NODE_IP }}:8782" \
--harp --harp_shared_key "${{ env.HP_SHARED_KEY }}" \
--k8s --k8s_expose_type=clusterip --set-default
./occ app_api:daemon:list

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/tests-deploy-k8s-loadbalancer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ jobs:
run: |
./occ app_api:daemon:register \
k8s_test "K8s Test" "kubernetes-install" "http" "${{ env.NODE_IP }}:8780" "http://${{ env.NODE_IP }}" \
--harp --harp_shared_key "${{ env.HP_SHARED_KEY }}" --harp_frp_address "${{ env.NODE_IP }}:8782" \
--harp --harp_shared_key "${{ env.HP_SHARED_KEY }}" \
--k8s --k8s_expose_type=loadbalancer --set-default
./occ app_api:daemon:list

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/tests-deploy-k8s-manual.yml
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ jobs:
run: |
./occ app_api:daemon:register \
k8s_test "K8s Test" "kubernetes-install" "http" "${{ env.NODE_IP }}:8780" "http://${{ env.NODE_IP }}" \
--harp --harp_shared_key "${{ env.HP_SHARED_KEY }}" --harp_frp_address "${{ env.NODE_IP }}:8782" \
--harp --harp_shared_key "${{ env.HP_SHARED_KEY }}" \
--k8s --k8s_expose_type=manual --k8s_upstream_host=${{ env.MANUAL_CLUSTER_IP }} --set-default
./occ app_api:daemon:list

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/tests-deploy-k8s.yml
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ jobs:
run: |
./occ app_api:daemon:register \
k8s_test "K8s Test" "kubernetes-install" "http" "${{ env.NODE_IP }}:8780" "http://${{ env.NODE_IP }}" \
--harp --harp_shared_key "${{ env.HP_SHARED_KEY }}" --harp_frp_address "${{ env.NODE_IP }}:8782" \
--harp --harp_shared_key "${{ env.HP_SHARED_KEY }}" \
--k8s --k8s_expose_type=nodeport --set-default
./occ app_api:daemon:list

Expand Down
2 changes: 1 addition & 1 deletion js/app_api-adminSettings.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/app_api-adminSettings.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion lib/Command/Daemon/ListDaemons.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$daemon->getHost(),
$deployConfig['nextcloud_url'],
isset($deployConfig['harp']) ? 'yes' : 'no',
$deployConfig['harp']['frp_address'] ?? '(none)',
($deployConfig['harp']['frp_address'] ?? null) ?: '(none)',
$deployConfig['harp']['docker_socket_port'] ?? '(none)',
];
}
Expand Down
10 changes: 5 additions & 5 deletions lib/Command/Daemon/RegisterDaemon.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ protected function configure(): void {
$this->addOption('compute_device', null, InputOption::VALUE_REQUIRED, 'Computation device for GPU support (cpu|cuda|rocm)');
$this->addOption('set-default', null, InputOption::VALUE_NONE, 'Set DaemonConfig as default');
$this->addOption('harp', null, InputOption::VALUE_NONE, 'Set the daemon to use HaRP for all Docker and ExApp communication');
$this->addOption('harp_frp_address', null, InputOption::VALUE_REQUIRED, '[host]:[port] of the HaRP FRP server, the default host is same as the HaRP host, port is 8782');
$this->addOption('harp_frp_address', null, InputOption::VALUE_REQUIRED, '[host]:[port] of the HaRP FRP server (not required for K8s daemons). Default: same as HaRP host, port 8782');
$this->addOption('harp_shared_key', null, InputOption::VALUE_REQUIRED, 'HaRP shared key for secure communication between HaRP and AppAPI');
$this->addOption('harp_docker_socket_port', null, InputOption::VALUE_REQUIRED, '\'remotePort\' of the FRP client of the remote Docker socket proxy. There is one included in the harp container so this can be skipped for default setups.', '24000');
$this->addOption('harp_exapp_direct', null, InputOption::VALUE_NONE, 'Flag for the advanced setups only. Disables the FRP tunnel between ExApps and HaRP.');
Expand All @@ -68,9 +68,9 @@ protected function configure(): void {
$this->addUsage('local_docker "Docker Local" "docker-install" "http" "/var/run/docker.sock" "http://nextcloud.local" --net=nextcloud --set-default --compute_device=cuda');

// Kubernetes usage examples
$this->addUsage('k8s_daemon "Kubernetes HaRP" "kubernetes-install" "http" "harp.nextcloud.svc:8780" "http://nextcloud.local" --harp --harp_shared_key "secret" --harp_frp_address "harp.nextcloud.svc:8782" --k8s');
$this->addUsage('k8s_daemon_nodeport "K8s NodePort" "kubernetes-install" "http" "harp.example.com:8780" "http://nextcloud.local" --harp --harp_shared_key "secret" --harp_frp_address "harp.example.com:8782" --k8s --k8s_expose_type=nodeport --k8s_upstream_host="k8s-node.example.com"');
$this->addUsage('k8s_daemon_lb "K8s LoadBalancer" "kubernetes-install" "http" "harp.example.com:8780" "http://nextcloud.local" --harp --harp_shared_key "secret" --harp_frp_address "harp.example.com:8782" --k8s --k8s_expose_type=loadbalancer');
$this->addUsage('k8s_daemon "Kubernetes HaRP" "kubernetes-install" "http" "harp.nextcloud.svc:8780" "http://nextcloud.local" --harp --harp_shared_key "secret" --k8s');
$this->addUsage('k8s_daemon_nodeport "K8s NodePort" "kubernetes-install" "http" "harp.example.com:8780" "http://nextcloud.local" --harp --harp_shared_key "secret" --k8s --k8s_expose_type=nodeport --k8s_upstream_host="k8s-node.example.com"');
$this->addUsage('k8s_daemon_lb "K8s LoadBalancer" "kubernetes-install" "http" "harp.example.com:8780" "http://nextcloud.local" --harp --harp_shared_key "secret" --k8s --k8s_expose_type=loadbalancer');
}

protected function execute(InputInterface $input, OutputInterface $output): int {
Expand All @@ -91,7 +91,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$output->writeln('Value error: HaRP enabled daemon requires `harp_shared_key` option.');
return 1;
}
if ($isHarp && !$input->getOption('harp_frp_address')) {
if ($isHarp && !$isK8s && !$input->getOption('harp_frp_address')) {
$output->writeln('Value error: HaRP enabled daemon requires `harp_frp_address` option.');
return 1;
}
Expand Down
24 changes: 23 additions & 1 deletion src/components/DaemonConfig/DaemonConfigDetailsModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,37 @@
{{ t('app_api', 'The "Manual install" daemon is usually used for development. It cannot be set as the default daemon.') }}
</NcNoteCard>

<NcNoteCard v-if="daemon.accepts_deploy_id === 'kubernetes-install'" type="info">
{{ t('app_api', 'This is a Kubernetes daemon managed via CLI.') }}
</NcNoteCard>

<p><b>{{ t('app_api', 'ExApps installed') }}: </b>{{ daemon.exAppsCount }}</p>
<p><b>{{ t('app_api', 'Name') }}: </b>{{ daemon.name }}</p>
<p><b>{{ t('app_api', 'Protocol') }}: </b>{{ daemon.protocol }}</p>
<p><b>{{ t('app_api', 'Host') }}: </b>{{ daemon.host }}</p>
<p v-if="daemon.deploy_config.harp">
<p v-if="daemon.deploy_config.harp && daemon.accepts_deploy_id !== 'kubernetes-install'">
<b>{{ t('app_api', 'ExApp direct communication (FRP disabled)') }}: </b>
{{ daemon.deploy_config.harp.exapp_direct ?? false }}
</p>

<template v-if="daemon.deploy_config.kubernetes">
<h3>{{ t('app_api', 'Kubernetes settings') }}</h3>
<p><b>{{ t('app_api', 'Expose type') }}: </b>{{ daemon.deploy_config.kubernetes.expose_type }}</p>
<p v-if="daemon.deploy_config.kubernetes.node_port">
<b>{{ t('app_api', 'Node port') }}: </b>{{ daemon.deploy_config.kubernetes.node_port }}
</p>
<p v-if="daemon.deploy_config.kubernetes.upstream_host">
<b>{{ t('app_api', 'Upstream host') }}: </b>{{ daemon.deploy_config.kubernetes.upstream_host }}
</p>
<p v-if="daemon.deploy_config.kubernetes.external_traffic_policy">
<b>{{ t('app_api', 'External traffic policy') }}: </b>{{ daemon.deploy_config.kubernetes.external_traffic_policy }}
</p>
<p v-if="daemon.deploy_config.kubernetes.load_balancer_ip">
<b>{{ t('app_api', 'Load balancer IP') }}: </b>{{ daemon.deploy_config.kubernetes.load_balancer_ip }}
</p>
<p><b>{{ t('app_api', 'Node address type') }}: </b>{{ daemon.deploy_config.kubernetes.node_address_type }}</p>
</template>

<h3>{{ t('app_api', 'Deploy options') }}</h3>
<p><b>{{ t('app_api', 'Docker network') }}: </b>{{ daemon.deploy_config.net }}</p>
<p><b>{{ t('app_api', 'Nextcloud URL') }}: </b>{{ daemon.deploy_config.nextcloud_url }}</p>
Expand Down
38 changes: 35 additions & 3 deletions src/components/DaemonConfig/ManageDaemonConfigModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
v-model="host"
:label="isHarp ? t('app_api', 'HaRP host') : t('app_api', 'Daemon host')"
:placeholder="daemonHostHelperText"
:readonly="isEdit && isK8s"
:aria-label="daemonHostHelperText" />
<InfoTooltip :text="daemonHostHelperText" />
</div>
Expand All @@ -66,6 +67,7 @@
v-model="deployConfig.haproxy_password"
:label="isHarp ? t('app_api', 'HaRP shared key') : t('app_api', 'HaProxy password')"
:error="isHaProxyPasswordValid === false"
:disabled="isEdit && isK8s"
:placeholder="haProxyPasswordHelperText"
:aria-label="haProxyPasswordHelperText"
:helper-text="!isHaProxyPasswordValid ? t('app_api', 'The password must be at least 12 characters long') : ''"
Expand All @@ -77,6 +79,7 @@
id="nextcloud-url"
v-model="nextcloud_url"
:label="t('app_api', 'Nextcloud URL')"
:readonly="isEdit && isK8s"
:helper-text="getNextcloudUrlHelperText"
:input-class="getNextcloudUrlHelperText !== '' ? 'text-warning' : ''"
:placeholder="t('app_api', 'Nextcloud URL')"
Expand Down Expand Up @@ -106,12 +109,13 @@
</NcButton>
<div v-show="deployConfigSettingsOpened" class="deploy-config" :aria-label="t('app_api', 'Deploy options')">
<NcFormBoxSwitch
v-if="!isK8s || !isEdit"
v-model="isHarp"
@update:model-value="toggleHarp">
{{ t('app_api', 'Enable HaRP') }}
</NcFormBoxSwitch>
<div v-if="isHarp" class="harp-options">
<div class="row" :aria-label="t('app_api', 'FRP server address')">
<div v-if="!isK8s" class="row" :aria-label="t('app_api', 'FRP server address')">
<NcInputField
id="frp-address"
v-model="deployConfig.harp.frp_address"
Expand All @@ -120,7 +124,7 @@
:aria-label="t('app_api', 'FRP server address')" />
<InfoTooltip :text="t('app_api', 'The address (host:port) of the FRP server that should be reachable by the ExApp in the network defined in the \'Docker network\' section.')" />
</div>
<div class="row" :aria-label="t('app_api', 'Docker socket proxy port')">
<div v-if="!isK8s" class="row" :aria-label="t('app_api', 'Docker socket proxy port')">
<NcInputField
id="harp-dsp-port"
v-model="deployConfig.harp.docker_socket_port"
Expand All @@ -129,7 +133,7 @@
:aria-label="t('app_api', 'Docker socket proxy port')" />
<InfoTooltip :text="t('app_api', 'The port in HaRP which the Docker socket proxy connects to. This should be exposed but for the in-built one, it is not required to be exposed or changed.')" />
</div>
<div class="row-switch" :aria-label="t('app_api', 'Disable FRP')">
<div v-if="!isK8s" class="row-switch" :aria-label="t('app_api', 'Disable FRP')">
<NcFormBoxSwitch
v-model="deployConfig.harp.exapp_direct"
class="switch"
Expand All @@ -148,6 +152,7 @@
v-model="deployConfig.net"
:label="t('app_api', 'Docker network')"
:placeholder="t('app_api', 'Docker network')"
:readonly="isEdit && isK8s"
:aria-label="t('app_api', 'Docker network')"
:show-trailing-button="isEditDifferentNetwork"
:error="isHarp && !deployConfig.net"
Expand All @@ -165,6 +170,7 @@
id="compute-device"
v-model="deployConfig.computeDevice"
class="ncselect"
:disabled="isEdit && isK8s"
:input-label="t('app_api', 'Compute device')"
:aria-label-combobox="t('app_api', 'Computation device')"
:options="computeDevices" />
Expand All @@ -179,6 +185,7 @@
v-model="memoryLimit"
:label="t('app_api', 'Memory limit (in MiB)')"
:placeholder="t('app_api', 'Memory limit (in MiB)')"
:readonly="isEdit && isK8s"
:aria-label="t('app_api', 'Memory limit (in MiB)')"
:error="isMemoryLimitValid === false"
:helper-text="isMemoryLimitValid === false ? t('app_api', 'Must be a positive integer') : ''" />
Expand All @@ -191,11 +198,29 @@
v-model="cpuLimit"
:label="t('app_api', 'CPU limit')"
:placeholder="t('app_api', 'CPU limit as decimal value')"
:readonly="isEdit && isK8s"
:aria-label="t('app_api', 'CPU limit')"
:error="isCpuLimitValid === false"
:helper-text="isCpuLimitValid === false ? t('app_api', 'Must be a positive number') : ''" />
<InfoTooltip :text="t('app_api', 'Maximum number of CPU cores that the ExApp container can use (e.g. 0.5 for half a core, 2 for two cores)')" />
</div>
<div v-if="isK8s && isEdit && deployConfig.kubernetes" class="k8s-info">
<h4>{{ t('app_api', 'Kubernetes settings') }}</h4>
<p><b>{{ t('app_api', 'Expose type') }}: </b>{{ deployConfig.kubernetes.expose_type }}</p>
<p v-if="deployConfig.kubernetes.node_port">
<b>{{ t('app_api', 'Node port') }}: </b>{{ deployConfig.kubernetes.node_port }}
</p>
<p v-if="deployConfig.kubernetes.upstream_host">
<b>{{ t('app_api', 'Upstream host') }}: </b>{{ deployConfig.kubernetes.upstream_host }}
</p>
<p v-if="deployConfig.kubernetes.external_traffic_policy">
<b>{{ t('app_api', 'External traffic policy') }}: </b>{{ deployConfig.kubernetes.external_traffic_policy }}
</p>
<p v-if="deployConfig.kubernetes.load_balancer_ip">
<b>{{ t('app_api', 'Load balancer IP') }}: </b>{{ deployConfig.kubernetes.load_balancer_ip }}
</p>
<p><b>{{ t('app_api', 'Node address type') }}: </b>{{ deployConfig.kubernetes.node_address_type }}</p>
</div>
<template v-if="additionalOptions.length > 0">
<div class="row" style="flex-direction: column;">
<div
Expand Down Expand Up @@ -539,6 +564,9 @@ export default {
isPureManual() {
return this.acceptsDeployId === 'manual-install' && !this.isHarp
},
isK8s() {
return this.acceptsDeployId === 'kubernetes-install'
},
},
watch: {
configurationTab(newConfigurationTab) {
Expand Down Expand Up @@ -784,6 +812,10 @@ export default {
margin-bottom: 10px;
}

.k8s-info {
margin-top: 16px;
}

.additional-options {
padding: 10px 0;
}
Expand Down
2 changes: 1 addition & 1 deletion tests/test_occ_commands_k8s.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
"127.0.0.1:8780", "http://127.0.0.1",
]
K8S_HARP_OPTS = [
"--harp", "--harp_shared_key", "test_key", "--harp_frp_address", "127.0.0.1:8782",
"--harp", "--harp_shared_key", "test_key",
]


Expand Down
Loading