From fc2a155dedc446b043a684a91fd225b3ade9dd65 Mon Sep 17 00:00:00 2001 From: Ivan087 Date: Fri, 21 Nov 2025 10:45:23 +0800 Subject: [PATCH] feat: support open-webui charts --- charts.list | 5 +- open-webui/.helmignore | 25 + open-webui/Chart.lock | 12 + open-webui/Chart.yaml | 38 + open-webui/README.md | 270 + open-webui/README.md.gotmpl | 36 + open-webui/charts/ollama/.helmignore | 30 + .../charts/ollama/.ollama-helm/.helmignore | 30 + .../charts/ollama/.ollama-helm/Chart.yaml | 33 + open-webui/charts/ollama/.ollama-helm/LICENSE | 21 + .../charts/ollama/.ollama-helm/README.md | 331 + .../ollama/.ollama-helm/templates/NOTES.txt | 25 + .../.ollama-helm/templates/_helpers.tpl | 80 + .../.ollama-helm/templates/deployment.yaml | 293 + .../templates/extra-manifests.yaml | 4 + .../ollama/.ollama-helm/templates/hpa.yaml | 34 + .../.ollama-helm/templates/ingress.yaml | 63 + .../templates/knative/service.yaml | 200 + .../ollama/.ollama-helm/templates/pvc.yaml | 33 + .../templates/resourceclaimtemplate.yaml | 19 + .../.ollama-helm/templates/service.yaml | 32 + .../templates/serviceaccount.yaml | 15 + .../templates/tests/test-connection.yaml | 25 + .../charts/ollama/.ollama-helm/values.yaml | 440 ++ open-webui/charts/ollama/Chart.yaml | 28 + open-webui/charts/ollama/LICENSE | 21 + open-webui/charts/ollama/README.md | 331 + open-webui/charts/ollama/artifacthub-repo.yml | 17 + open-webui/charts/ollama/banner.png | Bin 0 -> 134943 bytes open-webui/charts/ollama/templates/NOTES.txt | 25 + .../charts/ollama/templates/_helpers.tpl | 80 + .../charts/ollama/templates/deployment.yaml | 293 + .../ollama/templates/extra-manifests.yaml | 4 + open-webui/charts/ollama/templates/hpa.yaml | 34 + .../charts/ollama/templates/ingress.yaml | 63 + .../ollama/templates/knative/service.yaml | 200 + open-webui/charts/ollama/templates/pvc.yaml | 33 + .../templates/resourceclaimtemplate.yaml | 19 + .../charts/ollama/templates/service.yaml | 32 + .../ollama/templates/serviceaccount.yaml | 15 + .../templates/tests/test-connection.yaml | 25 + open-webui/charts/ollama/values.yaml | 440 ++ open-webui/charts/pipelines/.helmignore | 24 + open-webui/charts/pipelines/Chart.yaml | 16 + open-webui/charts/pipelines/README.md | 84 + open-webui/charts/pipelines/README.md.gotmpl | 36 + .../charts/pipelines/templates/_helpers.tpl | 65 + .../pipelines/templates/deployment.yaml | 111 + .../pipelines/templates/extra-resources.yaml | 6 + .../charts/pipelines/templates/pvc.yaml | 28 + .../pipelines/templates/service-account.yaml | 13 + .../charts/pipelines/templates/service.yaml | 30 + open-webui/charts/pipelines/values.yaml | 160 + open-webui/charts/tika/.asf.yaml | 26 + .../tika/.github/workflows/lint-test.yaml | 83 + .../charts/tika/.github/workflows/pluto.yaml | 44 + open-webui/charts/tika/.helmignore | 24 + open-webui/charts/tika/Chart.yaml | 52 + open-webui/charts/tika/LICENSE.txt | 5737 +++++++++++++++++ open-webui/charts/tika/README.md | 159 + open-webui/charts/tika/artifacthub-repo.yml | 32 + open-webui/charts/tika/templates/NOTES.txt | 22 + open-webui/charts/tika/templates/_helpers.tpl | 74 + .../charts/tika/templates/configmap.yaml | 28 + .../charts/tika/templates/deployment.yaml | 127 + open-webui/charts/tika/templates/hpa.yaml | 66 + open-webui/charts/tika/templates/ingress.yaml | 80 + .../charts/tika/templates/networkpolicy.yaml | 42 + open-webui/charts/tika/templates/service.yaml | 38 + .../charts/tika/templates/serviceaccount.yaml | 31 + open-webui/charts/tika/values.yaml | 69 + open-webui/templates/NOTES.txt | 77 + open-webui/templates/_helpers.tpl | 256 + open-webui/templates/extra-resources.yaml | 6 + open-webui/templates/ingress.yaml | 52 + open-webui/templates/managed-cert.yaml | 11 + open-webui/templates/pvc.yaml | 28 + open-webui/templates/service-account.yaml | 14 + open-webui/templates/service.yaml | 36 + open-webui/templates/websocket-redis.yaml | 98 + open-webui/templates/workload-manager.yaml | 418 ++ open-webui/values-gke-min.yaml | 276 + open-webui/values.schema.json | 118 + open-webui/values.yaml | 590 ++ 84 files changed, 13039 insertions(+), 2 deletions(-) create mode 100644 open-webui/.helmignore create mode 100644 open-webui/Chart.lock create mode 100644 open-webui/Chart.yaml create mode 100644 open-webui/README.md create mode 100644 open-webui/README.md.gotmpl create mode 100644 open-webui/charts/ollama/.helmignore create mode 100644 open-webui/charts/ollama/.ollama-helm/.helmignore create mode 100644 open-webui/charts/ollama/.ollama-helm/Chart.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/LICENSE create mode 100644 open-webui/charts/ollama/.ollama-helm/README.md create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/NOTES.txt create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/_helpers.tpl create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/deployment.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/extra-manifests.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/hpa.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/ingress.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/knative/service.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/pvc.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/resourceclaimtemplate.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/service.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/serviceaccount.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/templates/tests/test-connection.yaml create mode 100644 open-webui/charts/ollama/.ollama-helm/values.yaml create mode 100644 open-webui/charts/ollama/Chart.yaml create mode 100644 open-webui/charts/ollama/LICENSE create mode 100644 open-webui/charts/ollama/README.md create mode 100644 open-webui/charts/ollama/artifacthub-repo.yml create mode 100644 open-webui/charts/ollama/banner.png create mode 100644 open-webui/charts/ollama/templates/NOTES.txt create mode 100644 open-webui/charts/ollama/templates/_helpers.tpl create mode 100644 open-webui/charts/ollama/templates/deployment.yaml create mode 100644 open-webui/charts/ollama/templates/extra-manifests.yaml create mode 100644 open-webui/charts/ollama/templates/hpa.yaml create mode 100644 open-webui/charts/ollama/templates/ingress.yaml create mode 100644 open-webui/charts/ollama/templates/knative/service.yaml create mode 100644 open-webui/charts/ollama/templates/pvc.yaml create mode 100644 open-webui/charts/ollama/templates/resourceclaimtemplate.yaml create mode 100644 open-webui/charts/ollama/templates/service.yaml create mode 100644 open-webui/charts/ollama/templates/serviceaccount.yaml create mode 100644 open-webui/charts/ollama/templates/tests/test-connection.yaml create mode 100644 open-webui/charts/ollama/values.yaml create mode 100644 open-webui/charts/pipelines/.helmignore create mode 100644 open-webui/charts/pipelines/Chart.yaml create mode 100644 open-webui/charts/pipelines/README.md create mode 100644 open-webui/charts/pipelines/README.md.gotmpl create mode 100644 open-webui/charts/pipelines/templates/_helpers.tpl create mode 100644 open-webui/charts/pipelines/templates/deployment.yaml create mode 100644 open-webui/charts/pipelines/templates/extra-resources.yaml create mode 100644 open-webui/charts/pipelines/templates/pvc.yaml create mode 100644 open-webui/charts/pipelines/templates/service-account.yaml create mode 100644 open-webui/charts/pipelines/templates/service.yaml create mode 100644 open-webui/charts/pipelines/values.yaml create mode 100644 open-webui/charts/tika/.asf.yaml create mode 100644 open-webui/charts/tika/.github/workflows/lint-test.yaml create mode 100644 open-webui/charts/tika/.github/workflows/pluto.yaml create mode 100644 open-webui/charts/tika/.helmignore create mode 100644 open-webui/charts/tika/Chart.yaml create mode 100644 open-webui/charts/tika/LICENSE.txt create mode 100644 open-webui/charts/tika/README.md create mode 100644 open-webui/charts/tika/artifacthub-repo.yml create mode 100644 open-webui/charts/tika/templates/NOTES.txt create mode 100644 open-webui/charts/tika/templates/_helpers.tpl create mode 100644 open-webui/charts/tika/templates/configmap.yaml create mode 100644 open-webui/charts/tika/templates/deployment.yaml create mode 100644 open-webui/charts/tika/templates/hpa.yaml create mode 100644 open-webui/charts/tika/templates/ingress.yaml create mode 100644 open-webui/charts/tika/templates/networkpolicy.yaml create mode 100644 open-webui/charts/tika/templates/service.yaml create mode 100644 open-webui/charts/tika/templates/serviceaccount.yaml create mode 100644 open-webui/charts/tika/values.yaml create mode 100644 open-webui/templates/NOTES.txt create mode 100644 open-webui/templates/_helpers.tpl create mode 100644 open-webui/templates/extra-resources.yaml create mode 100644 open-webui/templates/ingress.yaml create mode 100644 open-webui/templates/managed-cert.yaml create mode 100644 open-webui/templates/pvc.yaml create mode 100644 open-webui/templates/service-account.yaml create mode 100644 open-webui/templates/service.yaml create mode 100644 open-webui/templates/websocket-redis.yaml create mode 100644 open-webui/templates/workload-manager.yaml create mode 100644 open-webui/values-gke-min.yaml create mode 100644 open-webui/values.schema.json create mode 100644 open-webui/values.yaml diff --git a/charts.list b/charts.list index 7d216af..3024d7e 100644 --- a/charts.list +++ b/charts.list @@ -1,3 +1,4 @@ # List each Helm chart directory to package and push (one per line) -vllm-serve -code-server-chart +# vllm-serve +# code-server-chart +open-webui diff --git a/open-webui/.helmignore b/open-webui/.helmignore new file mode 100644 index 0000000..260f898 --- /dev/null +++ b/open-webui/.helmignore @@ -0,0 +1,25 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +.drone.yml +*.tmproj +.vscode/ +values-minikube.yaml diff --git a/open-webui/Chart.lock b/open-webui/Chart.lock new file mode 100644 index 0000000..4c6d52f --- /dev/null +++ b/open-webui/Chart.lock @@ -0,0 +1,12 @@ +dependencies: +- name: ollama + repository: https://otwld.github.io/ollama-helm/ + version: 1.27.0 +- name: pipelines + repository: https://helm.openwebui.com + version: 0.7.0 +- name: tika + repository: https://apache.jfrog.io/artifactory/tika + version: 3.2.2 +digest: sha256:1c6e5d6a38dc8ebb4e15b1945fb222fa57b10e8882d5c79ba430648f3c5af372 +generated: "2025-08-22T15:22:03.150693+02:00" diff --git a/open-webui/Chart.yaml b/open-webui/Chart.yaml new file mode 100644 index 0000000..4b59d40 --- /dev/null +++ b/open-webui/Chart.yaml @@ -0,0 +1,38 @@ +annotations: + licenses: MIT +apiVersion: v2 +appVersion: 0.6.26 +dependencies: +- condition: ollama.enabled + import-values: + - child: service + parent: ollama.service + name: ollama + repository: https://otwld.github.io/ollama-helm/ + version: '>=0.24.0' +- condition: pipelines.enabled + import-values: + - child: service + parent: pipelines.service + name: pipelines + repository: https://helm.openwebui.com + version: '>=0.0.1' +- condition: tika.enabled + name: tika + repository: https://apache.jfrog.io/artifactory/tika + version: '>=2.9.0' +description: "Open WebUI: A User-Friendly Web Interface for Chat Interactions \U0001F44B" +home: https://www.openwebui.com/ +icon: https://raw.githubusercontent.com/open-webui/open-webui/main/static/favicon.png +keywords: +- llm +- chat +- web-ui +- open-webui +name: open-webui +sources: +- https://github.com/open-webui/helm-charts +- https://github.com/open-webui/open-webui/pkgs/container/open-webui +- https://github.com/otwld/ollama-helm/ +- https://hub.docker.com/r/ollama/ollama +version: 7.7.0 diff --git a/open-webui/README.md b/open-webui/README.md new file mode 100644 index 0000000..7821ec7 --- /dev/null +++ b/open-webui/README.md @@ -0,0 +1,270 @@ +# open-webui + +![Version: 7.7.0](https://img.shields.io/badge/Version-7.7.0-informational?style=flat-square) ![AppVersion: 0.6.26](https://img.shields.io/badge/AppVersion-0.6.26-informational?style=flat-square) + +Open WebUI: A User-Friendly Web Interface for Chat Interactions 👋 + +**Homepage:** + +## Source Code + +* +* +* +* + +## Installing + +Before you can install, you need to add the `open-webui` repo to [Helm](https://helm.sh) + +```shell +helm repo add open-webui https://helm.openwebui.com/ +helm repo update +``` + +Now you can install the chart: + +```shell +helm upgrade --install open-webui open-webui/open-webui +``` + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://apache.jfrog.io/artifactory/tika | tika | >=2.9.0 | +| https://helm.openwebui.com | pipelines | >=0.0.1 | +| https://otwld.github.io/ollama-helm/ | ollama | >=0.24.0 | + +## Values + +### Logging configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| logging.components.audio | string | `""` | Set the log level for the Audio processing component | +| logging.components.comfyui | string | `""` | Set the log level for the ComfyUI Integration component | +| logging.components.config | string | `""` | Set the log level for the Configuration Management component | +| logging.components.db | string | `""` | Set the log level for the Database Operations (Peewee) component | +| logging.components.images | string | `""` | Set the log level for the Image Generation component | +| logging.components.main | string | `""` | Set the log level for the Main Application Execution component | +| logging.components.models | string | `""` | Set the log level for the Model Management component | +| logging.components.ollama | string | `""` | Set the log level for the Ollama Backend Integration component | +| logging.components.openai | string | `""` | Set the log level for the OpenAI API Integration component | +| logging.components.rag | string | `""` | Set the log level for the Retrieval-Augmented Generation (RAG) component | +| logging.components.webhook | string | `""` | Set the log level for the Authentication Webhook component | +| logging.level | string | `""` | Set the global log level ["notset", "debug", "info" (default), "warning", "error", "critical"] | + +### Azure Storage configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| persistence.azure.container | string | `""` | Sets the container name for Azure Storage | +| persistence.azure.endpointUrl | string | `""` | Sets the endpoint URL for Azure Storage | +| persistence.azure.key | string | `""` | Set the access key for Azure Storage (ignored if keyExistingSecret is set). Optional - if not provided, credentials will be taken from the environment. User credentials if run locally and Managed Identity if run in Azure services | +| persistence.azure.keyExistingSecret | string | `""` | Set the access key for Azure Storage from existing secret | +| persistence.azure.keyExistingSecretKey | string | `""` | Set the access key for Azure Storage from existing secret key | + +### Google Cloud Storage configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| persistence.gcs.appCredentialsJson | string | `""` | Contents of Google Application Credentials JSON file (ignored if appCredentialsJsonExistingSecret is set). Optional - if not provided, credentials will be taken from the environment. User credentials if run locally and Google Metadata server if run on a Google Compute Engine. File can be generated for a service account following this guide: https://developers.google.com/workspace/guides/create-credentials#service-account | +| persistence.gcs.appCredentialsJsonExistingSecret | string | `""` | Set the Google Application Credentials JSON file for Google Cloud Storage from existing secret | +| persistence.gcs.appCredentialsJsonExistingSecretKey | string | `""` | Set the Google Application Credentials JSON file for Google Cloud Storage from existing secret key | +| persistence.gcs.bucket | string | `""` | Sets the bucket name for Google Cloud Storage. Bucket must already exist | + +### Amazon S3 Storage configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| persistence.s3.accessKey | string | `""` | Sets the access key ID for S3 storage | +| persistence.s3.accessKeyExistingAccessKey | string | `""` | Set the secret access key for S3 storage from existing k8s secret key | +| persistence.s3.accessKeyExistingSecret | string | `""` | Set the secret access key for S3 storage from existing k8s secret | +| persistence.s3.bucket | string | `""` | Sets the bucket name for S3 storage | +| persistence.s3.endpointUrl | string | `""` | Sets the endpoint url for S3 storage | +| persistence.s3.keyPrefix | string | `""` | Sets the key prefix for a S3 object | +| persistence.s3.region | string | `""` | Sets the region name for S3 storage | +| persistence.s3.secretKey | string | `""` | Sets the secret access key for S3 storage (ignored if secretKeyExistingSecret is set) | +| persistence.s3.secretKeyExistingSecret | string | `""` | Set the secret key for S3 storage from existing k8s secret | +| persistence.s3.secretKeyExistingSecretKey | string | `""` | Set the secret key for S3 storage from existing k8s secret key | + +### SSO Configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| sso.enableGroupManagement | bool | `false` | Enable OAuth group management through access token groups claim | +| sso.enableRoleManagement | bool | `false` | Enable OAuth role management through access token roles claim | +| sso.enableSignup | bool | `false` | Enable account creation when logging in with OAuth (distinct from regular signup) | +| sso.enabled | bool | `false` | **Enable SSO authentication globally** must enable to use SSO authentication | +| sso.groupManagement.groupsClaim | string | `"groups"` | The claim that contains the groups (can be nested, e.g., user.memberOf) | +| sso.mergeAccountsByEmail | bool | `false` | Allow logging into accounts that match email from OAuth provider (considered insecure) | + +### GitHub OAuth configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| sso.github.clientExistingSecret | string | `""` | GitHub OAuth client secret from existing secret | +| sso.github.clientExistingSecretKey | string | `""` | GitHub OAuth client secret key from existing secret | +| sso.github.clientId | string | `""` | GitHub OAuth client ID | +| sso.github.clientSecret | string | `""` | GitHub OAuth client secret (ignored if clientExistingSecret is set) | +| sso.github.enabled | bool | `false` | Enable GitHub OAuth | + +### Google OAuth configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| sso.google.clientExistingSecret | string | `""` | Google OAuth client secret from existing secret | +| sso.google.clientExistingSecretKey | string | `""` | Google OAuth client secret key from existing secret | +| sso.google.clientId | string | `""` | Google OAuth client ID | +| sso.google.clientSecret | string | `""` | Google OAuth client secret (ignored if clientExistingSecret is set) | +| sso.google.enabled | bool | `false` | Enable Google OAuth | + +### Microsoft OAuth configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| sso.microsoft.clientExistingSecret | string | `""` | Microsoft OAuth client secret from existing secret | +| sso.microsoft.clientExistingSecretKey | string | `""` | Microsoft OAuth client secret key from existing secret | +| sso.microsoft.clientId | string | `""` | Microsoft OAuth client ID | +| sso.microsoft.clientSecret | string | `""` | Microsoft OAuth client secret (ignored if clientExistingSecret is set) | +| sso.microsoft.enabled | bool | `false` | Enable Microsoft OAuth | +| sso.microsoft.tenantId | string | `""` | Microsoft tenant ID - use 9188040d-6c67-4c5b-b112-36a304b66dad for personal accounts | + +### OIDC configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| sso.oidc.clientExistingSecret | string | `""` | OICD client secret from existing secret | +| sso.oidc.clientExistingSecretKey | string | `""` | OIDC client secret key from existing secret | +| sso.oidc.clientId | string | `""` | OIDC client ID | +| sso.oidc.clientSecret | string | `""` | OIDC client secret (ignored if clientExistingSecret is set) | +| sso.oidc.enabled | bool | `false` | Enable OIDC authentication | +| sso.oidc.providerName | string | `"SSO"` | Name of the provider to show on the UI | +| sso.oidc.providerUrl | string | `""` | OIDC provider well known URL | +| sso.oidc.scopes | string | `"openid email profile"` | Scopes to request (space-separated). | + +### Role management configuration + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| sso.roleManagement.adminRoles | string | `""` | Comma-separated list of roles allowed to log in as admin (receive open webui role admin) | +| sso.roleManagement.allowedRoles | string | `""` | Comma-separated list of roles allowed to log in (receive open webui role user) | +| sso.roleManagement.rolesClaim | string | `"roles"` | The claim that contains the roles (can be nested, e.g., user.roles) | + +### SSO trusted header authentication + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| sso.trustedHeader.emailHeader | string | `""` | Header containing the user's email address | +| sso.trustedHeader.enabled | bool | `false` | Enable trusted header authentication | +| sso.trustedHeader.nameHeader | string | `""` | Header containing the user's name (optional, used for new user creation) | + +### Other Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | Affinity for pod assignment | +| annotations | object | `{}` | | +| args | list | `[]` | Open WebUI container arguments (overrides default) | +| clusterDomain | string | `"cluster.local"` | Value of cluster domain | +| command | list | `[]` | Open WebUI container command (overrides default entrypoint) | +| commonEnvVars | list | `[]` | Env vars added to the Open WebUI deployment, common across environments. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/ (caution: environment variables defined in both `extraEnvVars` and `commonEnvVars` will result in a conflict. Avoid duplicates) | +| containerSecurityContext | object | `{}` | Configure container security context ref: | +| copyAppData.args | list | `[]` | Open WebUI copy-app-data init container arguments (overrides default) | +| copyAppData.command | list | `[]` | Open WebUI copy-app-data init container command (overrides default) | +| copyAppData.resources | object | `{}` | | +| databaseUrl | string | `""` | Configure database URL, needed to work with Postgres (example: `postgresql://:@:/`), leave empty to use the default sqlite database | +| enableOpenaiApi | bool | `true` | Enables the use of OpenAI APIs | +| extraEnvFrom | list | `[]` | Env vars added from configmap or secret to the Open WebUI deployment. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/ (caution: `extraEnvVars` will take precedence over the value from `extraEnvFrom`) | +| extraEnvVars | list | `[{"name":"OPENAI_API_KEY","value":"0p3n-w3bu!"}]` | Env vars added to the Open WebUI deployment. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/ | +| extraEnvVars[0] | object | `{"name":"OPENAI_API_KEY","value":"0p3n-w3bu!"}` | Default API key value for Pipelines. Should be updated in a production deployment, or be changed to the required API key if not using Pipelines | +| extraInitContainers | list | `[]` | Additional init containers to add to the deployment/statefulset ref: | +| extraResources | list | `[]` | Extra resources to deploy with Open WebUI | +| hostAliases | list | `[]` | HostAliases to be added to hosts-file of each container | +| image | object | `{"pullPolicy":"IfNotPresent","repository":"ghcr.io/open-webui/open-webui","tag":""}` | Open WebUI image tags can be found here: https://github.com/open-webui/open-webui | +| imagePullSecrets | list | `[]` | Configure imagePullSecrets to use private registry ref: | +| ingress.additionalHosts | list | `[]` | | +| ingress.annotations | object | `{}` | Use appropriate annotations for your Ingress controller, e.g., for NGINX: | +| ingress.class | string | `""` | | +| ingress.enabled | bool | `false` | | +| ingress.existingSecret | string | `""` | | +| ingress.extraLabels | object | `{}` | Additional custom labels to add to the Ingress metadata Useful for tagging, selecting, or applying policies to the Ingress via labels. | +| ingress.host | string | `"chat.example.com"` | | +| ingress.tls | bool | `false` | | +| livenessProbe | object | `{}` | Probe for liveness of the Open WebUI container ref: | +| managedCertificate.domains[0] | string | `"chat.example.com"` | | +| managedCertificate.enabled | bool | `false` | | +| managedCertificate.name | string | `"mydomain-chat-cert"` | | +| nameOverride | string | `""` | | +| namespaceOverride | string | `""` | | +| nodeSelector | object | `{}` | Node labels for pod assignment. | +| ollama.enabled | bool | `true` | Automatically install Ollama Helm chart from https://otwld.github.io/ollama-helm/. Use [Helm Values](https://github.com/otwld/ollama-helm/#helm-values) to configure | +| ollama.fullnameOverride | string | `"open-webui-ollama"` | If enabling embedded Ollama, update fullnameOverride to your desired Ollama name value, or else it will use the default ollama.name value from the Ollama chart | +| ollamaUrls | list | `[]` | A list of Ollama API endpoints. These can be added in lieu of automatically installing the Ollama Helm chart, or in addition to it. | +| ollamaUrlsFromExtraEnv | bool | `false` | Disables taking Ollama Urls from `ollamaUrls` list | +| openaiBaseApiUrl | string | `"https://api.openai.com/v1"` | OpenAI base API URL to use. Defaults to the Pipelines service endpoint when Pipelines are enabled, and "https://api.openai.com/v1" if Pipelines are not enabled and this value is blank | +| openaiBaseApiUrls | list | `[]` | OpenAI base API URLs to use. Overwrites the value in openaiBaseApiUrl if set | +| persistence.accessModes | list | `["ReadWriteOnce"]` | If using multiple replicas, you must update accessModes to ReadWriteMany | +| persistence.annotations | object | `{}` | | +| persistence.enabled | bool | `true` | | +| persistence.existingClaim | string | `""` | Use existingClaim if you want to re-use an existing Open WebUI PVC instead of creating a new one | +| persistence.provider | string | `"local"` | Sets the storage provider, availables values are `local`, `s3`, `gcs` or `azure` | +| persistence.selector | object | `{}` | | +| persistence.size | string | `"2Gi"` | | +| persistence.storageClass | string | `""` | | +| persistence.subPath | string | `""` | Subdirectory of Open WebUI PVC to mount. Useful if root directory is not empty. | +| pipelines.enabled | bool | `true` | Automatically install Pipelines chart to extend Open WebUI functionality using Pipelines: https://github.com/open-webui/pipelines | +| pipelines.extraEnvVars | list | `[]` | This section can be used to pass required environment variables to your pipelines (e.g. Langfuse hostname) | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| podSecurityContext | object | `{}` | Configure pod security context ref: | +| priorityClassName | string | `""` | Priority class name for the Open WebUI pods | +| readinessProbe | object | `{}` | Probe for readiness of the Open WebUI container ref: | +| replicaCount | int | `1` | | +| resources | object | `{}` | | +| revisionHistoryLimit | int | `10` | Revision history limit for the workload manager (deployment). | +| runtimeClassName | string | `""` | Configure runtime class ref: | +| service | object | `{"annotations":{},"containerPort":8080,"labels":{},"loadBalancerClass":"","nodePort":"","port":80,"type":"ClusterIP"}` | Service values to expose Open WebUI pods to cluster | +| serviceAccount.annotations | object | `{}` | | +| serviceAccount.automountServiceAccountToken | bool | `false` | | +| serviceAccount.enable | bool | `true` | | +| serviceAccount.name | string | `""` | | +| startupProbe | object | `{}` | Probe for startup of the Open WebUI container ref: | +| strategy | object | `{}` | Strategy for updating the workload manager: deployment or statefulset | +| tika.enabled | bool | `false` | Automatically install Apache Tika to extend Open WebUI | +| tolerations | list | `[]` | Tolerations for pod assignment | +| topologySpreadConstraints | list | `[]` | Topology Spread Constraints for pod assignment | +| volumeMounts | object | `{"container":[],"initContainer":[]}` | Configure container volume mounts ref: | +| volumes | list | `[]` | Configure pod volumes ref: | +| websocket.enabled | bool | `false` | Enables websocket support in Open WebUI with env `ENABLE_WEBSOCKET_SUPPORT` | +| websocket.manager | string | `"redis"` | Specifies the websocket manager to use with env `WEBSOCKET_MANAGER`: redis (default) | +| websocket.nodeSelector | object | `{}` | Node selector for websocket pods | +| websocket.redis | object | `{"affinity":{},"annotations":{},"args":[],"command":[],"enabled":true,"image":{"pullPolicy":"IfNotPresent","repository":"redis","tag":"7.4.2-alpine3.21"},"labels":{},"name":"open-webui-redis","pods":{"annotations":{},"labels":{}},"resources":{},"securityContext":{},"service":{"annotations":{},"containerPort":6379,"labels":{},"nodePort":"","port":6379,"portName":"http","type":"ClusterIP"},"tolerations":[]}` | Deploys a redis | +| websocket.redis.affinity | object | `{}` | Redis affinity for pod assignment | +| websocket.redis.annotations | object | `{}` | Redis annotations | +| websocket.redis.args | list | `[]` | Redis arguments (overrides default) | +| websocket.redis.command | list | `[]` | Redis command (overrides default) | +| websocket.redis.enabled | bool | `true` | Enable redis installation | +| websocket.redis.image | object | `{"pullPolicy":"IfNotPresent","repository":"redis","tag":"7.4.2-alpine3.21"}` | Redis image | +| websocket.redis.labels | object | `{}` | Redis labels | +| websocket.redis.name | string | `"open-webui-redis"` | Redis name | +| websocket.redis.pods | object | `{"annotations":{},"labels":{}}` | Redis pod | +| websocket.redis.pods.annotations | object | `{}` | Redis pod annotations | +| websocket.redis.pods.labels | object | `{}` | Redis pod labels | +| websocket.redis.resources | object | `{}` | Redis resources | +| websocket.redis.securityContext | object | `{}` | Redis security context | +| websocket.redis.service | object | `{"annotations":{},"containerPort":6379,"labels":{},"nodePort":"","port":6379,"portName":"http","type":"ClusterIP"}` | Redis service | +| websocket.redis.service.annotations | object | `{}` | Redis service annotations | +| websocket.redis.service.containerPort | int | `6379` | Redis container/target port | +| websocket.redis.service.labels | object | `{}` | Redis service labels | +| websocket.redis.service.nodePort | string | `""` | Redis service node port. Valid only when type is `NodePort` | +| websocket.redis.service.port | int | `6379` | Redis service port | +| websocket.redis.service.portName | string | `"http"` | Redis service port name. Istio needs this to be something like `tcp-redis` | +| websocket.redis.service.type | string | `"ClusterIP"` | Redis service type | +| websocket.redis.tolerations | list | `[]` | Redis tolerations for pod assignment | +| websocket.url | string | `"redis://open-webui-redis:6379/0"` | Specifies the URL of the Redis instance for websocket communication. Template with `redis://[:@]:/` | + +---------------------------------------------- + +Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/). diff --git a/open-webui/README.md.gotmpl b/open-webui/README.md.gotmpl new file mode 100644 index 0000000..89fee1c --- /dev/null +++ b/open-webui/README.md.gotmpl @@ -0,0 +1,36 @@ +{{ template "chart.header" . }} + +{{ template "chart.deprecationWarning" . }} + +{{ template "chart.badgesSection" . }} + +{{ template "chart.description" . }} + +{{ template "chart.homepageLine" . }} + +{{ template "chart.maintainersSection" . }} + +{{ template "chart.sourcesSection" . }} + +## Installing + +Before you can install, you need to add the `open-webui` repo to [Helm](https://helm.sh) + +```shell +helm repo add open-webui https://helm.openwebui.com/ +helm repo update +``` + +Now you can install the chart: + +```shell +helm upgrade --install open-webui open-webui/open-webui +``` + +{{ template "chart.requirementsSection" . }} + +{{ template "chart.valuesSection" . }} + +---------------------------------------------- + +Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/). diff --git a/open-webui/charts/ollama/.helmignore b/open-webui/charts/ollama/.helmignore new file mode 100644 index 0000000..50dab1d --- /dev/null +++ b/open-webui/charts/ollama/.helmignore @@ -0,0 +1,30 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +.drone.yml +*.tmproj +.vscode/ + +#others +.github +kind-config.yml +ci/ + diff --git a/open-webui/charts/ollama/.ollama-helm/.helmignore b/open-webui/charts/ollama/.ollama-helm/.helmignore new file mode 100644 index 0000000..50dab1d --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/.helmignore @@ -0,0 +1,30 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +.drone.yml +*.tmproj +.vscode/ + +#others +.github +kind-config.yml +ci/ + diff --git a/open-webui/charts/ollama/.ollama-helm/Chart.yaml b/open-webui/charts/ollama/.ollama-helm/Chart.yaml new file mode 100644 index 0000000..1c0a21d --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/Chart.yaml @@ -0,0 +1,33 @@ +apiVersion: v2 +name: ollama +description: Get up and running with large language models locally. + +type: application + +version: 1.27.0 + +appVersion: "0.11.4" + +annotations: + artifacthub.io/category: ai-machine-learning + artifacthub.io/changes: | + - kind: changed + description: upgrade app version to 0.11.4 + links: + - name: Ollama release v0.11.4 + url: https://github.com/ollama/ollama/releases/tag/v0.11.4 + +kubeVersion: "^1.16.0-0" +home: https://ollama.ai/ +icon: https://ollama.ai/public/ollama.png +keywords: + - ai + - llm + - llama + - mistral +sources: + - https://github.com/ollama/ollama + - https://github.com/otwld/ollama-helm +maintainers: + - name: OTWLD + email: contact@otwld.com diff --git a/open-webui/charts/ollama/.ollama-helm/LICENSE b/open-webui/charts/ollama/.ollama-helm/LICENSE new file mode 100644 index 0000000..01a4c80 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 OTWLD + +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. diff --git a/open-webui/charts/ollama/.ollama-helm/README.md b/open-webui/charts/ollama/.ollama-helm/README.md new file mode 100644 index 0000000..537f769 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/README.md @@ -0,0 +1,331 @@ +![otwld ollama helm chart banner](./banner.png) + +![GitHub License](https://img.shields.io/github/license/otwld/ollama-helm) +[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/ollama-helm)](https://artifacthub.io/packages/helm/ollama-helm/ollama) +[![Helm Lint and Test](https://github.com/otwld/ollama-helm/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/otwld/ollama-helm/actions/workflows/ci.yaml) +[![Discord](https://img.shields.io/badge/Discord-OTWLD-blue?logo=discord&logoColor=white)](https://discord.gg/U24mpqTynB) + +[Ollama](https://ollama.ai/), get up and running with large language models, locally. + +This Community Chart is for deploying [Ollama](https://github.com/ollama/ollama). + +## Requirements + +- Kubernetes: `>= 1.16.0-0` for **CPU only** + +- Kubernetes: `>= 1.26.0-0` for **GPU** stable support (NVIDIA and AMD) + +*Not all GPUs are currently supported with ollama (especially with AMD)* + +## Deploying Ollama chart + +To install the `ollama` chart in the `ollama` namespace: + +> [!IMPORTANT] +> We are migrating the registry from https://otwld.github.io/ollama-helm/ url to OTWLD Helm central +> registry https://helm.otwld.com/ +> Please update your Helm registry accordingly. + +```console +helm repo add otwld https://helm.otwld.com/ +helm repo update +helm install ollama otwld/ollama --namespace ollama --create-namespace +``` + +## Upgrading Ollama chart + +First please read the [release notes](https://github.com/ollama/ollama/releases) of Ollama to make sure there are no +backwards incompatible changes. + +Make adjustments to your values as needed, then run `helm upgrade`: + +```console +# -- This pulls the latest version of the ollama chart from the repo. +helm repo update +helm upgrade ollama otwld/ollama --namespace ollama --values values.yaml +``` + +## Uninstalling Ollama chart + +To uninstall/delete the `ollama` deployment in the `ollama` namespace: + +```console +helm delete ollama --namespace ollama +``` + +Substitute your values if they differ from the examples. See `helm delete --help` for a full reference on `delete` +parameters and flags. + +## Interact with Ollama + +- **Ollama documentation can be found [HERE](https://github.com/ollama/ollama/tree/main/docs)** +- Interact with RESTful API: [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md) +- Interact with official clients libraries: [ollama-js](https://github.com/ollama/ollama-js#custom-client) + and [ollama-python](https://github.com/ollama/ollama-python#custom-client) +- Interact with langchain: [langchain-js](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainjs.md) + and [langchain-python](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainpy.md) + +## Examples + +- **It's highly recommended to run an updated version of Kubernetes for deploying ollama with GPU** + +### Basic values.yaml example with GPU and two models pulled at startup + +``` +ollama: + gpu: + # -- Enable GPU integration + enabled: true + + # -- GPU type: 'nvidia' or 'amd' + type: 'nvidia' + + # -- Specify the number of GPU to 1 + number: 1 + + # -- List of models to pull at container startup + models: + pull: + - mistral + - llama2 +``` + +--- + +### Basic values.yaml example with Ingress + +``` +ollama: + models: + pull: + - llama2 + +ingress: + enabled: true + hosts: + - host: ollama.domain.lan + paths: + - path: / + pathType: Prefix +``` + +- *API is now reachable at `ollama.domain.lan`* + +--- + +### Create and run model from template + +``` +ollama: + models: + create: + - name: llama3.1-ctx32768 + template: | + FROM llama3.1 + PARAMETER num_ctx 32768 + run: + - llama3.1-ctx32768 +``` + +## Upgrading from 0.X.X to 1.X.X + +The version 1.X.X introduces the ability to load models in memory at startup, the values have been changed. + +Please change `ollama.models` to `ollama.models.pull` to avoid errors before upgrading: + +```yaml +ollama: + models: + - mistral + - llama2 +``` + +To: + +```yaml +ollama: + models: + pull: + - mistral + - llama2 +``` + +## Helm Values + +- See [values.yaml](values.yaml) to see the Chart's default values. + +| Key | Type | Default | Description | +|--------------------------------------------|--------|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| affinity | object | `{}` | Affinity for pod assignment | +| autoscaling.enabled | bool | `false` | Enable autoscaling | +| autoscaling.maxReplicas | int | `100` | Number of maximum replicas | +| autoscaling.minReplicas | int | `1` | Number of minimum replicas | +| autoscaling.targetCPUUtilizationPercentage | int | `80` | CPU usage to target replica | +| deployment.labels | object | `{}` | Labels to add to the deployment | +| extraArgs | list | `[]` | Additional arguments on the output Deployment definition. | +| extraEnv | list | `[]` | Additional environments variables on the output Deployment definition. For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go | +| extraEnvFrom | list | `[]` | Additionl environment variables from external sources (like ConfigMap) | +| extraObjects | list | `[]` | Extra K8s manifests to deploy | +| fullnameOverride | string | `""` | String to fully override template | +| hostIPC | bool | `false` | Use the host’s ipc namespace. | +| hostNetwork | bool | `false` | Use the host's network namespace. | +| hostPID | bool | `false` | Use the host’s pid namespace | +| image.pullPolicy | string | `"IfNotPresent"` | Docker pull policy | +| image.repository | string | `"ollama/ollama"` | Docker image registry | +| image.tag | string | `""` | Docker image tag, overrides the image tag whose default is the chart appVersion. | +| imagePullSecrets | list | `[]` | Docker registry secret names as an array | +| ingress.annotations | object | `{}` | Additional annotations for the Ingress resource. | +| ingress.className | string | `""` | IngressClass that will be used to implement the Ingress (Kubernetes 1.18+) | +| ingress.enabled | bool | `false` | Enable ingress controller resource | +| ingress.hosts[0].host | string | `"ollama.local"` | | +| ingress.hosts[0].paths[0].path | string | `"/"` | | +| ingress.hosts[0].paths[0].pathType | string | `"Prefix"` | | +| ingress.tls | list | `[]` | The tls configuration for hostnames to be covered with this ingress record. | +| initContainers | list | `[]` | Init containers to add to the pod | +| knative.annotations | object | `{}` | Knative service annotations | +| knative.containerConcurrency | int | `0` | Knative service container concurrency | +| knative.enabled | bool | `false` | Enable Knative integration | +| knative.idleTimeoutSeconds | int | `300` | Knative service idle timeout seconds | +| knative.responseStartTimeoutSeconds | int | `300` | Knative service response start timeout seconds | +| knative.timeoutSeconds | int | `300` | Knative service timeout seconds | +| lifecycle | object | `{}` | Lifecycle for pod assignment (override ollama.models startup pull/run) | +| livenessProbe.enabled | bool | `true` | Enable livenessProbe | +| livenessProbe.failureThreshold | int | `6` | Failure threshold for livenessProbe | +| livenessProbe.initialDelaySeconds | int | `60` | Initial delay seconds for livenessProbe | +| livenessProbe.path | string | `"/"` | Request path for livenessProbe | +| livenessProbe.periodSeconds | int | `10` | Period seconds for livenessProbe | +| livenessProbe.successThreshold | int | `1` | Success threshold for livenessProbe | +| livenessProbe.timeoutSeconds | int | `5` | Timeout seconds for livenessProbe | +| nameOverride | string | `""` | String to partially override template (will maintain the release name) | +| namespaceOverride | string | `""` | String to fully override namespace | +| nodeSelector | object | `{}` | Node labels for pod assignment. | +| ollama.gpu.draDriverClass | string | `"gpu.nvidia.com"` | DRA GPU DriverClass | +| ollama.gpu.draEnabled | bool | `false` | Enable DRA GPU integration If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters | +| ollama.gpu.draExistingClaimTemplate | string | `""` | Existing DRA GPU ResourceClaim Template | +| ollama.gpu.enabled | bool | `false` | Enable GPU integration | +| ollama.gpu.mig.devices | object | `{}` | Specify the mig devices and the corresponding number | +| ollama.gpu.mig.enabled | bool | `false` | Enable multiple mig devices If enabled you will have to specify the mig devices If enabled is set to false this section is ignored | +| ollama.gpu.number | int | `1` | Specify the number of GPU If you use MIG section below then this parameter is ignored | +| ollama.gpu.nvidiaResource | string | `"nvidia.com/gpu"` | only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice | +| ollama.gpu.type | string | `"nvidia"` | GPU type: 'nvidia' or 'amd' If 'ollama.gpu.enabled', default value is nvidia If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override This is due cause AMD and CPU/CUDA are different images | +| ollama.insecure | bool | `false` | Add insecure flag for pulling at container startup | +| ollama.models.clean | bool | `false` | Automatically remove models present on the disk but not specified in the values file | +| ollama.models.create | list | `[]` | List of models to create at container startup, there are two options 1. Create a raw model 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory. create: - name: llama3.1-ctx32768 configMapRef: my-configmap configMapKeyRef: configmap-key - name: llama3.1-ctx32768 template: | FROM llama3.1 PARAMETER num_ctx 32768 | +| ollama.models.pull | list | `[]` | List of models to pull at container startup The more you add, the longer the container will take to start if models are not present pull: - llama2 - mistral | +| ollama.models.run | list | `[]` | List of models to load in memory at container startup run: - llama2 - mistral | +| ollama.mountPath | string | `""` | Override ollama-data volume mount path, default: "/root/.ollama" | +| ollama.port | int | `11434` | | +| persistentVolume.accessModes | list | `["ReadWriteOnce"]` | Ollama server data Persistent Volume access modes Must match those of existing PV or dynamic provisioner Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ | +| persistentVolume.annotations | object | `{}` | Ollama server data Persistent Volume annotations | +| persistentVolume.enabled | bool | `false` | Enable persistence using PVC | +| persistentVolume.existingClaim | string | `""` | If you'd like to bring your own PVC for persisting Ollama state, pass the name of the created + ready PVC here. If set, this Chart will not create the default PVC. Requires server.persistentVolume.enabled: true | +| persistentVolume.size | string | `"30Gi"` | Ollama server data Persistent Volume size | +| persistentVolume.storageClass | string | `""` | Ollama server data Persistent Volume Storage Class If defined, storageClassName: If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) | +| persistentVolume.subPath | string | `""` | Subdirectory of Ollama server data Persistent Volume to mount Useful if the volume's root directory is not empty | +| persistentVolume.volumeMode | string | `""` | Ollama server data Persistent Volume Binding Mode If defined, volumeMode: If empty (the default) or set to null, no volumeBindingMode spec is set, choosing the default mode. | +| persistentVolume.volumeName | string | `""` | Pre-existing PV to attach this claim to Useful if a CSI auto-provisions a PV for you and you want to always reference the PV moving forward | +| podAnnotations | object | `{}` | Map of annotations to add to the pods | +| podLabels | object | `{}` | Map of labels to add to the pods | +| podSecurityContext | object | `{}` | Pod Security Context | +| priorityClassName | string | `""` | Priority Class Name | +| readinessProbe.enabled | bool | `true` | Enable readinessProbe | +| readinessProbe.failureThreshold | int | `6` | Failure threshold for readinessProbe | +| readinessProbe.initialDelaySeconds | int | `30` | Initial delay seconds for readinessProbe | +| readinessProbe.path | string | `"/"` | Request path for readinessProbe | +| readinessProbe.periodSeconds | int | `5` | Period seconds for readinessProbe | +| readinessProbe.successThreshold | int | `1` | Success threshold for readinessProbe | +| readinessProbe.timeoutSeconds | int | `3` | Timeout seconds for readinessProbe | +| replicaCount | int | `1` | Number of replicas | +| resources.limits | object | `{}` | Pod limit | +| resources.requests | object | `{}` | Pod requests | +| runtimeClassName | string | `""` | Specify runtime class | +| securityContext | object | `{}` | Container Security Context | +| service.annotations | object | `{}` | Annotations to add to the service | +| service.labels | object | `{}` | Labels to add to the service | +| service.loadBalancerIP | string | `nil` | Load Balancer IP address | +| service.nodePort | int | `31434` | Service node port when service type is 'NodePort' | +| service.port | int | `11434` | Service port | +| service.type | string | `"ClusterIP"` | Service type | +| serviceAccount.annotations | object | `{}` | Annotations to add to the service account | +| serviceAccount.automount | bool | `true` | Automatically mount a ServiceAccount's API credentials? | +| serviceAccount.create | bool | `true` | Specifies whether a service account should be created | +| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | +| terminationGracePeriodSeconds | int | `120` | Wait for a grace period | +| tests.annotations | object | `{}` | Annotations to add to the tests | +| tests.enabled | bool | `true` | | +| tests.labels | object | `{}` | Labels to add to the tests | +| tolerations | list | `[]` | Tolerations for pod assignment | +| topologySpreadConstraints | object | `{}` | Topology Spread Constraints for pod assignment | +| updateStrategy.type | string | `"Recreate"` | Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate | +| volumeMounts | list | `[]` | Additional volumeMounts on the output Deployment definition. | +| volumes | list | `[]` | Additional volumes on the output Deployment definition. | + +---------------------------------------------- + +## Core team + + + + + + +
+ Jean Baptiste Detroyes
     Jean Baptiste Detroyes     
+
+ + +
+
+ Jean Baptiste Detroyes
     Nathan Tréhout     
+
+ + + +
+
+ +## Support + +- For questions, suggestions, and discussion about Ollama please refer to + the [Ollama issue page](https://github.com/ollama/ollama/issues) +- For questions, suggestions, and discussion about this chart please + visit [Ollama-Helm issue page](https://github.com/otwld/ollama-helm/issues) or join + our [OTWLD Discord](https://discord.gg/U24mpqTynB) diff --git a/open-webui/charts/ollama/.ollama-helm/templates/NOTES.txt b/open-webui/charts/ollama/.ollama-helm/templates/NOTES.txt new file mode 100644 index 0000000..4f4889d --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/NOTES.txt @@ -0,0 +1,25 @@ +1. Get the application URL by running these commands: +{{- if .Values.knative.enabled }} + export KSERVICE_URL=$(kubectl get ksvc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} -o jsonpath={.status.url}) + echo "Visit $KSERVICE_URL to use your application" +{{- else if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "ollama.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "ollama.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "ollama.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/_helpers.tpl b/open-webui/charts/ollama/.ollama-helm/templates/_helpers.tpl new file mode 100644 index 0000000..17ea417 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts +*/}} +{{- define "ollama.namespace" -}} + {{- if .Values.namespaceOverride -}} + {{- .Values.namespaceOverride -}} + {{- else -}} + {{- .Release.Namespace -}} + {{- end -}} +{{- end -}} + +{{/* +Expand the name of the chart. +*/}} +{{- define "ollama.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "ollama.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "ollama.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "ollama.labels" -}} +helm.sh/chart: {{ include "ollama.chart" . }} +{{ include "ollama.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "ollama.selectorLabels" -}} +app.kubernetes.io/name: {{ include "ollama.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "ollama.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "ollama.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Models mount path +*/}} +{{- define "ollama.modelsMountPath" -}} +{{- printf "%s/models" (((.Values).ollama).mountPath | default "/root/.ollama") }} +{{- end -}} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/deployment.yaml b/open-webui/charts/ollama/.ollama-helm/templates/deployment.yaml new file mode 100644 index 0000000..090d2a0 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/deployment.yaml @@ -0,0 +1,293 @@ +--- +{{- if not .Values.knative.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.deployment.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + {{- if or .Values.updateStrategy.type .Values.updateStrategy.rollingUpdate }} + strategy: {{ .Values.updateStrategy | toYaml | nindent 4 }} + {{- end }} + selector: + matchLabels: + {{- include "ollama.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "ollama.labels" . | nindent 8 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- if .Values.hostIPC }} + hostIPC: {{ .Values.hostIPC }} + {{- end }} + {{- if .Values.hostPID }} + hostPID: {{ .Values.hostPID }} + {{- end }} + {{- if .Values.hostNetwork }} + hostNetwork: {{ .Values.hostNetwork }} + {{- end }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "ollama.serviceAccountName" . }} + {{- if .Values.priorityClassName }} + priorityClassName: {{ .Values.priorityClassName | quote }} + {{- end }} + {{- if .Values.terminationGracePeriodSeconds }} + terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }} + {{- end }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + {{- if .Values.runtimeClassName }} + runtimeClassName: {{ .Values.runtimeClassName | quote }} + {{- end }} + {{- with .Values.initContainers }} + initContainers: + {{- tpl (toYaml . ) $ | nindent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.ollama.port }} + protocol: TCP + env: + - name: OLLAMA_HOST + value: "0.0.0.0:{{ .Values.ollama.port }}" + {{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}} + - name: PATH + value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + {{- end}} + {{- with .Values.extraEnv }} + {{- toYaml . | nindent 12 }} + {{- end }} + envFrom: + {{- with .Values.extraEnvFrom }} + {{- toYaml . | nindent 12 }} + {{- end }} + args: + {{- with .Values.extraArgs }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.resources }} + resources: + {{- $limits := default dict .Values.resources.limits }} + {{- if .Values.ollama.gpu.enabled }} + {{- if .Values.ollama.gpu.draEnabled}} + claims: + - name: gpu + {{- else }} + # If gpu is enabled, it can either be a NVIDIA card or a AMD card + {{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }} + # NVIDIA is assumed by default if no value is set and GPU is enabled + # NVIDIA cards can have mig enabled (i.e., the card is sliced into parts + # Therefore, the first case is no migs enabled + {{- if or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled ) }} + {{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }} + {{- $limits = merge $limits $gpuLimit }} + # Second case is mig is enabled + {{- else if or (.Values.ollama.gpu.mig.enabled) }} + # Initialize empty dictionary + {{- $migDevices := dict -}} + # Loop over the entries in the mig devices + {{- range $key, $value := .Values.ollama.gpu.mig.devices }} + {{- $migKey := printf "nvidia.com/mig-%s" $key -}} + {{- $migDevices = merge $migDevices (dict $migKey $value) -}} + {{- end }} + {{- $limits = merge $limits $migDevices}} + {{- end }} + {{- end }} + {{- if eq .Values.ollama.gpu.type "amd" }} + {{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }} + {{- $limits = merge $limits $gpuLimit }} + {{- end }} + {{- end }} + {{- end }} + {{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }} + {{- toYaml $ressources | nindent 12 }} + {{- end}} + volumeMounts: + - name: ollama-data + mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }} + {{- if .Values.persistentVolume.subPath }} + subPath: {{ .Values.persistentVolume.subPath }} + {{- end }} + {{- range .Values.ollama.models.create }} + {{- if .configMapRef }} + - name: {{ .name }}-config-model-volume + mountPath: /models + {{- end }} + {{- end }} + {{- with .Values.volumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: {{ .Values.livenessProbe.path }} + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: {{ .Values.readinessProbe.path }} + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + {{- with .Values.lifecycle}} + lifecycle: + {{- toYaml . | nindent 12 }} + {{- else }} + {{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }} + lifecycle: + postStart: + exec: + command: + - /bin/sh + - -c + - | + while ! /bin/ollama ps > /dev/null 2>&1; do + sleep 5 + done + + {{- $allModels := list -}} + + {{- if .Values.ollama.models.pull }} + {{- range .Values.ollama.models.pull }} + + {{- if contains ":" . }} + {{- $allModels = append $allModels . }} + {{- else }} + {{- $allModels = append $allModels (printf "%s:latest" .) }} + {{- end }} + + /bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.create }} + {{- range .Values.ollama.models.create }} + {{- $allModels = append $allModels .name }} + {{- if .template }} + cat < {{ include "ollama.modelsMountPath" $ }}/{{ .name }} + {{- .template | nindent 20 }} + EOF + /bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" $ }}/{{ .name }} + {{- end }} + {{- if .configMapRef }} + /bin/ollama create {{ .name }} -f /models/{{ .name }} + {{- end }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.run }} + {{- range .Values.ollama.models.run }} + + {{- if contains ":" . }} + {{- $allModels = append $allModels . }} + {{- else }} + {{- $allModels = append $allModels (printf "%s:latest" .) }} + {{- end }} + + /bin/ollama run {{ . }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.clean }} + /bin/ollama list | awk 'NR>1 {print $1}' | while read model; do + echo "{{ $allModels | join " " }}" | tr ' ' '\n' | grep -Fqx "$model" || /bin/ollama rm "$model" + done + {{- end }} + {{- end }} + {{- end }} + {{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled }} + resourceClaims: + - name: gpu + resourceClaimTemplateName: {{ .Values.ollama.gpu.draExistingClaimTemplate | default (printf "%s" (include "ollama.fullname" .)) }} + {{- end }} + volumes: + - name: ollama-data + {{- if .Values.persistentVolume.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }} + {{- else }} + emptyDir: { } + {{- end }} + {{- range .Values.ollama.models.create }} + {{- if .configMapRef }} + - name: {{ .name }}-config-model-volume + configMap: + name: {{ .configMapRef }} + items: + - key: {{ .configMapKeyRef }} + path: {{ .name }} + {{- end }} + {{- end }} + {{- with .Values.volumes }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.ollama.gpu.enabled .Values.tolerations }} + tolerations: + {{- if and .Values.ollama.gpu.enabled (and + ( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type)) + ( or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled)) + ) }} + - key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}" + operator: Exists + effect: NoSchedule + {{- else if and .Values.ollama.gpu.enabled (and + ( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type)) + (( .Values.ollama.gpu.mig.enabled)) + ) }} + {{- range $key, $value := .Values.ollama.gpu.mig.devices }} + - key: nvidia.com/mig-{{ $key }} + operator: Exists + effect: NoSchedule + {{- end }} + {{- end }} + {{- with .Values.tolerations }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/extra-manifests.yaml b/open-webui/charts/ollama/.ollama-helm/templates/extra-manifests.yaml new file mode 100644 index 0000000..2855904 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/extra-manifests.yaml @@ -0,0 +1,4 @@ +{{ range .Values.extraObjects }} +--- +{{ tpl (toYaml .) $ }} +{{ end }} \ No newline at end of file diff --git a/open-webui/charts/ollama/.ollama-helm/templates/hpa.yaml b/open-webui/charts/ollama/.ollama-helm/templates/hpa.yaml new file mode 100644 index 0000000..b249330 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/hpa.yaml @@ -0,0 +1,34 @@ +--- +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "ollama.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/ingress.yaml b/open-webui/charts/ollama/.ollama-helm/templates/ingress.yaml new file mode 100644 index 0000000..80343e2 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/ingress.yaml @@ -0,0 +1,63 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "ollama.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className }} + {{- end }} +{{- end }} +--- +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion }} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion }} +apiVersion: networking.k8s.io/v1beta1 +{{- else }} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/knative/service.yaml b/open-webui/charts/ollama/.ollama-helm/templates/knative/service.yaml new file mode 100644 index 0000000..54a7dee --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/knative/service.yaml @@ -0,0 +1,200 @@ +--- +{{- if .Values.knative.enabled }} +apiVersion: serving.knative.dev/v1 +kind: Service +metadata: + name: {{ include "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.knative.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + template: + spec: + containerConcurrency: {{ .Values.knative.containerConcurrency }} + timeoutSeconds: {{ .Values.knative.timeoutSeconds }} + responseStartTimeoutSeconds: {{ .Values.knative.responseStartTimeoutSeconds }} + idleTimeoutSeconds: {{ .Values.knative.idleTimeoutSeconds }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "ollama.serviceAccountName" . }} + {{- if .Values.runtimeClassName }} + runtimeClassName: {{ .Values.runtimeClassName | quote }} + {{- end }} + {{- if .Values.terminationGracePeriodSeconds }} + terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }} + {{- end }} + {{- with .Values.initContainers }} + initContainers: + {{- tpl (toYaml . ) $ | nindent 8 }} + {{- end }} + containers: + - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + ports: + - containerPort: {{ .Values.ollama.port }} + env: + - name: OLLAMA_HOST + value: "0.0.0.0:{{ .Values.ollama.port }}" + {{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}} + - name: PATH + value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + {{- end}} + {{- with .Values.extraEnv }} + {{- toYaml . | nindent 12 }} + {{- end }} + envFrom: + {{- with .Values.extraEnvFrom }} + {{- toYaml . | nindent 12 }} + {{- end }} + args: + {{- with .Values.extraArgs }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.resources }} + resources: + {{- $limits := default dict .Values.resources.limits }} + {{- if .Values.ollama.gpu.enabled }} + {{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }} + {{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }} + {{- $limits = merge $limits $gpuLimit }} + {{- end }} + {{- if eq .Values.ollama.gpu.type "amd" }} + {{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }} + {{- $limits = merge $limits $gpuLimit }} + {{- end }} + {{- end }} + {{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }} + {{- toYaml $ressources | nindent 12 }} + {{- end}} + volumeMounts: + - name: ollama-data + mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }} + {{- if .Values.persistentVolume.subPath }} + subPath: {{ .Values.persistentVolume.subPath }} + {{- end }} + {{- range .Values.ollama.models.create }} + {{- if .configMapRef }} + - name: {{ .name }}-config-model-volume + mountPath: /models + {{- end }} + {{- end }} + {{- with .Values.volumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: {{ .Values.livenessProbe.path }} + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: {{ .Values.readinessProbe.path }} + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + {{- with .Values.lifecycle}} + lifecycle: + {{- toYaml . | nindent 12 }} + {{- else }} + {{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }} + lifecycle: + postStart: + exec: + command: + - /bin/sh + - -c + - | + while ! /bin/ollama ps > /dev/null 2>&1; do + sleep 5 + done + {{- if .Values.ollama.models.pull }} + {{- range .Values.ollama.models.pull }} + /bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.create }} + {{- range .Values.ollama.models.create }} + {{- if .template }} + cat < {{ include "ollama.modelsMountPath" $ }}/{{ .name }} + {{- .template | nindent 20 }} + EOF + /bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" . }}/{{ .name }} + {{- end }} + {{- if .configMapRef }} + /bin/ollama create {{ .name }} -f /models/{{ .name }} + {{- end }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.run }} + {{- range .Values.ollama.models.run }} + /bin/ollama run {{ . }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + volumes: + - name: ollama-data + {{- if .Values.persistentVolume.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }} + {{- else }} + emptyDir: { } + {{- end }} + {{- range .Values.ollama.models.create }} + {{- if .configMapRef }} + - name: {{ .name }}-config-model-volume + configMap: + name: {{ .configMapRef }} + items: + - key: {{ .configMapKeyRef }} + path: {{ .name }} + {{- end }} + {{- end }} + {{- with .Values.volumes }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.ollama.gpu.enabled .Values.tolerations }} + tolerations: + {{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type)) }} + - key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}" + operator: Exists + effect: NoSchedule + {{- end }} + {{- with .Values.tolerations }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/pvc.yaml b/open-webui/charts/ollama/.ollama-helm/templates/pvc.yaml new file mode 100644 index 0000000..29faa9d --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/pvc.yaml @@ -0,0 +1,33 @@ +{{- if (and .Values.persistentVolume.enabled (not .Values.persistentVolume.existingClaim)) -}} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + {{- if .Values.persistentVolume.annotations }} + annotations: +{{ toYaml .Values.persistentVolume.annotations | indent 4 }} + {{- end }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + name: {{ template "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} +spec: + accessModes: +{{ toYaml .Values.persistentVolume.accessModes | indent 4 }} +{{- if .Values.persistentVolume.storageClass }} +{{- if (eq "-" .Values.persistentVolume.storageClass) }} + storageClassName: "" +{{- else }} + storageClassName: "{{ .Values.persistentVolume.storageClass }}" +{{- end }} +{{- end }} +{{- if .Values.persistentVolume.volumeMode }} + volumeMode: "{{ .Values.persistentVolume.volumeMode }}" +{{- end }} +{{- if .Values.persistentVolume.volumeName }} + volumeName: "{{ .Values.persistentVolume.volumeName }}" +{{- end }} + resources: + requests: + storage: "{{ .Values.persistentVolume.size }}" +{{- end -}} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/resourceclaimtemplate.yaml b/open-webui/charts/ollama/.ollama-helm/templates/resourceclaimtemplate.yaml new file mode 100644 index 0000000..2f2aedf --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/resourceclaimtemplate.yaml @@ -0,0 +1,19 @@ +{{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled (not .Values.ollama.gpu.draExistingClaimTemplate) -}} +--- +{{- if semverCompare ">=1.34-0" .Capabilities.KubeVersion.GitVersion }} +apiVersion: resource.k8s.io/v1 +{{- else }} +apiVersion: resource.k8s.io/v1beta1 +{{- end }} +kind: ResourceClaimTemplate +metadata: + name: {{ template "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} +spec: + spec: + devices: + requests: + - name: gpu + deviceClassName: {{ .Values.ollama.gpu.draDriverClass }} + count: {{(.Values.ollama.gpu.number | default 1)}} +{{- end -}} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/service.yaml b/open-webui/charts/ollama/.ollama-helm/templates/service.yaml new file mode 100644 index 0000000..2d6e6f5 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/service.yaml @@ -0,0 +1,32 @@ +--- +{{- if not .Values.knative.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.service.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + {{- if contains "NodePort" .Values.service.type }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} +{{- if .Values.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.service.loadBalancerIP | quote }} +{{- end }} + selector: + {{- include "ollama.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/serviceaccount.yaml b/open-webui/charts/ollama/.ollama-helm/templates/serviceaccount.yaml new file mode 100644 index 0000000..25ac575 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/serviceaccount.yaml @@ -0,0 +1,15 @@ +{{- if .Values.serviceAccount.create -}} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "ollama.serviceAccountName" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automount }} +{{- end }} diff --git a/open-webui/charts/ollama/.ollama-helm/templates/tests/test-connection.yaml b/open-webui/charts/ollama/.ollama-helm/templates/tests/test-connection.yaml new file mode 100644 index 0000000..48d5464 --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/templates/tests/test-connection.yaml @@ -0,0 +1,25 @@ +--- +{{- if .Values.tests.enabled }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "ollama.fullname" . }}-test-connection" + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.tests.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + {{- with .Values.tests.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "ollama.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never +{{ end }} diff --git a/open-webui/charts/ollama/.ollama-helm/values.yaml b/open-webui/charts/ollama/.ollama-helm/values.yaml new file mode 100644 index 0000000..a100aaf --- /dev/null +++ b/open-webui/charts/ollama/.ollama-helm/values.yaml @@ -0,0 +1,440 @@ +# Default values for ollama-helm. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +# -- Number of replicas +replicaCount: 1 + +# Knative configuration +knative: + # -- Enable Knative integration + enabled: false + # -- Knative service container concurrency + containerConcurrency: 0 + # -- Knative service timeout seconds + timeoutSeconds: 300 + # -- Knative service response start timeout seconds + responseStartTimeoutSeconds: 300 + # -- Knative service idle timeout seconds + idleTimeoutSeconds: 300 + # -- Knative service annotations + annotations: {} + +# Docker image +image: + # -- Docker image registry + repository: ollama/ollama + + # -- Docker pull policy + pullPolicy: IfNotPresent + + # -- Docker image tag, overrides the image tag whose default is the chart appVersion. + tag: "" + +# -- Docker registry secret names as an array +imagePullSecrets: [] + +# -- String to partially override template (will maintain the release name) +nameOverride: "" + +# -- String to fully override template +fullnameOverride: "" + +# -- String to fully override namespace +namespaceOverride: "" + +# Ollama parameters +ollama: + # Port Ollama is listening on + port: 11434 + + gpu: + # -- Enable GPU integration + enabled: false + + # -- Enable DRA GPU integration + # If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters + draEnabled: false + + # -- DRA GPU DriverClass + draDriverClass: "gpu.nvidia.com" + + # -- Existing DRA GPU ResourceClaim Template + draExistingClaimTemplate: "" + + # -- GPU type: 'nvidia' or 'amd' + # If 'ollama.gpu.enabled', default value is nvidia + # If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override + # This is due cause AMD and CPU/CUDA are different images + type: 'nvidia' + + # -- Specify the number of GPU + # If you use MIG section below then this parameter is ignored + number: 1 + + # -- only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice + nvidiaResource: "nvidia.com/gpu" + # nvidiaResource: "nvidia.com/mig-1g.10gb" # example + # If you want to use more than one NVIDIA MIG you can use the following syntax (then nvidiaResource is ignored and only the configuration in the following MIG section is used) + + mig: + # -- Enable multiple mig devices + # If enabled you will have to specify the mig devices + # If enabled is set to false this section is ignored + enabled: false + + # -- Specify the mig devices and the corresponding number + devices: {} + # 1g.10gb: 1 + # 3g.40gb: 1 + + models: + # -- List of models to pull at container startup + # The more you add, the longer the container will take to start if models are not present + # pull: + # - llama2 + # - mistral + pull: [] + + # -- List of models to load in memory at container startup + # run: + # - llama2 + # - mistral + run: [] + + # -- List of models to create at container startup, there are two options + # 1. Create a raw model + # 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory. + # create: + # - name: llama3.1-ctx32768 + # configMapRef: my-configmap + # configMapKeyRef: configmap-key + # - name: llama3.1-ctx32768 + # template: | + # FROM llama3.1 + # PARAMETER num_ctx 32768 + create: [] + + # -- Automatically remove models present on the disk but not specified in the values file + clean: false + + # -- Add insecure flag for pulling at container startup + insecure: false + + # -- Override ollama-data volume mount path, default: "/root/.ollama" + mountPath: "" + +# Service account +# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ +serviceAccount: + # -- Specifies whether a service account should be created + create: true + + # -- Automatically mount a ServiceAccount's API credentials? + automount: true + + # -- Annotations to add to the service account + annotations: {} + + # -- The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +# -- Map of annotations to add to the pods +podAnnotations: {} + +# -- Map of labels to add to the pods +podLabels: {} + +# -- Pod Security Context +podSecurityContext: {} + # fsGroup: 2000 + +# -- Priority Class Name +priorityClassName: "" + +# -- Container Security Context +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +# -- Specify runtime class +runtimeClassName: "" + +# Configure Service +service: + + # -- Service type + type: ClusterIP + + # -- Service port + port: 11434 + + # -- Service node port when service type is 'NodePort' + nodePort: 31434 + + # -- Load Balancer IP address + loadBalancerIP: + + # -- Annotations to add to the service + annotations: {} + + # -- Labels to add to the service + labels: {} + +# Configure Deployment +deployment: + + # -- Labels to add to the deployment + labels: {} + +# Configure the ingress resource that allows you to access the +ingress: + # -- Enable ingress controller resource + enabled: false + + # -- IngressClass that will be used to implement the Ingress (Kubernetes 1.18+) + className: "" + + # -- Additional annotations for the Ingress resource. + annotations: {} + # kubernetes.io/ingress.class: traefik + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + + # The list of hostnames to be covered with this ingress record. + hosts: + - host: ollama.local + paths: + - path: / + pathType: Prefix + + # -- The tls configuration for hostnames to be covered with this ingress record. + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +# Configure resource requests and limits +# ref: http://kubernetes.io/docs/user-guide/compute-resources/ +resources: + # -- Pod requests + requests: {} + # Memory request + # memory: 4096Mi + + # CPU request + # cpu: 2000m + + # -- Pod limit + limits: {} + # Memory limit + # memory: 8192Mi + + # CPU limit + # cpu: 4000m + +# Configure extra options for liveness probe +# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +livenessProbe: + # -- Enable livenessProbe + enabled: true + + # -- Request path for livenessProbe + path: / + + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 60 + + # -- Period seconds for livenessProbe + periodSeconds: 10 + + # -- Timeout seconds for livenessProbe + timeoutSeconds: 5 + + # -- Failure threshold for livenessProbe + failureThreshold: 6 + + # -- Success threshold for livenessProbe + successThreshold: 1 + +# Configure extra options for readiness probe +# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +readinessProbe: + # -- Enable readinessProbe + enabled: true + + # -- Request path for readinessProbe + path: / + + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 30 + + # -- Period seconds for readinessProbe + periodSeconds: 5 + + # -- Timeout seconds for readinessProbe + timeoutSeconds: 3 + + # -- Failure threshold for readinessProbe + failureThreshold: 6 + + # -- Success threshold for readinessProbe + successThreshold: 1 + +# Configure autoscaling +autoscaling: + # -- Enable autoscaling + enabled: false + + # -- Number of minimum replicas + minReplicas: 1 + + # -- Number of maximum replicas + maxReplicas: 100 + + # -- CPU usage to target replica + targetCPUUtilizationPercentage: 80 + + # -- targetMemoryUtilizationPercentage: 80 + +# -- Additional volumes on the output Deployment definition. +volumes: [] +# -- - name: foo +# secret: +# secretName: mysecret +# optional: false + +# -- Additional volumeMounts on the output Deployment definition. +volumeMounts: [] +# -- - name: foo +# mountPath: "/etc/foo" +# readOnly: true + +# -- Additional arguments on the output Deployment definition. +extraArgs: [] + +# -- Additional environments variables on the output Deployment definition. +# For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go +extraEnv: [] +# - name: OLLAMA_DEBUG +# value: "1" + +# -- Additionl environment variables from external sources (like ConfigMap) +extraEnvFrom: [] +# - configMapRef: +# name: my-env-configmap + +# Enable persistence using Persistent Volume Claims +# ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ +persistentVolume: + # -- Enable persistence using PVC + enabled: false + + # -- Ollama server data Persistent Volume access modes + # Must match those of existing PV or dynamic provisioner + # Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ + accessModes: + - ReadWriteOnce + + # -- Ollama server data Persistent Volume annotations + annotations: {} + + # -- If you'd like to bring your own PVC for persisting Ollama state, pass the name of the + # created + ready PVC here. If set, this Chart will not create the default PVC. + # Requires server.persistentVolume.enabled: true + existingClaim: "" + + # -- Ollama server data Persistent Volume size + size: 30Gi + + # -- Ollama server data Persistent Volume Storage Class + # If defined, storageClassName: + # If set to "-", storageClassName: "", which disables dynamic provisioning + # If undefined (the default) or set to null, no storageClassName spec is + # set, choosing the default provisioner. (gp2 on AWS, standard on + # GKE, AWS & OpenStack) + storageClass: "" + + # -- Ollama server data Persistent Volume Binding Mode + # If defined, volumeMode: + # If empty (the default) or set to null, no volumeBindingMode spec is + # set, choosing the default mode. + volumeMode: "" + + # -- Subdirectory of Ollama server data Persistent Volume to mount + # Useful if the volume's root directory is not empty + subPath: "" + + # -- Pre-existing PV to attach this claim to + # Useful if a CSI auto-provisions a PV for you and you want to always + # reference the PV moving forward + volumeName: "" + +# -- Node labels for pod assignment. +nodeSelector: {} + +# -- Tolerations for pod assignment +tolerations: [] + +# -- Affinity for pod assignment +affinity: {} + +# -- Lifecycle for pod assignment (override ollama.models startup pull/run) +lifecycle: {} + +# How to replace existing pods +updateStrategy: + # -- Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate + type: "Recreate" + +# -- Topology Spread Constraints for pod assignment +topologySpreadConstraints: {} + +# -- Wait for a grace period +terminationGracePeriodSeconds: 120 + +# -- Init containers to add to the pod +initContainers: [] +# - name: startup-tool +# image: alpine:3 +# command: [sh, -c] +# args: +# - echo init + +# -- Use the host’s ipc namespace. +hostIPC: false + +# -- Use the host’s pid namespace +hostPID: false + +# -- Use the host's network namespace. +hostNetwork: false + +# -- Extra K8s manifests to deploy +extraObjects: [] +# - apiVersion: v1 +# kind: PersistentVolume +# metadata: +# name: aws-efs +# data: +# key: "value" +# - apiVersion: scheduling.k8s.io/v1 +# kind: PriorityClass +# metadata: +# name: high-priority +# value: 1000000 +# globalDefault: false +# description: "This priority class should be used for XYZ service pods only." + +# Test connection pods +tests: + enabled: true + # -- Labels to add to the tests + labels: {} + # -- Annotations to add to the tests + annotations: {} diff --git a/open-webui/charts/ollama/Chart.yaml b/open-webui/charts/ollama/Chart.yaml new file mode 100644 index 0000000..00aeef7 --- /dev/null +++ b/open-webui/charts/ollama/Chart.yaml @@ -0,0 +1,28 @@ +annotations: + artifacthub.io/category: ai-machine-learning + artifacthub.io/changes: | + - kind: changed + description: upgrade app version to 0.11.4 + links: + - name: Ollama release v0.11.4 + url: https://github.com/ollama/ollama/releases/tag/v0.11.4 +apiVersion: v2 +appVersion: 0.11.4 +description: Get up and running with large language models locally. +home: https://ollama.ai/ +icon: https://ollama.ai/public/ollama.png +keywords: +- ai +- llm +- llama +- mistral +kubeVersion: ^1.16.0-0 +maintainers: +- email: contact@otwld.com + name: OTWLD +name: ollama +sources: +- https://github.com/ollama/ollama +- https://github.com/otwld/ollama-helm +type: application +version: 1.27.0 diff --git a/open-webui/charts/ollama/LICENSE b/open-webui/charts/ollama/LICENSE new file mode 100644 index 0000000..01a4c80 --- /dev/null +++ b/open-webui/charts/ollama/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 OTWLD + +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. diff --git a/open-webui/charts/ollama/README.md b/open-webui/charts/ollama/README.md new file mode 100644 index 0000000..537f769 --- /dev/null +++ b/open-webui/charts/ollama/README.md @@ -0,0 +1,331 @@ +![otwld ollama helm chart banner](./banner.png) + +![GitHub License](https://img.shields.io/github/license/otwld/ollama-helm) +[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/ollama-helm)](https://artifacthub.io/packages/helm/ollama-helm/ollama) +[![Helm Lint and Test](https://github.com/otwld/ollama-helm/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/otwld/ollama-helm/actions/workflows/ci.yaml) +[![Discord](https://img.shields.io/badge/Discord-OTWLD-blue?logo=discord&logoColor=white)](https://discord.gg/U24mpqTynB) + +[Ollama](https://ollama.ai/), get up and running with large language models, locally. + +This Community Chart is for deploying [Ollama](https://github.com/ollama/ollama). + +## Requirements + +- Kubernetes: `>= 1.16.0-0` for **CPU only** + +- Kubernetes: `>= 1.26.0-0` for **GPU** stable support (NVIDIA and AMD) + +*Not all GPUs are currently supported with ollama (especially with AMD)* + +## Deploying Ollama chart + +To install the `ollama` chart in the `ollama` namespace: + +> [!IMPORTANT] +> We are migrating the registry from https://otwld.github.io/ollama-helm/ url to OTWLD Helm central +> registry https://helm.otwld.com/ +> Please update your Helm registry accordingly. + +```console +helm repo add otwld https://helm.otwld.com/ +helm repo update +helm install ollama otwld/ollama --namespace ollama --create-namespace +``` + +## Upgrading Ollama chart + +First please read the [release notes](https://github.com/ollama/ollama/releases) of Ollama to make sure there are no +backwards incompatible changes. + +Make adjustments to your values as needed, then run `helm upgrade`: + +```console +# -- This pulls the latest version of the ollama chart from the repo. +helm repo update +helm upgrade ollama otwld/ollama --namespace ollama --values values.yaml +``` + +## Uninstalling Ollama chart + +To uninstall/delete the `ollama` deployment in the `ollama` namespace: + +```console +helm delete ollama --namespace ollama +``` + +Substitute your values if they differ from the examples. See `helm delete --help` for a full reference on `delete` +parameters and flags. + +## Interact with Ollama + +- **Ollama documentation can be found [HERE](https://github.com/ollama/ollama/tree/main/docs)** +- Interact with RESTful API: [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md) +- Interact with official clients libraries: [ollama-js](https://github.com/ollama/ollama-js#custom-client) + and [ollama-python](https://github.com/ollama/ollama-python#custom-client) +- Interact with langchain: [langchain-js](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainjs.md) + and [langchain-python](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainpy.md) + +## Examples + +- **It's highly recommended to run an updated version of Kubernetes for deploying ollama with GPU** + +### Basic values.yaml example with GPU and two models pulled at startup + +``` +ollama: + gpu: + # -- Enable GPU integration + enabled: true + + # -- GPU type: 'nvidia' or 'amd' + type: 'nvidia' + + # -- Specify the number of GPU to 1 + number: 1 + + # -- List of models to pull at container startup + models: + pull: + - mistral + - llama2 +``` + +--- + +### Basic values.yaml example with Ingress + +``` +ollama: + models: + pull: + - llama2 + +ingress: + enabled: true + hosts: + - host: ollama.domain.lan + paths: + - path: / + pathType: Prefix +``` + +- *API is now reachable at `ollama.domain.lan`* + +--- + +### Create and run model from template + +``` +ollama: + models: + create: + - name: llama3.1-ctx32768 + template: | + FROM llama3.1 + PARAMETER num_ctx 32768 + run: + - llama3.1-ctx32768 +``` + +## Upgrading from 0.X.X to 1.X.X + +The version 1.X.X introduces the ability to load models in memory at startup, the values have been changed. + +Please change `ollama.models` to `ollama.models.pull` to avoid errors before upgrading: + +```yaml +ollama: + models: + - mistral + - llama2 +``` + +To: + +```yaml +ollama: + models: + pull: + - mistral + - llama2 +``` + +## Helm Values + +- See [values.yaml](values.yaml) to see the Chart's default values. + +| Key | Type | Default | Description | +|--------------------------------------------|--------|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| affinity | object | `{}` | Affinity for pod assignment | +| autoscaling.enabled | bool | `false` | Enable autoscaling | +| autoscaling.maxReplicas | int | `100` | Number of maximum replicas | +| autoscaling.minReplicas | int | `1` | Number of minimum replicas | +| autoscaling.targetCPUUtilizationPercentage | int | `80` | CPU usage to target replica | +| deployment.labels | object | `{}` | Labels to add to the deployment | +| extraArgs | list | `[]` | Additional arguments on the output Deployment definition. | +| extraEnv | list | `[]` | Additional environments variables on the output Deployment definition. For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go | +| extraEnvFrom | list | `[]` | Additionl environment variables from external sources (like ConfigMap) | +| extraObjects | list | `[]` | Extra K8s manifests to deploy | +| fullnameOverride | string | `""` | String to fully override template | +| hostIPC | bool | `false` | Use the host’s ipc namespace. | +| hostNetwork | bool | `false` | Use the host's network namespace. | +| hostPID | bool | `false` | Use the host’s pid namespace | +| image.pullPolicy | string | `"IfNotPresent"` | Docker pull policy | +| image.repository | string | `"ollama/ollama"` | Docker image registry | +| image.tag | string | `""` | Docker image tag, overrides the image tag whose default is the chart appVersion. | +| imagePullSecrets | list | `[]` | Docker registry secret names as an array | +| ingress.annotations | object | `{}` | Additional annotations for the Ingress resource. | +| ingress.className | string | `""` | IngressClass that will be used to implement the Ingress (Kubernetes 1.18+) | +| ingress.enabled | bool | `false` | Enable ingress controller resource | +| ingress.hosts[0].host | string | `"ollama.local"` | | +| ingress.hosts[0].paths[0].path | string | `"/"` | | +| ingress.hosts[0].paths[0].pathType | string | `"Prefix"` | | +| ingress.tls | list | `[]` | The tls configuration for hostnames to be covered with this ingress record. | +| initContainers | list | `[]` | Init containers to add to the pod | +| knative.annotations | object | `{}` | Knative service annotations | +| knative.containerConcurrency | int | `0` | Knative service container concurrency | +| knative.enabled | bool | `false` | Enable Knative integration | +| knative.idleTimeoutSeconds | int | `300` | Knative service idle timeout seconds | +| knative.responseStartTimeoutSeconds | int | `300` | Knative service response start timeout seconds | +| knative.timeoutSeconds | int | `300` | Knative service timeout seconds | +| lifecycle | object | `{}` | Lifecycle for pod assignment (override ollama.models startup pull/run) | +| livenessProbe.enabled | bool | `true` | Enable livenessProbe | +| livenessProbe.failureThreshold | int | `6` | Failure threshold for livenessProbe | +| livenessProbe.initialDelaySeconds | int | `60` | Initial delay seconds for livenessProbe | +| livenessProbe.path | string | `"/"` | Request path for livenessProbe | +| livenessProbe.periodSeconds | int | `10` | Period seconds for livenessProbe | +| livenessProbe.successThreshold | int | `1` | Success threshold for livenessProbe | +| livenessProbe.timeoutSeconds | int | `5` | Timeout seconds for livenessProbe | +| nameOverride | string | `""` | String to partially override template (will maintain the release name) | +| namespaceOverride | string | `""` | String to fully override namespace | +| nodeSelector | object | `{}` | Node labels for pod assignment. | +| ollama.gpu.draDriverClass | string | `"gpu.nvidia.com"` | DRA GPU DriverClass | +| ollama.gpu.draEnabled | bool | `false` | Enable DRA GPU integration If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters | +| ollama.gpu.draExistingClaimTemplate | string | `""` | Existing DRA GPU ResourceClaim Template | +| ollama.gpu.enabled | bool | `false` | Enable GPU integration | +| ollama.gpu.mig.devices | object | `{}` | Specify the mig devices and the corresponding number | +| ollama.gpu.mig.enabled | bool | `false` | Enable multiple mig devices If enabled you will have to specify the mig devices If enabled is set to false this section is ignored | +| ollama.gpu.number | int | `1` | Specify the number of GPU If you use MIG section below then this parameter is ignored | +| ollama.gpu.nvidiaResource | string | `"nvidia.com/gpu"` | only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice | +| ollama.gpu.type | string | `"nvidia"` | GPU type: 'nvidia' or 'amd' If 'ollama.gpu.enabled', default value is nvidia If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override This is due cause AMD and CPU/CUDA are different images | +| ollama.insecure | bool | `false` | Add insecure flag for pulling at container startup | +| ollama.models.clean | bool | `false` | Automatically remove models present on the disk but not specified in the values file | +| ollama.models.create | list | `[]` | List of models to create at container startup, there are two options 1. Create a raw model 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory. create: - name: llama3.1-ctx32768 configMapRef: my-configmap configMapKeyRef: configmap-key - name: llama3.1-ctx32768 template: | FROM llama3.1 PARAMETER num_ctx 32768 | +| ollama.models.pull | list | `[]` | List of models to pull at container startup The more you add, the longer the container will take to start if models are not present pull: - llama2 - mistral | +| ollama.models.run | list | `[]` | List of models to load in memory at container startup run: - llama2 - mistral | +| ollama.mountPath | string | `""` | Override ollama-data volume mount path, default: "/root/.ollama" | +| ollama.port | int | `11434` | | +| persistentVolume.accessModes | list | `["ReadWriteOnce"]` | Ollama server data Persistent Volume access modes Must match those of existing PV or dynamic provisioner Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ | +| persistentVolume.annotations | object | `{}` | Ollama server data Persistent Volume annotations | +| persistentVolume.enabled | bool | `false` | Enable persistence using PVC | +| persistentVolume.existingClaim | string | `""` | If you'd like to bring your own PVC for persisting Ollama state, pass the name of the created + ready PVC here. If set, this Chart will not create the default PVC. Requires server.persistentVolume.enabled: true | +| persistentVolume.size | string | `"30Gi"` | Ollama server data Persistent Volume size | +| persistentVolume.storageClass | string | `""` | Ollama server data Persistent Volume Storage Class If defined, storageClassName: If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) | +| persistentVolume.subPath | string | `""` | Subdirectory of Ollama server data Persistent Volume to mount Useful if the volume's root directory is not empty | +| persistentVolume.volumeMode | string | `""` | Ollama server data Persistent Volume Binding Mode If defined, volumeMode: If empty (the default) or set to null, no volumeBindingMode spec is set, choosing the default mode. | +| persistentVolume.volumeName | string | `""` | Pre-existing PV to attach this claim to Useful if a CSI auto-provisions a PV for you and you want to always reference the PV moving forward | +| podAnnotations | object | `{}` | Map of annotations to add to the pods | +| podLabels | object | `{}` | Map of labels to add to the pods | +| podSecurityContext | object | `{}` | Pod Security Context | +| priorityClassName | string | `""` | Priority Class Name | +| readinessProbe.enabled | bool | `true` | Enable readinessProbe | +| readinessProbe.failureThreshold | int | `6` | Failure threshold for readinessProbe | +| readinessProbe.initialDelaySeconds | int | `30` | Initial delay seconds for readinessProbe | +| readinessProbe.path | string | `"/"` | Request path for readinessProbe | +| readinessProbe.periodSeconds | int | `5` | Period seconds for readinessProbe | +| readinessProbe.successThreshold | int | `1` | Success threshold for readinessProbe | +| readinessProbe.timeoutSeconds | int | `3` | Timeout seconds for readinessProbe | +| replicaCount | int | `1` | Number of replicas | +| resources.limits | object | `{}` | Pod limit | +| resources.requests | object | `{}` | Pod requests | +| runtimeClassName | string | `""` | Specify runtime class | +| securityContext | object | `{}` | Container Security Context | +| service.annotations | object | `{}` | Annotations to add to the service | +| service.labels | object | `{}` | Labels to add to the service | +| service.loadBalancerIP | string | `nil` | Load Balancer IP address | +| service.nodePort | int | `31434` | Service node port when service type is 'NodePort' | +| service.port | int | `11434` | Service port | +| service.type | string | `"ClusterIP"` | Service type | +| serviceAccount.annotations | object | `{}` | Annotations to add to the service account | +| serviceAccount.automount | bool | `true` | Automatically mount a ServiceAccount's API credentials? | +| serviceAccount.create | bool | `true` | Specifies whether a service account should be created | +| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | +| terminationGracePeriodSeconds | int | `120` | Wait for a grace period | +| tests.annotations | object | `{}` | Annotations to add to the tests | +| tests.enabled | bool | `true` | | +| tests.labels | object | `{}` | Labels to add to the tests | +| tolerations | list | `[]` | Tolerations for pod assignment | +| topologySpreadConstraints | object | `{}` | Topology Spread Constraints for pod assignment | +| updateStrategy.type | string | `"Recreate"` | Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate | +| volumeMounts | list | `[]` | Additional volumeMounts on the output Deployment definition. | +| volumes | list | `[]` | Additional volumes on the output Deployment definition. | + +---------------------------------------------- + +## Core team + + + + + + +
+ Jean Baptiste Detroyes
     Jean Baptiste Detroyes     
+
+ + +
+
+ Jean Baptiste Detroyes
     Nathan Tréhout     
+
+ + + +
+
+ +## Support + +- For questions, suggestions, and discussion about Ollama please refer to + the [Ollama issue page](https://github.com/ollama/ollama/issues) +- For questions, suggestions, and discussion about this chart please + visit [Ollama-Helm issue page](https://github.com/otwld/ollama-helm/issues) or join + our [OTWLD Discord](https://discord.gg/U24mpqTynB) diff --git a/open-webui/charts/ollama/artifacthub-repo.yml b/open-webui/charts/ollama/artifacthub-repo.yml new file mode 100644 index 0000000..4393e1a --- /dev/null +++ b/open-webui/charts/ollama/artifacthub-repo.yml @@ -0,0 +1,17 @@ +# Artifact Hub repository metadata file +# +# Some settings like the verified publisher flag or the ignored packages won't +# be applied until the next time the repository is processed. Please keep in +# mind that the repository won't be processed if it has not changed since the +# last time it was processed. Depending on the repository kind, this is checked +# in a different way. For Helm http based repositories, we consider it has +# changed if the `index.yaml` file changes. For git based repositories, it does +# when the hash of the last commit in the branch you set up changes. This does +# NOT apply to ownership claim operations, which are processed immediately. +# +repositoryID: 2ccfd0bd-c123-483e-96f6-eb446fa850ac +owners: + - name: OTWLD + email: tech@otwld.com + - name: Jean-Baptiste DETROYES + email: jean-baptiste@detroyes.fr \ No newline at end of file diff --git a/open-webui/charts/ollama/banner.png b/open-webui/charts/ollama/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..72e6f57a6f9e8e5021fb6762a8deb08be642e323 GIT binary patch literal 134943 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%0AiisSDajaen-&ghWalN2_bq2~AtxbZc-60==4 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 literal 0 HcmV?d00001 diff --git a/open-webui/charts/ollama/templates/NOTES.txt b/open-webui/charts/ollama/templates/NOTES.txt new file mode 100644 index 0000000..4f4889d --- /dev/null +++ b/open-webui/charts/ollama/templates/NOTES.txt @@ -0,0 +1,25 @@ +1. Get the application URL by running these commands: +{{- if .Values.knative.enabled }} + export KSERVICE_URL=$(kubectl get ksvc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} -o jsonpath={.status.url}) + echo "Visit $KSERVICE_URL to use your application" +{{- else if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "ollama.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "ollama.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "ollama.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/open-webui/charts/ollama/templates/_helpers.tpl b/open-webui/charts/ollama/templates/_helpers.tpl new file mode 100644 index 0000000..17ea417 --- /dev/null +++ b/open-webui/charts/ollama/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts +*/}} +{{- define "ollama.namespace" -}} + {{- if .Values.namespaceOverride -}} + {{- .Values.namespaceOverride -}} + {{- else -}} + {{- .Release.Namespace -}} + {{- end -}} +{{- end -}} + +{{/* +Expand the name of the chart. +*/}} +{{- define "ollama.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "ollama.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "ollama.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "ollama.labels" -}} +helm.sh/chart: {{ include "ollama.chart" . }} +{{ include "ollama.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "ollama.selectorLabels" -}} +app.kubernetes.io/name: {{ include "ollama.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "ollama.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "ollama.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{/* +Models mount path +*/}} +{{- define "ollama.modelsMountPath" -}} +{{- printf "%s/models" (((.Values).ollama).mountPath | default "/root/.ollama") }} +{{- end -}} diff --git a/open-webui/charts/ollama/templates/deployment.yaml b/open-webui/charts/ollama/templates/deployment.yaml new file mode 100644 index 0000000..090d2a0 --- /dev/null +++ b/open-webui/charts/ollama/templates/deployment.yaml @@ -0,0 +1,293 @@ +--- +{{- if not .Values.knative.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.deployment.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + {{- if or .Values.updateStrategy.type .Values.updateStrategy.rollingUpdate }} + strategy: {{ .Values.updateStrategy | toYaml | nindent 4 }} + {{- end }} + selector: + matchLabels: + {{- include "ollama.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "ollama.labels" . | nindent 8 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- if .Values.hostIPC }} + hostIPC: {{ .Values.hostIPC }} + {{- end }} + {{- if .Values.hostPID }} + hostPID: {{ .Values.hostPID }} + {{- end }} + {{- if .Values.hostNetwork }} + hostNetwork: {{ .Values.hostNetwork }} + {{- end }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "ollama.serviceAccountName" . }} + {{- if .Values.priorityClassName }} + priorityClassName: {{ .Values.priorityClassName | quote }} + {{- end }} + {{- if .Values.terminationGracePeriodSeconds }} + terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }} + {{- end }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + {{- if .Values.runtimeClassName }} + runtimeClassName: {{ .Values.runtimeClassName | quote }} + {{- end }} + {{- with .Values.initContainers }} + initContainers: + {{- tpl (toYaml . ) $ | nindent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.ollama.port }} + protocol: TCP + env: + - name: OLLAMA_HOST + value: "0.0.0.0:{{ .Values.ollama.port }}" + {{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}} + - name: PATH + value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + {{- end}} + {{- with .Values.extraEnv }} + {{- toYaml . | nindent 12 }} + {{- end }} + envFrom: + {{- with .Values.extraEnvFrom }} + {{- toYaml . | nindent 12 }} + {{- end }} + args: + {{- with .Values.extraArgs }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.resources }} + resources: + {{- $limits := default dict .Values.resources.limits }} + {{- if .Values.ollama.gpu.enabled }} + {{- if .Values.ollama.gpu.draEnabled}} + claims: + - name: gpu + {{- else }} + # If gpu is enabled, it can either be a NVIDIA card or a AMD card + {{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }} + # NVIDIA is assumed by default if no value is set and GPU is enabled + # NVIDIA cards can have mig enabled (i.e., the card is sliced into parts + # Therefore, the first case is no migs enabled + {{- if or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled ) }} + {{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }} + {{- $limits = merge $limits $gpuLimit }} + # Second case is mig is enabled + {{- else if or (.Values.ollama.gpu.mig.enabled) }} + # Initialize empty dictionary + {{- $migDevices := dict -}} + # Loop over the entries in the mig devices + {{- range $key, $value := .Values.ollama.gpu.mig.devices }} + {{- $migKey := printf "nvidia.com/mig-%s" $key -}} + {{- $migDevices = merge $migDevices (dict $migKey $value) -}} + {{- end }} + {{- $limits = merge $limits $migDevices}} + {{- end }} + {{- end }} + {{- if eq .Values.ollama.gpu.type "amd" }} + {{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }} + {{- $limits = merge $limits $gpuLimit }} + {{- end }} + {{- end }} + {{- end }} + {{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }} + {{- toYaml $ressources | nindent 12 }} + {{- end}} + volumeMounts: + - name: ollama-data + mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }} + {{- if .Values.persistentVolume.subPath }} + subPath: {{ .Values.persistentVolume.subPath }} + {{- end }} + {{- range .Values.ollama.models.create }} + {{- if .configMapRef }} + - name: {{ .name }}-config-model-volume + mountPath: /models + {{- end }} + {{- end }} + {{- with .Values.volumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: {{ .Values.livenessProbe.path }} + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: {{ .Values.readinessProbe.path }} + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + {{- with .Values.lifecycle}} + lifecycle: + {{- toYaml . | nindent 12 }} + {{- else }} + {{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }} + lifecycle: + postStart: + exec: + command: + - /bin/sh + - -c + - | + while ! /bin/ollama ps > /dev/null 2>&1; do + sleep 5 + done + + {{- $allModels := list -}} + + {{- if .Values.ollama.models.pull }} + {{- range .Values.ollama.models.pull }} + + {{- if contains ":" . }} + {{- $allModels = append $allModels . }} + {{- else }} + {{- $allModels = append $allModels (printf "%s:latest" .) }} + {{- end }} + + /bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.create }} + {{- range .Values.ollama.models.create }} + {{- $allModels = append $allModels .name }} + {{- if .template }} + cat < {{ include "ollama.modelsMountPath" $ }}/{{ .name }} + {{- .template | nindent 20 }} + EOF + /bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" $ }}/{{ .name }} + {{- end }} + {{- if .configMapRef }} + /bin/ollama create {{ .name }} -f /models/{{ .name }} + {{- end }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.run }} + {{- range .Values.ollama.models.run }} + + {{- if contains ":" . }} + {{- $allModels = append $allModels . }} + {{- else }} + {{- $allModels = append $allModels (printf "%s:latest" .) }} + {{- end }} + + /bin/ollama run {{ . }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.clean }} + /bin/ollama list | awk 'NR>1 {print $1}' | while read model; do + echo "{{ $allModels | join " " }}" | tr ' ' '\n' | grep -Fqx "$model" || /bin/ollama rm "$model" + done + {{- end }} + {{- end }} + {{- end }} + {{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled }} + resourceClaims: + - name: gpu + resourceClaimTemplateName: {{ .Values.ollama.gpu.draExistingClaimTemplate | default (printf "%s" (include "ollama.fullname" .)) }} + {{- end }} + volumes: + - name: ollama-data + {{- if .Values.persistentVolume.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }} + {{- else }} + emptyDir: { } + {{- end }} + {{- range .Values.ollama.models.create }} + {{- if .configMapRef }} + - name: {{ .name }}-config-model-volume + configMap: + name: {{ .configMapRef }} + items: + - key: {{ .configMapKeyRef }} + path: {{ .name }} + {{- end }} + {{- end }} + {{- with .Values.volumes }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.ollama.gpu.enabled .Values.tolerations }} + tolerations: + {{- if and .Values.ollama.gpu.enabled (and + ( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type)) + ( or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled)) + ) }} + - key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}" + operator: Exists + effect: NoSchedule + {{- else if and .Values.ollama.gpu.enabled (and + ( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type)) + (( .Values.ollama.gpu.mig.enabled)) + ) }} + {{- range $key, $value := .Values.ollama.gpu.mig.devices }} + - key: nvidia.com/mig-{{ $key }} + operator: Exists + effect: NoSchedule + {{- end }} + {{- end }} + {{- with .Values.tolerations }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/ollama/templates/extra-manifests.yaml b/open-webui/charts/ollama/templates/extra-manifests.yaml new file mode 100644 index 0000000..2855904 --- /dev/null +++ b/open-webui/charts/ollama/templates/extra-manifests.yaml @@ -0,0 +1,4 @@ +{{ range .Values.extraObjects }} +--- +{{ tpl (toYaml .) $ }} +{{ end }} \ No newline at end of file diff --git a/open-webui/charts/ollama/templates/hpa.yaml b/open-webui/charts/ollama/templates/hpa.yaml new file mode 100644 index 0000000..b249330 --- /dev/null +++ b/open-webui/charts/ollama/templates/hpa.yaml @@ -0,0 +1,34 @@ +--- +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "ollama.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/ollama/templates/ingress.yaml b/open-webui/charts/ollama/templates/ingress.yaml new file mode 100644 index 0000000..80343e2 --- /dev/null +++ b/open-webui/charts/ollama/templates/ingress.yaml @@ -0,0 +1,63 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "ollama.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className }} + {{- end }} +{{- end }} +--- +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion }} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion }} +apiVersion: networking.k8s.io/v1beta1 +{{- else }} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/ollama/templates/knative/service.yaml b/open-webui/charts/ollama/templates/knative/service.yaml new file mode 100644 index 0000000..54a7dee --- /dev/null +++ b/open-webui/charts/ollama/templates/knative/service.yaml @@ -0,0 +1,200 @@ +--- +{{- if .Values.knative.enabled }} +apiVersion: serving.knative.dev/v1 +kind: Service +metadata: + name: {{ include "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.knative.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + template: + spec: + containerConcurrency: {{ .Values.knative.containerConcurrency }} + timeoutSeconds: {{ .Values.knative.timeoutSeconds }} + responseStartTimeoutSeconds: {{ .Values.knative.responseStartTimeoutSeconds }} + idleTimeoutSeconds: {{ .Values.knative.idleTimeoutSeconds }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "ollama.serviceAccountName" . }} + {{- if .Values.runtimeClassName }} + runtimeClassName: {{ .Values.runtimeClassName | quote }} + {{- end }} + {{- if .Values.terminationGracePeriodSeconds }} + terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }} + {{- end }} + {{- with .Values.initContainers }} + initContainers: + {{- tpl (toYaml . ) $ | nindent 8 }} + {{- end }} + containers: + - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + ports: + - containerPort: {{ .Values.ollama.port }} + env: + - name: OLLAMA_HOST + value: "0.0.0.0:{{ .Values.ollama.port }}" + {{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}} + - name: PATH + value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + {{- end}} + {{- with .Values.extraEnv }} + {{- toYaml . | nindent 12 }} + {{- end }} + envFrom: + {{- with .Values.extraEnvFrom }} + {{- toYaml . | nindent 12 }} + {{- end }} + args: + {{- with .Values.extraArgs }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.resources }} + resources: + {{- $limits := default dict .Values.resources.limits }} + {{- if .Values.ollama.gpu.enabled }} + {{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }} + {{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }} + {{- $limits = merge $limits $gpuLimit }} + {{- end }} + {{- if eq .Values.ollama.gpu.type "amd" }} + {{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }} + {{- $limits = merge $limits $gpuLimit }} + {{- end }} + {{- end }} + {{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }} + {{- toYaml $ressources | nindent 12 }} + {{- end}} + volumeMounts: + - name: ollama-data + mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }} + {{- if .Values.persistentVolume.subPath }} + subPath: {{ .Values.persistentVolume.subPath }} + {{- end }} + {{- range .Values.ollama.models.create }} + {{- if .configMapRef }} + - name: {{ .name }}-config-model-volume + mountPath: /models + {{- end }} + {{- end }} + {{- with .Values.volumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: {{ .Values.livenessProbe.path }} + port: http + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: {{ .Values.readinessProbe.path }} + port: http + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold }} + {{- end }} + {{- with .Values.lifecycle}} + lifecycle: + {{- toYaml . | nindent 12 }} + {{- else }} + {{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }} + lifecycle: + postStart: + exec: + command: + - /bin/sh + - -c + - | + while ! /bin/ollama ps > /dev/null 2>&1; do + sleep 5 + done + {{- if .Values.ollama.models.pull }} + {{- range .Values.ollama.models.pull }} + /bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.create }} + {{- range .Values.ollama.models.create }} + {{- if .template }} + cat < {{ include "ollama.modelsMountPath" $ }}/{{ .name }} + {{- .template | nindent 20 }} + EOF + /bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" . }}/{{ .name }} + {{- end }} + {{- if .configMapRef }} + /bin/ollama create {{ .name }} -f /models/{{ .name }} + {{- end }} + {{- end }} + {{- end }} + + {{- if .Values.ollama.models.run }} + {{- range .Values.ollama.models.run }} + /bin/ollama run {{ . }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + volumes: + - name: ollama-data + {{- if .Values.persistentVolume.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }} + {{- else }} + emptyDir: { } + {{- end }} + {{- range .Values.ollama.models.create }} + {{- if .configMapRef }} + - name: {{ .name }}-config-model-volume + configMap: + name: {{ .configMapRef }} + items: + - key: {{ .configMapKeyRef }} + path: {{ .name }} + {{- end }} + {{- end }} + {{- with .Values.volumes }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if or .Values.ollama.gpu.enabled .Values.tolerations }} + tolerations: + {{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type)) }} + - key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}" + operator: Exists + effect: NoSchedule + {{- end }} + {{- with .Values.tolerations }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/ollama/templates/pvc.yaml b/open-webui/charts/ollama/templates/pvc.yaml new file mode 100644 index 0000000..29faa9d --- /dev/null +++ b/open-webui/charts/ollama/templates/pvc.yaml @@ -0,0 +1,33 @@ +{{- if (and .Values.persistentVolume.enabled (not .Values.persistentVolume.existingClaim)) -}} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + {{- if .Values.persistentVolume.annotations }} + annotations: +{{ toYaml .Values.persistentVolume.annotations | indent 4 }} + {{- end }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + name: {{ template "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} +spec: + accessModes: +{{ toYaml .Values.persistentVolume.accessModes | indent 4 }} +{{- if .Values.persistentVolume.storageClass }} +{{- if (eq "-" .Values.persistentVolume.storageClass) }} + storageClassName: "" +{{- else }} + storageClassName: "{{ .Values.persistentVolume.storageClass }}" +{{- end }} +{{- end }} +{{- if .Values.persistentVolume.volumeMode }} + volumeMode: "{{ .Values.persistentVolume.volumeMode }}" +{{- end }} +{{- if .Values.persistentVolume.volumeName }} + volumeName: "{{ .Values.persistentVolume.volumeName }}" +{{- end }} + resources: + requests: + storage: "{{ .Values.persistentVolume.size }}" +{{- end -}} diff --git a/open-webui/charts/ollama/templates/resourceclaimtemplate.yaml b/open-webui/charts/ollama/templates/resourceclaimtemplate.yaml new file mode 100644 index 0000000..2f2aedf --- /dev/null +++ b/open-webui/charts/ollama/templates/resourceclaimtemplate.yaml @@ -0,0 +1,19 @@ +{{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled (not .Values.ollama.gpu.draExistingClaimTemplate) -}} +--- +{{- if semverCompare ">=1.34-0" .Capabilities.KubeVersion.GitVersion }} +apiVersion: resource.k8s.io/v1 +{{- else }} +apiVersion: resource.k8s.io/v1beta1 +{{- end }} +kind: ResourceClaimTemplate +metadata: + name: {{ template "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} +spec: + spec: + devices: + requests: + - name: gpu + deviceClassName: {{ .Values.ollama.gpu.draDriverClass }} + count: {{(.Values.ollama.gpu.number | default 1)}} +{{- end -}} diff --git a/open-webui/charts/ollama/templates/service.yaml b/open-webui/charts/ollama/templates/service.yaml new file mode 100644 index 0000000..2d6e6f5 --- /dev/null +++ b/open-webui/charts/ollama/templates/service.yaml @@ -0,0 +1,32 @@ +--- +{{- if not .Values.knative.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "ollama.fullname" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.service.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + {{- if contains "NodePort" .Values.service.type }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} +{{- if .Values.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.service.loadBalancerIP | quote }} +{{- end }} + selector: + {{- include "ollama.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/open-webui/charts/ollama/templates/serviceaccount.yaml b/open-webui/charts/ollama/templates/serviceaccount.yaml new file mode 100644 index 0000000..25ac575 --- /dev/null +++ b/open-webui/charts/ollama/templates/serviceaccount.yaml @@ -0,0 +1,15 @@ +{{- if .Values.serviceAccount.create -}} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "ollama.serviceAccountName" . }} + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automount }} +{{- end }} diff --git a/open-webui/charts/ollama/templates/tests/test-connection.yaml b/open-webui/charts/ollama/templates/tests/test-connection.yaml new file mode 100644 index 0000000..48d5464 --- /dev/null +++ b/open-webui/charts/ollama/templates/tests/test-connection.yaml @@ -0,0 +1,25 @@ +--- +{{- if .Values.tests.enabled }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "ollama.fullname" . }}-test-connection" + namespace: {{ include "ollama.namespace" . }} + labels: + {{- include "ollama.labels" . | nindent 4 }} + {{- with .Values.tests.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + {{- with .Values.tests.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "ollama.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never +{{ end }} diff --git a/open-webui/charts/ollama/values.yaml b/open-webui/charts/ollama/values.yaml new file mode 100644 index 0000000..a100aaf --- /dev/null +++ b/open-webui/charts/ollama/values.yaml @@ -0,0 +1,440 @@ +# Default values for ollama-helm. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +# -- Number of replicas +replicaCount: 1 + +# Knative configuration +knative: + # -- Enable Knative integration + enabled: false + # -- Knative service container concurrency + containerConcurrency: 0 + # -- Knative service timeout seconds + timeoutSeconds: 300 + # -- Knative service response start timeout seconds + responseStartTimeoutSeconds: 300 + # -- Knative service idle timeout seconds + idleTimeoutSeconds: 300 + # -- Knative service annotations + annotations: {} + +# Docker image +image: + # -- Docker image registry + repository: ollama/ollama + + # -- Docker pull policy + pullPolicy: IfNotPresent + + # -- Docker image tag, overrides the image tag whose default is the chart appVersion. + tag: "" + +# -- Docker registry secret names as an array +imagePullSecrets: [] + +# -- String to partially override template (will maintain the release name) +nameOverride: "" + +# -- String to fully override template +fullnameOverride: "" + +# -- String to fully override namespace +namespaceOverride: "" + +# Ollama parameters +ollama: + # Port Ollama is listening on + port: 11434 + + gpu: + # -- Enable GPU integration + enabled: false + + # -- Enable DRA GPU integration + # If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters + draEnabled: false + + # -- DRA GPU DriverClass + draDriverClass: "gpu.nvidia.com" + + # -- Existing DRA GPU ResourceClaim Template + draExistingClaimTemplate: "" + + # -- GPU type: 'nvidia' or 'amd' + # If 'ollama.gpu.enabled', default value is nvidia + # If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override + # This is due cause AMD and CPU/CUDA are different images + type: 'nvidia' + + # -- Specify the number of GPU + # If you use MIG section below then this parameter is ignored + number: 1 + + # -- only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice + nvidiaResource: "nvidia.com/gpu" + # nvidiaResource: "nvidia.com/mig-1g.10gb" # example + # If you want to use more than one NVIDIA MIG you can use the following syntax (then nvidiaResource is ignored and only the configuration in the following MIG section is used) + + mig: + # -- Enable multiple mig devices + # If enabled you will have to specify the mig devices + # If enabled is set to false this section is ignored + enabled: false + + # -- Specify the mig devices and the corresponding number + devices: {} + # 1g.10gb: 1 + # 3g.40gb: 1 + + models: + # -- List of models to pull at container startup + # The more you add, the longer the container will take to start if models are not present + # pull: + # - llama2 + # - mistral + pull: [] + + # -- List of models to load in memory at container startup + # run: + # - llama2 + # - mistral + run: [] + + # -- List of models to create at container startup, there are two options + # 1. Create a raw model + # 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory. + # create: + # - name: llama3.1-ctx32768 + # configMapRef: my-configmap + # configMapKeyRef: configmap-key + # - name: llama3.1-ctx32768 + # template: | + # FROM llama3.1 + # PARAMETER num_ctx 32768 + create: [] + + # -- Automatically remove models present on the disk but not specified in the values file + clean: false + + # -- Add insecure flag for pulling at container startup + insecure: false + + # -- Override ollama-data volume mount path, default: "/root/.ollama" + mountPath: "" + +# Service account +# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ +serviceAccount: + # -- Specifies whether a service account should be created + create: true + + # -- Automatically mount a ServiceAccount's API credentials? + automount: true + + # -- Annotations to add to the service account + annotations: {} + + # -- The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +# -- Map of annotations to add to the pods +podAnnotations: {} + +# -- Map of labels to add to the pods +podLabels: {} + +# -- Pod Security Context +podSecurityContext: {} + # fsGroup: 2000 + +# -- Priority Class Name +priorityClassName: "" + +# -- Container Security Context +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +# -- Specify runtime class +runtimeClassName: "" + +# Configure Service +service: + + # -- Service type + type: ClusterIP + + # -- Service port + port: 11434 + + # -- Service node port when service type is 'NodePort' + nodePort: 31434 + + # -- Load Balancer IP address + loadBalancerIP: + + # -- Annotations to add to the service + annotations: {} + + # -- Labels to add to the service + labels: {} + +# Configure Deployment +deployment: + + # -- Labels to add to the deployment + labels: {} + +# Configure the ingress resource that allows you to access the +ingress: + # -- Enable ingress controller resource + enabled: false + + # -- IngressClass that will be used to implement the Ingress (Kubernetes 1.18+) + className: "" + + # -- Additional annotations for the Ingress resource. + annotations: {} + # kubernetes.io/ingress.class: traefik + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + + # The list of hostnames to be covered with this ingress record. + hosts: + - host: ollama.local + paths: + - path: / + pathType: Prefix + + # -- The tls configuration for hostnames to be covered with this ingress record. + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +# Configure resource requests and limits +# ref: http://kubernetes.io/docs/user-guide/compute-resources/ +resources: + # -- Pod requests + requests: {} + # Memory request + # memory: 4096Mi + + # CPU request + # cpu: 2000m + + # -- Pod limit + limits: {} + # Memory limit + # memory: 8192Mi + + # CPU limit + # cpu: 4000m + +# Configure extra options for liveness probe +# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +livenessProbe: + # -- Enable livenessProbe + enabled: true + + # -- Request path for livenessProbe + path: / + + # -- Initial delay seconds for livenessProbe + initialDelaySeconds: 60 + + # -- Period seconds for livenessProbe + periodSeconds: 10 + + # -- Timeout seconds for livenessProbe + timeoutSeconds: 5 + + # -- Failure threshold for livenessProbe + failureThreshold: 6 + + # -- Success threshold for livenessProbe + successThreshold: 1 + +# Configure extra options for readiness probe +# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes +readinessProbe: + # -- Enable readinessProbe + enabled: true + + # -- Request path for readinessProbe + path: / + + # -- Initial delay seconds for readinessProbe + initialDelaySeconds: 30 + + # -- Period seconds for readinessProbe + periodSeconds: 5 + + # -- Timeout seconds for readinessProbe + timeoutSeconds: 3 + + # -- Failure threshold for readinessProbe + failureThreshold: 6 + + # -- Success threshold for readinessProbe + successThreshold: 1 + +# Configure autoscaling +autoscaling: + # -- Enable autoscaling + enabled: false + + # -- Number of minimum replicas + minReplicas: 1 + + # -- Number of maximum replicas + maxReplicas: 100 + + # -- CPU usage to target replica + targetCPUUtilizationPercentage: 80 + + # -- targetMemoryUtilizationPercentage: 80 + +# -- Additional volumes on the output Deployment definition. +volumes: [] +# -- - name: foo +# secret: +# secretName: mysecret +# optional: false + +# -- Additional volumeMounts on the output Deployment definition. +volumeMounts: [] +# -- - name: foo +# mountPath: "/etc/foo" +# readOnly: true + +# -- Additional arguments on the output Deployment definition. +extraArgs: [] + +# -- Additional environments variables on the output Deployment definition. +# For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go +extraEnv: [] +# - name: OLLAMA_DEBUG +# value: "1" + +# -- Additionl environment variables from external sources (like ConfigMap) +extraEnvFrom: [] +# - configMapRef: +# name: my-env-configmap + +# Enable persistence using Persistent Volume Claims +# ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ +persistentVolume: + # -- Enable persistence using PVC + enabled: false + + # -- Ollama server data Persistent Volume access modes + # Must match those of existing PV or dynamic provisioner + # Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ + accessModes: + - ReadWriteOnce + + # -- Ollama server data Persistent Volume annotations + annotations: {} + + # -- If you'd like to bring your own PVC for persisting Ollama state, pass the name of the + # created + ready PVC here. If set, this Chart will not create the default PVC. + # Requires server.persistentVolume.enabled: true + existingClaim: "" + + # -- Ollama server data Persistent Volume size + size: 30Gi + + # -- Ollama server data Persistent Volume Storage Class + # If defined, storageClassName: + # If set to "-", storageClassName: "", which disables dynamic provisioning + # If undefined (the default) or set to null, no storageClassName spec is + # set, choosing the default provisioner. (gp2 on AWS, standard on + # GKE, AWS & OpenStack) + storageClass: "" + + # -- Ollama server data Persistent Volume Binding Mode + # If defined, volumeMode: + # If empty (the default) or set to null, no volumeBindingMode spec is + # set, choosing the default mode. + volumeMode: "" + + # -- Subdirectory of Ollama server data Persistent Volume to mount + # Useful if the volume's root directory is not empty + subPath: "" + + # -- Pre-existing PV to attach this claim to + # Useful if a CSI auto-provisions a PV for you and you want to always + # reference the PV moving forward + volumeName: "" + +# -- Node labels for pod assignment. +nodeSelector: {} + +# -- Tolerations for pod assignment +tolerations: [] + +# -- Affinity for pod assignment +affinity: {} + +# -- Lifecycle for pod assignment (override ollama.models startup pull/run) +lifecycle: {} + +# How to replace existing pods +updateStrategy: + # -- Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate + type: "Recreate" + +# -- Topology Spread Constraints for pod assignment +topologySpreadConstraints: {} + +# -- Wait for a grace period +terminationGracePeriodSeconds: 120 + +# -- Init containers to add to the pod +initContainers: [] +# - name: startup-tool +# image: alpine:3 +# command: [sh, -c] +# args: +# - echo init + +# -- Use the host’s ipc namespace. +hostIPC: false + +# -- Use the host’s pid namespace +hostPID: false + +# -- Use the host's network namespace. +hostNetwork: false + +# -- Extra K8s manifests to deploy +extraObjects: [] +# - apiVersion: v1 +# kind: PersistentVolume +# metadata: +# name: aws-efs +# data: +# key: "value" +# - apiVersion: scheduling.k8s.io/v1 +# kind: PriorityClass +# metadata: +# name: high-priority +# value: 1000000 +# globalDefault: false +# description: "This priority class should be used for XYZ service pods only." + +# Test connection pods +tests: + enabled: true + # -- Labels to add to the tests + labels: {} + # -- Annotations to add to the tests + annotations: {} diff --git a/open-webui/charts/pipelines/.helmignore b/open-webui/charts/pipelines/.helmignore new file mode 100644 index 0000000..1e540ba --- /dev/null +++ b/open-webui/charts/pipelines/.helmignore @@ -0,0 +1,24 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +.drone.yml +*.tmproj +.vscode/ \ No newline at end of file diff --git a/open-webui/charts/pipelines/Chart.yaml b/open-webui/charts/pipelines/Chart.yaml new file mode 100644 index 0000000..eee7813 --- /dev/null +++ b/open-webui/charts/pipelines/Chart.yaml @@ -0,0 +1,16 @@ +annotations: + licenses: MIT +apiVersion: v2 +appVersion: alpha +description: 'Pipelines: UI-Agnostic OpenAI API Plugin Framework' +home: https://github.com/open-webui/pipelines +icon: https://github.com/open-webui/pipelines/raw/main/header.png +keywords: +- llm +- chat +- web-ui +name: pipelines +sources: +- https://github.com/open-webui/helm-charts +- https://github.com/open-webui/pipelines/pkgs/container/pipelines +version: 0.7.0 diff --git a/open-webui/charts/pipelines/README.md b/open-webui/charts/pipelines/README.md new file mode 100644 index 0000000..14426e6 --- /dev/null +++ b/open-webui/charts/pipelines/README.md @@ -0,0 +1,84 @@ +# pipelines + +![Version: 0.7.0](https://img.shields.io/badge/Version-0.7.0-informational?style=flat-square) ![AppVersion: alpha](https://img.shields.io/badge/AppVersion-alpha-informational?style=flat-square) + +Pipelines: UI-Agnostic OpenAI API Plugin Framework + +**Homepage:** + +## Source Code + +* +* + +## Installing + +Before you can install, you need to add the `open-webui` repo to [Helm](https://helm.sh) + +```shell +helm repo add open-webui https://helm.openwebui.com/ +helm repo update +``` + +Now you can install the chart: + +```shell +helm upgrade --install open-webui open-webui/pipelines +``` + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | Affinity for pod assignment | +| annotations | object | `{}` | | +| clusterDomain | string | `"cluster.local"` | Value of cluster domain | +| commonEnvVars | list | `[]` | Additional environments variables on the output Deployment definition, common across environments | +| containerSecurityContext | object | `{}` | Configure container security context ref: | +| extraEnvVars | list | `[{"name":"PIPELINES_URLS","value":"https://github.com/open-webui/pipelines/blob/main/examples/filters/detoxify_filter_pipeline.py"}]` | Additional environments variables on the output Deployment definition. These are used to pull initial Pipeline files, and help configure Pipelines with required values (e.g. Langfuse API keys) | +| extraEnvVars[0] | object | `{"name":"PIPELINES_URLS","value":"https://github.com/open-webui/pipelines/blob/main/examples/filters/detoxify_filter_pipeline.py"}` | Example pipeline to pull and load on deployment startup, see current pipelines here: https://github.com/open-webui/pipelines/blob/main/examples | +| extraInitContainers | list | `[]` | Additional init containers to add to the deployment ref: | +| extraResources | list | `[]` | Extra resources to deploy with Open WebUI Pipelines | +| hostAliases | list | `[]` | HostAliases to be added to hosts-file of each container | +| image.pullPolicy | string | `"Always"` | | +| image.repository | string | `"ghcr.io/open-webui/pipelines"` | | +| image.tag | string | `"main"` | | +| imagePullSecrets | list | `[]` | Configure imagePullSecrets to use private registry ref: | +| ingress.annotations | object | `{}` | Use appropriate annotations for your Ingress controller, e.g., for NGINX: nginx.ingress.kubernetes.io/rewrite-target: / | +| ingress.class | string | `""` | | +| ingress.enabled | bool | `true` | | +| ingress.existingSecret | string | `""` | | +| ingress.host | string | `""` | | +| ingress.tls | bool | `false` | | +| nameOverride | string | `""` | | +| namespaceOverride | string | `""` | | +| nodeSelector | object | `{}` | Node labels for pod assignment. | +| persistence.accessModes | list | `["ReadWriteOnce"]` | If using multiple replicas, you must update accessModes to ReadWriteMany | +| persistence.annotations | object | `{}` | | +| persistence.enabled | bool | `true` | | +| persistence.existingClaim | string | `""` | | +| persistence.selector | object | `{}` | | +| persistence.size | string | `"2Gi"` | | +| persistence.storageClass | string | `""` | | +| podAnnotations | object | `{}` | | +| podLabels | object | `{}` | | +| podSecurityContext | object | `{}` | Configure pod security context ref: | +| replicaCount | int | `1` | | +| resources | object | `{}` | | +| service.annotations | object | `{}` | | +| service.containerPort | int | `9099` | | +| service.labels | object | `{}` | | +| service.loadBalancerClass | string | `""` | | +| service.nodePort | string | `""` | | +| service.port | int | `9099` | | +| service.type | string | `"ClusterIP"` | | +| serviceAccount.automountServiceAccountToken | bool | `false` | | +| serviceAccount.enable | bool | `true` | | +| strategy | object | `{}` | Strategy for updating the deployment | +| tolerations | list | `[]` | Tolerations for pod assignment | +| volumeMounts | list | `[]` | Configure container volume mounts ref: | +| volumes | list | `[]` | Configure pod volumes ref: | + +---------------------------------------------- + +Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/). diff --git a/open-webui/charts/pipelines/README.md.gotmpl b/open-webui/charts/pipelines/README.md.gotmpl new file mode 100644 index 0000000..88d437d --- /dev/null +++ b/open-webui/charts/pipelines/README.md.gotmpl @@ -0,0 +1,36 @@ +{{ template "chart.header" . }} + +{{ template "chart.deprecationWarning" . }} + +{{ template "chart.badgesSection" . }} + +{{ template "chart.description" . }} + +{{ template "chart.homepageLine" . }} + +{{ template "chart.maintainersSection" . }} + +{{ template "chart.sourcesSection" . }} + +## Installing + +Before you can install, you need to add the `open-webui` repo to [Helm](https://helm.sh) + +```shell +helm repo add open-webui https://helm.openwebui.com/ +helm repo update +``` + +Now you can install the chart: + +```shell +helm upgrade --install open-webui open-webui/pipelines +``` + +{{ template "chart.requirementsSection" . }} + +{{ template "chart.valuesSection" . }} + +---------------------------------------------- + +Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/). diff --git a/open-webui/charts/pipelines/templates/_helpers.tpl b/open-webui/charts/pipelines/templates/_helpers.tpl new file mode 100644 index 0000000..a33f23a --- /dev/null +++ b/open-webui/charts/pipelines/templates/_helpers.tpl @@ -0,0 +1,65 @@ +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts +*/}} +{{- define "pipelines.namespace" -}} + {{- if .Values.namespaceOverride -}} + {{- .Values.namespaceOverride -}} + {{- else -}} + {{- .Release.Namespace -}} + {{- end -}} +{{- end -}} + +{{/* +Set the name of the Pipelines resources +*/}} +{{- define "pipelines.name" -}} +{{- default .Release.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end -}} + +{{/* +Create the chart name and version for the chart label +*/}} +{{- define "chart.name" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create the base labels to include on chart resources +*/}} +{{- define "base.labels" -}} +helm.sh/chart: {{ include "chart.name" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Create selector labels to include on all resources +*/}} +{{- define "base.selectorLabels" -}} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{/* +Create selector labels to include on all Pipelines resources +*/}} +{{- define "pipelines.selectorLabels" -}} +{{ include "base.selectorLabels" . }} +app.kubernetes.io/component: {{ .Chart.Name }} +{{- end }} + +{{/* +Create labels to include on all Pipelines resources +*/}} +{{- define "pipelines.labels" -}} +{{ include "base.labels" . }} +{{ include "pipelines.selectorLabels" . }} +{{- end }} + +{{/* +Create the default port to use on the service if none is defined in values +*/}} +{{- define "pipelines.servicePort" -}} +{{- .Values.service.port | default 9099 }} +{{- end }} diff --git a/open-webui/charts/pipelines/templates/deployment.yaml b/open-webui/charts/pipelines/templates/deployment.yaml new file mode 100644 index 0000000..e35a061 --- /dev/null +++ b/open-webui/charts/pipelines/templates/deployment.yaml @@ -0,0 +1,111 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "pipelines.name" . }} + namespace: {{ include "pipelines.namespace" . }} + labels: + {{- include "pipelines.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "pipelines.selectorLabels" . | nindent 6 }} + {{- with .Values.strategy }} + strategy: + {{- toYaml . | nindent 4 }} + {{- end }} + template: + metadata: + labels: + {{- include "pipelines.labels" . | nindent 8 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.extraInitContainers }} + initContainers: + {{- toYaml . | nindent 8 }} + {{- end }} + enableServiceLinks: false + automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken | default false }} + {{- if .Values.serviceAccount.enable }} + serviceAccountName: {{ .Values.serviceAccount.name | default (include "pipelines.name" .) }} + {{- end }} + {{- with .Values.podSecurityContext }} + securityContext: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + {{- with .Values.image }} + image: {{ .repository }}:{{ .tag | default $.Chart.AppVersion }} + imagePullPolicy: {{ .pullPolicy }} + {{- end }} + ports: + - name: http + containerPort: {{ .Values.service.containerPort }} + {{- with .Values.resources }} + resources: {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.containerSecurityContext }} + securityContext: + {{- toYaml . | nindent 10 }} + {{- end }} + volumeMounts: + - name: data + mountPath: /app/pipelines + {{- with .Values.volumeMounts }} + {{- toYaml . | nindent 8 }} + {{- end }} + env: + {{- if .Values.extraEnvVars }} + {{- toYaml .Values.extraEnvVars | nindent 8 }} + {{- end }} + {{- if .Values.commonEnvVars }} + {{- toYaml .Values.commonEnvVars | nindent 8 }} + {{- end }} + tty: true + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.hostAliases }} + hostAliases: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + {{- if and .Values.persistence.enabled .Values.persistence.existingClaim }} + - name: data + persistentVolumeClaim: + claimName: {{ .Values.persistence.existingClaim }} + {{- else if not .Values.persistence.enabled }} + - name: data + emptyDir: {} + {{- else if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }} + - name: data + persistentVolumeClaim: + claimName: {{ include "pipelines.name" . }} + {{- end }} + {{- with .Values.volumes }} + {{- toYaml . | nindent 6 }} + {{- end }} \ No newline at end of file diff --git a/open-webui/charts/pipelines/templates/extra-resources.yaml b/open-webui/charts/pipelines/templates/extra-resources.yaml new file mode 100644 index 0000000..5124a0b --- /dev/null +++ b/open-webui/charts/pipelines/templates/extra-resources.yaml @@ -0,0 +1,6 @@ +{{- if .Values.extraResources }} +{{- range .Values.extraResources }} +--- +{{ toYaml . | nindent 0 }} +{{- end }} +{{- end }} diff --git a/open-webui/charts/pipelines/templates/pvc.yaml b/open-webui/charts/pipelines/templates/pvc.yaml new file mode 100644 index 0000000..c16f12a --- /dev/null +++ b/open-webui/charts/pipelines/templates/pvc.yaml @@ -0,0 +1,28 @@ +{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "pipelines.name" . }} + namespace: {{ include "pipelines.namespace" . }} + labels: + {{- include "pipelines.selectorLabels" . | nindent 4 }} + {{- with .Values.persistence.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} +spec: + accessModes: + {{- range .Values.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.persistence.size }} + {{- if .Values.persistence.storageClass }} + storageClassName: {{ .Values.persistence.storageClass }} + {{- end }} + {{- with .Values.persistence.selector }} + selector: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/pipelines/templates/service-account.yaml b/open-webui/charts/pipelines/templates/service-account.yaml new file mode 100644 index 0000000..4da3f3e --- /dev/null +++ b/open-webui/charts/pipelines/templates/service-account.yaml @@ -0,0 +1,13 @@ +{{- if .Values.serviceAccount.enable }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name | default (include "pipelines.name" .) }} + namespace: {{ include "pipelines.namespace" . }} + labels: + {{- include "pipelines.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/open-webui/charts/pipelines/templates/service.yaml b/open-webui/charts/pipelines/templates/service.yaml new file mode 100644 index 0000000..746fa35 --- /dev/null +++ b/open-webui/charts/pipelines/templates/service.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "pipelines.name" . }} + namespace: {{ include "pipelines.namespace" . }} + labels: + {{- include "pipelines.labels" . | nindent 4 }} + {{- with .Values.service.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + selector: + {{- include "pipelines.selectorLabels" . | nindent 4 }} + type: {{ .Values.service.type | default "ClusterIP" }} + ports: + - protocol: TCP + name: http + port: {{ .Values.service.port }} + targetPort: http + {{- if .Values.service.nodePort }} + nodePort: {{ .Values.service.nodePort | int }} + {{- end }} + {{- if .Values.service.loadBalancerClass }} + loadBalancerClass: {{ .Values.service.loadBalancerClass | quote }} + {{- end }} + \ No newline at end of file diff --git a/open-webui/charts/pipelines/values.yaml b/open-webui/charts/pipelines/values.yaml new file mode 100644 index 0000000..8a356f3 --- /dev/null +++ b/open-webui/charts/pipelines/values.yaml @@ -0,0 +1,160 @@ +nameOverride: "" +namespaceOverride: "" + +# -- Value of cluster domain +clusterDomain: cluster.local + +annotations: {} +podAnnotations: {} +podLabels: {} +replicaCount: 1 +# -- Strategy for updating the deployment +strategy: {} +image: + repository: ghcr.io/open-webui/pipelines + tag: main + pullPolicy: Always + +# -- Configure imagePullSecrets to use private registry +# ref: +imagePullSecrets: [] +# imagePullSecrets: +# - name: myRegistryKeySecretName + +resources: {} +ingress: + enabled: true + class: "" + # -- Use appropriate annotations for your Ingress controller, e.g., for NGINX: + # nginx.ingress.kubernetes.io/rewrite-target: / + annotations: {} + host: "" + tls: false + existingSecret: "" +persistence: + enabled: true + size: 2Gi + existingClaim: "" + # -- If using multiple replicas, you must update accessModes to ReadWriteMany + accessModes: + - ReadWriteOnce + storageClass: "" + selector: {} + annotations: {} + +serviceAccount: + enable: true + automountServiceAccountToken: false + +# -- Configure pod security context +# ref: +podSecurityContext: + {} + # fsGroupChangePolicy: Always + # sysctls: [] + # supplementalGroups: [] + # fsGroup: 1001 + +# -- Configure container security context +# ref: +containerSecurityContext: + {} + # runAsUser: 1001 + # runAsGroup: 1001 + # runAsNonRoot: true + # privileged: false + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: false + # capabilities: + # drop: + # - ALL + # seccompProfile: + # type: "RuntimeDefault" + +# -- Node labels for pod assignment. +nodeSelector: {} + +# -- Tolerations for pod assignment +tolerations: [] + +# -- Affinity for pod assignment +affinity: {} + +# -- HostAliases to be added to hosts-file of each container +hostAliases: [] + +service: + type: ClusterIP + annotations: {} + port: 9099 + containerPort: 9099 + nodePort: "" + labels: {} + loadBalancerClass: "" + +# -- Additional environments variables on the output Deployment definition. These are used to pull initial Pipeline files, and help configure Pipelines with required values (e.g. Langfuse API keys) +extraEnvVars: + # -- Example pipeline to pull and load on deployment startup, see current pipelines here: https://github.com/open-webui/pipelines/blob/main/examples + - name: PIPELINES_URLS + value: "https://github.com/open-webui/pipelines/blob/main/examples/filters/detoxify_filter_pipeline.py" + # - name: PIPELINES_API_KEY + # valueFrom: + # secretKeyRef: + # name: pipelines-keys + # key: pipelines-api-key + # -- Langfuse example, including values used in Langfuse filter to connect + # - name: PIPELINES_URLS + # value: "https://github.com/open-webui/pipelines/blob/main/examples/filters/langfuse_filter_pipeline.py" + # - name: LANGFUSE_PUBLIC_KEY + # valueFrom: + # secretKeyRef: + # name: langfuse-keys + # key: public-key + # - name: LANGFUSE_SECRET_KEY + # valueFrom: + # secretKeyRef: + # name: langfuse-keys + # key: secret-key + # - name: LANGFUSE_HOST + # value: https://us.cloud.langfuse.com + +# -- Additional environments variables on the output Deployment definition, common across environments. +commonEnvVars: [] + +# -- Configure container volume mounts +# ref: +volumeMounts: [] + # - name: "" + # mountPath: "" + +# -- Additional init containers to add to the deployment +# ref: +extraInitContainers: [] +# - name: custom-init +# image: busybox:latest +# command: ['sh', '-c', 'echo "Custom init container running"'] +# volumeMounts: +# - name: data +# mountPath: /data + +# -- Configure pod volumes +# ref: +volumes: [] +# - name: "" +# configMap: +# name: "" +# - name: "" +# secret: +# name: "" +# - name: "" +# emptyDir: {} + +# -- Extra resources to deploy with Open WebUI Pipelines +extraResources: + [] + # - apiVersion: v1 + # kind: ConfigMap + # metadata: + # name: example-configmap + # data: + # example-key: example-value diff --git a/open-webui/charts/tika/.asf.yaml b/open-webui/charts/tika/.asf.yaml new file mode 100644 index 0000000..9cd5f69 --- /dev/null +++ b/open-webui/charts/tika/.asf.yaml @@ -0,0 +1,26 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# 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. +github: + description: "A Helm chart to deploy Apache Tika on Kubernetes." + homepage: https://tika.apache.org/ + labels: + - helm + - chart + - tika + +notifications: + commits: commits@tika.apache.org + issues: dev@tika.apache.org + pullrequests: dev@tika.apache.org + jira_options: link label comment diff --git a/open-webui/charts/tika/.github/workflows/lint-test.yaml b/open-webui/charts/tika/.github/workflows/lint-test.yaml new file mode 100644 index 0000000..e1cc61e --- /dev/null +++ b/open-webui/charts/tika/.github/workflows/lint-test.yaml @@ -0,0 +1,83 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +name: Lint and Test Charts + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + types: [opened, synchronize, reopened] + +jobs: + lint-test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4.1.5 + with: + fetch-depth: 0 + - name: Set up Helm + uses: azure/setup-helm@v4.2.0 + - uses: actions/setup-python@v5.1.0 + with: + python-version: '3.x' + check-latest: true + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.6.1 + - name: Run chart-testing (list-changed) + id: list-changed + run: | + changed=$(ct list-changed --target-branch ${{ github.event.repository.default_branch }}) + if [[ -n "$changed" ]]; then + echo "::set-output name=changed::true" + fi + shell: bash + - name: Run chart-testing (lint) + run: ct lint --target-branch ${{ github.event.repository.default_branch }} --charts . + shell: bash + - name: Create kind cluster + uses: helm/kind-action@v1.10.0 + if: steps.list-changed.outputs.changed == 'true' + - name: Uninstall helm-unittest if present + run: | + helm plugin uninstall unittest >/dev/null 2>/dev/null \ + || echo "Failed to uninstall plugin, assuming it's not present." + shell: bash + - name: Install latest helm-unittest + run: | + echo "Installing latest version of helm-unittest" + helm plugin install https://github.com/helm-unittest/helm-unittest >/dev/null 2>/dev/null + shell: bash + - name: Assemble list of chart directories to test + run: | + tr ' ' '\n' <<< . | grep -v '^$' > charts-to-test || true + find . -type f -name 'Chart.yaml' -exec dirname {} \; > all-charts + [ -z . ] && mv all-charts charts-to-test || true + shell: bash + - name: Fetch chart dependencies + run: | + for chart in $(cat charts-to-test); do + helm dependency update "$chart" >/dev/null + done + shell: bash + - name: Run unit tests + run: helm unittest --color $(cat charts-to-test) + shell: bash + - name: Run chart-testing (install) + if: steps.list-changed.outputs.changed == 'true' + run: ct install --target-branch ${{ github.event.repository.default_branch }} --charts . + shell: bash diff --git a/open-webui/charts/tika/.github/workflows/pluto.yaml b/open-webui/charts/tika/.github/workflows/pluto.yaml new file mode 100644 index 0000000..d246f5e --- /dev/null +++ b/open-webui/charts/tika/.github/workflows/pluto.yaml @@ -0,0 +1,44 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +name: Use Pluto to check helm chart for resources using deprecated k8s APIs + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + types: [opened, synchronize, reopened] + +jobs: + pluto_detect: + runs-on: ubuntu-latest + env: + PLUTO_VERSION: 5.19.1 + steps: + - name: Checkout + uses: actions/checkout@v4.1.5 + - name: Download Pluto + run: | + wget https://github.com/FairwindsOps/pluto/releases/download/v${{ env.PLUTO_VERSION }}/pluto_${{ env.PLUTO_VERSION }}_linux_amd64.tar.gz -O - | tar -xz + mv pluto /usr/local/bin/pluto + chmod +x /usr/local/bin/pluto + shell: bash + - name: Set up Helm + uses: azure/setup-helm@v4.2.0 + - name: verify helm chart + run: | + helm template . | pluto detect -omarkdown - >> $GITHUB_STEP_SUMMARY + shell: bash diff --git a/open-webui/charts/tika/.helmignore b/open-webui/charts/tika/.helmignore new file mode 100644 index 0000000..2d9d142 --- /dev/null +++ b/open-webui/charts/tika/.helmignore @@ -0,0 +1,24 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +tests diff --git a/open-webui/charts/tika/Chart.yaml b/open-webui/charts/tika/Chart.yaml new file mode 100644 index 0000000..ba978f5 --- /dev/null +++ b/open-webui/charts/tika/Chart.yaml @@ -0,0 +1,52 @@ +annotations: + artifacthub.io/category: integration-delivery + artifacthub.io/containsSecurityUpdates: "false" + artifacthub.io/license: Apache-2.0 + artifacthub.io/links: | + - name: support + url: https://issues.apache.org/jira/browse/TIKA + artifacthub.io/prerelease: "false" + artifacthub.io/recommendations: | + - url: https://artifacthub.io/packages/helm/apache-solr/solr + - url: https://artifacthub.io/packages/helm/apache-airflow/airflow +apiVersion: v2 +appVersion: 3.2.2.0-full +description: The official Helm chart for Apache Tika +home: https://tika.apache.org +icon: https://tika.apache.org/tika.png +keywords: +- apache +- tika +- apache-tika +- tika-helm +maintainers: +- email: lewismc@apache.org + name: lewismc + url: https://github.com/lewismc +- name: stijnbrouwers + url: https://github.com/stijnbrouwers +- name: philipsoutham + url: https://github.com/philipsoutham +- name: frascu + url: https://github.com/frascu +- name: euven + url: https://github.com/euven +- name: ps0uth + url: https://github.com/ps0uth +- name: ahilmathew + url: https://github.com/ahilmathew +- name: aidanthewiz + url: https://github.com/aidanthewiz +- name: bartek + url: https://github.com/bartek +- name: CiraciNicolo + url: https://github.com/CiraciNicolo +- name: amalucelli + url: https://github.com/amalucelli +- name: thatmlopsguy + url: https://github.com/thatmlopsguy +name: tika +sources: +- https://github.com/apache/tika-helm +type: application +version: 3.2.2 diff --git a/open-webui/charts/tika/LICENSE.txt b/open-webui/charts/tika/LICENSE.txt new file mode 100644 index 0000000..9badcda --- /dev/null +++ b/open-webui/charts/tika/LICENSE.txt @@ -0,0 +1,5737 @@ + + 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 [yyyy] [name of copyright owner] + + 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. + + +APACHE NUTCH SUBCOMPONENTS + +lib/commons-httpclient-3.0.1.jar + + 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 + +lib/icu4j-4_0_1.jar + +ICU license - ICU 1.8.1 and later + + COPYRIGHT AND PERMISSION NOTICE + + Copyright (c) 1995-2006 International Business Machines Corporation and + others + + 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, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, provided that the above copyright notice(s) and this + permission notice appear in all copies of the Software and that both the + above copyright notice(s) and this permission notice appear in supporting + documentation. + + 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 OF THIRD PARTY + RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL 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. + + Except as contained in this notice, the name of a copyright holder shall + not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization of the + copyright holder. + + ---------------------------------------------------------------------- + + All trademarks and registered trademarks mentioned herein are the property + of their respective owners. + +lib/commons-collections-3.2.1.jar + + + 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 [yyyy] [name of copyright owner] + + 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. + + +lib/commons-logging-1.0.4.jar + + 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 [yyyy] [name of copyright owner] + + 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. + + +lib/lucene-misc-2.4.0.jar +src/plugin/summary-lucene/lib/lucene-highlighter-2.4.0.jar +lib/lucene-core-2.4.0.jar +src/plugin/lib-lucene-analyzers/lib/lucene-analyzers-2.4.0.jar + + + 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 [yyyy] [name of copyright owner] + + 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. + + + +Some code in src/java/org/apache/lucene/util/UnicodeUtil.java was +derived from unicode conversion examples available at +http://www.unicode.org/Public/PROGRAMS/CVTUTF. Here is the copyright +from those sources: + +/* + * Copyright 2001-2004 Unicode, Inc. + * + * Disclaimer + * + * This source code is provided as is by Unicode, Inc. No claims are + * made as to fitness for any particular purpose. No warranties of any + * kind are expressed or implied. The recipient agrees to determine + * applicability of information provided. If this file has been + * purchased on magnetic or optical media from Unicode, Inc., the + * sole remedy for any claim will be exchange of defective media + * within 90 days of receipt. + * + * Limitations on Rights to Redistribute This Code + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form + * for internal or external distribution as long as this notice + * remains attached. + */ + + +Some code in src/java/org/apache/lucene/util/ArrayUtil.java was +derived from Python 2.4.2 sources available at +http://www.python.org. Full license is here: + + http://www.python.org/download/releases/2.4.2/license/ + +lib/jetty-ext/commons-el.jar + +/* + * $Header: /home/cvs/jakarta-commons/el/LICENSE.txt,v 1.1.1.1 2003/02/04 00:22:24 luehe Exp $ + * $Revision: 1.1.1.1 $ + * $Date: 2003/02/04 00:22:24 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR + * ITS 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +lib/jetty-ext/ant.jar + +/* + * 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 [yyyy] [name of copyright owner] + * + * 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. + */ + + +lib/jetty-ext/jsp-api.jar +ASF + +lib/jetty-ext/jasper-runtime.jar +ASF + +lib/jetty-ext/jasper-compiler.jar +ASF + +lib/hadoop-0.19.1-core.jar + + 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 [yyyy] [name of copyright owner] + + 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. + + +APACHE HADOOP SUBCOMPONENTS: + +The Apache Hadoop project contains subcomponents with separate copyright +notices and license terms. Your use of the source code for the these +subcomponents is subject to the terms and conditions of the following +licenses. + +For the org.apache.hadoop.util.bloom.* classes: + +/** + * + * Copyright (c) 2005, European Commission project OneLab under contract + * 034819 (http://www.one-lab.org) + * 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 the University Catholique de Louvain - UCL + * 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 OWNER 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. + */ + +lib/apache-solr-common-1.3.0.jar +lib/apache-solr-solrj-1.3.0.jar + + + 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 [yyyy] [name of copyright owner] + + 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. + + +========================================================================== +Portions of Jetty 6 are bundled in the Solr example server. +Jetty 6 includes a binary javax.servlet package licensed under the +Common Development and Distribution License. +-------------------------------------------------------------------------- +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + +1. Definitions. + +1.1. Contributor means each individual or entity that creates or contributes to +the creation of Modifications. + +1.2. Contributor Version means the combination of the Original Software, prior +Modifications used by a Contributor (if any), and the Modifications made by +that particular Contributor. + +1.3. Covered Software means (a) the Original Software, or (b) Modifications, or +(c) the combination of files containing Original Software with files containing +Modifications, in each case including portions thereof. + +1.4. Executable means the Covered Software in any form other than Source Code. + +1.5. Initial Developer means the individual or entity that first makes Original +Software available under this License. + +1.6. Larger Work means a work which combines Covered Software or portions +thereof with code not governed by the terms of this License. + +1.7. License means this document. + +1.8. Licensable means having the right to grant, to the maximum extent +possible, whether at the time of the initial grant or subsequently acquired, +any and all of the rights conveyed herein. + +1.9. Modifications means the Source Code and Executable form of any of the +following: + +A. Any file that results from an addition to, deletion from or modification of +the contents of a file containing Original Software or previous Modifications; + +B. Any new file that contains any part of the Original Software or previous +Modification; or + +C. Any new file that is contributed or otherwise made available under the terms +of this License. + +1.10. Original Software means the Source Code and Executable form of computer +software code that is originally released under this License. + +1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, +including without limitation, method, process, and apparatus claims, in any +patent Licensable by grantor. + +1.12. Source Code means (a) the common form of computer software code in which +modifications are made and (b) associated documentation included in or with +such code. + +1.13. You (or Your) means an individual or a legal entity exercising rights +under, and complying with all of the terms of, this License. For legal +entities, You includes any entity which controls, is controlled by, or is under +common control with You. For purposes of this definition, control means (a)áthe +power, direct or indirect, to cause the direction or management of such entity, +whether by contract or otherwise, or (b)áownership of more than fifty percent +(50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants. + +2.1. The Initial Developer Grant. Conditioned upon Your compliance with +Section 3.1 below and subject to third party intellectual property claims, the +Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive +license: (a) under intellectual property rights (other than patent or +trademark) Licensable by Initial Developer, to use, reproduce, modify, display, +perform, sublicense and distribute the Original Software (or portions thereof), +with or without Modifications, and/or as part of a Larger Work; and (b) under +Patent Claims infringed by the making, using or selling of Original Software, +to make, have made, use, practice, sell, and offer for sale, and/or otherwise +dispose of the Original Software (or portions thereof). (c) The licenses +granted in Sectionsá2.1(a) and (b) are effective on the date Initial Developer +first distributes or otherwise makes the Original Software available to a third +party under the terms of this License. (d) Notwithstanding Sectioná2.1(b) +above, no patent license is granted: (1)áfor code that You delete from the +Original Software, or (2)áfor infringements caused by: (i)áthe modification of +the Original Software, or (ii)áthe combination of the Original Software with +other software or devices. + +2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 +below and subject to third party intellectual property claims, each Contributor +hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under +intellectual property rights (other than patent or trademark) Licensable by +Contributor to use, reproduce, modify, display, perform, sublicense and +distribute the Modifications created by such Contributor (or portions thereof), +either on an unmodified basis, with other Modifications, as Covered Software +and/or as part of a Larger Work; and (b) under Patent Claims infringed by the +making, using, or selling of Modifications made by that Contributor either +alone and/or in combination with its Contributor Version (or portions of such +combination), to make, use, sell, offer for sale, have made, and/or otherwise +dispose of: (1)áModifications made by that Contributor (or portions thereof); +and (2)áthe combination of Modifications made by that Contributor with its +Contributor Version (or portions of such combination). (c) The licenses +granted in Sectionsá2.2(a) and 2.2(b) are effective on the date Contributor +first distributes or otherwise makes the Modifications available to a third +party. (d) Notwithstanding Sectioná2.2(b) above, no patent license is granted: +(1)áfor any code that Contributor has deleted from the Contributor Version; +(2)áfor infringements caused by: (i)áthird party modifications of Contributor +Version, or (ii)áthe combination of Modifications made by that Contributor with +other software (except as part of the Contributor Version) or other devices; or +(3)áunder Patent Claims infringed by Covered Software in the absence of +Modifications made by that Contributor. + +3. Distribution Obligations. + +3.1. Availability of Source Code. + +Any Covered Software that You distribute or otherwise make available in +Executable form must also be made available in Source Code form and that Source +Code form must be distributed only under the terms of this License. You must +include a copy of this License with every copy of the Source Code form of the +Covered Software You distribute or otherwise make available. You must inform +recipients of any such Covered Software in Executable form as to how they can +obtain such Covered Software in Source Code form in a reasonable manner on or +through a medium customarily used for software exchange. + +3.2. Modifications. + +The Modifications that You create or to which You contribute are governed by +the terms of this License. You represent that You believe Your Modifications +are Your original creation(s) and/or You have sufficient rights to grant the +rights conveyed by this License. + +3.3. Required Notices. You must include a notice in each of Your Modifications +that identifies You as the Contributor of the Modification. You may not remove +or alter any copyright, patent or trademark notices contained within the +Covered Software, or any notices of licensing or any descriptive text giving +attribution to any Contributor or the Initial Developer. + +3.4. Application of Additional Terms. You may not offer or impose any terms on +any Covered Software in Source Code form that alters or restricts the +applicable version of this License or the recipients rights hereunder. You may +choose to offer, and to charge a fee for, warranty, support, indemnity or +liability obligations to one or more recipients of Covered Software. However, +you may do so only on Your own behalf, and not on behalf of the Initial +Developer or any Contributor. You must make it absolutely clear that any such +warranty, support, indemnity or liability obligation is offered by You alone, +and You hereby agree to indemnify the Initial Developer and every Contributor +for any liability incurred by the Initial Developer or such Contributor as a +result of warranty, support, indemnity or liability terms You offer. + +3.5. Distribution of Executable Versions. You may distribute the Executable +form of the Covered Software under the terms of this License or under the terms +of a license of Your choice, which may contain terms different from this +License, provided that You are in compliance with the terms of this License and +that the license for the Executable form does not attempt to limit or alter the +recipients rights in the Source Code form from the rights set forth in this +License. If You distribute the Covered Software in Executable form under a +different license, You must make it absolutely clear that any terms which +differ from this License are offered by You alone, not by the Initial Developer +or Contributor. You hereby agree to indemnify the Initial Developer and every +Contributor for any liability incurred by the Initial Developer or such +Contributor as a result of any such terms You offer. + +3.6. Larger Works. You may create a Larger Work by combining Covered Software +with other code not governed by the terms of this License and distribute the +Larger Work as a single product. In such a case, You must make sure the +requirements of this License are fulfilled for the Covered Software. + +4. Versions of the License. + +4.1. New Versions. Sun Microsystems, Inc. is the initial license steward and +may publish revised and/or new versions of this License from time to time. Each +version will be given a distinguishing version number. Except as provided in +Section 4.3, no one other than the license steward has the right to modify this +License. + +4.2. Effect of New Versions. + +You may always continue to use, distribute or otherwise make the Covered +Software available under the terms of the version of the License under which +You originally received the Covered Software. If the Initial Developer includes +a notice in the Original Software prohibiting it from being distributed or +otherwise made available under any subsequent version of the License, You must +distribute and make the Covered Software available under the terms of the +version of the License under which You originally received the Covered +Software. Otherwise, You may also choose to use, distribute or otherwise make +the Covered Software available under the terms of any subsequent version of the +License published by the license steward. 4.3. Modified Versions. + +When You are an Initial Developer and You want to create a new license for Your +Original Software, You may create and use a modified version of this License if +You: (a)árename the license and remove any references to the name of the +license steward (except to note that the license differs from this License); +and (b)áotherwise make it clear that the license contains terms which differ +from this License. + +5. DISCLAIMER OF WARRANTY. + +COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT +LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, +MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK +AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD +ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL +DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, +REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART +OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT +UNDER THIS DISCLAIMER. + +6. TERMINATION. + +6.1. This License and the rights granted hereunder will terminate automatically +if You fail to comply with terms herein and fail to cure such breach within 30 +days of becoming aware of the breach. Provisions which, by their nature, must +remain in effect beyond the termination of this License shall survive. + +6.2. If You assert a patent infringement claim (excluding declaratory judgment +actions) against Initial Developer or a Contributor (the Initial Developer or +Contributor against whom You assert such claim is referred to as Participant) +alleging that the Participant Software (meaning the Contributor Version where +the Participant is a Contributor or the Original Software where the Participant +is the Initial Developer) directly or indirectly infringes any patent, then any +and all rights granted directly or indirectly to You by such Participant, the +Initial Developer (if the Initial Developer is not the Participant) and all +Contributors under Sectionsá2.1 and/or 2.2 of this License shall, upon 60 days +notice from Participant terminate prospectively and automatically at the +expiration of such 60 day notice period, unless if within such 60 day period +You withdraw Your claim with respect to the Participant Software against such +Participant either unilaterally or pursuant to a written agreement with +Participant. + +6.3. In the event of termination under Sectionsá6.1 or 6.2 above, all end user +licenses that have been validly granted by You or any distributor hereunder +prior to termination (excluding licenses granted to You by any distributor) +shall survive termination. + +7. LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING +NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY +OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF +ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT +LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER +FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN +IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS +LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL +INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW +PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR +LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND +LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + +The Covered Software is a commercial item, as that term is defined in +48áC.F.R.á2.101 (Oct. 1995), consisting of commercial computer software (as +that term is defined at 48 C.F.R. á252.227-7014(a)(1)) and commercial computer +software documentation as such terms are used in 48áC.F.R.á12.212 (Sept. 1995). +Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 +(June 1995), all U.S. Government End Users acquire Covered Software with only +those rights set forth herein. This U.S. Government Rights clause is in lieu +of, and supersedes, any other FAR, DFAR, or other clause or provision that +addresses Government rights in computer software under this License. + +9. MISCELLANEOUS. + +This License represents the complete agreement concerning subject matter +hereof. If any provision of this License is held to be unenforceable, such +provision shall be reformed only to the extent necessary to make it +enforceable. This License shall be governed by the law of the jurisdiction +specified in a notice contained within the Original Software (except to the +extent applicable law, if any, provides otherwise), excluding such +jurisdictions conflict-of-law provisions. Any litigation relating to this +License shall be subject to the jurisdiction of the courts located in the +jurisdiction and venue specified in a notice contained within the Original +Software, with the losing party responsible for costs, including, without +limitation, court costs and reasonable attorneys fees and expenses. The +application of the United Nations Convention on Contracts for the International +Sale of Goods is expressly excluded. Any law or regulation which provides that +the language of a contract shall be construed against the drafter shall not +apply to this License. You agree that You alone are responsible for compliance +with the United States export administration regulations (and the export +control laws and regulation of any other countries) when You use, distribute or +otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + +As between Initial Developer and the Contributors, each party is responsible +for claims and damages arising, directly or indirectly, out of its utilization +of rights under this License and You agree to work with Initial Developer and +Contributors to distribute such responsibility on an equitable basis. Nothing +herein is intended or shall be deemed to constitute any admission of liability. + +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE +(CDDL) The GlassFish code released under the CDDL shall be governed by the laws +of the State of California (excluding conflict-of-law provisions). Any +litigation relating to this License shall be subject to the jurisdiction of the +Federal Courts of the Northern District of California and the state courts of +the State of California, with venue lying in Santa Clara County, California. + + +========================================================================== +The following license applies to parts of the lucene-snowball jar +that are generated from the snowball sources at http://snowball.tartarus.org/ +-------------------------------------------------------------------------- +The BSD License + +Copyright (c) 2001, Dr Martin Porter, Copyright (c) 2002, Richard Boulton +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 the 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 OWNER 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. + +========================================================================== +The following license applies to easymock.jar +-------------------------------------------------------------------------- +EasyMock 2 License (MIT License) +Copyright (c) 2001-2007 OFFIS, Tammo Freese. + +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. + +========================================================================== +The following license applies to the JQuery JavaScript library +-------------------------------------------------------------------------- +Copyright (c) 2008 John Resig, http://jquery.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. + +========================================================================== +The following license applies to stax-utils.jar +-------------------------------------------------------------------------- +Copyright (c) 2004, Christian Niles, unit12.net +Copyright (c) 2004, Sun Microsystems, Inc. +Copyright (c) 2006, John Kristian +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 the listed copyright holders 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 +OWNER 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. + +========================================================================== +The following license applies to JUnit +-------------------------------------------------------------------------- +Common Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + + c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + + d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + + ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + + iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + + iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. + + +lib/xerces-2_6_2-apis.jar + +xml-commons/java/external/LICENSE.sax.txt $Id: LICENSE.sax.txt,v 1.1 2002/01/31 23:26:48 curcuru Exp $ + + +This license came from: http://www.megginson.com/SAX/copying.html + However please note future versions of SAX may be covered + under http://saxproject.org/?selected=pd + + +This page is now out of date -- see the new SAX site at +http://www.saxproject.org/ for more up-to-date +releases and other information. Please change your bookmarks. + + +SAX2 is Free! + +I hereby abandon any property rights to SAX 2.0 (the Simple API for +XML), and release all of the SAX 2.0 source code, compiled code, and +documentation contained in this distribution into the Public Domain. +SAX comes with NO WARRANTY or guarantee of fitness for any +purpose. + +David Megginson, david@megginson.com +2000-05-05 + + +xml-commons/java/external/LICENSE.dom-software.txt $Id: LICENSE.dom-software.txt,v 1.1 2002/01/31 23:13:42 curcuru Exp $ + + +This license came from: http://www.w3.org/Consortium/Legal/copyright-software-19980720 + + +W3C® SOFTWARE NOTICE AND LICENSE +Copyright © 1994-2001 World +Wide Web Consortium, World +Wide Web Consortium, (Massachusetts Institute of +Technology, Institut National de +Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/ + +This W3C work (including software, documents, or other related +items) is being provided by the copyright holders under the +following license. By obtaining, using and/or copying this work, +you (the licensee) agree that you have read, understood, and will +comply with the following terms and conditions: +Permission to use, copy, modify, and distribute this software +and its documentation, with or without modification,  for any +purpose and without fee or royalty is hereby granted, provided that +you include the following on ALL copies of the software and +documentation or portions thereof, including modifications, that +you make: + +The full text of this NOTICE in a location viewable to users of +the redistributed or derivative work. + +Any pre-existing intellectual property disclaimers, notices, or +terms and conditions. If none exist, a short notice of the +following form (hypertext is preferred, text is permitted) should +be used within the body of any redistributed or derivative code: +"Copyright © [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of +Technology, Institut National de +Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/" + +Notice of any changes or modifications to the W3C files, +including the date changes were made. (We recommend you provide +URIs to the location from which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND +COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF +MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE +USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD +PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, +SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE +SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in +advertising or publicity pertaining to the software without +specific, written prior permission. Title to copyright in this +software and any associated documentation will at all times remain +with copyright holders. +____________________________________ +This formulation of W3C's notice and license became active on +August 14 1998 so as to improve compatibility with GPL. This +version ensures that W3C software licensing terms are no more +restrictive than GPL and consequently W3C software may be +distributed in GPL packages. See the older formulation for the +policy prior to this date. Please see our Copyright FAQ for common +questions about using materials from +our site, including specific terms and conditions for packages like +libwww, Amaya, and Jigsaw. +Other questions about this notice can be +directed to site-policy@w3.org. + +webmaster +(last updated $Date: 2002/01/31 23:13:42 $) + +lib/commons-cli-2.0-SNAPSHOT.jar + + 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 [yyyy] [name of copyright owner] + + 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. + + +lib/commons-codec-1.3.jar + + + 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 [yyyy] [name of copyright owner] + + 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. + +lib/xerces-2_6_2.jar +ASF + +lib/jetty-5.1.4.jar + + + 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 [yyyy] [name of copyright owner] + + 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. + +lib/commons-lang-2.1.jar + + + 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 [yyyy] [name of copyright owner] + + 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. + +lib/commons-beanutils-1.8.0.jar + + + 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 [yyyy] [name of copyright owner] + + 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. + + +lib/commons-logging-api-1.0.4.jar + + + 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 [yyyy] [name of copyright owner] + + 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. + +lib/servlet-api.jar +ASF + +lib/jets3t-0.6.1.jar + + 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 [yyyy] [name of copyright owner] + + 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. + + +lib/tika-0.1-incubating.jar + + + 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 [yyyy] [name of copyright owner] + + 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. + +lib/junit-3.8.1.jar + +Common Public License Version 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + + c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + + d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + + ii) effectively excludes on behalf of all Cntributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + + iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + + iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PR LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. +OFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. + +lib/taglibs-i18n.jar +ASF + +lib/log4j-1.2.15.jar +ASF + +src/plugin/feed/lib/rome-0.9.jar +Copyright 2004 Sun Microsystems, 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. + +src/plugin/lib-jakarta-poi/lib/poi-scratchpad-3.5-beta4-20081128.jar + + 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 [yyyy] [name of copyright owner] + + 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. + + + + +Office Open XML (OOXML) xsds: +----------------------------- + +These were downloaded as part of the Office Open XML ECMA Specification +from + +These are included within the Apache POI distribution, and are available +under compatible licensing terms. + +Copyright - ECMA International, "made available without restriction" + http://www.ecma-international.org/memento/Ecmabylaws.htm - section 9.4 +Patent License - Microsoft Open Specification Promise (OSP) + http://www.microsoft.com/interop/osp/ + + +src/plugin/lib-jakarta-poi/lib/poi-3.5-beta4-20081128.jar + + 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 [yyyy] [name of copyright owner] + + 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. + + + + +Office Open XML (OOXML) xsds: +----------------------------- + +These were downloaded as part of the Office Open XML ECMA Specification +from + +These are included within the Apache POI distribution, and are available +under compatible licensing terms. + +Copyright - ECMA International, "made available without restriction" + http://www.ecma-international.org/memento/Ecmabylaws.htm - section 9.4 +Patent License - Microsoft Open Specification Promise (OSP) + http://www.microsoft.com/interop/osp/ + +src/plugin/urlfilter-automaton/lib/automaton.jar + +dk.brics.automaton +------------------ + +Copyright (C) 2001-2004 Anders Moeller + +This source code in this package may be used under the terms of the +BSD license. Please read the file 'COPYING' for details. + +This package contains a full DFA/NFA implementation with Unicode +alphabet and support for all standard regular expression operations. + +For more information, go to the package home page at +http://www.brics.dk/~amoeller/automaton/ + + +Anders Moeller +amoeller@brics.dk + +src/plugin/lib-nekohtml/lib/nekohtml-0.9.4.jar + +The CyberNeko Software License, Version 1.0 + + +(C) Copyright 2002,2003, Andy Clark. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. The end-user documentation included with the redistribution, + if any, must include the following acknowledgment: + "This product includes software developed by Andy Clark." + Alternately, this acknowledgment may appear in the software itself, + if and wherever such third-party acknowledgments normally appear. + +4. The names "CyberNeko" and "NekoHTML" must not be used to endorse + or promote products derived from this software without prior + written permission. For written permission, please contact + andy@cyberneko.net. + +5. Products derived from this software may not be called "CyberNeko", + nor may "CyberNeko" appear in their name, without prior written + permission of the author. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHOR OR OTHER 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. + +==================================================================== + +This license is based on the Apache Software License, version 1.1. + + +src/plugin/clustering-carrot2/lib/violinstrings-1.0.2.jar + +Copyright (c) Michael Schmeling 1998, 2000 - 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, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, provided that the above copyright notice(s) and this +permission notice appear in all copies of the Software and that both the +above copyright notice(s) and this permission notice appear in supporting +documentation. + +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 OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL 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. + +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization of the +copyright holder. + +src/plugin/clustering-carrot2/lib/carrot2-util-common.jar +src/plugin/clustering-carrot2/lib/carrot2-filter-lingo.jar +src/plugin/clustering-carrot2/lib/carrot2-snowball-stemmers.jar +src/plugin/clustering-carrot2/lib/carrot2-util-tokenizer.jar +src/plugin/clustering-carrot2/lib/carrot2-local-core.jar + + +Carrot2 Project + +Copyright (C) 2002-2006, Dawid Weiss, Stanis�aw Osi�ski. +Portions (C) Contributors listed in "carrot2.CONTRIBUTORS" file. +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 the Poznan University of Technology, Poznan, Poland nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +- We request that you include in the end-user documentation provided with the + redistribution and/or in the software itself an acknowledgement equivalent to + the following: "This product includes software developed by the Carrot2 + Project." + +- No algorithms or technical solutions in the project may be patented or claimed + proprietary. + +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 OWNER 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. + +src/plugin/clustering-carrot2/lib/commons-collections-3.2.jar +ASF + +src/plugin/clustering-carrot2/lib/Jama-1.0.2.jar + +Copyright Notice This software is a cooperative product of The MathWorks and the +National Institute of Standards and Technology (NIST) which has been released to +the public domain. Neither The MathWorks nor NIST assumes any responsibility +whatsoever for its use by other parties, and makes no guarantees, expressed or +implied, about its quality, reliability, or any other characteristic. + +src/plugin/clustering-carrot2/lib/commons-pool-1.3.jar +ASF + +src/plugin/protocol-ftp/lib/commons-net-1.2.0-dev.jar +ASF + +src/plugin/ontology/lib/jena-2.1.jar + +/* + * (c) Copyright 2000, 2001, 2002, 2003, 2004 Hewlett-Packard Development Company, LP + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + */ + + +This product includes software developed by the +Apache Software Foundation (http://www.apache.org/). + +src/plugin/parse-swf/lib/javaswf.jar + + + Copyright (c) 2001-2005, David N. Main, All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, are permitted provided that the + following conditions are met: + + 1. Redistributions of source code must retain the above + copyright notice, this list of conditions and the following + disclaimer. + + 2. 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. + + 3. The name of the author may not be used to endorse or + promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 + AUTHOR 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. + +src/plugin/response-json/lib/json-lib-2.2.2-jdk15.jar + + 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 [yyyy] [name of copyright owner] + + 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. + +src/plugin/response-json/lib/ezmorph-1.0.6.jar + + 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 [yyyy] [name of copyright owner] + + 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. + +src/plugin/parse-html/lib/tagsoup-1.2.jar + + 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 [yyyy] [name of copyright owner] + + 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. + +src/plugin/parse-pdf/lib/PDFBox-0.7.4-dev.jar + +Copyright (c) 2003-2005, www.pdfbox.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +2. 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. +3. Neither the name of pdfbox; 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 REGENTS 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. + +src/plugin/parse-pdf/lib/JempBox-0.2.0.jar + +Copyright (c) 2006-2007, www.jempbox.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +2. 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. +3. Neither the name of pdfbox; 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 REGENTS 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. + + +src/plugin/parse-pdf/lib/FontBox-0.2.0-dev.jar + +Copyright (c) 2003-2005, www.fontbox.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +2. 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. +3. Neither the name of fontbox; 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 REGENTS 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. + + +src/plugin/parse-pdf/lib/bcprov-jdk14-132.jar + +Copyright (c) 2000 - 2008 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) + +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. + + +src/plugin/lib-xml/lib/jdom.jar + +/*-- + + $Id: LICENSE.txt,v 1.11 2004/02/06 09:32:57 jhunter Exp $ + + Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "JDOM" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact . + + 4. Products derived from this software may not be called "JDOM", nor + may "JDOM" appear in their name, without prior written permission + from the JDOM Project Management . + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + JDOM Project (http://www.jdom.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.jdom.org/images/logos. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JDOM AUTHORS OR THE PROJECT + 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. + + This software consists of voluntary contributions made by many + individuals on behalf of the JDOM Project and was originally + created by Jason Hunter and + Brett McLaughlin . For more information + on the JDOM Project, please see . + + */ + +src/plugin/lib-xml/lib/jaxen-jdom.jar +src/plugin/lib-xml/lib/jaxen-core.jar + +/* + $Id: LICENSE.txt 1128 2006-02-05 21:49:04Z elharo $ + + Copyright 2003-2006 The Werken 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 the Jaxen Project 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 OWNER +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. + + */ + + +src/plugin/lib-xml/lib/saxpath.jar + +/*-- + + $Id: LICENSE,v 1.1 2002/04/26 17:43:56 jstrachan Exp $ + + Copyright (C) 2000-2002 werken digital. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the disclaimer that follows + these conditions in the documentation and/or other materials + provided with the distribution. + + 3. The name "SAXPath" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact license@saxpath.org. + + 4. Products derived from this software may not be called "SAXPath", nor + may "SAXPath" appear in their name, without prior written permission + from the SAXPath Project Management (pm@saxpath.org). + + In addition, we request (but do not require) that you include in the + end-user documentation provided with the redistribution and/or in the + software itself an acknowledgement equivalent to the following: + "This product includes software developed by the + SAXPath Project (http://www.saxpath.org/)." + Alternatively, the acknowledgment may be graphical using the logos + available at http://www.saxpath.org/ + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 SAXPath AUTHORS OR THE PROJECT + 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. + + This software consists of voluntary contributions made by many + individuals on behalf of the SAXPath Project and was originally + created by bob mcwhirter and + James Strachan . For more information on the + SAXPath Project, please see . + + */ + +src/plugin/lib-xml/lib/xercesImpl.jar + +ASF + + + diff --git a/open-webui/charts/tika/README.md b/open-webui/charts/tika/README.md new file mode 100644 index 0000000..365a55b --- /dev/null +++ b/open-webui/charts/tika/README.md @@ -0,0 +1,159 @@ +tika-helm +========= + +[![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/apache-tika)](https://artifacthub.io/packages/search?repo=apache-tika) + +

tika: The official Helm chart to deploy Apache Tika on Kubernetes

— Open in Artifact Hub
+ +A [Helm chart][] to deploy [Apache Tika][] on [Kubernetes][]. + + + +This Helm chart is a lightweight way to configure and run the official [apache/tika][] Docker image. + +We recommend that the Helm chart version is aligned to the version Tika (and subsequently the +version of the [Tika Docker image][]) you want to deploy. +This will ensure that you using a chart version that has been tested against the corresponding +production version. This will also ensure that the documentation and examples for the chart +will work with the version of Tika you are installing. + + +**Warning**: This branch is used for development, please use the [latest release][] for released version. + + + + +- [tika-helm](#tika-helm) + - [Requirements](#requirements) + - [Installing](#installing) + - [Install released version using Helm repository](#install-released-version-using-helm-repository) + - [Install development version using master branch](#install-development-version-using-master-branch) + - [Custom configuration for tika](#custom-configuration-for-tika) + - [Upgrading](#upgrading) + - [Configuration](#configuration) + - [Deprecated](#deprecated) + - [Contributing](#contributing) + - [More Information](#more-information) + - [Authors](#authors) +- [License](#license) + + + + + +## Requirements + +* Kubernetes >= 1.14 +* [Helm][] >= v3.4.2 + +## Installing + +### Install released version using Helm repository + +**N.B.** You may or may not need/wish to install the chart into a specific **namespace**, +in which case you may need to augment the commands below. + +* Add the Tika Helm charts repo: +`helm repo add tika https://apache.jfrog.io/artifactory/tika` + +* Install it: + - with Helm 3: `helm install tika tika/tika --set image.tag=${release.version} -n tika-test`, you will see something like +``` +helm install tika tika/tika --set image.tag=latest-full -n tika-test + +... +NAME: tika +LAST DEPLOYED: Mon Jan 24 13:38:01 2022 +NAMESPACE: tika-test +STATUS: deployed +REVISION: 1 +NOTES: +1. Get the application URL by running these commands: + export POD_NAME=$(kubectl get pods --namespace tika-test -l "app.kubernetes.io/name=tika,app.kubernetes.io/instance=tika" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace tika-test $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:9998 to use your application" + kubectl --namespace tika-test port-forward $POD_NAME 9998:$CONTAINER_PORT +``` +You may notice that the _kubectl port forwarding_ experiences a _timeout issue_ which ultimately kills the app. In this case you can run port formarding in a loop +``` +while true; do kubectl --namespace tika-test port-forward $POD_NAME 9998:$CONTAINER_PORT ; done +``` +... this should keep `kubectl` reconnecting on connection lost. + +### Install development version using master branch + +* Clone the git repo: `git clone git@github.com:apache/tika-helm.git` + +* Install it: + - with Helm 3: `helm install tika . --set image.tag=latest-full` + +### Custom configuration for tika + +To use custom [configuration]( https://tika.apache.org/2.9.1/configuring.html) values for apache tika, use the `tikaConfig` key in the `values.yaml`. +Example: +``` +tikaConfig: | + + + + + + image/jpeg + application/pdf + + + +``` +## Upgrading + +Please check `artifacthub.io/changes` in `Chart.yaml` before upgrading. + +## Configuration + +| Parameter | Description | Default | +| --------- | ----------- | ------- | +| `...` | ... | ... | + +## Testing + +``` +helm plugin install https://github.com/helm-unittest/helm-unittest.git +helm unittest . +``` + +See [helm-unittest][] for canonical documentation. + +## Contributing + +Please check [CONTRIBUTING][] before any contribution or for any questions +about our development and testing process. + +## More Information + +For more infomation on Apache Tika Server, go to the [Apache Tika Server documentation][]. + +For more information on Apache Tika, go to the official [Apache Tika][] project website. + +For more information on the Apache Software Foundation, go to the [Apache Software Foundation][] website. + +## Authors + +Apache Tika Dev Team (dev@tika.apache.org) + +# License +The code is licensed permissively under the [Apache License v2.0][]. + +[Apache License v2.0]: https://www.apache.org/licenses/LICENSE-2.0.html +[Apache Software Foundation]: http://apache.org +[Apache Tika]: https://tika.apache.org +[Apache Tika Server documentation]: https://cwiki.apache.org/confluence/display/TIKA/TikaServer +[BREAKING_CHANGES.md]: https://github.com/apache/tika-helm/blob/master/BREAKING_CHANGES.md +[CHANGELOG.md]: https://github.com/apache/tika-helm/blob/master/CHANGELOG.md +[CONTRIBUTING]: https://github.com/apache/tika#contributing-via-github +[apache/tika]: https://github.com/apache/tika-docker +[helm-unittest]: https://github.com/helm-unittest/helm-unittest +[Helm chart]: https://helm.sh/docs/topics/charts/ +[Kubernetes]: https://kubernetes.io/ +[Tika Docker image]: https://hub.docker.com/r/apache/tika/tags?page=1&ordering=last_updated +[helm]: https://helm.sh +[latest release]: https://github.com/apache/tika-helm/releases diff --git a/open-webui/charts/tika/artifacthub-repo.yml b/open-webui/charts/tika/artifacthub-repo.yml new file mode 100644 index 0000000..46ce097 --- /dev/null +++ b/open-webui/charts/tika/artifacthub-repo.yml @@ -0,0 +1,32 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# Artifact Hub repository metadata file +# +# Some settings like the verified publisher flag or the ignored packages won't +# be applied until the next time the repository is processed. Please keep in +# mind that the repository won't be processed if it has not changed since the +# last time it was processed. Depending on the repository kind, this is checked +# in a different way. For Helm http based repositories, we consider it has +# changed if the `index.yaml` file changes. For git based repositories, it does +# when the hash of the last commit in the branch you set up changes. This does +# NOT apply to ownership claim operations, which are processed immediately. +# +repositoryID: 01c1e88b-cba6-4430-9e05-05f02d3f805b +owners: + - name: Apache Tika Committers + email: dev@tika.apache.org diff --git a/open-webui/charts/tika/templates/NOTES.txt b/open-webui/charts/tika/templates/NOTES.txt new file mode 100644 index 0000000..21fb4d6 --- /dev/null +++ b/open-webui/charts/tika/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "tika-helm.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "tika-helm.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "tika-helm.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "tika-helm.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:9998 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 9998:$CONTAINER_PORT +{{- end }} diff --git a/open-webui/charts/tika/templates/_helpers.tpl b/open-webui/charts/tika/templates/_helpers.tpl new file mode 100644 index 0000000..4fbd57d --- /dev/null +++ b/open-webui/charts/tika/templates/_helpers.tpl @@ -0,0 +1,74 @@ +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts +*/}} +{{- define "tika-helm.namespace" -}} + {{- if .Values.namespaceOverride -}} + {{- .Values.namespaceOverride -}} + {{- else -}} + {{- .Release.Namespace -}} + {{- end -}} +{{- end -}} + + +{{/* +Expand the name of the chart. +*/}} +{{- define "tika-helm.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "tika-helm.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "tika-helm.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "tika-helm.labels" -}} +helm.sh/chart: {{ include "tika-helm.chart" . }} +{{ include "tika-helm.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "tika-helm.selectorLabels" -}} +app.kubernetes.io/name: {{ include "tika-helm.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "tika-helm.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "tika-helm.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/open-webui/charts/tika/templates/configmap.yaml b/open-webui/charts/tika/templates/configmap.yaml new file mode 100644 index 0000000..b588c95 --- /dev/null +++ b/open-webui/charts/tika/templates/configmap.yaml @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +--- +{{- if .Values.tikaConfig }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Chart.Name }}-config + namespace: {{ include "tika-helm.namespace" . }} +data: + tika-config.xml: |- +{{ .Values.tikaConfig | indent 4 }} +{{- end }} \ No newline at end of file diff --git a/open-webui/charts/tika/templates/deployment.yaml b/open-webui/charts/tika/templates/deployment.yaml new file mode 100644 index 0000000..65c83d6 --- /dev/null +++ b/open-webui/charts/tika/templates/deployment.yaml @@ -0,0 +1,127 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "tika-helm.fullname" . }} + namespace: {{ include "tika-helm.namespace" . }} + labels: + {{- include "tika-helm.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "tika-helm.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "tika-helm.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "tika-helm.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + - name: sec-ctx-vol + emptyDir: {} + {{- if .Values.tikaConfig }} + - name: tika-config + configMap: + name: {{ .Chart.Name }}-config + defaultMode: 0777 + {{- end }} + containers: + - name: {{ .Chart.Name }} + {{- if .Values.tikaConfig }} + args: ["-c" , "/tika-config/tika-config.xml"] + {{- end }} + {{- with .Values.env }} + env: + {{- toYaml . | nindent 12 }} + {{- end }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + volumeMounts: + - name: sec-ctx-vol + mountPath: /tmp + {{- if .Values.tikaConfig }} + - name: tika-config + mountPath: /tika-config + {{- end }} + ports: + - name: http + containerPort: {{ .Values.service.port }} + protocol: TCP + livenessProbe: + {{- if eq (lower .Values.livenessProbe.scheme) "tcp" }} + tcpSocket: + port: {{ .Values.service.port }} + {{- else }} + httpGet: + path: {{if .Values.config.base_url }}{{- with urlParse (tpl .Values.config.base_url .) }}{{ .path }}{{end}}{{else}}/{{end}} + port: {{ .Values.service.port }} + scheme: {{ .Values.livenessProbe.scheme | default "http" }} + {{- end }} + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds | default 15 }} + timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds | default 30 }} + failureThreshold: {{ .Values.livenessProbe.failureThreshold | default 20 }} + periodSeconds: {{ .Values.livenessProbe.periodSeconds | default 5 }} + readinessProbe: + {{- if eq (lower .Values.readinessProbe.scheme) "tcp" }} + tcpSocket: + port: {{ .Values.service.port }} + {{- else }} + httpGet: + path: {{if .Values.config.base_url }}{{- with urlParse (tpl .Values.config.base_url .) }}{{ .path }}{{end}}{{else}}/{{end}} + port: {{ .Values.service.port }} + scheme: {{ .Values.readinessProbe.scheme | default "http" }} + {{- end }} + initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds | default 15 }} + timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds | default 30 }} + failureThreshold: {{ .Values.readinessProbe.failureThreshold | default 20 }} + periodSeconds: {{ .Values.readinessProbe.periodSeconds | default 5 }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/open-webui/charts/tika/templates/hpa.yaml b/open-webui/charts/tika/templates/hpa.yaml new file mode 100644 index 0000000..e46040f --- /dev/null +++ b/open-webui/charts/tika/templates/hpa.yaml @@ -0,0 +1,66 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +--- +{{- if .Values.autoscaling.enabled }} +apiVersion: {{ .Values.autoscaling.apiVersion }} +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "tika-helm.fullname" . }} + namespace: {{ include "tika-helm.namespace" . }} + labels: + {{- include "tika-helm.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "tika-helm.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if eq .Values.autoscaling.apiVersion "autoscaling/v2" }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- else }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/tika/templates/ingress.yaml b/open-webui/charts/tika/templates/ingress.yaml new file mode 100644 index 0000000..3a330e1 --- /dev/null +++ b/open-webui/charts/tika/templates/ingress.yaml @@ -0,0 +1,80 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +--- +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "tika-helm.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + namespace: {{ include "tika-helm.namespace" . }} + labels: + {{- include "tika-helm.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/tika/templates/networkpolicy.yaml b/open-webui/charts/tika/templates/networkpolicy.yaml new file mode 100644 index 0000000..6921751 --- /dev/null +++ b/open-webui/charts/tika/templates/networkpolicy.yaml @@ -0,0 +1,42 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +--- +{{- if .Values.networkPolicy.enabled }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ template "tika-helm.fullname" . }} + namespace: {{ include "tika-helm.namespace" . }} + labels: + {{- include "tika-helm.labels" . | nindent 4 }} +spec: + podSelector: + matchLabels: + {{- include "tika-helm.selectorLabels" . | nindent 6 }} + egress: + - {} + ingress: + - ports: + - port: {{ .Values.service.port }} + {{- if not .Values.networkPolicy.allowExternal }} + from: + - podSelector: + matchLabels: + {{ template "tika-helm.fullname" . }}-client: "true" + {{- end }} +{{- end }} diff --git a/open-webui/charts/tika/templates/service.yaml b/open-webui/charts/tika/templates/service.yaml new file mode 100644 index 0000000..73f4e1f --- /dev/null +++ b/open-webui/charts/tika/templates/service.yaml @@ -0,0 +1,38 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ include "tika-helm.fullname" . }} + namespace: {{ include "tika-helm.namespace" . }} + labels: + {{- include "tika-helm.labels" . | nindent 4 }} + annotations: + {{- with .Values.service.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "tika-helm.selectorLabels" . | nindent 4 }} diff --git a/open-webui/charts/tika/templates/serviceaccount.yaml b/open-webui/charts/tika/templates/serviceaccount.yaml new file mode 100644 index 0000000..0f33db0 --- /dev/null +++ b/open-webui/charts/tika/templates/serviceaccount.yaml @@ -0,0 +1,31 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +--- +{{- if .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "tika-helm.serviceAccountName" . }} + namespace: {{ include "tika-helm.namespace" . }} + labels: + {{- include "tika-helm.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/open-webui/charts/tika/values.yaml b/open-webui/charts/tika/values.yaml new file mode 100644 index 0000000..dc9899f --- /dev/null +++ b/open-webui/charts/tika/values.yaml @@ -0,0 +1,69 @@ +affinity: {} +autoscaling: + apiVersion: autoscaling/v2 + enabled: false + maxReplicas: 100 + minReplicas: 1 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 +config: + base_url: http://localhost/ +fullnameOverride: "" +image: + pullPolicy: IfNotPresent + repository: apache/tika + tag: 3.2.2.0-full +imagePullSecrets: [] +ingress: + annotations: {} + enabled: false + hosts: + - host: chart-example.local + paths: [] + tls: [] +livenessProbe: + failureThreshold: 20 + initialDelaySeconds: 15 + periodSeconds: 5 + scheme: HTTP + timeoutSeconds: 30 +nameOverride: "" +namespaceOverride: "" +networkPolicy: + allowExternal: false + enabled: false +nodeSelector: {} +podAnnotations: {} +podSecurityContext: {} +readinessProbe: + failureThreshold: 20 + initialDelaySeconds: 15 + periodSeconds: 5 + scheme: HTTP + timeoutSeconds: 30 +replicaCount: 1 +resources: + limits: + cpu: "2" + memory: 2000Mi + requests: + cpu: "1" + memory: 1500Mi +securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsGroup: 35002 + runAsNonRoot: true + runAsUser: 35002 +service: + port: 9998 + type: ClusterIP +serviceAccount: + annotations: {} + create: true + name: "" +tolerations: [] +topologySpreadConstraints: [] diff --git a/open-webui/templates/NOTES.txt b/open-webui/templates/NOTES.txt new file mode 100644 index 0000000..ec09b78 --- /dev/null +++ b/open-webui/templates/NOTES.txt @@ -0,0 +1,77 @@ +{{- ` +🎉 Welcome to Open WebUI!! + ██████╗ ██████╗ ███████╗███╗ ██╗ ██╗ ██╗███████╗██████╗ ██╗ ██╗██╗ +██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ██║ ██║██╔════╝██╔══██╗██║ ██║██║ +██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ██║ █╗ ██║█████╗ ██████╔╝██║ ██║██║ +██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║███╗██║██╔══╝ ██╔══██╗██║ ██║██║ +╚██████╔╝██║ ███████╗██║ ╚████║ ╚███╔███╔╝███████╗██████╔╝╚██████╔╝██║ + ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚══╝╚══╝ ╚══════╝╚═════╝ ╚═════╝ ╚═╝ +` }} +v{{ .Chart.AppVersion }} - building the best open-source AI user interface. + - Chart Version: v{{ .Chart.Version }} + - Project URL 1: {{ .Chart.Home }} + - Project URL 2: https://github.com/open-webui/open-webui + - Documentation: https://docs.openwebui.com/ + - Chart URL: https://github.com/open-webui/helm-charts + +Open WebUI is a web-based user interface that works with Ollama, OpenAI, Claude 3, Gemini and more. +This interface allows you to easily interact with local AI models. + +1. Deployment Information: + - Chart Name: {{ .Chart.Name }} + - Release Name: {{ .Release.Name }} + - Namespace: {{ .Release.Namespace }} + +2. Access the Application: +{{- if contains "ClusterIP" .Values.service.type }} + Access via ClusterIP service: + + export LOCAL_PORT=8080 + export POD_NAME=$(kubectl get pods -n {{ .Release.Namespace }} -l "app.kubernetes.io/component={{ include "open-webui.name" . }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod -n {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + kubectl -n {{ .Release.Namespace }} port-forward $POD_NAME $LOCAL_PORT:$CONTAINER_PORT + echo "Visit http://127.0.0.1:$LOCAL_PORT to use your application" + + Then, access the application at: http://127.0.0.1:$LOCAL_PORT or http://localhost:8080 + +{{- else if contains "NodePort" .Values.service.type }} + Access via NodePort service: + export NODE_PORT=$(kubectl get -n {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "open-webui.name" . }}) + export NODE_IP=$(kubectl get nodes -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT + +{{- else if contains "LoadBalancer" .Values.service.type }} + Access via LoadBalancer service: + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + NOTE: The external address format depends on your cloud provider: + - AWS: Will return a hostname (e.g., xxx.elb.amazonaws.com) + - GCP/Azure: Will return an IP address + You can watch the status by running: + + kubectl get -n {{ .Release.Namespace }} svc {{ include "open-webui.name" . }} --watch + export EXTERNAL_IP=$(kubectl get -n {{ .Release.Namespace }} svc {{ include "open-webui.name" . }} -o jsonpath="{.status.loadBalancer.ingress[0].hostname:-.status.loadBalancer.ingress[0].ip}") + echo http://$EXTERNAL_IP:{{ .Values.service.port }} +{{- end }} + +{{- if .Values.ingress.enabled }} + + Ingress is enabled. Access the application at: http{{ if .Values.ingress.tls }}s{{ end }}://{{ .Values.ingress.host }} +{{- end }} + +3. Useful Commands: + - Check deployment status: + helm status {{ .Release.Name }} -n {{ .Release.Namespace }} + + - Get detailed information: + helm get all {{ .Release.Name }} -n {{ .Release.Namespace }} + + - View logs: + {{- if .Values.persistence.enabled }} + kubectl logs -f statefulset/{{ include "open-webui.name" . }} -n {{ .Release.Namespace }} + {{- else }} + kubectl logs -f deployment/{{ include "open-webui.name" . }} -n {{ .Release.Namespace }} + {{- end }} + +4. Cleanup: + - Uninstall the deployment: + helm uninstall {{ .Release.Name }} -n {{ .Release.Namespace }} diff --git a/open-webui/templates/_helpers.tpl b/open-webui/templates/_helpers.tpl new file mode 100644 index 0000000..d19bc65 --- /dev/null +++ b/open-webui/templates/_helpers.tpl @@ -0,0 +1,256 @@ +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts +*/}} +{{- define "open-webui.namespace" -}} + {{- if .Values.namespaceOverride -}} + {{- .Values.namespaceOverride -}} + {{- else -}} + {{- .Release.Namespace -}} + {{- end -}} +{{- end -}} + +{{/* +Set the name of the Open WebUI resources +*/}} +{{- define "open-webui.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end -}} + +{{/* +Set the name of the integrated Ollama resources +*/}} +{{- define "ollama.name" -}} +open-webui-ollama +{{- end -}} + +{{/* +Set the name of the integrated Pipelines resources +*/}} +{{- define "pipelines.name" -}} +open-webui-pipelines +{{- end -}} + +{{/* +Constructs a semicolon-separated string of Ollama API endpoint URLs from the ollamaUrls list +defined in the values.yaml file +*/}} +{{- define "ollamaUrls" -}} +{{- if .Values.ollamaUrls }} +{{- join ";" .Values.ollamaUrls | trimSuffix "/" }} +{{- end }} +{{- end }} + +{{/* +Generates the URL for accessing the Ollama service within the Kubernetes cluster when the +ollama.enabled value is set to true, which means that the Ollama Helm chart is being installed +as a dependency of the Open WebUI chart +*/}} +{{- define "ollamaLocalUrl" -}} +{{- if .Values.ollama.enabled -}} +{{- $clusterDomain := .Values.clusterDomain }} +{{- $ollamaServicePort := .Values.ollama.service.port | toString }} +{{- printf "http://%s.%s.svc.%s:%s" (default .Values.ollama.name .Values.ollama.fullnameOverride) (.Release.Namespace) $clusterDomain $ollamaServicePort }} +{{- end }} +{{- end }} + +{{/* +Constructs a string containing the URLs of the Ollama API endpoints that the Open WebUI +application should use based on which values are set for Ollama/ whether the Ollama +subchart is in use +*/}} +{{- define "ollamaBaseUrls" -}} +{{- $ollamaLocalUrl := include "ollamaLocalUrl" . }} +{{- $ollamaUrls := include "ollamaUrls" . }} +{{- if and .Values.ollama.enabled .Values.ollamaUrls }} +{{- printf "%s;%s" $ollamaUrls $ollamaLocalUrl }} +{{- else if .Values.ollama.enabled }} +{{- printf "%s" $ollamaLocalUrl }} +{{- else if .Values.ollamaUrls }} +{{- printf "%s" $ollamaUrls }} +{{- end }} +{{- end }} + +{{/* +Create the chart name and version for the chart label +*/}} +{{- define "chart.name" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create the base labels to include on chart resources +*/}} +{{- define "base.labels" -}} +helm.sh/chart: {{ include "chart.name" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Create selector labels to include on all resources +*/}} +{{- define "base.selectorLabels" -}} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{/* +Create selector labels to include on all Open WebUI resources +*/}} +{{- define "open-webui.selectorLabels" -}} +{{ include "base.selectorLabels" . }} +app.kubernetes.io/component: {{ .Chart.Name }} +{{- end }} + +{{/* +Create labels to include on chart all Open WebUI resources +*/}} +{{- define "open-webui.labels" -}} +{{ include "base.labels" . }} +{{ include "open-webui.selectorLabels" . }} +{{- end }} + +{{/* +Create selector labels to include on chart all Ollama resources +*/}} +{{- define "ollama.selectorLabels" -}} +{{ include "base.selectorLabels" . }} +app.kubernetes.io/component: {{ include "ollama.name" . }} +{{- end }} + +{{/* +Create labels to include on chart all Ollama resources +*/}} +{{- define "ollama.labels" -}} +{{ include "base.labels" . }} +{{ include "ollama.selectorLabels" . }} +{{- end }} + +{{/* +Create selector labels to include on chart all Pipelines resources +*/}} +{{- define "pipelines.selectorLabels" -}} +{{ include "base.selectorLabels" . }} +app.kubernetes.io/component: {{ include "pipelines.name" . }} +{{- end }} + +{{/* +Create labels to include on chart all Pipelines resources +*/}} +{{- define "pipelines.labels" -}} +{{ include "base.labels" . }} +{{ include "pipelines.selectorLabels" . }} +{{- end }} + +{{/* +Create the service endpoint to use for Pipelines if the subchart is used +*/}} +{{- define "pipelines.serviceEndpoint" -}} +{{- if .Values.pipelines.enabled -}} +{{- $clusterDomain := .Values.clusterDomain }} +{{- $pipelinesServicePort := .Values.pipelines.service.port | toString }} +{{- printf "http://%s.%s.svc.%s:%s" (include "pipelines.name" .) (.Release.Namespace) $clusterDomain $pipelinesServicePort }} +{{- end }} +{{- end }} + +{{/* +Create selector labels to include on chart all websocket resources +*/}} +{{- define "websocket.redis.selectorLabels" -}} +{{ include "base.selectorLabels" . }} +app.kubernetes.io/component: {{ .Values.websocket.redis.name }} +{{- end }} + +{{/* +Create labels to include on chart all websocket resources +*/}} +{{- define "websocket.redis.labels" -}} +{{ include "base.labels" . }} +{{ include "websocket.redis.selectorLabels" . }} +{{- end }} + +{{/* +Validate SSO ClientSecret to be set literally or via Secret +*/}} +{{- define "sso.validateClientSecret" -}} +{{- $provider := .provider }} +{{- $values := .values }} +{{- if and (empty (index $values $provider "clientSecret")) (empty (index $values $provider "clientExistingSecret")) }} + {{- fail (printf "You must provide either .Values.sso.%s.clientSecret or .Values.sso.%s.clientExistingSecret" $provider $provider) }} +{{- end }} +{{- end }} + +{{- /* +Fail template rendering if invalid log component +*/ -}} +{{- define "logging.isValidComponent" -}} + {{- $component := . | lower -}} + {{- $validComponents := dict + "audio" true + "comfyui" true + "config" true + "db" true + "images" true + "main" true + "models" true + "ollama" true + "openai" true + "rag" true + "webhook" true + -}} + {{- hasKey $validComponents $component -}} +{{- end }} + + +{{- define "logging.assertValidComponent" -}} + {{- $component := lower . -}} + {{- $res := include "logging.isValidComponent" $component }} + {{- if ne $res "true" }} + {{- fail (printf "Invalid logging component name: '%s'. Valid names: audio, comfyui, config, db, images, main, models, ollama, openai, rag, webhook" $component) }} + {{- end }} +{{- end }} + +{{- /* +Fail template rendering if invalid log level +*/ -}} +{{- define "logging.assertValidLevel" -}} + {{- $level := lower . }} + {{- $validLevels := dict "notset" true "debug" true "info" true "warning" true "error" true "critical" true }} + {{- if not (hasKey $validLevels $level) }} + {{- fail (printf "Invalid log level: '%s'. Valid values are: notset, debug, info, warning, error, critical" $level) }} + {{- end }} +{{- end }} + +{{- /* +Render a logging env var for a component, validating value +*/ -}} +{{- define "logging.componentEnvVar" -}} + {{- $name := .componentName }} + {{- $level := .logLevel }} +{{- include "logging.assertValidComponent" $name -}} +{{- include "logging.assertValidLevel" $level }} +- name: {{ printf "%s_LOG_LEVEL" (upper $name) | quote }} + value: {{ $level | quote | trim }} +{{- end }} + +{{- /* +Constructs a string containing the URLs of the Open WebUI based on the ingress configuration +used to populate the variable WEBUI_URL +*/ -}} +{{- define "open-webui.url" -}} + {{- $url := "" -}} + {{- range .Values.extraEnvVars }} + {{- if and (eq .name "WEBUI_URL") .value }} + {{- $url = .value }} + {{- end }} + {{- end }} + {{- if not $url }} + {{- $proto := "http" -}} + {{- if .Values.ingress.tls }} + {{- $proto = "https" -}} + {{- end }} + {{- $url = printf "%s://%s" $proto .Values.ingress.host }} + {{- end }} + {{- $url }} +{{- end }} diff --git a/open-webui/templates/extra-resources.yaml b/open-webui/templates/extra-resources.yaml new file mode 100644 index 0000000..5124a0b --- /dev/null +++ b/open-webui/templates/extra-resources.yaml @@ -0,0 +1,6 @@ +{{- if .Values.extraResources }} +{{- range .Values.extraResources }} +--- +{{ toYaml . | nindent 0 }} +{{- end }} +{{- end }} diff --git a/open-webui/templates/ingress.yaml b/open-webui/templates/ingress.yaml new file mode 100644 index 0000000..fd76b6f --- /dev/null +++ b/open-webui/templates/ingress.yaml @@ -0,0 +1,52 @@ +{{- if .Values.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "open-webui.name" . }} + namespace: {{ include "open-webui.namespace" . }} + labels: + {{- include "open-webui.labels" . | nindent 4 }} + {{- with .Values.ingress.extraLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if .Values.ingress.annotations }} + annotations: + {{- tpl (toYaml .Values.ingress.annotations | nindent 4) . }} + {{- end }} +spec: + {{- with .Values.ingress.class }} + ingressClassName: {{ . }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + - hosts: + - {{ .Values.ingress.host | quote }} + {{- range .Values.ingress.additionalHosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ default (printf "%s-tls" .Release.Name) .Values.ingress.existingSecret }} + {{- end }} + rules: + - host: {{ .Values.ingress.host }} + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: {{ include "open-webui.name" . }} + port: + name: http + {{- range .Values.ingress.additionalHosts }} + - host: {{ . | quote }} + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: {{ include "open-webui.name" $ }} + port: + name: http + {{- end }} +{{- end }} diff --git a/open-webui/templates/managed-cert.yaml b/open-webui/templates/managed-cert.yaml new file mode 100644 index 0000000..a4ade9e --- /dev/null +++ b/open-webui/templates/managed-cert.yaml @@ -0,0 +1,11 @@ +{{- if .Values.managedCertificate.enabled }} +apiVersion: networking.gke.io/v1 +kind: ManagedCertificate +metadata: + name: {{ .Values.managedCertificate.name | default "mydomain-cert" }} +spec: + domains: + {{- range .Values.managedCertificate.domains }} + - {{ . | quote }} + {{- end }} +{{- end }} diff --git a/open-webui/templates/pvc.yaml b/open-webui/templates/pvc.yaml new file mode 100644 index 0000000..4df3f27 --- /dev/null +++ b/open-webui/templates/pvc.yaml @@ -0,0 +1,28 @@ +{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.persistence.provider "local") }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "open-webui.name" . }} + namespace: {{ include "open-webui.namespace" . }} + labels: + {{- include "open-webui.selectorLabels" . | nindent 4 }} + {{- with .Values.persistence.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} +spec: + accessModes: + {{- range .Values.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.persistence.size }} + {{- if .Values.persistence.storageClass }} + storageClassName: {{ .Values.persistence.storageClass }} + {{- end }} + {{- with .Values.persistence.selector }} + selector: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/open-webui/templates/service-account.yaml b/open-webui/templates/service-account.yaml new file mode 100644 index 0000000..ecea069 --- /dev/null +++ b/open-webui/templates/service-account.yaml @@ -0,0 +1,14 @@ +{{- if .Values.serviceAccount.enable }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name | default (include "open-webui.name" .) }} + namespace: {{ include "open-webui.namespace" . }} + labels: + {{- include "open-webui.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} \ No newline at end of file diff --git a/open-webui/templates/service.yaml b/open-webui/templates/service.yaml new file mode 100644 index 0000000..bce51b6 --- /dev/null +++ b/open-webui/templates/service.yaml @@ -0,0 +1,36 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "open-webui.name" . }} + namespace: {{ include "open-webui.namespace" . }} + labels: + {{- include "open-webui.labels" . | nindent 4 }} + {{- with .Values.service.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + selector: + {{- include "open-webui.selectorLabels" . | nindent 4 }} + type: {{ .Values.service.type | default "ClusterIP" }} + ports: + - protocol: TCP + name: http + port: {{ .Values.service.port }} + targetPort: http + {{- if .Values.service.nodePort }} + nodePort: {{ .Values.service.nodePort | int }} + {{- end }} + {{- if .Values.service.loadBalancerClass }} + loadBalancerClass: {{ .Values.service.loadBalancerClass | quote }} + {{- end }} + {{- if and (eq .Values.service.type "ClusterIP") (.Values.service.clusterIP) }} + clusterIP: {{ .Values.service.clusterIP }} + {{- end }} + {{- if and (eq .Values.service.type "LoadBalancer") (.Values.service.loadBalancerIP) }} + loadBalancerIP: {{ .Values.service.loadBalancerIP }} + {{- end }} + diff --git a/open-webui/templates/websocket-redis.yaml b/open-webui/templates/websocket-redis.yaml new file mode 100644 index 0000000..7fdc05c --- /dev/null +++ b/open-webui/templates/websocket-redis.yaml @@ -0,0 +1,98 @@ +{{- if and .Values.websocket.enabled .Values.websocket.redis.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Values.websocket.redis.name }} + namespace: {{ include "open-webui.namespace" . }} + labels: + {{- include "websocket.redis.labels" . | nindent 4 }} + {{- with .Values.websocket.redis.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + annotations: + {{- with .Values.websocket.redis.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + selector: + matchLabels: + {{- include "websocket.redis.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "websocket.redis.labels" . | nindent 8 }} + {{- with .Values.websocket.redis.pods.labels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + {{- with .Values.websocket.redis.pods.annotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- if .Values.websocket.redis.image.pullSecretName }} + imagePullSecrets: + - name: {{ .Values.websocket.redis.image.pullSecretName }} + {{- end }} + containers: + - name: {{ .Values.websocket.redis.name }} + image: "{{ .Values.websocket.redis.image.repository }}:{{ .Values.websocket.redis.image.tag }}" + imagePullPolicy: {{ .Values.websocket.redis.image.pullPolicy }} + {{- with .Values.websocket.redis.command }} + command: + {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.websocket.redis.args }} + args: + {{- toYaml . | nindent 10 }} + {{- end }} + ports: + - name: http + containerPort: {{ .Values.websocket.redis.service.containerPort }} + {{- with .Values.websocket.redis.resources }} + resources: + {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.websocket.redis.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.websocket.redis.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.websocket.redis.securityContext }} + securityContext: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.websocket.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.websocket.redis.name }} + namespace: {{ include "open-webui.namespace" . }} + labels: + {{- include "websocket.redis.labels" . | nindent 4 }} + {{- with .Values.websocket.redis.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + annotations: + {{- with .Values.websocket.redis.service.annotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + selector: + {{- include "websocket.redis.selectorLabels" . | nindent 4 }} + type: {{ .Values.websocket.redis.service.type | default "ClusterIP" }} + ports: + - protocol: TCP + name: {{ .Values.websocket.redis.service.portName | default "http" }} + port: {{ .Values.websocket.redis.service.port }} + targetPort: http + {{- if .Values.websocket.redis.service.nodePort }} + nodePort: {{ .Values.websocket.redis.service.nodePort | int }} + {{- end }} +{{- end }} diff --git a/open-webui/templates/workload-manager.yaml b/open-webui/templates/workload-manager.yaml new file mode 100644 index 0000000..3834d4d --- /dev/null +++ b/open-webui/templates/workload-manager.yaml @@ -0,0 +1,418 @@ +apiVersion: apps/v1 +{{- if and .Values.persistence.enabled (eq .Values.persistence.provider "local") }} +kind: StatefulSet +{{- else }} +kind: Deployment +{{- end }} +metadata: + name: {{ include "open-webui.name" . }} + namespace: {{ include "open-webui.namespace" . }} + labels: + {{- include "open-webui.labels" . | nindent 4 }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.replicaCount }} + {{- if or (not .Values.persistence.enabled) (not (eq .Values.persistence.provider "local")) }} + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + {{- end }} + {{- if and .Values.persistence.enabled (eq .Values.persistence.provider "local") }} + serviceName: {{ include "open-webui.name" . }} + {{- end }} + selector: + matchLabels: + {{- include "open-webui.selectorLabels" . | nindent 6 }} + {{- if .Values.strategy }} + {{- if and .Values.persistence.enabled (eq .Values.persistence.provider "local") }} + updateStrategy: + {{- toYaml .Values.strategy | nindent 4 }} + {{- else }} + strategy: + {{- toYaml .Values.strategy | nindent 4 }} + {{- end }} + {{- end }} + template: + metadata: + labels: + {{- include "open-webui.labels" . | nindent 8 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.priorityClassName }} + priorityClassName: {{ . }} + {{- end }} + initContainers: + - name: copy-app-data + {{- with .Values.image }} + image: {{ .repository }}:{{ .tag | default $.Chart.AppVersion }} + imagePullPolicy: {{ .pullPolicy }} + {{- end }} + command: + {{- toYaml (.Values.copyAppData.command | default (list "sh" "-c" "cp -R -n /app/backend/data/* /tmp/app-data/")) | nindent 10 }} + {{- with .Values.copyAppData.args }} + args: + {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.containerSecurityContext }} + securityContext: + {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.copyAppData.resources }} + resources: {{- toYaml . | nindent 10 }} + {{- end }} + volumeMounts: + - name: data + mountPath: /tmp/app-data + {{- if .Values.persistence.subPath }} + subPath: {{ .Values.persistence.subPath }} + {{- end }} + {{- with .Values.volumeMounts.initContainer }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.extraInitContainers }} + {{- toYaml . | nindent 6 }} + {{- end }} + enableServiceLinks: false + automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} + {{- if .Values.runtimeClassName }} + runtimeClassName: {{ .Values.runtimeClassName | quote }} + {{- end }} + {{- if .Values.serviceAccount.enable }} + serviceAccountName: {{ .Values.serviceAccount.name | default (include "open-webui.name" .) }} + {{- end }} + {{- with .Values.podSecurityContext }} + securityContext: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }} + {{- with .Values.image }} + image: {{ .repository }}:{{ .tag | default $.Chart.AppVersion }} + imagePullPolicy: {{ .pullPolicy }} + {{- end }} + {{- with .Values.command }} + command: + {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.args }} + args: + {{- toYaml . | nindent 10 }} + {{- end }} + ports: + - name: http + containerPort: {{ .Values.service.containerPort }} + {{- with .Values.livenessProbe }} + livenessProbe: {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.readinessProbe }} + readinessProbe: {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.startupProbe }} + startupProbe: {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.resources }} + resources: {{- toYaml . | nindent 10 }} + {{- end }} + {{- with .Values.containerSecurityContext }} + securityContext: + {{- toYaml . | nindent 10 }} + {{- end }} + volumeMounts: + - name: data + mountPath: /app/backend/data + {{- if .Values.persistence.subPath }} + subPath: {{ .Values.persistence.subPath }} + {{- end }} + {{- with .Values.volumeMounts.container }} + {{- toYaml . | nindent 8 }} + {{- end }} + env: + {{- $hasCustomWebUIUrl := false }} + {{- range .Values.extraEnvVars }} + {{- if eq .name "WEBUI_URL" }} + {{- $hasCustomWebUIUrl = true }} + {{- end }} + {{- end }} + {{- if and .Values.ingress.enabled (not $hasCustomWebUIUrl) }} + - name: WEBUI_URL + value: {{ include "open-webui.url" . | quote }} + {{- end }} + {{- if .Values.ollamaUrlsFromExtraEnv}} + {{- else if or .Values.ollamaUrls .Values.ollama.enabled }} + - name: "OLLAMA_BASE_URLS" + value: {{ include "ollamaBaseUrls" . | quote }} + {{- else }} + - name: "ENABLE_OLLAMA_API" + value: "False" + {{- end }} + {{- if and .Values.enableOpenaiApi .Values.openaiBaseApiUrl (not .Values.openaiBaseApiUrls) (not .Values.pipelines.enabled) }} + # If only an OpenAI API value is set, set it to OPENAI_API_BASE_URL + - name: "OPENAI_API_BASE_URL" + value: {{ .Values.openaiBaseApiUrl | quote }} + {{- else if and .Values.enableOpenaiApi .Values.openaiBaseApiUrl .Values.pipelines.enabled (not .Values.openaiBaseApiUrls) }} + # If Pipelines is enabled and OpenAI API value is set, use OPENAI_API_BASE_URLS with combined values + - name: "OPENAI_API_BASE_URLS" + value: "{{ include "pipelines.serviceEndpoint" . }};{{ .Values.openaiBaseApiUrl }}" + {{- else if and .Values.enableOpenaiApi .Values.pipelines.enabled (not .Values.openaiBaseApiUrl) (not .Values.openaiBaseApiUrls) }} + # If Pipelines is enabled and no OpenAI API values are set, set OPENAI_API_BASE_URL to the Pipelines server endpoint + - name: "OPENAI_API_BASE_URL" + value: {{ include "pipelines.serviceEndpoint" . | quote }} + {{- else if and .Values.enableOpenaiApi .Values.openaiBaseApiUrls .Values.pipelines.enabled }} + # If OpenAI API value(s) set and Pipelines is enabled, use OPENAI_API_BASE_URLS to support all the endpoints in the chart + - name: "OPENAI_API_BASE_URLS" + value: "{{ include "pipelines.serviceEndpoint" . }};{{ join ";" .Values.openaiBaseApiUrls }}" + {{- else if not .Values.enableOpenaiApi }} + - name: "ENABLE_OPENAI_API" + value: "False" + {{- end }} + {{- if .Values.tika.enabled }} + - name: "CONTENT_EXTRACTION_ENGINE" + value: "Tika" + - name: "TIKA_SERVER_URL" + value: http://{{ .Chart.Name }}-tika:9998 + {{- end }} + {{- if eq .Values.persistence.provider "s3" }} + - name: "STORAGE_PROVIDER" + value: {{ .Values.persistence.provider }} + - name: "S3_ACCESS_KEY_ID" + {{- if .Values.persistence.s3.accessKeyExistingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.persistence.s3.accessKeyExistingSecret }} + key: {{ .Values.persistence.s3.accessKeyExistingAccessKey }} + {{- else }} + value: {{ .Values.persistence.s3.accessKey }} + {{- end }} + - name: "S3_SECRET_ACCESS_KEY" + {{- if .Values.persistence.s3.secretKeyExistingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.persistence.s3.secretKeyExistingSecret }} + key: {{ .Values.persistence.s3.secretKeyExistingSecretKey }} + {{- else }} + value: {{ .Values.persistence.s3.secretKey }} + {{- end }} + - name: "S3_ENDPOINT_URL" + value: {{ .Values.persistence.s3.endpointUrl }} + - name: "S3_BUCKET_NAME" + value: {{ .Values.persistence.s3.bucket }} + - name: "S3_REGION_NAME" + value: {{ .Values.persistence.s3.region }} + - name: "S3_KEY_PREFIX" + value: {{ .Values.persistence.s3.keyPrefix }} + {{- else if eq .Values.persistence.provider "gcs" }} + - name: "STORAGE_PROVIDER" + value: {{ .Values.persistence.provider }} + - name: "GOOGLE_APPLICATION_CREDENTIALS_JSON" + {{- if .Values.persistence.gcs.appCredentialsJsonExistingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.persistence.gcs.appCredentialsJsonExistingSecret }} + key: {{ .Values.persistence.gcs.appCredentialsJsonExistingSecretKey }} + {{- else }} + value: {{ .Values.persistence.gcs.appCredentialsJson }} + {{- end }} + - name: "GCS_BUCKET_NAME" + value: {{ .Values.persistence.gcs.bucket }} + {{- else if eq .Values.persistence.provider "azure" }} + - name: "STORAGE_PROVIDER" + value: {{ .Values.persistence.provider }} + - name: "AZURE_STORAGE_ENDPOINT" + value: {{ .Values.persistence.azure.endpointUrl }} + - name: "AZURE_STORAGE_CONTAINER_NAME" + value: {{ .Values.persistence.azure.container }} + - name: "AZURE_STORAGE_KEY" + {{- if .Values.persistence.azure.keyExistingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.persistence.azure.keyExistingSecret }} + key: {{ .Values.persistence.azure.keyExistingSecretKey }} + {{- else }} + value: {{ .Values.persistence.azure.key }} + {{- end }} + {{- end }} + {{- if .Values.websocket.enabled }} + - name: "ENABLE_WEBSOCKET_SUPPORT" + value: "True" + - name: "WEBSOCKET_MANAGER" + value: {{ .Values.websocket.manager | default "redis" | quote }} + - name: "WEBSOCKET_REDIS_URL" + value: {{ .Values.websocket.url | quote }} + {{- end }} + {{- if .Values.databaseUrl }} + - name: "DATABASE_URL" + value: {{ .Values.databaseUrl | quote }} + {{- end }} + {{- if .Values.sso.enabled }} + {{- if .Values.sso.enableSignup }} + - name: "ENABLE_OAUTH_SIGNUP" + value: "True" + {{- end }} + {{- if .Values.sso.mergeAccountsByEmail }} + - name: "OAUTH_MERGE_ACCOUNTS_BY_EMAIL" + value: "True" + {{- end }} + {{- if .Values.sso.google.enabled }} + - name: "GOOGLE_CLIENT_ID" + value: {{ .Values.sso.google.clientId | quote }} + {{- include "sso.validateClientSecret" (dict "provider" "google" "values" .Values.sso) }} + - name: "GOOGLE_CLIENT_SECRET" + {{- if .Values.sso.google.clientExistingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.sso.google.clientExistingSecret | quote }} + key: {{ .Values.sso.google.clientExistingSecretKey | quote }} + {{- else }} + value: {{ .Values.sso.google.clientSecret | quote }} + {{- end }} + {{- end }} + {{- if .Values.sso.microsoft.enabled }} + - name: "MICROSOFT_CLIENT_ID" + value: {{ .Values.sso.microsoft.clientId | quote }} + {{- include "sso.validateClientSecret" (dict "provider" "microsoft" "values" .Values.sso) }} + - name: "MICROSOFT_CLIENT_SECRET" + {{- if .Values.sso.microsoft.clientExistingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.sso.microsoft.clientExistingSecret | quote }} + key: {{ .Values.sso.microsoft.clientExistingSecretKey | quote }} + {{- else }} + value: {{ .Values.sso.microsoft.clientSecret | quote }} + {{- end }} + - name: "MICROSOFT_CLIENT_TENANT_ID" + value: {{ .Values.sso.microsoft.tenantId | quote }} + {{- end }} + {{- if .Values.sso.github.enabled }} + - name: "GITHUB_CLIENT_ID" + value: {{ .Values.sso.github.clientId | quote }} + {{- include "sso.validateClientSecret" (dict "provider" "github" "values" .Values.sso) }} + - name: "GITHUB_CLIENT_SECRET" + {{- if .Values.sso.github.clientExistingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.sso.github.clientExistingSecret | quote }} + key: {{ .Values.sso.github.clientExistingSecretKey | quote }} + {{- else }} + value: {{ .Values.sso.github.clientSecret | quote }} + {{- end }} + {{- end }} + {{- if .Values.sso.oidc.enabled }} + - name: "OAUTH_CLIENT_ID" + value: {{ .Values.sso.oidc.clientId | quote }} + {{- include "sso.validateClientSecret" (dict "provider" "oidc" "values" .Values.sso) }} + - name: "OAUTH_CLIENT_SECRET" + {{- if .Values.sso.oidc.clientExistingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.sso.oidc.clientExistingSecret | quote }} + key: {{ .Values.sso.oidc.clientExistingSecretKey | quote }} + {{- else }} + value: {{ .Values.sso.oidc.clientSecret | quote }} + {{- end }} + - name: "OPENID_PROVIDER_URL" + value: {{ .Values.sso.oidc.providerUrl | quote }} + - name: "OAUTH_PROVIDER_NAME" + value: {{ .Values.sso.oidc.providerName | quote }} + - name: "OAUTH_SCOPES" + value: {{ .Values.sso.oidc.scopes | quote }} + {{- end }} + {{- if .Values.sso.enableRoleManagement }} + - name: "ENABLE_OAUTH_ROLE_MANAGEMENT" + value: "True" + - name: "OAUTH_ROLES_CLAIM" + value: {{ .Values.sso.roleManagement.rolesClaim | quote }} + {{- if .Values.sso.roleManagement.allowedRoles }} + - name: "OAUTH_ALLOWED_ROLES" + value: {{ .Values.sso.roleManagement.allowedRoles | quote }} + {{- end }} + {{- if .Values.sso.roleManagement.adminRoles }} + - name: "OAUTH_ADMIN_ROLES" + value: {{ .Values.sso.roleManagement.adminRoles | quote }} + {{- end }} + {{- end }} + {{- if .Values.sso.enableGroupManagement }} + - name: "ENABLE_OAUTH_GROUP_MANAGEMENT" + value: "True" + - name: "OAUTH_GROUP_CLAIM" + value: {{ .Values.sso.groupManagement.groupsClaim | quote }} + {{- end }} + {{- if .Values.sso.trustedHeader.enabled }} + - name: "WEBUI_AUTH_TRUSTED_EMAIL_HEADER" + value: {{ .Values.sso.trustedHeader.emailHeader | quote }} + {{- if .Values.sso.trustedHeader.nameHeader }} + - name: "WEBUI_AUTH_TRUSTED_NAME_HEADER" + value: {{ .Values.sso.trustedHeader.nameHeader | quote }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.logging.level }} + {{- include "logging.assertValidLevel" .Values.logging.level }} + - name: "GLOBAL_LOG_LEVEL" + value: {{ .Values.logging.level | quote }} + {{- end }} + + {{- if .Values.logging.components }} + {{- range $name, $level := .Values.logging.components }} + {{- if $level }} + {{- include "logging.componentEnvVar" (dict "componentName" $name "logLevel" $level) | indent 8 }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.extraEnvVars }} + {{- toYaml .Values.extraEnvVars | nindent 8 }} + {{- end }} + {{- if .Values.commonEnvVars }} + {{- toYaml .Values.commonEnvVars | nindent 8 }} + {{- end }} + {{- if .Values.extraEnvFrom }} + envFrom: + {{- toYaml .Values.extraEnvFrom | nindent 8 }} + {{- end }} + tty: true + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.hostAliases }} + hostAliases: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + {{- if and .Values.persistence.enabled .Values.persistence.existingClaim }} + - name: data + persistentVolumeClaim: + claimName: {{ .Values.persistence.existingClaim }} + {{- else if or (not .Values.persistence.enabled) (not (eq .Values.persistence.provider "local")) }} + - name: data + emptyDir: {} + {{- else if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }} + - name: data + persistentVolumeClaim: + claimName: {{ include "open-webui.name" . }} + {{- end }} + {{- with .Values.volumes }} + {{- toYaml . | nindent 6 }} + {{- end }} diff --git a/open-webui/values-gke-min.yaml b/open-webui/values-gke-min.yaml new file mode 100644 index 0000000..e000020 --- /dev/null +++ b/open-webui/values-gke-min.yaml @@ -0,0 +1,276 @@ +nameOverride: "" +namespaceOverride: "" + +ollama: + # -- Automatically install Ollama Helm chart from https://otwld.github.io/ollama-helm/. Use [Helm Values](https://github.com/otwld/ollama-helm/#helm-values) to configure + enabled: false + # -- If enabling embedded Ollama, update fullnameOverride to your desired Ollama name value, or else it will use the default ollama.name value from the Ollama chart + fullnameOverride: "open-webui-ollama" + # -- Example Ollama configuration with nvidia GPU enabled, automatically downloading a model, and deploying a PVC for model persistence + # ollama: + # gpu: + # enabled: true + # type: 'nvidia' + # number: 1 + # models: + # - llama3 + # runtimeClassName: nvidia + # persistentVolume: + # enabled: true + # volumeName: "example-pre-existing-pv-created-by-smb-csi" + +pipelines: + # -- Automatically install Pipelines chart to extend Open WebUI functionality using Pipelines: https://github.com/open-webui/pipelines + enabled: false + # -- This section can be used to pass required environment variables to your pipelines (e.g. Langfuse hostname) + extraEnvVars: [] + +tika: + # -- Automatically install Apache Tika to extend Open WebUI + enabled: false + +# -- A list of Ollama API endpoints. These can be added in lieu of automatically installing the Ollama Helm chart, or in addition to it. +ollamaUrls: [] + +websocket: + # -- Enables websocket support in Open WebUI with env `ENABLE_WEBSOCKET_SUPPORT` + enabled: false + # -- Specifies the websocket manager to use with env `WEBSOCKET_MANAGER`: redis (default) + manager: redis + # -- Specifies the URL of the Redis instance for websocket communication. Template with `redis://[:@]:/` + url: redis://open-webui-redis:6379/0 + # -- Deploys a redis + redis: + # -- Enable redis installation + enabled: true + # -- Redis name + name: open-webui-redis + # -- Redis labels + labels: {} + # -- Redis annotations + annotations: {} + # -- Redis image + image: + repository: redis + tag: 7.4.2-alpine3.21 + pullPolicy: IfNotPresent + # -- Redis command (overrides default) + command: [] + # -- Redis arguments (overrides default) + args: [] + # -- Redis resources + resources: {} + # -- Redis service + service: + # -- Redis container/target port + containerPort: 6379 + # -- Redis service type + type: ClusterIP + # -- Redis service labels + labels: {} + # -- Redis service annotations + annotations: {} + # -- Redis service port name. Istio needs this to be something like `tcp-redis` + portName: http + # -- Redis service port + port: 6379 + # -- Redis service node port. Valid only when type is `NodePort` + nodePort: "" + +# -- Value of cluster domain +clusterDomain: cluster.local + +annotations: {} +podAnnotations: {} +podLabels: {} +replicaCount: 1 +# -- Strategy for updating the workload manager: deployment or statefulset +strategy: {} +# -- Open WebUI image tags can be found here: https://github.com/open-webui/open-webui +image: + repository: ghcr.io/open-webui/open-webui + tag: "" + pullPolicy: "IfNotPresent" + +serviceAccount: + enable: true + name: "" + annotations: {} + automountServiceAccountToken: false + +# -- Configure imagePullSecrets to use private registry +# ref: +imagePullSecrets: [] +# imagePullSecrets: +# - name: myRegistryKeySecretName + +# -- Probe for liveness of the Open WebUI container +# ref: +livenessProbe: {} +# livenessProbe: +# httpGet: +# path: /health +# port: http +# failureThreshold: 1 +# periodSeconds: 10 + +# -- Probe for readiness of the Open WebUI container +# ref: +readinessProbe: {} +# readinessProbe: +# httpGet: +# path: /health/db +# port: http +# failureThreshold: 1 +# periodSeconds: 10 + +# -- Probe for startup of the Open WebUI container +# ref: +startupProbe: {} +# startupProbe: +# httpGet: +# path: /health +# port: http +# initialDelaySeconds: 30 +# periodSeconds: 5 +# failureThreshold: 20 + +resources: {} + +copyAppData: + resources: {} + +managedCertificate: + enabled: true + name: "mydomain-chat-cert" # You can override this name if needed + domains: + - chat.example.com # update to your real domain + +ingress: + enabled: true + class: "" + # -- Use appropriate annotations for your Ingress controller, e.g., for NGINX: + annotations: + # Example for GKE Ingress + kubernetes.io/ingress.class: "gce" + kubernetes.io/ingress.global-static-ip-name: "open-webui-external-ip" # you need to create this address in GCP console + # Force HTTP to redirect to HTTPS + nginx.ingress.kubernetes.io/force-ssl-redirect: "true" + nginx.ingress.kubernetes.io/ssl-redirect: "true" + nginx.ingress.kubernetes.io/permanent-redirect: "https://chat.example.com" + networking.gke.io/managed-certificates: "mydomain-chat-cert" + # nginx.ingress.kubernetes.io/rewrite-target: / + host: "chat.example.com" # update to your real domain + additionalHosts: [] + tls: false + existingSecret: "" +persistence: + enabled: true + size: 2Gi + # -- Use existingClaim if you want to re-use an existing Open WebUI PVC instead of creating a new one + existingClaim: "" + # -- Subdirectory of Open WebUI PVC to mount. Useful if root directory is not empty. + subPath: "" + # -- If using multiple replicas, you must update accessModes to ReadWriteMany + accessModes: + - ReadWriteOnce + storageClass: "" + selector: {} + annotations: {} + +# -- Node labels for pod assignment. +nodeSelector: {} + +# -- Tolerations for pod assignment +tolerations: [] + +# -- Affinity for pod assignment +affinity: {} + +# -- Topology Spread Constraints for pod assignment +topologySpreadConstraints: [] + +# -- Service values to expose Open WebUI pods to cluster +service: + type: LoadBalancer # changed from ClusterIP to LoadBalancer for external access on GKE + annotations: {} + port: 80 + containerPort: 8080 + nodePort: "" + labels: {} + loadBalancerClass: "" + +# -- OpenAI base API URL to use. Defaults to the Pipelines service endpoint when Pipelines are enabled, and "https://api.openai.com/v1" if Pipelines are not enabled and this value is blank +openaiBaseApiUrl: "" + +# -- Env vars added to the Open WebUI deployment. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/ +extraEnvVars: + # -- Default API key value for Pipelines. Should be updated in a production deployment, or be changed to the required API key if not using Pipelines + - name: OPENAI_API_KEY + value: "0p3n-w3bu!" + # valueFrom: + # secretKeyRef: + # name: pipelines-api-key + # key: api-key + # - name: OPENAI_API_KEY + # valueFrom: + # secretKeyRef: + # name: openai-api-key + # key: api-key + # - name: OLLAMA_DEBUG + # value: "1" + +# -- Configure container volume mounts +# ref: +volumeMounts: + initContainer: [] + # - name: "" + # mountPath: "" + container: [] + # - name: "" + # mountPath: "" + +# -- Configure pod volumes +# ref: +volumes: [] +# - name: "" +# configMap: +# name: "" +# - name: "" +# emptyDir: {} + +# -- Configure pod security context +# ref: +podSecurityContext: + {} + # fsGroupChangePolicy: Always + # sysctls: [] + # supplementalGroups: [] + # fsGroup: 1001 + + +# -- Configure container security context +# ref: +containerSecurityContext: + {} + # runAsUser: 1001 + # runAsGroup: 1001 + # runAsNonRoot: true + # privileged: false + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: false + # capabilities: + # drop: + # - ALL + # seccompProfile: + # type: "RuntimeDefault" + +# -- Extra resources to deploy with Open WebUI +extraResources: + [] + # - apiVersion: v1 + # kind: ConfigMap + # metadata: + # name: example-configmap + # data: + # example-key: example-value diff --git a/open-webui/values.schema.json b/open-webui/values.schema.json new file mode 100644 index 0000000..f7e872d --- /dev/null +++ b/open-webui/values.schema.json @@ -0,0 +1,118 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Open WebUI Helm Chart Values Schema", + "type": "object", + "properties": { + "image": { + "type": "object", + "properties": { + "repository": { + "type": "string", + "default": "ghcr.io/open-webui/open-webui" + }, + "tag": { + "type": "string", + "default": "main" + }, + "pullPolicy": { + "type": "string", + "enum": ["Always", "IfNotPresent", "Never"], + "default": "IfNotPresent" + } + } + }, + "openaiBaseApiUrl": { + "type": "string", + "default": "https://api.openai.com/v1" + }, + "replicaCount": { + "type": "integer", + "minimum": 0, + "default": 1 + }, + "service": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["ClusterIP", "NodePort", "LoadBalancer", "ExternalName"], + "default": "LoadBalancer" + }, + "port": { + "type": "integer", + "default": 80 + }, + "containerPort": { + "type": "integer", + "default": 8080 + } + } + }, + "persistence": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true + }, + "size": { + "type": "string", + "default": "2Gi" + }, + "storageClass": { + "type": "string", + "default": "" + } + } + }, + "ingress": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "host": { + "type": "string", + "default": "chat.example.com" + }, + "annotations": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "default": {} + } + } + }, + "extraEnvVars": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "valueFrom": { + "type": "object" + } + } + }, + "default": [] + }, + "resources": { + "type": "object", + "default": {} + }, + "ollamaUrls": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + } +} diff --git a/open-webui/values.yaml b/open-webui/values.yaml new file mode 100644 index 0000000..1c5e218 --- /dev/null +++ b/open-webui/values.yaml @@ -0,0 +1,590 @@ +nameOverride: "" +namespaceOverride: "" +ollama: + # -- Automatically install Ollama Helm chart from https://otwld.github.io/ollama-helm/. Use [Helm Values](https://github.com/otwld/ollama-helm/#helm-values) to configure + enabled: false + # -- If enabling embedded Ollama, update fullnameOverride to your desired Ollama name value, or else it will use the default ollama.name value from the Ollama chart + fullnameOverride: "open-webui-ollama" + # -- Example Ollama configuration with nvidia GPU enabled, automatically downloading a model, and deploying a PVC for model persistence + # ollama: + # gpu: + # enabled: true + # type: 'nvidia' + # number: 1 + # models: + # pull: + # - llama3 + # run: + # - llama3 + # runtimeClassName: nvidia + # persistentVolume: + # enabled: true + # volumeName: "example-pre-existing-pv-created-by-smb-csi" + +pipelines: + # -- Automatically install Pipelines chart to extend Open WebUI functionality using Pipelines: https://github.com/open-webui/pipelines + enabled: true + # -- This section can be used to pass required environment variables to your pipelines (e.g. Langfuse hostname) + extraEnvVars: [] + +tika: + # -- Automatically install Apache Tika to extend Open WebUI + enabled: false + +# -- A list of Ollama API endpoints. These can be added in lieu of automatically installing the Ollama Helm chart, or in addition to it. +ollamaUrls: [] + +# -- Disables taking Ollama Urls from `ollamaUrls` list +ollamaUrlsFromExtraEnv: false + +websocket: + # -- Enables websocket support in Open WebUI with env `ENABLE_WEBSOCKET_SUPPORT` + enabled: false + # -- Specifies the websocket manager to use with env `WEBSOCKET_MANAGER`: redis (default) + manager: redis + # -- Specifies the URL of the Redis instance for websocket communication. Template with `redis://[:@]:/` + url: redis://open-webui-redis:6379/0 + # -- Node selector for websocket pods + nodeSelector: {} + # -- Deploys a redis + redis: + # -- Enable redis installation + enabled: true + # -- Redis name + name: open-webui-redis + # -- Redis labels + labels: {} + # -- Redis annotations + annotations: {} + # -- Redis pod + pods: + # -- Redis pod labels + labels: {} + # -- Redis pod annotations + annotations: {} + # -- Redis image + image: + repository: redis + tag: 7.4.2-alpine3.21 + pullPolicy: IfNotPresent + # -- Redis command (overrides default) + command: [] + # -- Redis arguments (overrides default) + args: [] + # -- Redis resources + resources: {} + # -- Redis service + service: + # -- Redis container/target port + containerPort: 6379 + # -- Redis service type + type: ClusterIP + # -- Redis service labels + labels: {} + # -- Redis service annotations + annotations: {} + # -- Redis service port name. Istio needs this to be something like `tcp-redis` + portName: http + # -- Redis service port + port: 6379 + # -- Redis service node port. Valid only when type is `NodePort` + nodePort: "" + # -- Redis tolerations for pod assignment + tolerations: [] + + # -- Redis affinity for pod assignment + affinity: {} + + # -- Redis security context + securityContext: + {} + # runAsUser: 999 + # runAsGroup: 1000 + +# -- Value of cluster domain +clusterDomain: cluster.local + +annotations: {} +podAnnotations: {} +podLabels: {} +replicaCount: 1 +# -- Revision history limit for the workload manager (deployment). +revisionHistoryLimit: 10 +# -- Priority class name for the Open WebUI pods +priorityClassName: "" +# -- Strategy for updating the workload manager: deployment or statefulset +strategy: {} +# -- Open WebUI image tags can be found here: https://github.com/open-webui/open-webui +image: + repository: ghcr.io/open-webui/open-webui + tag: "main" + pullPolicy: "IfNotPresent" + +# -- Open WebUI container command (overrides default entrypoint) +command: [] +# -- Open WebUI container arguments (overrides default) +args: [] + +serviceAccount: + enable: true + name: "" + annotations: {} + automountServiceAccountToken: false + +# -- Configure imagePullSecrets to use private registry +# ref: +imagePullSecrets: [] +# imagePullSecrets: +# - name: myRegistryKeySecretName + +# -- Probe for liveness of the Open WebUI container +# ref: +livenessProbe: {} +# livenessProbe: +# httpGet: +# path: /health +# port: http +# failureThreshold: 1 +# periodSeconds: 10 + +# -- Probe for readiness of the Open WebUI container +# ref: +readinessProbe: {} +# readinessProbe: +# httpGet: +# path: /health/db +# port: http +# failureThreshold: 1 +# periodSeconds: 10 + +# -- Probe for startup of the Open WebUI container +# ref: +startupProbe: {} +# startupProbe: +# httpGet: +# path: /health +# port: http +# initialDelaySeconds: 30 +# periodSeconds: 5 +# failureThreshold: 20 + +resources: {} + +copyAppData: + # -- Open WebUI copy-app-data init container command (overrides default) + command: [] + # -- Open WebUI copy-app-data init container arguments (overrides default) + args: [] + + resources: {} + +managedCertificate: + enabled: false + name: "mydomain-chat-cert" # You can override this name if needed + domains: + - chat.example.com # update to your real domain + +ingress: + enabled: false + class: "" + # -- Use appropriate annotations for your Ingress controller, e.g., for NGINX: + annotations: {} + # # Example for GKE Ingress + # kubernetes.io/ingress.class: "gce" + # kubernetes.io/ingress.global-static-ip-name: "open-webui-external-ip" # you need to create this address in GCP console + # # Force HTTP to redirect to HTTPS + # nginx.ingress.kubernetes.io/force-ssl-redirect: "true" + # nginx.ingress.kubernetes.io/ssl-redirect: "true" + # nginx.ingress.kubernetes.io/permanent-redirect: "https://chat.example.com" + # networking.gke.io/managed-certificates: "mydomain-chat-cert" + # # nginx.ingress.kubernetes.io/rewrite-target: / + host: "chat.example.com" # update to your real domain + additionalHosts: [] + tls: false + existingSecret: "" + + # -- Additional custom labels to add to the Ingress metadata + # Useful for tagging, selecting, or applying policies to the Ingress via labels. + extraLabels: {} + # extraLabels: + # app.kubernetes.io/environment: "staging" + +persistence: + enabled: true + size: 2Gi + # -- Use existingClaim if you want to re-use an existing Open WebUI PVC instead of creating a new one + existingClaim: "" + # -- Subdirectory of Open WebUI PVC to mount. Useful if root directory is not empty. + subPath: "" + # -- If using multiple replicas, you must update accessModes to ReadWriteMany + accessModes: + - ReadWriteOnce + storageClass: "" + selector: {} + annotations: {} + # -- Sets the storage provider, availables values are `local`, `s3`, `gcs` or `azure` + provider: local + s3: + # -- Sets the access key ID for S3 storage + # @section -- Amazon S3 Storage configuration + accessKey: "" + # -- Sets the secret access key for S3 storage (ignored if secretKeyExistingSecret is set) + # @section -- Amazon S3 Storage configuration + secretKey: "" + # -- Set the secret access key for S3 storage from existing k8s secret + # @section -- Amazon S3 Storage configuration + accessKeyExistingSecret: "" + # -- Set the secret access key for S3 storage from existing k8s secret key + # @section -- Amazon S3 Storage configuration + accessKeyExistingAccessKey: "" + # -- Set the secret key for S3 storage from existing k8s secret + # @section -- Amazon S3 Storage configuration + secretKeyExistingSecret: "" + # -- Set the secret key for S3 storage from existing k8s secret key + # @section -- Amazon S3 Storage configuration + secretKeyExistingSecretKey: "" + # -- Sets the endpoint url for S3 storage + # @section -- Amazon S3 Storage configuration + endpointUrl: "" + # -- Sets the region name for S3 storage + # @section -- Amazon S3 Storage configuration + region: "" + # -- Sets the bucket name for S3 storage + # @section -- Amazon S3 Storage configuration + bucket: "" + # -- Sets the key prefix for a S3 object + # @section -- Amazon S3 Storage configuration + keyPrefix: "" + gcs: + # -- Contents of Google Application Credentials JSON file (ignored if appCredentialsJsonExistingSecret is set). Optional - if not provided, credentials will be taken from the environment. User credentials if run locally and Google Metadata server if run on a Google Compute Engine. File can be generated for a service account following this guide: https://developers.google.com/workspace/guides/create-credentials#service-account + # @section -- Google Cloud Storage configuration + appCredentialsJson: "" + # -- Set the Google Application Credentials JSON file for Google Cloud Storage from existing secret + # @section -- Google Cloud Storage configuration + appCredentialsJsonExistingSecret: "" + # -- Set the Google Application Credentials JSON file for Google Cloud Storage from existing secret key + # @section -- Google Cloud Storage configuration + appCredentialsJsonExistingSecretKey: "" + # -- Sets the bucket name for Google Cloud Storage. Bucket must already exist + # @section -- Google Cloud Storage configuration + bucket: "" + azure: + # -- Sets the endpoint URL for Azure Storage + # @section -- Azure Storage configuration + endpointUrl: "" + # -- Sets the container name for Azure Storage + # @section -- Azure Storage configuration + container: "" + # -- Set the access key for Azure Storage (ignored if keyExistingSecret is set). Optional - if not provided, credentials will be taken from the environment. User credentials if run locally and Managed Identity if run in Azure services + # @section -- Azure Storage configuration + key: "" + # -- Set the access key for Azure Storage from existing secret + # @section -- Azure Storage configuration + keyExistingSecret: "" + # -- Set the access key for Azure Storage from existing secret key + # @section -- Azure Storage configuration + keyExistingSecretKey: "" + +# -- Node labels for pod assignment. +nodeSelector: {} + +# -- Tolerations for pod assignment +tolerations: [] + +# -- Affinity for pod assignment +affinity: {} + +# -- Topology Spread Constraints for pod assignment +topologySpreadConstraints: [] + +# -- HostAliases to be added to hosts-file of each container +hostAliases: [] + +# -- Service values to expose Open WebUI pods to cluster +service: + type: LoadBalancer + annotations: {} + port: 80 + containerPort: 8080 + nodePort: "" + labels: {} + loadBalancerClass: "" + +# -- Enables the use of OpenAI APIs +enableOpenaiApi: true + +# -- OpenAI base API URL to use. Defaults to the Pipelines service endpoint when Pipelines are enabled, and "https://api.openai.com/v1" if Pipelines are not enabled and this value is blank +openaiBaseApiUrl: "http://10.6.80.50/v1" #"https://api.openai.com/v1" + +# -- OpenAI base API URLs to use. Overwrites the value in openaiBaseApiUrl if set +openaiBaseApiUrls: + [] + # - "https://api.openai.com/v1" + # - "https://api.company.openai.com/v1" + +# -- Configure database URL, needed to work with Postgres (example: `postgresql://:@:/`), leave empty to use the default sqlite database +databaseUrl: "" + +# -- Env vars added to the Open WebUI deployment. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/ +extraEnvVars: + # -- Default API key value for Pipelines. Should be updated in a production deployment, or be changed to the required API key if not using Pipelines + - name: OPENAI_API_KEY + value: "0p3n-w3bu!" + # valueFrom: + # secretKeyRef: + # name: pipelines-api-key + # key: api-key + # - name: OPENAI_API_KEY + # valueFrom: + # secretKeyRef: + # name: openai-api-key + # key: api-key + # - name: OLLAMA_DEBUG + # value: "1" + +# -- Env vars added to the Open WebUI deployment, common across environments. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/ (caution: environment variables defined in both `extraEnvVars` and `commonEnvVars` will result in a conflict. Avoid duplicates) +commonEnvVars: [] + # - name: RAG_EMBEDDING_ENGINE + # value: "openai" + +# -- Env vars added from configmap or secret to the Open WebUI deployment. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/ (caution: `extraEnvVars` will take precedence over the value from `extraEnvFrom`) +extraEnvFrom: [] + # - configMapRef: + # name: my-config + # - secretRef: + # name: my-secret + +# -- Configure runtime class +# ref: +runtimeClassName: "" + +# -- Configure container volume mounts +# ref: +volumeMounts: + initContainer: [] + # - name: "" + # mountPath: "" + container: [] + # - name: "" + # mountPath: "" + +# -- Additional init containers to add to the deployment/statefulset +# ref: +extraInitContainers: [] +# - name: custom-init +# image: busybox:latest +# command: ['sh', '-c', 'echo "Custom init container running"'] +# volumeMounts: +# - name: data +# mountPath: /data + +# -- Configure pod volumes +# ref: +volumes: [] +# - name: "" +# configMap: +# name: "" +# - name: "" +# emptyDir: {} + +# -- Configure pod security context +# ref: +podSecurityContext: + {} + # fsGroupChangePolicy: Always + # sysctls: [] + # supplementalGroups: [] + # fsGroup: 1001 + +# -- Configure container security context +# ref: +containerSecurityContext: + {} + # runAsUser: 1001 + # runAsGroup: 1001 + # runAsNonRoot: true + # privileged: false + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: false + # capabilities: + # drop: + # - ALL + # seccompProfile: + # type: "RuntimeDefault" + +sso: + # -- **Enable SSO authentication globally** must enable to use SSO authentication + # @section -- SSO Configuration + enabled: false + # -- Enable account creation when logging in with OAuth (distinct from regular signup) + # @section -- SSO Configuration + enableSignup: false + # -- Allow logging into accounts that match email from OAuth provider (considered insecure) + # @section -- SSO Configuration + mergeAccountsByEmail: false + # -- Enable OAuth role management through access token roles claim + # @section -- SSO Configuration + enableRoleManagement: false + # -- Enable OAuth group management through access token groups claim + # @section -- SSO Configuration + enableGroupManagement: false + + google: + # -- Enable Google OAuth + # @section -- Google OAuth configuration + enabled: false + # -- Google OAuth client ID + # @section -- Google OAuth configuration + clientId: "" + # -- Google OAuth client secret (ignored if clientExistingSecret is set) + # @section -- Google OAuth configuration + clientSecret: "" + # -- Google OAuth client secret from existing secret + # @section -- Google OAuth configuration + clientExistingSecret: "" + # -- Google OAuth client secret key from existing secret + # @section -- Google OAuth configuration + clientExistingSecretKey: "" + + microsoft: + # -- Enable Microsoft OAuth + # @section -- Microsoft OAuth configuration + enabled: false + # -- Microsoft OAuth client ID + # @section -- Microsoft OAuth configuration + clientId: "" + # -- Microsoft OAuth client secret (ignored if clientExistingSecret is set) + # @section -- Microsoft OAuth configuration + clientSecret: "" + # -- Microsoft OAuth client secret from existing secret + # @section -- Microsoft OAuth configuration + clientExistingSecret: "" + # -- Microsoft OAuth client secret key from existing secret + # @section -- Microsoft OAuth configuration + clientExistingSecretKey: "" + # -- Microsoft tenant ID - use 9188040d-6c67-4c5b-b112-36a304b66dad for personal accounts + # @section -- Microsoft OAuth configuration + tenantId: "" + + github: + # -- Enable GitHub OAuth + # @section -- GitHub OAuth configuration + enabled: false + # -- GitHub OAuth client ID + # @section -- GitHub OAuth configuration + clientId: "" + # -- GitHub OAuth client secret (ignored if clientExistingSecret is set) + # @section -- GitHub OAuth configuration + clientSecret: "" + # -- GitHub OAuth client secret from existing secret + # @section -- GitHub OAuth configuration + clientExistingSecret: "" + # -- GitHub OAuth client secret key from existing secret + # @section -- GitHub OAuth configuration + clientExistingSecretKey: "" + + oidc: + # -- Enable OIDC authentication + # @section -- OIDC configuration + enabled: false + # -- OIDC client ID + # @section -- OIDC configuration + clientId: "" + # -- OIDC client secret (ignored if clientExistingSecret is set) + # @section -- OIDC configuration + clientSecret: "" + # -- OICD client secret from existing secret + # @section -- OIDC configuration + clientExistingSecret: "" + # -- OIDC client secret key from existing secret + # @section -- OIDC configuration + clientExistingSecretKey: "" + # -- OIDC provider well known URL + # @section -- OIDC configuration + providerUrl: "" + # -- Name of the provider to show on the UI + # @section -- OIDC configuration + providerName: "SSO" + # -- Scopes to request (space-separated). + # @section -- OIDC configuration + scopes: "openid email profile" + + roleManagement: + # -- The claim that contains the roles (can be nested, e.g., user.roles) + # @section -- Role management configuration + rolesClaim: "roles" + # -- Comma-separated list of roles allowed to log in (receive open webui role user) + # @section -- Role management configuration + allowedRoles: "" + # -- Comma-separated list of roles allowed to log in as admin (receive open webui role admin) + # @section -- Role management configuration + adminRoles: "" + + groupManagement: + # -- The claim that contains the groups (can be nested, e.g., user.memberOf) + # @section -- SSO Configuration + groupsClaim: "groups" + + trustedHeader: + # -- Enable trusted header authentication + # @section -- SSO trusted header authentication + enabled: false + # -- Header containing the user's email address + # @section -- SSO trusted header authentication + emailHeader: "" + # -- Header containing the user's name (optional, used for new user creation) + # @section -- SSO trusted header authentication + nameHeader: "" + +# -- Extra resources to deploy with Open WebUI +extraResources: + [] + # - apiVersion: v1 + # kind: ConfigMap + # metadata: + # name: example-configmap + # data: + # example-key: example-value + +# Configure Application logging levels (see. https://docs.openwebui.com/getting-started/advanced-topics/logging#-logging-levels-explained) +logging: + # -- Set the global log level ["notset", "debug", "info" (default), "warning", "error", "critical"] + # @section -- Logging configuration + level: "" + + # Optional granularity: override log levels per subsystem/component + # if not set, it will use the global level (see. https://docs.openwebui.com/getting-started/advanced-topics/logging#%EF%B8%8F-appbackend-specific-logging-levels) + components: + # -- Set the log level for the Audio processing component + # @section -- Logging configuration + audio: "" + # -- Set the log level for the ComfyUI Integration component + # @section -- Logging configuration + comfyui: "" + # -- Set the log level for the Configuration Management component + # @section -- Logging configuration + config: "" + # -- Set the log level for the Database Operations (Peewee) component + # @section -- Logging configuration + db: "" + # -- Set the log level for the Image Generation component + # @section -- Logging configuration + images: "" + # -- Set the log level for the Main Application Execution component + # @section -- Logging configuration + main: "" + # -- Set the log level for the Model Management component + # @section -- Logging configuration + models: "" + # -- Set the log level for the Ollama Backend Integration component + # @section -- Logging configuration + ollama: "" + # -- Set the log level for the OpenAI API Integration component + # @section -- Logging configuration + openai: "" + # -- Set the log level for the Retrieval-Augmented Generation (RAG) component + # @section -- Logging configuration + rag: "" + # -- Set the log level for the Authentication Webhook component + # @section -- Logging configuration + webhook: ""