mirror of
https://github.com/clearml/clearml-helm-charts
synced 2025-04-17 01:31:13 +00:00
Compare commits
7 Commits
clearml-se
...
clearml-7.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
546c2b6d2e | ||
|
|
0a2bc7c2a8 | ||
|
|
25de2dfaeb | ||
|
|
28d9fe82f6 | ||
|
|
e680990d10 | ||
|
|
fdbbe5b90d | ||
|
|
eff09794bd |
2
.github/helm-docs.sh
vendored
2
.github/helm-docs.sh
vendored
@@ -6,7 +6,7 @@ if [[ -z "$CHART_DIRS" ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
HELM_DOCS_VERSION="1.11.0"
|
||||
HELM_DOCS_VERSION="1.11.3"
|
||||
|
||||
curl --silent --show-error --fail --location --output /tmp/helm-docs.tar.gz https://github.com/norwoodj/helm-docs/releases/download/v"${HELM_DOCS_VERSION}"/helm-docs_"${HELM_DOCS_VERSION}"_Linux_x86_64.tar.gz
|
||||
tar -xf /tmp/helm-docs.tar.gz helm-docs
|
||||
|
||||
17
.github/workflows/ci.yaml
vendored
17
.github/workflows/ci.yaml
vendored
@@ -11,7 +11,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3.5.0
|
||||
uses: actions/checkout@v4.1.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Run helm-docs
|
||||
@@ -24,21 +24,22 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
k8s:
|
||||
- v1.25.11
|
||||
- v1.26.6
|
||||
- v1.27.3
|
||||
- v1.28.0
|
||||
- v1.27.11
|
||||
- v1.28.7
|
||||
- v1.29.2
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3.5.0
|
||||
uses: actions/checkout@v4.1.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Create kind ${{ matrix.k8s }} cluster
|
||||
uses: helm/kind-action@v1.5.0
|
||||
uses: helm/kind-action@v1.8.0
|
||||
with:
|
||||
node_image: kindest/node:${{ matrix.k8s }}
|
||||
- name: Set up chart-testing
|
||||
uses: helm/chart-testing-action@v2.4.0
|
||||
uses: helm/chart-testing-action@v2.5.0
|
||||
with:
|
||||
version: v3.8.0
|
||||
- name: Add bitnami repo
|
||||
run: helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||
- name: Add elastic repo
|
||||
|
||||
@@ -2,9 +2,9 @@ apiVersion: v2
|
||||
name: clearml-agent
|
||||
description: MLOps platform Task running agent
|
||||
type: application
|
||||
version: "5.1.1"
|
||||
version: "5.1.3"
|
||||
appVersion: "1.24"
|
||||
kubeVersion: ">= 1.21.0-0 < 1.29.0-0"
|
||||
kubeVersion: ">= 1.21.0-0 < 1.30.0-0"
|
||||
home: https://clear.ml
|
||||
icon: https://raw.githubusercontent.com/allegroai/clearml/master/docs/clearml-logo.svg
|
||||
sources:
|
||||
@@ -20,5 +20,5 @@ keywords:
|
||||
- "task agent"
|
||||
annotations:
|
||||
artifacthub.io/changes: |
|
||||
- kind: added
|
||||
description: kubernetes 1.28 support
|
||||
- kind: fixed
|
||||
description: kubernetes 1.29 support
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# ClearML Kubernetes Agent
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
MLOps platform Task running agent
|
||||
|
||||
@@ -47,7 +47,7 @@ Before issuing helm upgrade:
|
||||
|
||||
## Requirements
|
||||
|
||||
Kubernetes: `>= 1.21.0-0 < 1.29.0-0`
|
||||
Kubernetes: `>= 1.21.0-0 < 1.30.0-0`
|
||||
|
||||
## Values
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ spec:
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- if .Values.agentk8sglue.volumeMounts }}
|
||||
{{- toYaml .Values.agentk8sglue.volumeMounts | nindent 10 }}
|
||||
{{- toYaml .Values.agentk8sglue.volumeMounts | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- range .Values.agentk8sglue.fileMounts }}
|
||||
- name: filemounts
|
||||
|
||||
@@ -2,7 +2,7 @@ apiVersion: v2
|
||||
name: clearml-serving
|
||||
description: ClearML Serving Helm Chart
|
||||
type: application
|
||||
version: "1.5.1"
|
||||
version: "1.5.3"
|
||||
appVersion: "1.3.0"
|
||||
kubeVersion: ">= 1.21.0-0 < 1.29.0-0"
|
||||
home: https://clear.ml
|
||||
@@ -34,4 +34,4 @@ dependencies:
|
||||
annotations:
|
||||
artifacthub.io/changes: |
|
||||
- kind: fixed
|
||||
description: missing extraEnvs
|
||||
description: clearml labels helper function reference
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# ClearML Kubernetes Serving
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
ClearML Serving Helm Chart
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ kind: ConfigMap
|
||||
metadata:
|
||||
name: "{{ include "clearmlServing.fullname" . }}-inference-configmap"
|
||||
labels:
|
||||
{{- include "clearml.labels" . | nindent 4 }}
|
||||
{{- include "clearmlServing.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{- range $key, $val := .Values.clearml_serving_inference.additionalConfigs }}
|
||||
{{ $key }}: |
|
||||
|
||||
@@ -5,7 +5,7 @@ kind: ConfigMap
|
||||
metadata:
|
||||
name: "{{ include "clearmlServing.fullname" . }}-statistics-configmap"
|
||||
labels:
|
||||
{{- include "clearml.labels" . | nindent 4 }}
|
||||
{{- include "clearmlServing.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{- range $key, $val := .Values.clearml_serving_statistics.additionalConfigs }}
|
||||
{{ $key }}: |
|
||||
|
||||
@@ -5,7 +5,7 @@ kind: ConfigMap
|
||||
metadata:
|
||||
name: "{{ include "clearmlServing.fullname" . }}-triton-configmap"
|
||||
labels:
|
||||
{{- include "clearml.labels" . | nindent 4 }}
|
||||
{{- include "clearmlServing.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{- range $key, $val := .Values.clearml_serving_triton.additionalConfigs }}
|
||||
{{ $key }}: |
|
||||
|
||||
@@ -27,6 +27,9 @@ spec:
|
||||
- name: clearml-registry-key
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{ if .Values.clearml_serving_triton.runtimeClassName}}
|
||||
runtimeClassName: {{ .Values.clearml_serving_triton.runtimeClassName }}
|
||||
{{- end}}
|
||||
{{- if or .Values.clearml_serving_triton.additionalConfigs .Values.clearml_serving_triton.existingAdditionalConfigsConfigMap .Values.clearml_serving_triton.existingAdditionalConfigsSecret }}
|
||||
volumes:
|
||||
- name: additional-config
|
||||
@@ -75,10 +78,7 @@ spec:
|
||||
- name: additional-config
|
||||
mountPath: /opt/clearml/config
|
||||
{{- end }}
|
||||
{{- with .Values.clearml_serving_triton.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
|
||||
{{- with .Values.clearml_serving_triton.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
@@ -90,5 +90,9 @@ spec:
|
||||
resources:
|
||||
{{- toYaml .Values.clearml_serving_triton.resources | nindent 12 }}
|
||||
restartPolicy: Always
|
||||
{{- with .Values.clearml_serving_triton.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{ end }}
|
||||
|
||||
|
||||
@@ -112,6 +112,9 @@ clearml_serving_triton:
|
||||
image:
|
||||
repository: "allegroai/clearml-serving-triton"
|
||||
tag: "1.3.0"
|
||||
# -- Runtime Class configuration
|
||||
# uncomment to use custom runtime class, eg. nvidia when using GPU operator
|
||||
# runtimeClassName: "nvidia"
|
||||
# -- Node Selector configuration
|
||||
nodeSelector: {}
|
||||
# -- Tolerations configuration
|
||||
|
||||
@@ -2,9 +2,9 @@ apiVersion: v2
|
||||
name: clearml
|
||||
description: MLOps platform
|
||||
type: application
|
||||
version: "7.4.1"
|
||||
appVersion: "1.12.0"
|
||||
kubeVersion: ">= 1.21.0-0 < 1.29.0-0"
|
||||
version: "7.7.1"
|
||||
appVersion: "1.14.1"
|
||||
kubeVersion: ">= 1.21.0-0 < 1.30.0-0"
|
||||
home: https://clear.ml
|
||||
icon: https://raw.githubusercontent.com/allegroai/clearml/master/docs/clearml-logo.svg
|
||||
sources:
|
||||
@@ -32,5 +32,5 @@ dependencies:
|
||||
condition: elasticsearch.enabled
|
||||
annotations:
|
||||
artifacthub.io/changes: |
|
||||
- kind: fixed
|
||||
description: redis service name reference generation
|
||||
- kind: changed
|
||||
description: kubernetes 1.29 support
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# ClearML Ecosystem for Kubernetes
|
||||
|
||||
  
|
||||
  
|
||||
|
||||
MLOps platform
|
||||
|
||||
@@ -133,7 +133,7 @@ For detailed instructions, see the [Optional Configuration](https://github.com/a
|
||||
|
||||
## Requirements
|
||||
|
||||
Kubernetes: `>= 1.21.0-0 < 1.29.0-0`
|
||||
Kubernetes: `>= 1.21.0-0 < 1.30.0-0`
|
||||
|
||||
| Repository | Name | Version |
|
||||
|------------|------|---------|
|
||||
@@ -145,7 +145,7 @@ Kubernetes: `>= 1.21.0-0 < 1.29.0-0`
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| apiserver | object | `{"additionalConfigs":{},"affinity":{},"containerSecurityContext":{},"enabled":true,"existingAdditionalConfigsConfigMap":"","existingAdditionalConfigsSecret":"","extraEnvs":[],"image":{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.12.0-393"},"ingress":{"annotations":{},"enabled":false,"hostName":"api.clearml.127-0-0-1.nip.io","ingressClassName":"","path":"/","tlsSecretName":""},"initContainers":{"resources":{"limits":{"cpu":"10m","memory":"64Mi"},"requests":{"cpu":"10m","memory":"64Mi"}}},"nodeSelector":{},"podAnnotations":{},"podSecurityContext":{},"prepopulateEnabled":true,"processes":{"count":8,"maxRequests":1000,"maxRequestsJitter":300,"timeout":24000},"replicaCount":1,"resources":{"limits":{"cpu":"2000m","memory":"1Gi"},"requests":{"cpu":"100m","memory":"256Mi"}},"service":{"annotations":{},"nodePort":30008,"port":8008,"type":"NodePort"},"serviceAccountName":"clearml","tolerations":[]}` | Api Server configurations |
|
||||
| apiserver | object | `{"additionalConfigs":{},"affinity":{},"containerSecurityContext":{},"enabled":true,"existingAdditionalConfigsConfigMap":"","existingAdditionalConfigsSecret":"","extraEnvs":[],"image":{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.14.1-448"},"ingress":{"annotations":{},"enabled":false,"hostName":"api.clearml.127-0-0-1.nip.io","ingressClassName":"","path":"/","tlsSecretName":""},"initContainers":{"resources":{"limits":{"cpu":"10m","memory":"64Mi"},"requests":{"cpu":"10m","memory":"64Mi"}}},"nodeSelector":{},"podAnnotations":{},"podSecurityContext":{},"prepopulateEnabled":true,"processes":{"count":8,"maxRequests":1000,"maxRequestsJitter":300,"timeout":24000},"replicaCount":1,"resources":{"limits":{"cpu":"2000m","memory":"1Gi"},"requests":{"cpu":"100m","memory":"256Mi"}},"service":{"annotations":{},"nodePort":30008,"port":8008,"type":"NodePort"},"serviceAccountName":"clearml","tolerations":[]}` | Api Server configurations |
|
||||
| apiserver.additionalConfigs | object | `{}` | files declared in this parameter will be mounted and read by apiserver (examples in values.yaml) if not overridden by existingAdditionalConfigsSecret |
|
||||
| apiserver.affinity | object | `{}` | Api Server affinity setup |
|
||||
| apiserver.containerSecurityContext | object | `{}` | Api Server containers security context |
|
||||
@@ -153,7 +153,7 @@ Kubernetes: `>= 1.21.0-0 < 1.29.0-0`
|
||||
| apiserver.existingAdditionalConfigsConfigMap | string | `""` | reference for files declared in existing ConfigMap will be mounted and read by apiserver (examples in values.yaml) |
|
||||
| apiserver.existingAdditionalConfigsSecret | string | `""` | reference for files declared in existing Secret will be mounted and read by apiserver (examples in values.yaml) if not overridden by existingAdditionalConfigsConfigMap |
|
||||
| apiserver.extraEnvs | list | `[]` | Api Server extra envrinoment variables |
|
||||
| apiserver.image | object | `{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.12.0-393"}` | Api Server image configuration |
|
||||
| apiserver.image | object | `{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.14.1-448"}` | Api Server image configuration |
|
||||
| apiserver.ingress | object | `{"annotations":{},"enabled":false,"hostName":"api.clearml.127-0-0-1.nip.io","ingressClassName":"","path":"/","tlsSecretName":""}` | Ingress configuration for Api Server component |
|
||||
| apiserver.ingress.annotations | object | `{}` | Ingress annotations |
|
||||
| apiserver.ingress.enabled | bool | `false` | Enable/Disable ingress |
|
||||
@@ -201,12 +201,12 @@ Kubernetes: `>= 1.21.0-0 < 1.29.0-0`
|
||||
| externalServices.mongodbConnectionStringBackend | string | `"mongodb://mongodb_hostnamehostname:27017/backend"` | Existing MongoDB connection string for AUTH to use if mongodb.enabled is false (example in values.yaml) |
|
||||
| externalServices.redisHost | string | `"redis_hostname"` | Existing Redis Hostname to use if redis.enabled is false (example in values.yaml) |
|
||||
| externalServices.redisPort | int | `6379` | Existing Redis Port to use if redis.enabled is false |
|
||||
| fileserver | object | `{"affinity":{},"containerSecurityContext":{},"enabled":true,"extraEnvs":[],"image":{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.12.0-393"},"ingress":{"annotations":{},"enabled":false,"hostName":"files.clearml.127-0-0-1.nip.io","ingressClassName":"","path":"/","tlsSecretName":""},"initContainers":{"resources":{"limits":{"cpu":"10m","memory":"64Mi"},"requests":{"cpu":"10m","memory":"64Mi"}}},"nodeSelector":{},"podAnnotations":{},"podSecurityContext":{},"replicaCount":1,"resources":{"limits":{"cpu":"2000m","memory":"1Gi"},"requests":{"cpu":"100m","memory":"256Mi"}},"service":{"annotations":{},"nodePort":30081,"port":8081,"type":"NodePort"},"serviceAccountName":"clearml","storage":{"data":{"accessMode":"ReadWriteOnce","class":"","existingPVC":"","size":"50Gi"},"enabled":true},"tolerations":[]}` | File Server configurations |
|
||||
| fileserver | object | `{"affinity":{},"containerSecurityContext":{},"enabled":true,"extraEnvs":[],"image":{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.14.1-448"},"ingress":{"annotations":{},"enabled":false,"hostName":"files.clearml.127-0-0-1.nip.io","ingressClassName":"","path":"/","tlsSecretName":""},"initContainers":{"resources":{"limits":{"cpu":"10m","memory":"64Mi"},"requests":{"cpu":"10m","memory":"64Mi"}}},"nodeSelector":{},"podAnnotations":{},"podSecurityContext":{},"replicaCount":1,"resources":{"limits":{"cpu":"2000m","memory":"1Gi"},"requests":{"cpu":"100m","memory":"256Mi"}},"service":{"annotations":{},"nodePort":30081,"port":8081,"type":"NodePort"},"serviceAccountName":"clearml","storage":{"data":{"accessMode":"ReadWriteOnce","class":"","existingPVC":"","size":"50Gi"},"enabled":true},"tolerations":[]}` | File Server configurations |
|
||||
| fileserver.affinity | object | `{}` | File Server affinity setup |
|
||||
| fileserver.containerSecurityContext | object | `{}` | File Server containers security context |
|
||||
| fileserver.enabled | bool | `true` | Enable/Disable component deployment |
|
||||
| fileserver.extraEnvs | list | `[]` | File Server extra envrinoment variables |
|
||||
| fileserver.image | object | `{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.12.0-393"}` | File Server image configuration |
|
||||
| fileserver.image | object | `{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.14.1-448"}` | File Server image configuration |
|
||||
| fileserver.ingress | object | `{"annotations":{},"enabled":false,"hostName":"files.clearml.127-0-0-1.nip.io","ingressClassName":"","path":"/","tlsSecretName":""}` | Ingress configuration for File Server component |
|
||||
| fileserver.ingress.annotations | object | `{}` | Ingress annotations |
|
||||
| fileserver.ingress.enabled | bool | `false` | Enable/Disable ingress |
|
||||
@@ -241,13 +241,13 @@ Kubernetes: `>= 1.21.0-0 < 1.29.0-0`
|
||||
| imageCredentials.username | string | `"someone"` | Registry username |
|
||||
| mongodb | object | `{"architecture":"standalone","auth":{"enabled":false},"enabled":true,"persistence":{"accessModes":["ReadWriteOnce"],"enabled":true,"size":"50Gi","storageClass":null},"replicaCount":1}` | Configuration from https://github.com/bitnami/charts/blob/master/bitnami/mongodb/values.yaml |
|
||||
| redis | object | `{"architecture":"standalone","auth":{"enabled":false},"databaseNumber":0,"enabled":true,"master":{"name":"{{ .Release.Name }}-redis-master","persistence":{"accessModes":["ReadWriteOnce"],"enabled":true,"size":"5Gi","storageClass":null},"port":6379}}` | Configuration from https://github.com/bitnami/charts/blob/master/bitnami/redis/values.yaml |
|
||||
| webserver | object | `{"additionalConfigs":{},"affinity":{},"containerSecurityContext":{},"enabled":true,"extraEnvs":[],"image":{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.12.0-393"},"ingress":{"annotations":{},"enabled":false,"hostName":"app.clearml.127-0-0-1.nip.io","ingressClassName":"","path":"/","tlsSecretName":""},"initContainers":{"resources":{"limits":{"cpu":"10m","memory":"64Mi"},"requests":{"cpu":"10m","memory":"64Mi"}}},"nodeSelector":{},"podAnnotations":{},"podSecurityContext":{},"replicaCount":1,"resources":{"limits":{"cpu":"2000m","memory":"1Gi"},"requests":{"cpu":"100m","memory":"256Mi"}},"service":{"annotations":{},"nodePort":30080,"port":8080,"type":"NodePort"},"serviceAccountName":"clearml","tolerations":[]}` | Web Server configurations |
|
||||
| webserver | object | `{"additionalConfigs":{},"affinity":{},"containerSecurityContext":{},"enabled":true,"extraEnvs":[],"image":{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.14.1-448"},"ingress":{"annotations":{},"enabled":false,"hostName":"app.clearml.127-0-0-1.nip.io","ingressClassName":"","path":"/","tlsSecretName":""},"initContainers":{"resources":{"limits":{"cpu":"10m","memory":"64Mi"},"requests":{"cpu":"10m","memory":"64Mi"}}},"nodeSelector":{},"podAnnotations":{},"podSecurityContext":{},"replicaCount":1,"resources":{"limits":{"cpu":"2000m","memory":"1Gi"},"requests":{"cpu":"100m","memory":"256Mi"}},"service":{"annotations":{},"nodePort":30080,"port":8080,"type":"NodePort"},"serviceAccountName":"clearml","tolerations":[]}` | Web Server configurations |
|
||||
| webserver.additionalConfigs | object | `{}` | Additional specific webserver configurations |
|
||||
| webserver.affinity | object | `{}` | Web Server affinity setup |
|
||||
| webserver.containerSecurityContext | object | `{}` | Web Server containers security context |
|
||||
| webserver.enabled | bool | `true` | Enable/Disable component deployment |
|
||||
| webserver.extraEnvs | list | `[]` | Web Server extra envrinoment variables |
|
||||
| webserver.image | object | `{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.12.0-393"}` | Web Server image configuration |
|
||||
| webserver.image | object | `{"pullPolicy":"IfNotPresent","registry":"","repository":"allegroai/clearml","tag":"1.14.1-448"}` | Web Server image configuration |
|
||||
| webserver.ingress | object | `{"annotations":{},"enabled":false,"hostName":"app.clearml.127-0-0-1.nip.io","ingressClassName":"","path":"/","tlsSecretName":""}` | Ingress configuration for Web Server component |
|
||||
| webserver.ingress.annotations | object | `{}` | Ingress annotations |
|
||||
| webserver.ingress.enabled | bool | `false` | Enable/Disable ingress |
|
||||
|
||||
@@ -65,7 +65,7 @@ apiserver:
|
||||
registry: ""
|
||||
repository: "allegroai/clearml"
|
||||
pullPolicy: IfNotPresent
|
||||
tag: "1.12.0-393"
|
||||
tag: "1.14.1-448"
|
||||
# -- Api Server internal service configuration
|
||||
service:
|
||||
# -- specific annotation for Api Server service
|
||||
@@ -181,7 +181,7 @@ fileserver:
|
||||
registry: ""
|
||||
repository: "allegroai/clearml"
|
||||
pullPolicy: IfNotPresent
|
||||
tag: "1.12.0-393"
|
||||
tag: "1.14.1-448"
|
||||
# -- File Server internal service configuration
|
||||
service:
|
||||
# -- specific annotation for File Server service
|
||||
@@ -265,7 +265,7 @@ webserver:
|
||||
registry: ""
|
||||
repository: "allegroai/clearml"
|
||||
pullPolicy: IfNotPresent
|
||||
tag: "1.12.0-393"
|
||||
tag: "1.14.1-448"
|
||||
# -- Web Server internal service configuration
|
||||
service:
|
||||
# -- specific annotation for Web Server service
|
||||
|
||||
Reference in New Issue
Block a user