From d589ce2978ed2b1b45cd0c48ce32fec7d1bf42df Mon Sep 17 00:00:00 2001 From: jefferyfry Date: Thu, 6 Aug 2020 19:49:31 -0700 Subject: [PATCH 01/28] Updated documentation. Add new tests for software upgrades. --- Ansible/README.md | 21 ++- Ansible/pipelines.yaml | 4 +- Ansible/test/aws/playbook-ha-install.yaml | 22 +-- Ansible/test/aws/playbook-ha-upgrade.yaml | 172 ++++++++++++++++++ Ansible/test/aws/runAwsInstall.sh | 11 +- Ansible/test/aws/runAwsUpgrade.sh | 14 ++ .../.gradle/5.2.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .../.gradle/5.2.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../test/tests/.gradle/5.2.1/gc.properties | 0 .../6.5/executionHistory/executionHistory.bin | Bin 134537 -> 138306 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .../.gradle/6.5/fileHashes/fileHashes.bin | Bin 23547 -> 23647 bytes .../.gradle/6.5/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../tests/src/test/resources/testenv.yaml | 6 +- .../tests/src/test/resources/testenv_tpl.yaml | 6 + 16 files changed, 237 insertions(+), 19 deletions(-) create mode 100644 Ansible/test/aws/playbook-ha-upgrade.yaml create mode 100755 Ansible/test/aws/runAwsUpgrade.sh delete mode 100644 Ansible/test/tests/.gradle/5.2.1/fileChanges/last-build.bin delete mode 100644 Ansible/test/tests/.gradle/5.2.1/fileHashes/fileHashes.lock delete mode 100644 Ansible/test/tests/.gradle/5.2.1/gc.properties create mode 100644 Ansible/test/tests/src/test/resources/testenv_tpl.yaml diff --git a/Ansible/README.md b/Ansible/README.md index 4527053..71d07d9 100644 --- a/Ansible/README.md +++ b/Ansible/README.md @@ -12,6 +12,7 @@ This Ansible directory consists of the following directories that support the JF | collection_version | artifactory_version | xray_version | |--------------------|---------------------|--------------| +| 1.0.8 | 7.6.1 | 3.5.2 | | 1.0.7 | 7.6.1 | 3.5.2 | | 1.0.6 | 7.5.0 | 3.3.0 | | 1.0.6 | 7.4.3 | 3.3.0 | @@ -84,11 +85,29 @@ ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A us eg. ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ azureDeployment.deployment.outputs.lbIp.value }} -W %h:%p"' ``` +## Upgrades +The Artifactory and Xray roles support software updates. To use a role to perform a software update only, use the _artifactory_upgrade_only_ or _xray_upgrade_only_ variable and specify the version. See the following example. + +``` +- hosts: artifactory + vars: + artifactory_version: "{{ lookup('env', 'artifactory_version_upgrade') }}" + artifactory_upgrade_only: true + roles: + - artifactory + +- hosts: xray + vars: + xray_version: "{{ lookup('env', 'xray_version_upgrade') }}" + xray_upgrade_only: true + roles: + - xray +``` ## Building the Collection Archive 1. Go to the [ansible_collections/jfrog/installers directory](ansible_collections/jfrog/installers). 2. Update the galaxy.yml meta file as needed. Update the version. -3. Build the archive. +3. Build the archive. (Requires Ansible 2.9+) ``` ansible-galaxy collection build ``` diff --git a/Ansible/pipelines.yaml b/Ansible/pipelines.yaml index 9f7a18f..8c22a43 100644 --- a/Ansible/pipelines.yaml +++ b/Ansible/pipelines.yaml @@ -53,7 +53,7 @@ pipelines: - ls - eval $(ssh-agent -s) - ssh-add <(echo "$int_ansiblePrivateKey_key") - - ansible-playbook Ansible/test/aws/playbook.yaml + - ansible-playbook Ansible/test/aws/playbook-ha-install.yaml onComplete: - echo "AWS Ansible playbook complete." - name: execute_azure_ansible_playbook @@ -105,6 +105,6 @@ pipelines: - eval $(ssh-agent -s) - ssh-add <(echo "$int_ansiblePrivateKey_key") - az login --service-principal -u "$clientId" -p "$clientSecret" --tenant "$tenantId" - - ansible-playbook Ansible/test/azure/playbook.yaml + - ansible-playbook Ansible/test/azure/playbook-ha-install.yaml onComplete: - echo "Azure Ansible playbook complete." \ No newline at end of file diff --git a/Ansible/test/aws/playbook-ha-install.yaml b/Ansible/test/aws/playbook-ha-install.yaml index a859072..ba59220 100644 --- a/Ansible/test/aws/playbook-ha-install.yaml +++ b/Ansible/test/aws/playbook-ha-install.yaml @@ -37,9 +37,7 @@ db_url: "jdbc:postgresql://{{ AWSDeployment.stack_outputs.DBInstancePrivate }}:5432/artifactory" server_name: "{{ AWSDeployment.stack_outputs.ALBHostName }}" artifactory_is_primary: true - artifactory_license1: "{{ lookup('env', 'artifactory_license1') }}" - artifactory_license2: "{{ lookup('env', 'artifactory_license2') }}" - artifactory_license3: "{{ lookup('env', 'artifactory_license3') }}" + artifactory_license_file: "{{ lookup('env', 'artifactory_license_file') }}" groups: - artifactory @@ -84,6 +82,11 @@ - { db_name: "xraydb", db_owner: "xray" } groups: database + - name: Set up test environment file + copy: + src: ../tests/src/test/resources/testenv_tpl.yaml + dest: ../tests/src/test/resources/testenv.yaml + - name: Set up test environment url replace: path: ../tests/src/test/resources/testenv.yaml @@ -140,12 +143,7 @@ - name: Test hosts: localhost tasks: - - name: Run tests - shell: - cmd: ./gradlew clean unified_test - chdir: ../tests/ - - name: Cleanup and delete stack - cloudformation: - stack_name: "{{ lookup('env', 'stack_name') }}" - region: "us-east-1" - state: "absent" \ No newline at end of file + - name: Run tests + shell: + cmd: ./gradlew clean unified_test + chdir: ../tests/ \ No newline at end of file diff --git a/Ansible/test/aws/playbook-ha-upgrade.yaml b/Ansible/test/aws/playbook-ha-upgrade.yaml new file mode 100644 index 0000000..fa97c16 --- /dev/null +++ b/Ansible/test/aws/playbook-ha-upgrade.yaml @@ -0,0 +1,172 @@ +--- +- name: Provision AWS test infrastructure + hosts: localhost + tasks: + - shell: 'pwd' + register: cmd + + - debug: + msg: "{{ cmd.stdout }}" + - name: Create AWS test system + cloudformation: + stack_name: "{{ lookup('env', 'stack_name') }}" + state: "present" + region: "us-east-1" + disable_rollback: true + template: "{{ lookup('env', 'cfn_template') }}" + template_parameters: + SSHKeyName: "{{ lookup('env', 'ssh_public_key_name') }}" + tags: + Stack: "{{ lookup('env', 'stack_name') }}" + register: AWSDeployment + - name: Get AWS deployment details + debug: + var: AWSDeployment + + - name: Add bastion + add_host: + hostname: "{{ AWSDeployment.stack_outputs.BastionInstancePublic }}" + groups: bastion + ansible_user: "ubuntu" + - name: Add new RT primary to host group + add_host: + hostname: "{{ AWSDeployment.stack_outputs.RTPriInstancePrivate }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ AWSDeployment.stack_outputs.BastionInstancePublic }} -W %h:%p"' + artifactory_version: "{{ lookup('env', 'artifactory_version') }}" + db_url: "jdbc:postgresql://{{ AWSDeployment.stack_outputs.DBInstancePrivate }}:5432/artifactory" + server_name: "{{ AWSDeployment.stack_outputs.ALBHostName }}" + artifactory_is_primary: true + artifactory_license_file: "{{ lookup('env', 'artifactory_license_file') }}" + groups: + - artifactory + + - name: Add RT secondaries to host group + add_host: + hostname: "{{ AWSDeployment.stack_outputs.RTSecInstancePrivate }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ AWSDeployment.stack_outputs.BastionInstancePublic }} -W %h:%p"' + artifactory_version: "{{ lookup('env', 'artifactory_version') }}" + db_url: "jdbc:postgresql://{{ AWSDeployment.stack_outputs.DBInstancePrivate }}:5432/artifactory" + server_name: "{{ AWSDeployment.stack_outputs.ALBHostName }}" + artifactory_is_primary: false + groups: + - artifactory + + - name: Add xrays to host group + add_host: + hostname: "{{ AWSDeployment.stack_outputs.XrayInstancePrivate }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ AWSDeployment.stack_outputs.BastionInstancePublic }} -W %h:%p"' + xray_version: "{{ lookup('env', 'xray_version') }}" + jfrog_url: "http://{{ AWSDeployment.stack_outputs.ALBHostName }}" + master_key: "{{ lookup('env', 'master_key') }}" + join_key: "{{ lookup('env', 'join_key') }}" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_user: "xray" + db_password: "xray" + db_url: "postgres://{{ AWSDeployment.stack_outputs.DBInstancePrivate }}:5432/xraydb?sslmode=disable" + groups: xray + + - name: Add DBs to host group + add_host: + hostname: "{{ AWSDeployment.stack_outputs.DBInstancePrivate }}" + ansible_user: "ubuntu" + ansible_ssh_common_args: '-o ProxyCommand="ssh -o StrictHostKeyChecking=no -A ubuntu@{{ AWSDeployment.stack_outputs.BastionInstancePublic }} -W %h:%p"' + db_users: + - { db_user: "artifactory", db_password: "Art1fAct0ry" } + - { db_user: "xray", db_password: "xray" } + dbs: + - { db_name: "artifactory", db_owner: "artifactory" } + - { db_name: "xraydb", db_owner: "xray" } + groups: database + + - name: Set up test environment file + copy: + src: ../tests/src/test/resources/testenv_tpl.yaml + dest: ../tests/src/test/resources/testenv.yaml + + - name: Set up test environment url + replace: + path: ../tests/src/test/resources/testenv.yaml + regexp: 'urlval' + replace: "http://{{ AWSDeployment.stack_outputs.ALBHostName }}" + + - name: Set up test environment external_ip + replace: + path: ../tests/src/test/resources/testenv.yaml + regexp: 'ipval' + replace: "{{ AWSDeployment.stack_outputs.ALBHostName }}" + + - name: Set up test environment rt_password + replace: + path: ../tests/src/test/resources/testenv.yaml + regexp: 'passval' + replace: "password" + + - name: show testenv.yaml + debug: var=item + with_file: + - ../tests/src/test/resources/testenv.yaml + + - name: Wait 300 seconds for port 22 + wait_for: + port: 22 + host: "{{ AWSDeployment.stack_outputs.BastionInstancePublic }}" + delay: 10 + + - debug: + msg: "Unified URL is at http://{{ AWSDeployment.stack_outputs.ALBHostName }}" + +# apply roles to install software +- hosts: database + roles: + - postgres + +- hosts: artifactory + vars: + artifactory_ha_enabled: true + master_key: "{{ lookup('env', 'master_key') }}" + join_key: "{{ lookup('env', 'join_key') }}" + db_download_url: "https://jdbc.postgresql.org/download/postgresql-42.2.12.jar" + db_type: "postgresql" + db_driver: "org.postgresql.Driver" + db_user: "artifactory" + db_password: "Art1fAct0ry" + roles: + - artifactory + +- hosts: xray + roles: + - xray + +- name: Test + hosts: localhost + tasks: + - name: Run tests + shell: + cmd: ./gradlew clean unified_test + chdir: ../tests/ + +# Now upgrade +- name: Upgrade + hosts: localhost + tasks: + - pause: + prompt: "Proceed to upgrade?" + minutes: 5 + +- hosts: artifactory + vars: + artifactory_version: "{{ lookup('env', 'artifactory_version_upgrade') }}" + artifactory_upgrade_only: true + roles: + - artifactory + +- hosts: xray + vars: + xray_version: "{{ lookup('env', 'xray_version_upgrade') }}" + xray_upgrade_only: true + roles: + - xray \ No newline at end of file diff --git a/Ansible/test/aws/runAwsInstall.sh b/Ansible/test/aws/runAwsInstall.sh index fa8da2a..6b1a735 100755 --- a/Ansible/test/aws/runAwsInstall.sh +++ b/Ansible/test/aws/runAwsInstall.sh @@ -1,3 +1,12 @@ #!/usr/bin/env bash -ansible-playbook Ansible/test/aws/playbook.yaml \ No newline at end of file +export stack_name=$1 +export cfn_template="~/git/JFrog-Cloud-Installers/Ansible/infra/aws/lb-rt-xray-ha-ubuntu16.json" +export ssh_public_key_name=jeff-ansible +export artifactory_license_file="~/Desktop/artifactory.cluster.license" +export master_key=d8c19a03036f83ea45f2c658e22fdd60 +export join_key=d8c19a03036f83ea45f2c658e22fdd61 +export ansible_user=ubuntu +export artifactory_version="7.4.3" +export xray_version="3.4.0" +ansible-playbook Ansible/test/aws/playbook-ha-install.yaml \ No newline at end of file diff --git a/Ansible/test/aws/runAwsUpgrade.sh b/Ansible/test/aws/runAwsUpgrade.sh new file mode 100755 index 0000000..191fe97 --- /dev/null +++ b/Ansible/test/aws/runAwsUpgrade.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +export stack_name=$1 +export cfn_template="~/git/JFrog-Cloud-Installers/Ansible/infra/aws/lb-rt-xray-ha-ubuntu16.json" +export ssh_public_key_name=jeff-ansible +export artifactory_license_file="~/Desktop/artifactory.cluster.license" +export master_key=d8c19a03036f83ea45f2c658e22fdd60 +export join_key=d8c19a03036f83ea45f2c658e22fdd61 +export ansible_user=ubuntu +export artifactory_version="7.4.3" +export xray_version="3.4.0" +export artifactory_version_upgrade="7.6.1" +export xray_version_upgrade="3.5.2" +ansible-playbook Ansible/test/aws/playbook-ha-upgrade.yaml \ No newline at end of file diff --git a/Ansible/test/tests/.gradle/5.2.1/fileChanges/last-build.bin b/Ansible/test/tests/.gradle/5.2.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/Ansible/test/tests/.gradle/5.2.1/fileHashes/fileHashes.lock b/Ansible/test/tests/.gradle/5.2.1/fileHashes/fileHashes.lock deleted file mode 100644 index ceb38cc88f35a1c014e507af3e74c5a2b2a4d9d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 ScmZQ}3FHq8H4&T700jUW9s)c7 diff --git a/Ansible/test/tests/.gradle/5.2.1/gc.properties b/Ansible/test/tests/.gradle/5.2.1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/Ansible/test/tests/.gradle/6.5/executionHistory/executionHistory.bin b/Ansible/test/tests/.gradle/6.5/executionHistory/executionHistory.bin index 1da42b951b5fd0483d7c7691fd96842c9e3011af..e2cad615aa20e05d9d93ed30e5eaeff02eecb843 100644 GIT binary patch delta 2612 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 vKS<{r7l+iD?MF0Q* literal 17 UcmZRM7fj##ct)i-0|eLu04-tz;s5{u diff --git a/Ansible/test/tests/.gradle/6.5/fileHashes/fileHashes.bin b/Ansible/test/tests/.gradle/6.5/fileHashes/fileHashes.bin index 3aa0a9b101df2e66112d98e4f62fcd7680a4fd39..4782416b9284b5378b3efee4203b97ffa38586a0 100644 GIT binary patch delta 2068 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 diff --git a/Ansible/test/tests/.gradle/6.5/fileHashes/fileHashes.lock b/Ansible/test/tests/.gradle/6.5/fileHashes/fileHashes.lock index e9ea2c51355652fd0632b55daeffbc9d70e78624..88d74f8a5f662cf7d32cabf6de40aef0c028fca1 100644 GIT binary patch literal 17 VcmZSH8q%`ie|zM81~6cK2LL{@1@Zs@ literal 17 VcmZSH8q%`ie|zM81~6cX0RTQ41zi9D diff --git a/Ansible/test/tests/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/Ansible/test/tests/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 866a35e263bf740ab576771f7f7d0e929d5abe51..cad006e55b2e84f4a8120ac1e8e4e23de64b82a5 100644 GIT binary patch literal 17 UcmZQ}3cSGg=7je*1_;;=05vQHApigX literal 17 UcmZQ}3cSGg=7je*1_%fN05r)2z5oCK diff --git a/Ansible/test/tests/src/test/resources/testenv.yaml b/Ansible/test/tests/src/test/resources/testenv.yaml index 55ff648..3480812 100644 --- a/Ansible/test/tests/src/test/resources/testenv.yaml +++ b/Ansible/test/tests/src/test/resources/testenv.yaml @@ -1,6 +1,6 @@ artifactory: - url: urlval - external_ip: ipval + url: http://Ansib-Appli-1NLZU3V2AGK49-291976964.us-east-1.elb.amazonaws.com + external_ip: Ansib-Appli-1NLZU3V2AGK49-291976964.us-east-1.elb.amazonaws.com distribution: artifactory_ha rt_username: admin - rt_password: passval \ No newline at end of file + rt_password: password \ No newline at end of file diff --git a/Ansible/test/tests/src/test/resources/testenv_tpl.yaml b/Ansible/test/tests/src/test/resources/testenv_tpl.yaml new file mode 100644 index 0000000..55ff648 --- /dev/null +++ b/Ansible/test/tests/src/test/resources/testenv_tpl.yaml @@ -0,0 +1,6 @@ +artifactory: + url: urlval + external_ip: ipval + distribution: artifactory_ha + rt_username: admin + rt_password: passval \ No newline at end of file From 55af4c1bc9c693416e2a3f17025ae2f86d6194f3 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Mon, 17 Aug 2020 16:09:29 -0700 Subject: [PATCH 02/28] Artifactory HA v7.7.3 and Xray v3.8.0 in Openshift --- .../.osdk-scorecard.yaml | 2 +- .../artifactory-ha-operator/CHANGELOG.md | 3 + ...operator.v1.0.3.clusterserviceversion.yaml | 329 +++++++++++++++ ...enshiftartifactoryha-operator.package.yaml | 2 +- ...operator.v1.0.3.clusterserviceversion.yaml | 329 +++++++++++++++ .../openshift-artifactory-ha/CHANGELOG.md | 3 + .../openshift-artifactory-ha/Chart.yaml | 4 +- .../requirements.lock | 6 +- .../requirements.yaml | 2 +- .../openshift-artifactory-ha/values.yaml | 2 +- Openshift4/openshift-xray/CHANGELOG.md | 3 + Openshift4/openshift-xray/Chart.yaml | 4 +- Openshift4/openshift-xray/requirements.lock | 6 +- Openshift4/openshift-xray/requirements.yaml | 2 +- Openshift4/xray-operator/CHANGELOG.md | 3 + .../openshiftxray-operator.package.yaml | 2 +- ...operator.v1.0.3.clusterserviceversion.yaml | 376 ++++++++++++++++++ ...operator.v1.0.3.clusterserviceversion.yaml | 376 ++++++++++++++++++ .../helm-charts/openshift-xray/CHANGELOG.md | 3 + .../helm-charts/openshift-xray/Chart.yaml | 4 +- .../openshift-xray/requirements.lock | 6 +- .../openshift-xray/requirements.yaml | 2 +- 22 files changed, 1447 insertions(+), 22 deletions(-) create mode 100644 Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml create mode 100644 Openshift4/xray-operator/bundle/xray-operator.v1.0.3.clusterserviceversion.yaml create mode 100644 Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.3/xray-operator.v1.0.3.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/.osdk-scorecard.yaml b/Openshift4/artifactory-ha-operator/.osdk-scorecard.yaml index 994e1cc..c486e60 100644 --- a/Openshift4/artifactory-ha-operator/.osdk-scorecard.yaml +++ b/Openshift4/artifactory-ha-operator/.osdk-scorecard.yaml @@ -7,4 +7,4 @@ scorecard: - olm: cr-manifest: - "deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml" - csv-path: "deploy/olm-catalog/artifactory-ha-operator/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml" + csv-path: "deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml" diff --git a/Openshift4/artifactory-ha-operator/CHANGELOG.md b/Openshift4/artifactory-ha-operator/CHANGELOG.md index 63dfc5d..840b74f 100755 --- a/Openshift4/artifactory-ha-operator/CHANGELOG.md +++ b/Openshift4/artifactory-ha-operator/CHANGELOG.md @@ -1,6 +1,9 @@ # JFrog Openshift Artifactory-ha Chart Changelog All changes to this chart will be documented in this file. +## [3.1.0] - Aug 17, 2020 +* Updating to latest jfrog/artifactory-ha helm chart version 3.1.0 artifactory version 3.1.0 + ## [3.0.5] - July 16, 2020 * Updating to latest jfrog/artifactory-ha helm chart version 3.0.5 artifactory version 7.6.3 diff --git a/Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml new file mode 100644 index 0000000..b3e6df0 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml @@ -0,0 +1,329 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "charts.helm.k8s.io/v1alpha1", + "kind": "OpenshiftArtifactoryHa", + "metadata": { + "name": "openshiftartifactoryha" + }, + "spec": { + "artifactory-ha": { + "artifactory": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/artifactory-pro", + "version": "7.7.3" + }, + "joinKey": "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "masterKey": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "node": { + "replicaCount": 2, + "waitForPrimaryStartup": { + "enabled": false + } + } + }, + "database": { + "driver": "OVERRIDE", + "password": "OVERRIDE", + "type": "OVERRIDE", + "url": "OVERRIDE", + "user": "OVERRIDE" + }, + "initContainerImage": "registry.redhat.io/ubi8-minimal", + "nginx": { + "http": { + "externalPort": 80, + "internalPort": 8080 + }, + "https": { + "externalPort": 443, + "internalPort": 8443 + }, + "image": { + "repository": "registry.redhat.io/rhel8/nginx-116", + "version": "latest" + }, + "service": { + "ssloffload": false + }, + "tlsSecretName": "OVERRIDE" + }, + "postgresql": { + "enabled": false + }, + "waitForDatabase": false + } + } + } + ] + capabilities: Basic Install + categories: "Developer Tools,Integration & Delivery" + description: "JFrog Artifactory Enterprise deploys Artifactory in a high availability environment across multiple pods" + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.7.3 + createdAt: 2020-03-25T00:00:00Z + support: JFrog + certified: "true" + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + name: artifactory-ha-operator.v1.0.3 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + version: v1 + - kind: Service + version: v1 + - kind: ReplicaSet + version: v1 + - kind: Pod + version: v1 + - kind: Secret + version: v1 + - kind: ConfigMap + version: v1 + - kind: StatefulSet + version: apps/v1 + version: v1alpha1 + description: | + ## Overview + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift cluster. + + ## Usage + + An external DB is required. The operator will not deploy a DB but will require you to specify the configuration values to connect to it. + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + Go to the Installed Operators. + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + Open the Operator and click on the provided API: Artifactory HA. + + Click Create New Instance and provide the following parameters for your DB configuration: + + ``` + DATABASE_TYPE + DATABASE_DRIVER + DATABASE_URL + DATABASE_USER + DATABASE_PASSWORD + ``` + + In addition to use TLS you will need to first create a k8s tls secret to store your .crt and .key file into. + + Then supply the value of this k8s secret into the TLS_SECRET field. + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to it on the external IP exposed by the load balancer. + + displayName: JFrog Artifactory Enterprise Operator + provider: + name: JFrog + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + icon: + - base64data: iVBORw0KGgoAAAANSUhEUgAAAMkAAADCCAYAAADjAebGAAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAACAASURBVHic7V0HfBzF1Z83u3un5iLJGGzAdoyDgWDAgIxtSdd0xZiaxEASWiDARw9gei8hQCghhN5CJ4BDMHGMdbqiU7ExpgZCb4ZgTLFsg2Wr3O18792d7JN0ZfeaTvb9f7/T3u3N7oz25j/z3swrshCCEfg1nJvqG44F4HWMCQlPrwQmWgKt3oB6laqyIorYRiHTnzBBTI6ngLGjIqeBAUSOZpNjpdXrvDLg8DyuqqoYuqYWUcTQIEwSU73jtC0EGYSJjMOjZq/jQL6AH6POU0N5bF8RGaDe49pHkthM/G27u4W6eKmt6ZuhbtNwhIwdXzJX2y+hWSMFfmWqtv8Xj3/IQ7uKyBA4+58uS3BX32cj8A6LxzWz2d740VC2azhCrhtl3QcJsqOWwiiEzZ+1ZNYdy+Ys+yHXDUsEi98+Gxi/HlszDT/2oO60Aph6p9/W1DRUbSpIcDhnwJkq4OIsPJ49FM0pFNQ8UKNUTKk6hgl2NHZo7PusmwnxzKqelZd8MOeD7njXyAByhY46RpcYR/4Sj3/LSot1YrbPsb0RpCX4dkTfOdSdDsUecbDJ63S1NLg9Q9GuAsXYOOd2zXsrCgjYR+oqplQ+xOg5xApOAOeOM0wche9+F+86uWNd72tjqpW1+L5SS0VCCAsbIpIYGduXxRAkBpxzQJGRFUmyBV/ia1S/MwAdQ9OUoYfF7/qFxOEZFtXDBwIATqh1225od/o+Hvid/PY83wazx3UEl9jf8fOYVJXhzeKNUHlBD4j/GBgLsjj/KA4M+wxBkwoWgrHX8Jns2e+cUP89VO0ZSuy70DZ61EiFZpC4BIkCFFk6AI+DSUJ/AvZGr7nRvBdXjH9DFriSVym+zKC9GaHd6vnK6nNdhoy4kQ1caRCsqJDGAAmxAIAfv/kzY6+0tIaeYbahbNXQYNRI+Qg8jE5VTgj4Pt75zcwKuAJfo8xyoNlrPxP73014qjTefdQQPJp2a7MAv63xT1av8yVUTC/Ej7/Gl4Sv7pAQFw9luwoNAVvTIqvfebpgMA9//f91bgzOV6/yBYe6XUMD2FdDoVWre1c2x/ui3/QT3Sz8a73f7paF9CiO1QfEfi8EuwFnnfa025ol+Bvcb+PhWLPPcQMwOIKB+lJLg+eVoW5XocFvdd+Dh3uGuh0FgGRiVh/OT7i6Fe9kq9XzAb/GVmcyKSehTHMkztUGlbEHA7bGRzJpabaBo+W7eLhmqNtRRKFDvJtsHxBnhvuarY1PJ/o+IcOiU/O90VcRRQxbbOgMPl5RrvyekfVIf3QIIe5oaQ1ez6yJr9cyDRVRxLDGioN939csqtmjvLxqDgh1Jyagi4F47/uO1cvfnvd2T6rFjIxJYvU5rAz4efiW9JdynLw+wEb8vadjw1/b57VvyvT+abRnlgB+C74tYaq4trnBvTDfbSgUYMcoKy+tPETt7nK3zG1ZO9TtGUqsOHjFRjw8n861GZHE4nedA8BvY/0EPpiOn6YbqiuOq3XbDo+3OZMrWNyWnUExvgR9m2gcnrd4nUciUf6RrzYUEirKKp9iAIdJpSXN+DGJQFFEMqRNkmiH/BNLrBH9zCArfvMS876BOYHv0q1HD0Ax0LJw7C4zBw4PmBvNS2mJOx9tKBRYmiw/Adl4WOQTWCwe10+Lxo3pIW2SgCLTDreSvBDbiRuMZC5yXrr16AMcFudkJZKZxK+j89OGwgBwQ33sZ8HVvfGw1ZIExWz8f/kswVinYGpTwNb0YbbunTZJenrV9wyKRPsqyW3sAU6Y/Kjt0k+P93WlW5cWYB0lEycoO8dvAvwaH+KDfluTP5dtKCgA2z/2IwcYN1RNySXqmmx7KrJ8Dwt71EY6IzCuWn3O+wKtwbOzsYGaNklI17D6nY9gk05IUXT0xJ3kI/H4WLp1aUF5+XcqY+MTkRbwId6DRNon12QtGACri/2ID2b7oWpKrmD2Og9SZOU5Ntg6hOPIeJq5XtmA7y/MtJ6MFPeeNZ1nGKrKx2KDDkpakMP5fAF/MpdejbSUZ/W7yClszwRFpk7cWbkSj5fmqg2FAtQDt+PGkr1jz4FGn6HhAvK6lCWIR5AtAHZmzaKaq6MrW2kjI5LQEi+/xna42STfgC2azxKLXtPMlfb/w+PdWu9t8bsOZUJEXIoBnmy2Ni5OdY0Q6i0A/JGEBYBdYG5qWBhweJdrbcdwBFeMh9Ch/1kxZUgakwNQTAazyX4//qCJCRJBqaKMIKv1zzOpL+N9kqjMdwF26mUQ8TMZGbcghz9Y3JZ/NTubU1oRW/zOi3HkuyEajYLwa7PP8QtUxl5Idl2zrelRi8+1K16WaLaQuSw9Nr1p+r5vON7oTNWOYQsOxww+CT/Nf0NyA7PJQdbNNRqKdvR+8eNXmdaXtR13HOmfx478DgdOexLxRJ5KkI1PT1swzRbe5UyAaQtsFWOqlasHnAa8742c84WpIrY02xovQ7GL9mZuZ3EJC7uOlseSqc2xKf6lYYmIIqtY4ny1vbnRPG64L4XXLqgtNVRVXJs6JANB3LLi5BW9mdaZVbMUWnbDUXrmKGm7hwHgyEEFgNWOqR53J747JdE9FCXcpnhLy1NNbgeJDCmXMf3Wxr+hXL6IG42otAHVNZAsx+DM147E3urs0pAgpHfF7ULcoNCK17/y26LswlBdfiYedkpVTgjxfEtr8OZsbKFm3XaLxBgc8X9l8trfQJHpejZINoaTUSRaiSP+9fGuf/0w3zqLz/kEkuy4gd+pIDQr/tENzAv2XWi7ftQI5TzsNrTKYdzcCsbuMHmd77c0uJu13rPQYfY6XZzDEYlL8BlsGJOkrqlurCKXp1p4oXiLNyNBLsuW/0xODByjItGNOFr/Bzvjk2yAVxjqDNfhd+txJL8z3vW9HZ2nGqrKO7EgyZ5l+PqOCXYLduhP9baFSIeHK1EUfAFFtpfYlgAJisThHyiemNscvnf03rfQQDvsXDamcogjr9Mr8tGeXAAJcitL5mEo2PKgys5ptTe+nE0PzJxaAdOKFHbOAzjAv0gXiPmKVPI7rH5nt9/qfmDgdVHDyNP5NbazZ83qHrlszrK1mUaPRFHwdavPcThqNy1sy/9dpcjyEovHZR3OJhv4jPfgkpH811PshcB+FHFmOAapw//xcBzk4ixIhPERU8XlAYfnuVxEGc25qTzpKabFpplSacmz+CPZY75CnsB9OKNIiXSD6HTZwbIUidhva1qGxMTZKzYmFewIEgvgjOIcbjNK/Yv1I6SKsrOx85AIUqbhEm5g7GA8PpTjpmUV0Vny4ThfdQomru78eO1fwgp6jiJW58WfhMy0cVY40Fwv30E7oTFf0Yxyt8XvHN1sdd+Yj7Zs6AxeX1GuUHyl2NBE41DhbcWZ5sh8BLnDZyEfcADbQZFge8alEahHGCLfhIKqynsAxMZQKLRRVVmXJCk9QnQGQyEDQhoJwElp3RUl73p5RNlcfK8nbhqZbNCq3rAhSWS100ArpgNCXgkPsuKkNqtnZa7tm/PmdBWdFU7HmeNDJAbJln0KPdCeiNXnHB/o8Jyb61jD5IBj9btITzp1wFejURR7yepz/fH7jlV/SLZMrQcUEMzcZKcl8XoBrBb/2z3NJmU3/GwYXFpiUvipYFeWY9c7ylEeH1AUNK2BDgYwE4oue+EM/5/0bpA/0GBiMikUK2t6zOkeJtRLAq3e2/OV7SDvnokoWt2ORPkCf+InWKxJAcBZ5mrHJBQhjm49tPXHnDZCFQ8zDgNJQpCwE10xpnr8L3BWuQBnlZfSuX2tu7bKIJXPQVK4zF6HA0+FjQvT7NbZBu05Xc4odkEBg2JUm+rtj+IzmxtzejUOofMC9qZ2PYq5xes8Cv/pM1hYehBPBdZ4btMzGA+J+y5tPGInbMCf60XWPyDeIXJF2Ssmd8O8Fqf3v7mqHxW8V7Hzrsa3OyQo8jNs22KccV5DLfDBTZt6X1g+17c60f1IJKislPfnnFnwR3UalAraDZYLhBTxMM/scZkD9sZApjey+FyX4aS2d6Ch6ahsKc2RIO6OR/Dtb7acFe+K3p45AQ0WG7FAHfRkJMj9W87APuZqO1kfJNyrG4gh83EnJbreb6+TmdTIYh30ge0mKfIr+M9dHGjx3KVlSiVbntmzZ49pc7R9q6Vu+jGRAMvw7c9TFN0PO/p+ZaXK3diej4SA9/EckaULO0YZ6gU4Q8AuY6oVeuiSlroLBMAl9rBpsWn/dN16wyN9leM2fA7hANxmT8Nf8dCaacNoR91cZafIJbG+QS+HNnXN1dvWqPvEHwd/AyfXe1wPh5eKNWBIA0FQ6KJav73WwCQSa6bFfFWG/8gd5nrH0Ra//bxmq2dponvU+e0TsdyTSK59rV5nrb/B/YaWuoVg7+EPnIokfaCVOLIJ6x9wOl29oDAwWSoteXHfhbZDontJmmHxuHbHkf4+fLvZsUswTiuXGZEESVtpqK5YGHtfvPOyru4f5yybqz+TwYQJnILSxQ3diyqfEw+FTxIChS7FH8o0aqRMeyn9fCAoOB4wqR11GB/qEfd3MrZkRYN7PX1F5uBgNP6fwqSLsVx5pDzcjH/tgyqJD02zztYNqBs1QlmGA9EZOBD5UpXG0XemxMVpIAGJQf36Do4XWqIkJgQRTyotJYLEGGKKN9b/EJz7+mHppfro7la/KDFKcWNHo76o+fcfcpIQaCSrWVTjKi+v+ifJ9AO/x3M2VLRtFfi/oZhEBnqcG0to55wPKNhAbpwoyqUc0YCR/MxTFdv6geItDkReq8/1Pj4QIsq72OG/xffdQqhlHGBnLLQXnjfJEpuQZPlh70RfpILVbz8EJIkWcmJt7D7DBhw4cJajCDBlZaMPxV9ufEjA620OTyCRLrRsju9/Fp/jVABOLhpbVhMFe39NR+8TWttXECQhkGPM1CVTDx1vmPgMRfhIUIx+ofHJ7iOAX42HhpQVAmynu5FbM8JkYbtt+UiPSNcgsvMBi207JFvgGIjwEm+9cg2ARHGcYytbJ0LsoKX2/pYB5GhVUV5Fs80E+iwB2avZV6DIfUR4vyQOmm1ND9U12doVST5FAExFgrzTxdQ/UTYFre0sGJIQKBYrPrh5JpPyRJIcjklBsw7OJgemWr5FJXyv4a1SFB5KSpQ5eHhES9lZS2w7mU3KU6yf/hFGkAn1yGZ703uxJ8nMXzaU0G86YEUSalDk9tW6a2vane1x86+0OXy04JJ2MJKCIgmBNh2RKMfgA6Qp9Fdp3QT4zXwBdydaC5/eNL18tDy2GIcqy+AgKCLNI6nKWbzOX5YYFTJFGqRUC8HOaR5g9RBdEqYN4ERL9pMNcgXNRhn7s8dDwZGEECXKsUgU+pgOUX5mrrafjse/xvtytDRmoFlKEVkB2C1+19xErtazG22TjAblZuAwL/714vZmm/uugWfxtyTbtOSDGrBfsG2JJIQ+opjqZQMA/EL/HeA6nKIXDPTEoyVjBaRiJPocASXYp80+x+9a7d5/kEJNZjm1bsd+EmcnI0HIR6gk3nURJynP/IFUsPjtJmDSVRqqLs+89fFRsCQhEFGmLZj26zFV455PGZFlMEZxQ8lf2ADzC5lJtPuaMutREWljJAf+nNnr+M7qd63GI0VpqUp6hWDtvR2dxwzcOK5ZZBtTUabQHpiWjdpFGbQ5KQqaJAQyNJz8qG3exJ2VJfiwzDovPwJHtXkBW9OCvhNCqPcA8EHLzEVkHdtFX0lBaeo6hThoxYDg6lE9hGK1pXTVxbu0rf8heEG6DU2FgicJgQLK1Xidh1UA84cDcusAjmp31TXVtfSZrFDEFavPuTDJMvPWAlri/CdTBWUkfk8IWCe4OiJiai/2wN65O1kko3i0B0sgAuUB/u7uHw5fMWfwZqGp2k7u3QcmuZaWml/G/+/pQJtnQS4tgocFSQi00z7b5zjQyKANZxQ9MaTIL/oRlI0P6tt06gH1DAOTaHe/OgdN7cEOuEoA+wE74EbasQTayBJkih9encl1h9xErs7rf+y9LYG5yev4erHvw9QlU41j5UnTJYnNBCHqkDi0x5QHcVQ8sKp75VnxUrBZfI6jkcwXDb6EfYzP894QhF5otXo+2Xw+9a5YRhg2JCGQ26nF45oLEiNbrpTptGNACVPJG/HP9IFMYSx+1ynYeTNNyUCsexWY8KlCLBe0A9zm+V+yUS1iTqPszphEo/l0AOyYDPBzNizpRXNIZb/TEwsg2klfjr5upw2+ujp5JufsYGDhiDc/ybxd/bAORd4zm21NT8b70up11gDnA126V+GDvqy1temxfPmQxGJYkYRAvuj1HtchshQ2oUgVwS8GcAPqJwHydQ/fx9r4PBLlIeyZv9PbBiTGf5AYD27cFHxu0A5zilEtGsWFXi1958IKaqnsxDmHxAt66Z3haPa6ItDquSXTThR1jmujF86+l9Q3WmdwWT6JRczWtbgIJ8Pfe1jo/HabJ27AOEoPARKQAr75dxWC3b+mo3d+eId8iNJrDzuSEMjE2eJ1ngAcyKRa6whs5ABPT1tg26/PJGF98Nvfj5bHUiwqTXZHSA43Y6Hrm62eltSltYO8JfFAu89P1TxQo5ROrmyQOK3KhZe+RyW/WrwbCoaOa3F4X8t2J4qKpxQSdrlpselCqcR4AkqPp+kUd6mNb2Bvn58sqn+t2zbFoCikP/VFsyHHu+ObbY3/TLP5WcOwJAmhucH9jMXn3A0ArtZ+Few6plr5G46QR1IHoBhhdX77YQqTyLckSWoC8YYagnOz4aSUCtGIg0voVbOo5syK0sp5OMPQSE46VOyAsBpH2Vu+7ll5Z6LUytlE1JfjNn4Nv72+vuFQHHB+T8mBUlz2jirU61tbvc8mm+EsfvsMJAjZZPXtqK8O9QbntDi9b2Wp+Rlh2JKE0GL3XGv2OmgW0OoXQpiH+gmZMNxAH8gwzuRucEiK3MwG6zkbsSNe2tLhuTPXvvfxEI2GTsugj6GIOR5FTMpLWRFSxWebPl27PBshPPUi2tkpJvMLZHCICv8xEBEyaXaRcED5jJE1sRDPB+ze5vBslGCGI/3HbJLPAiaRY1TfgsY3SCwzEiRrSXgyxbAmCf0A9S/WHy+PKJ2Ko9oe2q+EP1h9jjf7jCDJVRjlYRNI4eiGu0QLvSpC7DeFEo8LRcxVjJZ0+5DjFR0twDa9iYc3ExZIMHfQLrypyX6o2aTQQLV7zFedoWDwIBQdC4YghGFNEgIFjcAOPg87+Aqm3TSBM+BP4nUH9JEAj+/VeJ37lQOE3T2/7vn8vHyIMdsSwnHCRpQdj7M/xfOdOqiAKk4J61YFhmFPEgJ1cIvPcUbS3CSDUYnE+vdMn2PWy7amNXQi6vV4Rk4auQ3D7HPsCoyfIY8o+y1LlJqDsSf8De6n8tgszdgqSEII5ybxu6woHx+v47KflgL/59QlUx3FWSP7QJ1lf4mLSzjww1lyN9B1Gzp7z81Xu/RiqyEJYX3w2zNGy2MpcvruKQtvQf04w8SHUU4+JhdxZLdFULginKUvlSVyxU69Qi+YuCm6DF6QGDYkodhWVVWSBUelyp7eDf+O54VGS7o4tR+DZWj3OHn67BgAwG/MHgdtcOXEHyEfCK9+cXaqAHYYROR9yuTlU4PBW/KV/s7kddolDldyaZC3YTKs7+7+UXOawKFAQZMkvBNdLv8cu/GhY6qVGajYXRPoaLov2XIs7ahb/M5rgcF1uioDSmnn/LbZ6r4l44bnEWR7Nc448RJZAiJ4acy4TblY5nFZ/qXV73qoq/uH+cviGBJmirC1bqX9l4LDfCTIDL3XC8GeyUW7somCIwntOJftMvownA2OryhXKJ+Ggk/y3109wf0o+oWWe7S0BG80mxTyP5mpp24k1p+wQ62hTFnptD3fQLGmdrxxEtk5JRMviTcnlRhH2nCkP76lwd2WjbopoY4sl51ornL8H9YwKV3DM6HmNnV5NlAwJKFIG6Wl8pkVU6pod7kvz8ZGnD3OCTg89+jRF8j+CMWu45FotIavw74r3KEesHidG2lHX8d1eQWJntVVyvUo1tBSqtaQJpNxpA/gIHA/KslXpKMDUDifivKqg3D0P0aRyynogyEzs0zxVavTszRXKROyhSEnicVt2ZkpxsvKShValYo1I/8ACXKEv8H9djoPkfKiWH2uP+CPGDftXBJIwOFx7EwGnFEe119zbmH1Oo9E0ZOC8E1I43Ii1Kk4Qx9t9TsfVYOhJ1qX+lckMhmhWb1icuWeDEQ9A25HgtAWZlnWoswI9uJwWCwZMpLsu9A2etRI+SpQjJSvxDjg6yUoQx+Vqay64ZOOm3FmokAS01IW7g9S+h+z+pxHdfcGz1zq8n2eSTuyASTHNMbhL/jKRpSXEThpnon6yplmk2O9xe+i4ORfAvmiYJ/AXluF7yfgs6OwroacxcMHNa2o/fnGkJAER+ljR40Mj4aD0peRaXRLa+8Z6lXLMk4KSbZN9R7XKbLE2lk64RoBDjIaFCsq9DevD35381DkfqcIIwZFvgJnNwqikIvfaxRSYHbsiTyFIwsGf+xuzk9VmSGvJKHVqvIy+b6E0U8oa6q96aJsTsFkVo+ixd00cqZ5izJU6K8aLW93ktnnunrjJx2P5sOwMBp+5yJ8ncjiJvwZ3sAf+PWc56HJEvJGElSk90VZ+HkWm2YhBvjQbm22NV6YCyUu+OOmS+WKssNxiNQQVCARYEcO7AEUQS5H0t20LvjdY7mYWUxepwXrOQvJQT74wymdgy4AEwkzBcQDJUbatMmo6o2Anw3khSQo8zo5cCJIXANEJMiTLQ1NF+RqlSNsBOl3nYFixMIs3A5JDnePlsfeYPG5HmUQwrb7VmQy+9U12XaTZflXOGP9SuIw2PBvK4RQtaU96ANtHuPzvg91s7cCbcH7s5WjXQtyThKz1+niHKhzDlTOIxBs+Rdf9p6kt5PRJpYeH49ma+OLSJRn0o0xHAejIglspLPNXsdKVPIX4//SJtSeZS1LW1YmWjGihEOzZlkmy7K0PzBOtmY2RVZ0evoNfwS5qoskhE1dvVeVlSofmE3KKSZ3w/H5csrKKUnwH9lbUuTnWCKCMLa2u7f3VxQySOs9w74IHsfZdSOtzfhR10MKBjvPVuRyWsbUE0RCCyaGswoDOw24kZlNjh4UyT7HGacDRwH634KCAeo2bDv8bmc2dCF8CgWrEkWBTwaKJ4DP9Q58rpeHs6H5XNcHWnv/mOtZJWckiW48kQ96wpi7OHecp2d5ddaSWSNx1KYoG+NwFPmL3jZR7C2Lz3EOANecmyJN0LJpNCsWxPwtIor2dC/sYeq9BiZRbGDayLzGZFIaDlhsO0pPyge9yBlJKsorL2FJzCVQtmpptTc9qlUPodWeEuNIiqTxM7xYS2zYuKBQNla/i/ZODk73HkVkBvztdSntsaBwUPj7UcQbCuBBg48JRbDlKLXMzVUy2pyQJGKYqCTNBxEKMc1LvSavc7LRoFCkjfAus8rU1zNpX1d372klRoUsVVNEIikiFxBCTZl6Lvn17HXUB/ePOTUBxa8AKvUOrTkz9SAnJCkvV45hSWM0ieZWu1uT4kaGdKhH0EPdbIYBIDLKd0iGkmaf6xwObFgYMm5l+LLV7k3L1KgPkd9/kABbzTg01rpts9udvo8zaeBA5IQkwMRByaVw0OQ/QLZD5VOqSPHvt7eiqjzjzbWArfERi89pBQjvZBeRJ+As8FzGm8UCjAm613YGRV44vWn6jGzuYeVIJ4H9kny5oWfNBk1h8it2qSK9xjTwPAdBpMnY5Lu3o/NUQ3XFz/BtsvYWkT2oIQjdn+lNBBMTIeEgDHuMlre7Ed+cpeVepOumWjzKOknClqNTqpIFXG5rHxBmPx7IOhgU48XxvsMHVIuHuLFk9YDaYW40H8KVkqXkE5Hp/YpIiWdbrZ4PMrkBbQGYPY7ZyUvBaajI36tFkceZ51azz/E4ZRtIVCZXq1sJZS0hhCZdBBQDKf7xfUEAfjFtwbRzKHdJes3bAsqEhXKsw6AoFJ0xaWbfIjLC+q7u3oxziJg9DXUazIskLkvkqZkyKAgAexcYf97qc5zvtzXdFq9M1klCxn/RXOtxw4biVJlyJIkmcDk6SZHtq6t2OBaPD6XZzH4gRQ+JYo7Goo1rW1ZERiAl5DitnqXJIBg/X8ueE+qa82oW1ZwWjYKZ+H5CvI9lUTjht1r9zkq/1X3FwDK5mklotogbelTLylTtaAf5fyTNkgTAr521ZNZz2fKPJqIcsNg2s6xUfh7vPisb9ywijF5VqCeiOPNi6qLJYfa4GrjEDtVYvKy8fBS5bydfbgYRk1MTLscZZe3AGSUnJBFC/Qd24vgkEZBSH5FATNWwRz2+xDiSMrUem0YT44J2bacumWodb5x4C9ZPQeqKG+WZ4dNgiB3dam/Sbac1EGQFbFAqdEkOoPLdWCqSMNbfJAr4zRav85PmBvdmY9ickOTrni8WYEe7iczLB34nQKT0ORcAIzT2zmOQ+W8kkiXTQTRI3Vlmr3MRB7i3qNCnBRRxxG0bOtfekErc0YLIYlAlxRzQJwoDVKQqIkJSKfR3SODA4cF6j2tFNP5ybkhCHc3ic1yGot4jg1sFSVIcRMCBrddcGTLf6nWu8ze4H9bVyBQINLgbaxfU7mGoqriAwg3hqZQPvAjK0xhObnRTtmypwntlu1Q+QTni9V5LKflSFuLquDhOq2Nkid2Lx7BolzPbrRa79zGzx37EwNTSSJzdUl6sivfDmQa1gWPZByw+V2WzrfHWNJqaENGl6mvNS8z3cKPxPGz96SxxLNttGR8IJIe6qeuhaB6TrICiwoyZEjaSTcvOTqV+lAIoLSTy3zkEpRQrJR7KGUloVxXlyOMMSvmyLRaxjOidUikOrPW8a652fMPi+MAnAP6v7BaLz7lH58a1Z2Vjiu/XnkgKt0vqX6z/o1xeeizWRmT5WTbrxdCg7wAAIABJREFUGIZAUUQ8iwroswG79+VsRz2h1HDV1QqlFt8rzVt0btq09hUN5RLGZhPAaZ8udyQhkDfZ7Eaby2gI70FEbK+A1VII/mT+zeRMZfU7cQSBc/TUh7PUiRXlVTNQnjw2mjsjq4i2mUxq7iZ3ZGTmsVjrL/HzztmuqwARQha8xgTzhFT2r/b2plc2O5Zl2aPU7HP9lkvsDpbEzUIDnk81WFI/lEeUJQzJirKMnTa1c+6ZSFv+WFEdKMbF+HFPfJVIFSUUCOLRZNd1dQdvLTEq8cINpcKeKE+SQ86NPR0bbtCyu58OoglKX+ecn1fvaZiOhDlIoNwMkZFpawjc0C3IqY28LZnaGgxubOkXf1m3hpAalibLT0Ay/JUPENHTgBrqDd6UqhBKBbQCm6x/caYYD8qLj3uzs/nLGq+zrgJ1B/x4BI74tLyalCS08YQd/Y/kWJNGlQpedwUq3cfiiH9Jq937TK6CoEXv+3r0dd30punlI/h2NZyzmcDgAOxk+2BbaFWmkJeT1+E/8S428D9hYrDQ6193f/lWvtJRhEf0irILQDaez/RF3IwPIe7S5FvC4bRURfCZHJC3aCnRBDlHWr3OU7Bxt1JwiGZrozvZNd93rLpxTPW4OWlv7gGbhFr90yav4wKs75qWhqZ/5TpiYNT6tDn6CmOmz1GNv/weKuNTeWQPiHzaJ7HIkmZlLtsTBZnvrMbe84UQ7Aus/3N8CJ9xpn6ysSv0Xi69+pIhrJhXy6ehyEOrh0k3j3Xgv993BC9NVcjit9uASRpiRYspeQ9O529w34/i10tMMfyOL+DeZMEcyDar1m8/wsAk8mRLJ6xnGDga7IuHhWav4y2cWW7p6Fj9bDbsvrQimkmrNfrqh9oFtaVihHF7hcP2IMvVQqhVAHw0/jgVqDmWYuPLcTZSAMIiXMzvJYjsNNJ34ZtuEIDyt7oBr1mngugQeBRc/U7t3fTdsjnL1hZSONHZPsf2BoDTxlQrFAtNb876ZPhOhNjP+1KQJwIF4zCbHCnFsQhg1JBEcCTxCw9XU2PZvORlyV2z3m93ykwiz8SUeywpsDcH/viY6vE3WXyuB4MQejidgATZRFRn+jz6yg0KJCC1CUVuicMpRuBHMv26Zip0qEKdE7A3pUwEa6p3kJi1f6pyUfQMacDsZLm9Y0Hm1eEHDNCII2s2wu+Mx5H5SoVJFGjOh53o8WDnpn8Ol4iCwwl1fvtERUhkrHosEiT1HllaEF/1BoNz2hy+d1KVxAF3qgySxlkk7I//zZBHldeKlgb3p7Xu2gMMSsXf8aMjS7fl4Z1czuwoF99r8TlfwsfyvNrVvTibm2LbGmiPAyRxuGAwDweiGpbYQypjUFAJ0dM9r80V+DpV2YgOpJCnq9YszVTBO8OGJARagkQ95kBzleMifOxXMx0p3zSgNBKjGH4hlZYGrT4Xhb1ZrDLV09rqfVPrrLctgsJHlZZWmjiAA9kwFyS2G8slMyIIoVZ2U+cnHVdric0cdb+g3XtdGQZUIXK7mZgLRBX9P9Z7XItlSdyPP0ZNDqqR8Rc249HMcZpBJW+N1e9qxVErEAqxtq7POt7KR9DsQoVpsakSjCUzUKOsw4+WivIq+g2yrWMkwztMqKc025qWMVvqwmFvRq/jQabfvGXNpk/XeocdSfpAO+o4OswyVTtOxhGL9lLG5rA6WoE5HOs5XJYYq5hS1YWkeRNHsleQOG+IYPCNtT98+14+V8zyhRqvc1Q5V/dmTNqXCTEd54cZONOSvdNQ7PusE0xcv2bN13dofdbhGcRrvwff/lZ3bYLdT4PhsCUJITqr3DtryaynSgwjz8efjcxYMjFl0AoKUzoTlf+Z4Z6iyGxM9fheq9/5Efadd5E8H4IQnwiufhwKSR+3O5u+LqQl2IGYtmCaoapqh0kAfAoIdYpgfBf838jebo8KDjuTh0+4YNZSXOnGJnym93Ru7L1BTxq7yY/aSswTHJST8Yg06lyv9nT9md4Ma5L0IeqdeGXNItsd5eXyOTja0RJfVZ6boVCkDjzuEe5L5BHKJEYzD071GyOxgckoEGhTbzWtmgghVjOVf43KzppQqHddryyvfa3N82M29B8yMZd2GT1SCoYqFYVXgYBqclMQnI2HsOEo7IDt2IF8fpDgtAcV8aoAXkimAT8gOR4MqezWPt8OraC9mAkTwqk+UgSNSAChXhk1bN06SNKH6Chz+fSm6TeM5tsdj+rEGdGOO9Qo6yNQ5GNEqSXXauqa5M0gS0pYqEf9R6AoR7v2P+J0H94sxMK0YdgDEV9xFfAXFNSb8TK6A55TQIRj45JJB71GokgYCcqt8L4qw6/+BCggOvTHJ/gv3r1BwENRSw1dQH11ppFzWsVKLx+NYN5Aq/fOPn1nqyJJH6KmIXejwnaP2dNgwQ51UjS71nCI5k49tyL8gv4ntxz7rxxBbIHhC9IxXkRyPIwdtDGd2ZT0D1OV42KcvSlWdHorn4J93hvq/E1s/VslSfoQ1QNop95PiUxHjFDmcRBHYY+i5JxbbRapYQTsiGIpDmLPiO6uZ/rEGy0rVgNBm4TmajuFrc0kiMd3QmVzKftA7MmtmiSxiKYRo2XABym+sCSVH8qBUco1MvoeDjPM1gKcMUQLEmNhd3fvC5mGGZq6ZKpxvGHSRTJIFO0zk99xdW+w19Hm8L038ItthiSxiI4UYcKQaftIaYyVA7hQsbWj2JIj04ltGIJ9LIB5hVCXqBu6vNky/zH7HIcjQW7O2FRJsPdFqBtnkObP4n29TZIkFlH9ZVH0xWr99h1lAVZgvB71aloZIWVbf3rrbRco4oqPRNhZC1pDEPK32bJrRGr1OVCk4jdw4OYs3O6Frp4fjk8Wv22bJ8lAkNUxHp6IvsK7y7y0tAZ/+Bk409QgcfZhEXfd4a8qZwerkBVv4vNZgY/klc7O3lf07GXogcVvnwFMuoIBz0YCpk6migsDDs89qfawiiRJgaihozv6CoOIw4wle3MOe+K4uTuAwNkGKKuX1sAVwxFrkAjvCQHv4vDwHvard6C3+63NynaOQO4U9fUNcwH4uUiQNFT6uHipu6f39HA0eQ1raEWSpIEocZpZjPchgXI6yvLIXTlXpwDAJGAwUUScxXaCSDBuMm8p1BmI/Ndpw44U6c+R/F8Kpq5kID5SN/V8lG+r6HDOzdLK35pN9t/3i7aTGT4QqrgoNjqjFhRJkkVE5dpXo69BoJWYathxnMHAxzImjUG5fSzOQmMgkpZuNMrwlfi+XESyhFUAHUV4xaYEqUV7jbRszWNeaswrNGDzcSMwsVGEPRbFBuxo64A8FhlbDyrrEBy+D4XYt5Lo/uaLVfxrPRmQc4moSHVCRXkV5bVMlsJDDz5F0eqmDZ+u/Vs6hqlFkuQR0cAKn7NceiEOQ9BiiUHAUahrnIgEyWY8s1eRHH8OtAWfDaexbkjvJkWSFDEkiBLjlwyAYhjMxtkvWyuIFGr1uWAI7m+1N0YCdadJjj4USVJEXkA+HRSfDHW1uSj6HWigSCXZIwaJikvw9eyGzo6F2Y7gWSRJETmDudE8jikGMwfuMnsdc/DUDlm8Pe29NKGO9VLox41NuYxPUCRJEVmD2efYlQuoE8BqgYGJG0qyEbSDEIwEzxPLVQFLhRAtFPMgS/dOibyThAK1QU9Ic5Q+Awt1J1qLr/fbd5EYmxgKSe/r9TcoIn2Q6FTXZP+JRGF5OJsuGOwLjO2HM0b1YHN8XehGfWIl3o/ysH8EqniXgXh7w8Z1b2VbhNKDvJOkhPGHwci1pvRCyJSKOm5QY0lIJwKwS8mxyepzfY6/zstCsJdDKlv+1Ve9bxbKsubWhp89aykXAkaGQPwgqew9JMo39NzZFhP/8rCfixB9OkcQdREK3LAJQFBn39C3FK2C+FZV+eqent7/rTi4+ZtC9ODcesStSEaqSUiaXxFpJk5Qei1+19v4Y71O8W3x2b8pOje9VYytlTmiERKzHrW/UILoDcTWQ5LBUKLhTUkUYBIlBRpRplr9rs9xRKMgZu8Ipr6HI9uHQ7GjXMTwwdZMknig6X8yzjaT8Xho3wqkVFrKkDzfMsE+Ekx8grPSZygKfIry8GchAV9907vyq3xFWC+i8LCtkSQZxiI5xgKD2vCnMH8gHCdkvHES+Z1/R+E08RwFcPgWiUY+KZ/6re57hrLRReQeRZJoA0lsY/EQju0Fm0PrkHk4K5JkK0eRJBlAMMjbWn0RQ4ciSTKBYJ8MdROKyD2KJMkIanEm2QZQJEkGAPJTKGKrx7ZGkjd7g73HZutmq1axj7N1ryIKF9sUSchbT0s2pCKKiMU2RZIiikgHRZIUsU2BghFGY61pRpEkRWwzoKB2o6Wxz1o8LmezvXFQONNEKJIkh4gE6ZbswPiOzbbGvyQrS342pQJcgrO9UHnaDgC4oFhXqlixZm3w36lyk8cD+X0csNiyo6LIu0kcxolwVBZRAirbKECsJ9u0zk71w1wFk9MKSvhZVSVNwH95JyHUkRx4Kf7fIRXERgDxbXe3+sXyuc1fpWtGT7laKqZUns+AU0Y0BSR2Hz4bs9b7FUmSRVDo/9rRjhpJEnMYA8eokcoMFnnGal2TrbHN4Xt/4DWRjLDydaXAT6OwQbFpFMIHDmxMtfJDvcfV0GpvjBuqaGAbTNUOF157hNnrcLJIvK8t96O/fEvyhopyiVn9zg8pJ4cA9e8tDb7WXPt0mJeYt+OK8RDBwYmtqMH/7yd9zQOIuqBwMj+NtLHEKFEipPUWv+stYKJFDUFzcN2Gpe3z2jclqydMjsmVR1TsUnUFfoyN8Vxf73H8jkXiQadEkSQZAjvveM6ZE39Tl7naQamzq+P45nFZUk7A40WxJ80+x77YQZ7Ft7ukqKa0C8RHyQpEO8TJ2IYL8eNEff8F7IpN3hWYdJrZ43jf7HPd1NrR9Hg03V7WYPHbTVjH+dxYciCLJCDSg1FY3sTILVhilxuqK7qQ3OTo1aYK8RoXsDIUCvVIMh/JBPxUANRWTKmirAFxo2ri73VTXVPdiwPTLMRDkSQZwOp3/VOWwukbUv7eAOznLIYkFq/zMJzyn2KRQHTJIVhLsoxPJGujOPFIViIdAtsNx/K/IdnOQRKfGLA1vZ7pLSl3iMz4nUgQe8bt24ISbKwFjxYOEZ9hiUe7szYX4ipZLr8Nj8ekKlgkSSYQ4rMYk+BU+Cnl8Vtqa/oGyfVr4EAJL7U9fxD/jneadA6Tx3EpiihXa76XduyNusFSq9d5tr/BfX+6N0ER6VSZSZSgs+BywOAPdzS277Fma6M7WbkiSTKAECyAFDlXa3kjY3uZvU4D10MQqicEiwaeC+seHvv9WP+JWu+TBowol9yHYs3OgQbPlXp0lUjudPttqPuck8P2ZQwQ7K7aBbV7JdNviiTJACEBK/Q8QMG4HfUXygys57IPmu2Ng/QRczXlJodcEiQGcDnqKkSQK7VegTPcjXgoaIKEAWyKUlV2HL67L1GRIkkyAIUxQtFpDYtEi08JHPUvYDoj7ohocqFY4Mh+Cd7mZD33yRjArkDR639aRC/Ut45CcfLCfDQrc4gHWlpDDyXL01gkSeagUV4TSVgaIalQwulHEpPXWSdxuFbvfbICDnegMv9qMmU+vLxrLLkrn81KE9/g61y/1f00syYvuK2RpKTWbUs7quBGWPv1QJMGHOlXYs+fmXnT4mJdW1uwrS/gczSJJmWYTed368LWvoE8/R4bXYV03Y/pV6aNqMw/he3YO1FgDG40Xsq0DxoDsQaf53/xef6ARwNElrJpxS6deHe0GjiC9U/l14n/+8sC2IL1wW8f12qesk2RhEIMGRQl6X5DMhhYNQXV+1e/k4J9lcO0PEvCKQOiQILMTyOJJiqk4rqu7h/vis0LWP9i/QhpRNnvsOm0Cz1Sx/2mjjNMOh+P1w/8osbrHFXB4RSd7aNnGFBVdlVre1PrwPzts5bYdjIalNNQVJ3Pwmsfmu/56sovew/ecUelShLdRhESG1rntn6fzkbpNkWSnADEdxkmrwpHRBdMtAshVnOAUvyBp1NKAiHUzaIWZdEqMY68QOe9NwgWcjVbPUsHfhEN0nc7ik9unB18TEcqO+ywF8/0Oe592da0JvZ8OYh5+G3qfZ9YCPHnQKvn/DA54uyiRFNYX1bvCe9JNeL7Km2NZA0TdpaOarY1Prr5XJrB74okyRAUqjPNBAI0oj3ULdTLae9k4JfTm6ZfIHfLm0e9EuOI/2P6Mz+dHo8gsUD94l3Uc45BPadJx30rShicySKz0GYAcJfO9vkDds98LaM7meRY/K4TcDjSnMoN23MVX8CfyNRyoEiSTMEhnbCpm4Qqjm1ucP8jUYFYeTmy5+A4VWcdrwYamp7QMnq2NLg9Vp+zkVEue40AgFOxA/5hQAfUp5sJmj+0iz/N1sYXrT7XcpwlDtB4yU9M1Q7S6JJuFqZCkSQZAn/hTp3CVjd2q0MCdrdX6wX1bgflk5+sqxZVPKCnAwrBHkAxSs9MsIO5qoEWTsMzEPlpjJbH7qTj+u8Cdm+bbhEIBA4soJUkyCdBdmJFkgwlsB/2hOMMawT22jsD9kbNBCFwKSzr62pXdzCoq2OsV79bMpqP7WG0PqERgvHDWZQk5XL1GKavke+ko0QLBm/p22iC6XrrGIgiSTJHMHWRGAimyysuAnDovGBlOEe5DpB4h6LMGzpEGRS5hKXvvSSgXA9FhBBpBSgHFa/TMShhm/TMbnFRJEmG4JyWLKWc3Z+MIo3A99B1kRBpBbugFBXY/TSTBHvg7qbFpspoRH5dgwXoWc6NASpARp1PW99qWxwUSVLgUATss9lDSiuAaXZNHYAPdZYHMJQSgdtZT89aZtSxNwkwSWddYXAQu+gUPZM6ZmlBkSQFDg6wdxqXfZFWZUL8j2m2/I+Cs93xb3vr8tY1ZpODslhpHbl3P2CxbYflc32r9VUITl3FBfta3/0HY1sjySeoKt6Y7sVC8Ley2RhNADFFr9KuChE3x2TK6xj7Rq/gyKPuwbSYa/G73sGWztB6aWmJchYeL9NaF5kUGRTll7oaCOxtXeXjYJsiCcrc3wRsjZr8mgsHoF/xVHlaJJEi9k66IPrt1As/tlcrSWjSOt/scfm0rPbVumurFKXiGaZTlxGq8OgpHw/bFEmGKcbpvUBl6aygMdYTCv5o4Iqua7CjV26uNxh6TpLli5KVHwADl9hii8/5R7Wr6454KfnId798cuUvDHIFSQCTdDWOsbWdm9a+pPOaQSiSpNAhwtlsdYFztSedqiRJ1n2dEGLzyN7i8L5m9bnasb21Om5hAICrpdLSS61+1+t4v3eReD8IwUbicULFlCqamfQYYMY0jt2bjdTWRZIUOkCU6tVJKGpIOlUJAfr2fNjgpVw1FJzPZbmd6V8Xp03MmUiYsGmL3vWDOPh6gxA3ZXwXViTJMADk7TeS1G6JSTq3LwD67ZoHHN7lKD5dR7NDFpumF2pIFScmizCjB0WSFD669F4gSZJm05JY9DJu1H2hEIOcr1rsnmvNHns1EuisdNqRKZC181sa3Euydb8iSQodgm3SrZOkuZstMdB9nQAYROKoTdbZVq/zfcbhZpaFXW+NCGGLzm22uv+azZsWSVLoALJx0qmTCP2dPVyVzHVfByyxDZa/wX23yetcJHEgv5Oj8aVv6UwfvhQs9Ntmq8eX7RsXSVLwgK90XwFCr3NW9Do+Ru81qOwn3TFHsYd2/0+Y7XNcbAQ4Dmu5BD9XJrtGJ9bjbHvH9x29f0onqLgWFElS8BD/0zuTgA5X3P5VqeMY6HOzBGCrUpWx+O2zDYyfgaUPZuku5/YHrcItQ5nuqe7uH56K9d3PBYokKXCoAv6rxzKcAABj06uN76D7EqEOipTfByTHDBDSbQBSrU6eEwleEELQUraM/89GrGidYLAShcn/dKr8tWytXGlBkSQFDi7EW3o3DVAESs+HAthPdF4huno2/DfeFxa/83Jg0tV4T337JUIs7A0FL46XpmKoUCRJgWNV78r/jDdO0mNdS4P21HTqAsH21DnifxhP1KEIk8DgOp3V031O8tvcz+m8LucokqTAQUHgrD5nq54gDdjR9+HXcD4whlUyhAPfGSftp6txQgxaSarz2ycqTLomXvGkt2LsiFTR3YcKRZIMA6As/hIO8HqCNIwy19nJD+UNrReMM04yM50RHYUIx8HqB1lIxyBJ9S71bmxZ06TL7z+fGAYkgZymJhsO2NTV+0xZqXIL05OugYeTC2kmCeI3OpvVsWbt14MsbFF92l/nfQhl5mq7B/WYRhBiI4vYkPV7qSB6APhGEWKdIdG7prubrc5XrsfCJ4lIN+7e1gPy3rP4XW6cTeZqvQZ1glNqFtX8SYsVrMVt2RkU41F62oQj19Nvz3t7kCElnq9KzzYRLHidhUH8NFV9+RNBovcKU+RwpjFa4XoPa21TQ7Cktb3Jr0fE1Iq8kwSYkPSs+wtgWc3bN1wBQr2FAddMEsS4ivLKOznnv0sWuod0F7PJcTfTJ2oF8Za3JfhOt61ZBhjFwgHxYCaX2Pn4f3xp9TluWdXzxX2JAnqng/zPJAC6lgSRVNv8TELw25r8Vr9zGT6RWdqvghNMHrtx34W2M14/zLdu4LfTFkwzmCIEOVhnc55oaXB/GrdGJj7U7YeePeyMA8lfxhsnnWpqajiW/FuycdOhELd0rpsXZ5I+oOR5DjAJiaI9+jAA/GbUSGUOimuP40cfqOJrVcBILokZY6rHU5rmVJl/B2Jdt1AvTthGlXmAszN13jPb2F2S5TYUx47zWxszXlLOO0lw3pd0yqy6HYG2VjRbPa9Yfc77sOefpvNS0hN+z+gVzo9OSE9zEEI9P16A7z50frp2ccUuVZ/j7SelVUH2QOLj02afQwRsTQsyudFQzCT6lhnT9NfeWtHT0TnfUF1Rh2+n5btu/C2ebLY1PZSszIqTV/TWe1y/liVGARjK89S0RJA48MesXucH/gZ32lFThkJxH61zFMuJZedwBWWJrffbfy4zqQ0/6re1ShtixZo1QU2R7VvtjS+b3A21KPLcpdPfPRcoFRwe5NfwWemufA3BTAL6zLghrdQGWzVarZ5PcLQ+MDpap5t6TQ/+q3Z3H/T2vIDmAavF6aUYZXWzG22TDAblYBwWaTefgldTpq68zjAUC8xUZ/85vk2Y6iIZ8kqSaJ4NbZmK+pCFCHxbI3C0ftPicc1CJXlxGiniNANFrBZ106bD44X70YJo4O47Y89R1i7ZWD5OiizhVqBUVMFUUQq0qMNBwvcKjv4GEGoZDpLbYTffkUXESwqpmpZrMnA4gw0Hkhyw2EL/rE6dRF2Zo+YMe1B+9xqvc/8KgNvx42+zfHsUTcSfOj9eeyXpGdm8cdQoUrcPSDglnjLiYCTSeSwyM+mBaabPUT0whZ0W5JUkBoO0j95ruIC4pthFRBD1qzjB7HE9waVwCNd0zEL6AWcPXyjELmq1u19Nlb45n4iS6ym+gD9jrrY/QPtAOi6nODC0x7QoZckByCtJgHG9eTY2BNZ63k14PyFW4k3btNcPaaUkSAY1KNZLstDcBuyC6QWzTgEKFYri7AyT12YFJp2Epw5i+rwAyQ7qBcFCD9BSs976UUfaR5JYnZayoIp2f4Nbj11ZP1AKutoFtWcYqsudUVFMEzgLp7AoXJJMftRWMnGCoss+CNGWLCkkPuj78XB/Zi3LDNFd3fqhbEMfouYnZL7u49fYZHO9VCOA74dTA0V+3wlHiQoQzIjHH4UQPwCwL1Co+iikhl5rW+p/IxO7J1liZKaiad4JZeF50Sqfxed6Ev+HC7Vegw9HM6FikTeSTJwg0waYLt9r/Kf+naPmbPWI5n9fFn2lht45PgYk65cCN2stv4llHumdgAR5U98VoiKdevJCEloGNBoUvY443aK765mcNKiIrMJAeQlBu6nMa23BTtaQeb1CFSroSg2XnttFzkkS9Xh7Gt+O0HMdigNPBuYE0kohUER+wUFsr2eDeEa9REu/uleZBgIAdK1wARNp7bnllCRkhm2qtz/M9Ob3JnPrUM8fctGmIrIP7Ky6IjSWCCAFf2EmdU5bYKsYU60cp+caIeB/6dSVM5JE/BTs9+Ij1OvxRm6hf2p2NH+Wi3YVkQuAPtMhDhfyBXxRskWZVBhTLd/BdOq4KkWeSQM5IUnNopoyc739MXx4+lJ3RfDamo5V12e9UUXkDqr4WE/aaCw521Rlv3/agmmnxfNuTIbIKikRRNceCaFr7drgyzqvCSPrJKn326dWlFeiDpJWkvnvRLD7CL0ProihxYZP175ZMaWKZhPNq0coop04pnrcTKvfdeP3a3r/mSpEKSUhLSuVfz5xgjKf6feBIfHk3+mGQc06SSQmkadbOgT5UQ0GDwkUxaxhBzJbwc7+T3x7rL4rgTb3HkPdosfid72PM8wHKGqTjVgXADMIIch2ayc8P6WsVNmZpesEwyiIOLs93WuzTpIeof7GCJzW5vVEA1wfUsXBLQ7v8my3p4j8INQbvFVS5GNYeh3ZgBfthce9YoNVQhbSXRGQeC+2NLh1WEX0R9ZJQl5rZp/jYA58KYtYeSaHYJ+rTD2spaHpP9luSxH5A5nGW3yuB7BfnzLUbRmAjl4InZ7JDXKiuAdsTe+aPa5fcolRXKZkgcr+tWFj74n5ip9URG6xpqN3PopO5GT1s6FuSxS9KKEc1d7g0Z2+IhY5WwImgzuzz3U6B/ZAnK87VEFWpk0PJQt3U8TwAinGFrflQFCMAaZP3M4FelShHo0SSmHncQ/YGh+0+J1TgEFfbu8elK/u7untvK7d2d5RDDu39aHZ2fxlrd9eb2ASbRbq9fnIFr4VLPTrgC07Wa9ybpbS0uK51GyyjxUCvuvu6f3rsjm+tHY9ixg+aLd6vpq6ZGrtOOPEa3CAPJdBy7cAAAAAtklEQVSl6U2YBkgqeULt7pqfTZOmnJMkan59Yq7rKaKwEI2geHG93/6AJKTzUKH/LctdglHynHwBxasbUR9+Pds3L/xYwEUMa1DQCjycYVpsuhxKSg9DHZUCeZNZfaZ5E38QgjWDEI3dIP6RLBZYpiiSpIi8IBpI4hF6UUCQek/D7sDYdGB8FwFsMp7fDgSrZkCRVISBcgGj8NSDn7tQhurAsqsEE1+ByshT9e1AW/DtqM9MzvH/uFCgxBI9EGYAAAAASUVORK5CYII= + mediatype: image/png + maintainers: + - name: JFrog + email: partner-support@jfrog.com + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.7.3 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.7.3 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - apiGroups: + - "" + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - "" + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - "DevOps" + - "CI/CD" + - "Developers" + - "Software" + - "Productivity" + - "Artifact Repository" + - "Repository Manager" + - "Docker" + - "Maven" + - "Git" + - "Helm" + - "npm" + - "go" + - "golang" + - "kubernetes" + - "k8s" + - "rpm" + - "yum" + maturity: alpha + version: 1.0.3 + replaces: artifactory-ha-operator.v1.0.2 \ No newline at end of file diff --git a/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml b/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml index bb8e767..7dc5339 100644 --- a/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml +++ b/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml @@ -1,4 +1,4 @@ packageName: openshiftartifactoryha-operator channels: - name: alpha - currentCSV: artifactory-ha-operator.v1.0.2 \ No newline at end of file + currentCSV: artifactory-ha-operator.v1.0.3 \ No newline at end of file diff --git a/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml new file mode 100644 index 0000000..b3e6df0 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml @@ -0,0 +1,329 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "charts.helm.k8s.io/v1alpha1", + "kind": "OpenshiftArtifactoryHa", + "metadata": { + "name": "openshiftartifactoryha" + }, + "spec": { + "artifactory-ha": { + "artifactory": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/artifactory-pro", + "version": "7.7.3" + }, + "joinKey": "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "masterKey": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "node": { + "replicaCount": 2, + "waitForPrimaryStartup": { + "enabled": false + } + } + }, + "database": { + "driver": "OVERRIDE", + "password": "OVERRIDE", + "type": "OVERRIDE", + "url": "OVERRIDE", + "user": "OVERRIDE" + }, + "initContainerImage": "registry.redhat.io/ubi8-minimal", + "nginx": { + "http": { + "externalPort": 80, + "internalPort": 8080 + }, + "https": { + "externalPort": 443, + "internalPort": 8443 + }, + "image": { + "repository": "registry.redhat.io/rhel8/nginx-116", + "version": "latest" + }, + "service": { + "ssloffload": false + }, + "tlsSecretName": "OVERRIDE" + }, + "postgresql": { + "enabled": false + }, + "waitForDatabase": false + } + } + } + ] + capabilities: Basic Install + categories: "Developer Tools,Integration & Delivery" + description: "JFrog Artifactory Enterprise deploys Artifactory in a high availability environment across multiple pods" + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.7.3 + createdAt: 2020-03-25T00:00:00Z + support: JFrog + certified: "true" + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + name: artifactory-ha-operator.v1.0.3 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + version: v1 + - kind: Service + version: v1 + - kind: ReplicaSet + version: v1 + - kind: Pod + version: v1 + - kind: Secret + version: v1 + - kind: ConfigMap + version: v1 + - kind: StatefulSet + version: apps/v1 + version: v1alpha1 + description: | + ## Overview + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift cluster. + + ## Usage + + An external DB is required. The operator will not deploy a DB but will require you to specify the configuration values to connect to it. + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + Go to the Installed Operators. + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + Open the Operator and click on the provided API: Artifactory HA. + + Click Create New Instance and provide the following parameters for your DB configuration: + + ``` + DATABASE_TYPE + DATABASE_DRIVER + DATABASE_URL + DATABASE_USER + DATABASE_PASSWORD + ``` + + In addition to use TLS you will need to first create a k8s tls secret to store your .crt and .key file into. + + Then supply the value of this k8s secret into the TLS_SECRET field. + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to it on the external IP exposed by the load balancer. + + displayName: JFrog Artifactory Enterprise Operator + provider: + name: JFrog + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + icon: + - base64data: iVBORw0KGgoAAAANSUhEUgAAAMkAAADCCAYAAADjAebGAAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAACAASURBVHic7V0HfBzF1Z83u3un5iLJGGzAdoyDgWDAgIxtSdd0xZiaxEASWiDARw9gei8hQCghhN5CJ4BDMHGMdbqiU7ExpgZCb4ZgTLFsg2Wr3O18792d7JN0ZfeaTvb9f7/T3u3N7oz25j/z3swrshCCEfg1nJvqG44F4HWMCQlPrwQmWgKt3oB6laqyIorYRiHTnzBBTI6ngLGjIqeBAUSOZpNjpdXrvDLg8DyuqqoYuqYWUcTQIEwSU73jtC0EGYSJjMOjZq/jQL6AH6POU0N5bF8RGaDe49pHkthM/G27u4W6eKmt6ZuhbtNwhIwdXzJX2y+hWSMFfmWqtv8Xj3/IQ7uKyBA4+58uS3BX32cj8A6LxzWz2d740VC2azhCrhtl3QcJsqOWwiiEzZ+1ZNYdy+Ys+yHXDUsEi98+Gxi/HlszDT/2oO60Aph6p9/W1DRUbSpIcDhnwJkq4OIsPJ49FM0pFNQ8UKNUTKk6hgl2NHZo7PusmwnxzKqelZd8MOeD7njXyAByhY46RpcYR/4Sj3/LSot1YrbPsb0RpCX4dkTfOdSdDsUecbDJ63S1NLg9Q9GuAsXYOOd2zXsrCgjYR+oqplQ+xOg5xApOAOeOM0wche9+F+86uWNd72tjqpW1+L5SS0VCCAsbIpIYGduXxRAkBpxzQJGRFUmyBV/ia1S/MwAdQ9OUoYfF7/qFxOEZFtXDBwIATqh1225od/o+Hvid/PY83wazx3UEl9jf8fOYVJXhzeKNUHlBD4j/GBgLsjj/KA4M+wxBkwoWgrHX8Jns2e+cUP89VO0ZSuy70DZ61EiFZpC4BIkCFFk6AI+DSUJ/AvZGr7nRvBdXjH9DFriSVym+zKC9GaHd6vnK6nNdhoy4kQ1caRCsqJDGAAmxAIAfv/kzY6+0tIaeYbahbNXQYNRI+Qg8jE5VTgj4Pt75zcwKuAJfo8xyoNlrPxP73014qjTefdQQPJp2a7MAv63xT1av8yVUTC/Ej7/Gl4Sv7pAQFw9luwoNAVvTIqvfebpgMA9//f91bgzOV6/yBYe6XUMD2FdDoVWre1c2x/ui3/QT3Sz8a73f7paF9CiO1QfEfi8EuwFnnfa025ol+Bvcb+PhWLPPcQMwOIKB+lJLg+eVoW5XocFvdd+Dh3uGuh0FgGRiVh/OT7i6Fe9kq9XzAb/GVmcyKSehTHMkztUGlbEHA7bGRzJpabaBo+W7eLhmqNtRRKFDvJtsHxBnhvuarY1PJ/o+IcOiU/O90VcRRQxbbOgMPl5RrvyekfVIf3QIIe5oaQ1ez6yJr9cyDRVRxLDGioN939csqtmjvLxqDgh1Jyagi4F47/uO1cvfnvd2T6rFjIxJYvU5rAz4efiW9JdynLw+wEb8vadjw1/b57VvyvT+abRnlgB+C74tYaq4trnBvTDfbSgUYMcoKy+tPETt7nK3zG1ZO9TtGUqsOHjFRjw8n861GZHE4nedA8BvY/0EPpiOn6YbqiuOq3XbDo+3OZMrWNyWnUExvgR9m2gcnrd4nUciUf6RrzYUEirKKp9iAIdJpSXN+DGJQFFEMqRNkmiH/BNLrBH9zCArfvMS876BOYHv0q1HD0Ax0LJw7C4zBw4PmBvNS2mJOx9tKBRYmiw/Adl4WOQTWCwe10+Lxo3pIW2SgCLTDreSvBDbiRuMZC5yXrr16AMcFudkJZKZxK+j89OGwgBwQ33sZ8HVvfGw1ZIExWz8f/kswVinYGpTwNb0YbbunTZJenrV9wyKRPsqyW3sAU6Y/Kjt0k+P93WlW5cWYB0lEycoO8dvAvwaH+KDfluTP5dtKCgA2z/2IwcYN1RNySXqmmx7KrJ8Dwt71EY6IzCuWn3O+wKtwbOzsYGaNklI17D6nY9gk05IUXT0xJ3kI/H4WLp1aUF5+XcqY+MTkRbwId6DRNon12QtGACri/2ID2b7oWpKrmD2Og9SZOU5Ntg6hOPIeJq5XtmA7y/MtJ6MFPeeNZ1nGKrKx2KDDkpakMP5fAF/MpdejbSUZ/W7yClszwRFpk7cWbkSj5fmqg2FAtQDt+PGkr1jz4FGn6HhAvK6lCWIR5AtAHZmzaKaq6MrW2kjI5LQEi+/xna42STfgC2azxKLXtPMlfb/w+PdWu9t8bsOZUJEXIoBnmy2Ni5OdY0Q6i0A/JGEBYBdYG5qWBhweJdrbcdwBFeMh9Ch/1kxZUgakwNQTAazyX4//qCJCRJBqaKMIKv1zzOpL+N9kqjMdwF26mUQ8TMZGbcghz9Y3JZ/NTubU1oRW/zOi3HkuyEajYLwa7PP8QtUxl5Idl2zrelRi8+1K16WaLaQuSw9Nr1p+r5vON7oTNWOYQsOxww+CT/Nf0NyA7PJQdbNNRqKdvR+8eNXmdaXtR13HOmfx478DgdOexLxRJ5KkI1PT1swzRbe5UyAaQtsFWOqlasHnAa8742c84WpIrY02xovQ7GL9mZuZ3EJC7uOlseSqc2xKf6lYYmIIqtY4ny1vbnRPG64L4XXLqgtNVRVXJs6JANB3LLi5BW9mdaZVbMUWnbDUXrmKGm7hwHgyEEFgNWOqR53J747JdE9FCXcpnhLy1NNbgeJDCmXMf3Wxr+hXL6IG42otAHVNZAsx+DM147E3urs0pAgpHfF7ULcoNCK17/y26LswlBdfiYedkpVTgjxfEtr8OZsbKFm3XaLxBgc8X9l8trfQJHpejZINoaTUSRaiSP+9fGuf/0w3zqLz/kEkuy4gd+pIDQr/tENzAv2XWi7ftQI5TzsNrTKYdzcCsbuMHmd77c0uJu13rPQYfY6XZzDEYlL8BlsGJOkrqlurCKXp1p4oXiLNyNBLsuW/0xODByjItGNOFr/Bzvjk2yAVxjqDNfhd+txJL8z3vW9HZ2nGqrKO7EgyZ5l+PqOCXYLduhP9baFSIeHK1EUfAFFtpfYlgAJisThHyiemNscvnf03rfQQDvsXDamcogjr9Mr8tGeXAAJcitL5mEo2PKgys5ptTe+nE0PzJxaAdOKFHbOAzjAv0gXiPmKVPI7rH5nt9/qfmDgdVHDyNP5NbazZ83qHrlszrK1mUaPRFHwdavPcThqNy1sy/9dpcjyEovHZR3OJhv4jPfgkpH811PshcB+FHFmOAapw//xcBzk4ixIhPERU8XlAYfnuVxEGc25qTzpKabFpplSacmz+CPZY75CnsB9OKNIiXSD6HTZwbIUidhva1qGxMTZKzYmFewIEgvgjOIcbjNK/Yv1I6SKsrOx85AIUqbhEm5g7GA8PpTjpmUV0Vny4ThfdQomru78eO1fwgp6jiJW58WfhMy0cVY40Fwv30E7oTFf0Yxyt8XvHN1sdd+Yj7Zs6AxeX1GuUHyl2NBE41DhbcWZ5sh8BLnDZyEfcADbQZFge8alEahHGCLfhIKqynsAxMZQKLRRVVmXJCk9QnQGQyEDQhoJwElp3RUl73p5RNlcfK8nbhqZbNCq3rAhSWS100ArpgNCXgkPsuKkNqtnZa7tm/PmdBWdFU7HmeNDJAbJln0KPdCeiNXnHB/o8Jyb61jD5IBj9btITzp1wFejURR7yepz/fH7jlV/SLZMrQcUEMzcZKcl8XoBrBb/2z3NJmU3/GwYXFpiUvipYFeWY9c7ylEeH1AUNK2BDgYwE4oue+EM/5/0bpA/0GBiMikUK2t6zOkeJtRLAq3e2/OV7SDvnokoWt2ORPkCf+InWKxJAcBZ5mrHJBQhjm49tPXHnDZCFQ8zDgNJQpCwE10xpnr8L3BWuQBnlZfSuX2tu7bKIJXPQVK4zF6HA0+FjQvT7NbZBu05Xc4odkEBg2JUm+rtj+IzmxtzejUOofMC9qZ2PYq5xes8Cv/pM1hYehBPBdZ4btMzGA+J+y5tPGInbMCf60XWPyDeIXJF2Ssmd8O8Fqf3v7mqHxW8V7Hzrsa3OyQo8jNs22KccV5DLfDBTZt6X1g+17c60f1IJKislPfnnFnwR3UalAraDZYLhBTxMM/scZkD9sZApjey+FyX4aS2d6Ch6ahsKc2RIO6OR/Dtb7acFe+K3p45AQ0WG7FAHfRkJMj9W87APuZqO1kfJNyrG4gh83EnJbreb6+TmdTIYh30ge0mKfIr+M9dHGjx3KVlSiVbntmzZ49pc7R9q6Vu+jGRAMvw7c9TFN0PO/p+ZaXK3diej4SA9/EckaULO0YZ6gU4Q8AuY6oVeuiSlroLBMAl9rBpsWn/dN16wyN9leM2fA7hANxmT8Nf8dCaacNoR91cZafIJbG+QS+HNnXN1dvWqPvEHwd/AyfXe1wPh5eKNWBIA0FQ6KJav73WwCQSa6bFfFWG/8gd5nrH0Ra//bxmq2dponvU+e0TsdyTSK59rV5nrb/B/YaWuoVg7+EPnIokfaCVOLIJ6x9wOl29oDAwWSoteXHfhbZDontJmmHxuHbHkf4+fLvZsUswTiuXGZEESVtpqK5YGHtfvPOyru4f5yybqz+TwYQJnILSxQ3diyqfEw+FTxIChS7FH8o0aqRMeyn9fCAoOB4wqR11GB/qEfd3MrZkRYN7PX1F5uBgNP6fwqSLsVx5pDzcjH/tgyqJD02zztYNqBs1QlmGA9EZOBD5UpXG0XemxMVpIAGJQf36Do4XWqIkJgQRTyotJYLEGGKKN9b/EJz7+mHppfro7la/KDFKcWNHo76o+fcfcpIQaCSrWVTjKi+v+ifJ9AO/x3M2VLRtFfi/oZhEBnqcG0to55wPKNhAbpwoyqUc0YCR/MxTFdv6geItDkReq8/1Pj4QIsq72OG/xffdQqhlHGBnLLQXnjfJEpuQZPlh70RfpILVbz8EJIkWcmJt7D7DBhw4cJajCDBlZaMPxV9ufEjA620OTyCRLrRsju9/Fp/jVABOLhpbVhMFe39NR+8TWttXECQhkGPM1CVTDx1vmPgMRfhIUIx+ofHJ7iOAX42HhpQVAmynu5FbM8JkYbtt+UiPSNcgsvMBi207JFvgGIjwEm+9cg2ARHGcYytbJ0LsoKX2/pYB5GhVUV5Fs80E+iwB2avZV6DIfUR4vyQOmm1ND9U12doVST5FAExFgrzTxdQ/UTYFre0sGJIQKBYrPrh5JpPyRJIcjklBsw7OJgemWr5FJXyv4a1SFB5KSpQ5eHhES9lZS2w7mU3KU6yf/hFGkAn1yGZ703uxJ8nMXzaU0G86YEUSalDk9tW6a2vane1x86+0OXy04JJ2MJKCIgmBNh2RKMfgA6Qp9Fdp3QT4zXwBdydaC5/eNL18tDy2GIcqy+AgKCLNI6nKWbzOX5YYFTJFGqRUC8HOaR5g9RBdEqYN4ERL9pMNcgXNRhn7s8dDwZGEECXKsUgU+pgOUX5mrrafjse/xvtytDRmoFlKEVkB2C1+19xErtazG22TjAblZuAwL/714vZmm/uugWfxtyTbtOSDGrBfsG2JJIQ+opjqZQMA/EL/HeA6nKIXDPTEoyVjBaRiJPocASXYp80+x+9a7d5/kEJNZjm1bsd+EmcnI0HIR6gk3nURJynP/IFUsPjtJmDSVRqqLs+89fFRsCQhEFGmLZj26zFV455PGZFlMEZxQ8lf2ADzC5lJtPuaMutREWljJAf+nNnr+M7qd63GI0VpqUp6hWDtvR2dxwzcOK5ZZBtTUabQHpiWjdpFGbQ5KQqaJAQyNJz8qG3exJ2VJfiwzDovPwJHtXkBW9OCvhNCqPcA8EHLzEVkHdtFX0lBaeo6hThoxYDg6lE9hGK1pXTVxbu0rf8heEG6DU2FgicJgQLK1Xidh1UA84cDcusAjmp31TXVtfSZrFDEFavPuTDJMvPWAlri/CdTBWUkfk8IWCe4OiJiai/2wN65O1kko3i0B0sgAuUB/u7uHw5fMWfwZqGp2k7u3QcmuZaWml/G/+/pQJtnQS4tgocFSQi00z7b5zjQyKANZxQ9MaTIL/oRlI0P6tt06gH1DAOTaHe/OgdN7cEOuEoA+wE74EbasQTayBJkih9encl1h9xErs7rf+y9LYG5yev4erHvw9QlU41j5UnTJYnNBCHqkDi0x5QHcVQ8sKp75VnxUrBZfI6jkcwXDb6EfYzP894QhF5otXo+2Xw+9a5YRhg2JCGQ26nF45oLEiNbrpTptGNACVPJG/HP9IFMYSx+1ynYeTNNyUCsexWY8KlCLBe0A9zm+V+yUS1iTqPszphEo/l0AOyYDPBzNizpRXNIZb/TEwsg2klfjr5upw2+ujp5JufsYGDhiDc/ybxd/bAORd4zm21NT8b70up11gDnA126V+GDvqy1temxfPmQxGJYkYRAvuj1HtchshQ2oUgVwS8GcAPqJwHydQ/fx9r4PBLlIeyZv9PbBiTGf5AYD27cFHxu0A5zilEtGsWFXi1958IKaqnsxDmHxAt66Z3haPa6ItDquSXTThR1jmujF86+l9Q3WmdwWT6JRczWtbgIJ8Pfe1jo/HabJ27AOEoPARKQAr75dxWC3b+mo3d+eId8iNJrDzuSEMjE2eJ1ngAcyKRa6whs5ABPT1tg26/PJGF98Nvfj5bHUiwqTXZHSA43Y6Hrm62eltSltYO8JfFAu89P1TxQo5ROrmyQOK3KhZe+RyW/WrwbCoaOa3F4X8t2J4qKpxQSdrlpselCqcR4AkqPp+kUd6mNb2Bvn58sqn+t2zbFoCikP/VFsyHHu+ObbY3/TLP5WcOwJAmhucH9jMXn3A0ArtZ+Few6plr5G46QR1IHoBhhdX77YQqTyLckSWoC8YYagnOz4aSUCtGIg0voVbOo5syK0sp5OMPQSE46VOyAsBpH2Vu+7ll5Z6LUytlE1JfjNn4Nv72+vuFQHHB+T8mBUlz2jirU61tbvc8mm+EsfvsMJAjZZPXtqK8O9QbntDi9b2Wp+Rlh2JKE0GL3XGv2OmgW0OoXQpiH+gmZMNxAH8gwzuRucEiK3MwG6zkbsSNe2tLhuTPXvvfxEI2GTsugj6GIOR5FTMpLWRFSxWebPl27PBshPPUi2tkpJvMLZHCICv8xEBEyaXaRcED5jJE1sRDPB+ze5vBslGCGI/3HbJLPAiaRY1TfgsY3SCwzEiRrSXgyxbAmCf0A9S/WHy+PKJ2Ko9oe2q+EP1h9jjf7jCDJVRjlYRNI4eiGu0QLvSpC7DeFEo8LRcxVjJZ0+5DjFR0twDa9iYc3ExZIMHfQLrypyX6o2aTQQLV7zFedoWDwIBQdC4YghGFNEgIFjcAOPg87+Aqm3TSBM+BP4nUH9JEAj+/VeJ37lQOE3T2/7vn8vHyIMdsSwnHCRpQdj7M/xfOdOqiAKk4J61YFhmFPEgJ1cIvPcUbS3CSDUYnE+vdMn2PWy7amNXQi6vV4Rk4auQ3D7HPsCoyfIY8o+y1LlJqDsSf8De6n8tgszdgqSEII5ybxu6woHx+v47KflgL/59QlUx3FWSP7QJ1lf4mLSzjww1lyN9B1Gzp7z81Xu/RiqyEJYX3w2zNGy2MpcvruKQtvQf04w8SHUU4+JhdxZLdFULginKUvlSVyxU69Qi+YuCm6DF6QGDYkodhWVVWSBUelyp7eDf+O54VGS7o4tR+DZWj3OHn67BgAwG/MHgdtcOXEHyEfCK9+cXaqAHYYROR9yuTlU4PBW/KV/s7kddolDldyaZC3YTKs7+7+UXOawKFAQZMkvBNdLv8cu/GhY6qVGajYXRPoaLov2XIs7ahb/M5rgcF1uioDSmnn/LbZ6r4l44bnEWR7Nc448RJZAiJ4acy4TblY5nFZ/qXV73qoq/uH+cviGBJmirC1bqX9l4LDfCTIDL3XC8GeyUW7somCIwntOJftMvownA2OryhXKJ+Ggk/y3109wf0o+oWWe7S0BG80mxTyP5mpp24k1p+wQ62hTFnptD3fQLGmdrxxEtk5JRMviTcnlRhH2nCkP76lwd2WjbopoY4sl51ornL8H9YwKV3DM6HmNnV5NlAwJKFIG6Wl8pkVU6pod7kvz8ZGnD3OCTg89+jRF8j+CMWu45FotIavw74r3KEesHidG2lHX8d1eQWJntVVyvUo1tBSqtaQJpNxpA/gIHA/KslXpKMDUDifivKqg3D0P0aRyynogyEzs0zxVavTszRXKROyhSEnicVt2ZkpxsvKShValYo1I/8ACXKEv8H9djoPkfKiWH2uP+CPGDftXBJIwOFx7EwGnFEe119zbmH1Oo9E0ZOC8E1I43Ii1Kk4Qx9t9TsfVYOhJ1qX+lckMhmhWb1icuWeDEQ9A25HgtAWZlnWoswI9uJwWCwZMpLsu9A2etRI+SpQjJSvxDjg6yUoQx+Vqay64ZOOm3FmokAS01IW7g9S+h+z+pxHdfcGz1zq8n2eSTuyASTHNMbhL/jKRpSXEThpnon6yplmk2O9xe+i4ORfAvmiYJ/AXluF7yfgs6OwroacxcMHNa2o/fnGkJAER+ljR40Mj4aD0peRaXRLa+8Z6lXLMk4KSbZN9R7XKbLE2lk64RoBDjIaFCsq9DevD35381DkfqcIIwZFvgJnNwqikIvfaxRSYHbsiTyFIwsGf+xuzk9VmSGvJKHVqvIy+b6E0U8oa6q96aJsTsFkVo+ixd00cqZ5izJU6K8aLW93ktnnunrjJx2P5sOwMBp+5yJ8ncjiJvwZ3sAf+PWc56HJEvJGElSk90VZ+HkWm2YhBvjQbm22NV6YCyUu+OOmS+WKssNxiNQQVCARYEcO7AEUQS5H0t20LvjdY7mYWUxepwXrOQvJQT74wymdgy4AEwkzBcQDJUbatMmo6o2Anw3khSQo8zo5cCJIXANEJMiTLQ1NF+RqlSNsBOl3nYFixMIs3A5JDnePlsfeYPG5HmUQwrb7VmQy+9U12XaTZflXOGP9SuIw2PBvK4RQtaU96ANtHuPzvg91s7cCbcH7s5WjXQtyThKz1+niHKhzDlTOIxBs+Rdf9p6kt5PRJpYeH49ma+OLSJRn0o0xHAejIglspLPNXsdKVPIX4//SJtSeZS1LW1YmWjGihEOzZlkmy7K0PzBOtmY2RVZ0evoNfwS5qoskhE1dvVeVlSofmE3KKSZ3w/H5csrKKUnwH9lbUuTnWCKCMLa2u7f3VxQySOs9w74IHsfZdSOtzfhR10MKBjvPVuRyWsbUE0RCCyaGswoDOw24kZlNjh4UyT7HGacDRwH634KCAeo2bDv8bmc2dCF8CgWrEkWBTwaKJ4DP9Q58rpeHs6H5XNcHWnv/mOtZJWckiW48kQ96wpi7OHecp2d5ddaSWSNx1KYoG+NwFPmL3jZR7C2Lz3EOANecmyJN0LJpNCsWxPwtIor2dC/sYeq9BiZRbGDayLzGZFIaDlhsO0pPyge9yBlJKsorL2FJzCVQtmpptTc9qlUPodWeEuNIiqTxM7xYS2zYuKBQNla/i/ZODk73HkVkBvztdSntsaBwUPj7UcQbCuBBg48JRbDlKLXMzVUy2pyQJGKYqCTNBxEKMc1LvSavc7LRoFCkjfAus8rU1zNpX1d372klRoUsVVNEIikiFxBCTZl6Lvn17HXUB/ePOTUBxa8AKvUOrTkz9SAnJCkvV45hSWM0ieZWu1uT4kaGdKhH0EPdbIYBIDLKd0iGkmaf6xwObFgYMm5l+LLV7k3L1KgPkd9/kABbzTg01rpts9udvo8zaeBA5IQkwMRByaVw0OQ/QLZD5VOqSPHvt7eiqjzjzbWArfERi89pBQjvZBeRJ+As8FzGm8UCjAm613YGRV44vWn6jGzuYeVIJ4H9kny5oWfNBk1h8it2qSK9xjTwPAdBpMnY5Lu3o/NUQ3XFz/BtsvYWkT2oIQjdn+lNBBMTIeEgDHuMlre7Ed+cpeVepOumWjzKOknClqNTqpIFXG5rHxBmPx7IOhgU48XxvsMHVIuHuLFk9YDaYW40H8KVkqXkE5Hp/YpIiWdbrZ4PMrkBbQGYPY7ZyUvBaajI36tFkceZ51azz/E4ZRtIVCZXq1sJZS0hhCZdBBQDKf7xfUEAfjFtwbRzKHdJes3bAsqEhXKsw6AoFJ0xaWbfIjLC+q7u3oxziJg9DXUazIskLkvkqZkyKAgAexcYf97qc5zvtzXdFq9M1klCxn/RXOtxw4biVJlyJIkmcDk6SZHtq6t2OBaPD6XZzH4gRQ+JYo7Goo1rW1ZERiAl5DitnqXJIBg/X8ueE+qa82oW1ZwWjYKZ+H5CvI9lUTjht1r9zkq/1X3FwDK5mklotogbelTLylTtaAf5fyTNkgTAr521ZNZz2fKPJqIcsNg2s6xUfh7vPisb9ywijF5VqCeiOPNi6qLJYfa4GrjEDtVYvKy8fBS5bydfbgYRk1MTLscZZe3AGSUnJBFC/Qd24vgkEZBSH5FATNWwRz2+xDiSMrUem0YT44J2bacumWodb5x4C9ZPQeqKG+WZ4dNgiB3dam/Sbac1EGQFbFAqdEkOoPLdWCqSMNbfJAr4zRav85PmBvdmY9ickOTrni8WYEe7iczLB34nQKT0ORcAIzT2zmOQ+W8kkiXTQTRI3Vlmr3MRB7i3qNCnBRRxxG0bOtfekErc0YLIYlAlxRzQJwoDVKQqIkJSKfR3SODA4cF6j2tFNP5ybkhCHc3ic1yGot4jg1sFSVIcRMCBrddcGTLf6nWu8ze4H9bVyBQINLgbaxfU7mGoqriAwg3hqZQPvAjK0xhObnRTtmypwntlu1Q+QTni9V5LKflSFuLquDhOq2Nkid2Lx7BolzPbrRa79zGzx37EwNTSSJzdUl6sivfDmQa1gWPZByw+V2WzrfHWNJqaENGl6mvNS8z3cKPxPGz96SxxLNttGR8IJIe6qeuhaB6TrICiwoyZEjaSTcvOTqV+lAIoLSTy3zkEpRQrJR7KGUloVxXlyOMMSvmyLRaxjOidUikOrPW8a652fMPi+MAnAP6v7BaLz7lH58a1Z2Vjiu/XnkgKt0vqX6z/o1xeeizWRmT5WTbrxdCg7wAAIABJREFUGIZAUUQ8iwroswG79+VsRz2h1HDV1QqlFt8rzVt0btq09hUN5RLGZhPAaZ8udyQhkDfZ7Eaby2gI70FEbK+A1VII/mT+zeRMZfU7cQSBc/TUh7PUiRXlVTNQnjw2mjsjq4i2mUxq7iZ3ZGTmsVjrL/HzztmuqwARQha8xgTzhFT2r/b2plc2O5Zl2aPU7HP9lkvsDpbEzUIDnk81WFI/lEeUJQzJirKMnTa1c+6ZSFv+WFEdKMbF+HFPfJVIFSUUCOLRZNd1dQdvLTEq8cINpcKeKE+SQ86NPR0bbtCyu58OoglKX+ecn1fvaZiOhDlIoNwMkZFpawjc0C3IqY28LZnaGgxubOkXf1m3hpAalibLT0Ay/JUPENHTgBrqDd6UqhBKBbQCm6x/caYYD8qLj3uzs/nLGq+zrgJ1B/x4BI74tLyalCS08YQd/Y/kWJNGlQpedwUq3cfiiH9Jq937TK6CoEXv+3r0dd30punlI/h2NZyzmcDgAOxk+2BbaFWmkJeT1+E/8S428D9hYrDQ6193f/lWvtJRhEf0irILQDaez/RF3IwPIe7S5FvC4bRURfCZHJC3aCnRBDlHWr3OU7Bxt1JwiGZrozvZNd93rLpxTPW4OWlv7gGbhFr90yav4wKs75qWhqZ/5TpiYNT6tDn6CmOmz1GNv/weKuNTeWQPiHzaJ7HIkmZlLtsTBZnvrMbe84UQ7Aus/3N8CJ9xpn6ysSv0Xi69+pIhrJhXy6ehyEOrh0k3j3Xgv993BC9NVcjit9uASRpiRYspeQ9O529w34/i10tMMfyOL+DeZMEcyDar1m8/wsAk8mRLJ6xnGDga7IuHhWav4y2cWW7p6Fj9bDbsvrQimkmrNfrqh9oFtaVihHF7hcP2IMvVQqhVAHw0/jgVqDmWYuPLcTZSAMIiXMzvJYjsNNJ34ZtuEIDyt7oBr1mngugQeBRc/U7t3fTdsjnL1hZSONHZPsf2BoDTxlQrFAtNb876ZPhOhNjP+1KQJwIF4zCbHCnFsQhg1JBEcCTxCw9XU2PZvORlyV2z3m93ykwiz8SUeywpsDcH/viY6vE3WXyuB4MQejidgATZRFRn+jz6yg0KJCC1CUVuicMpRuBHMv26Zip0qEKdE7A3pUwEa6p3kJi1f6pyUfQMacDsZLm9Y0Hm1eEHDNCII2s2wu+Mx5H5SoVJFGjOh53o8WDnpn8Ol4iCwwl1fvtERUhkrHosEiT1HllaEF/1BoNz2hy+d1KVxAF3qgySxlkk7I//zZBHldeKlgb3p7Xu2gMMSsXf8aMjS7fl4Z1czuwoF99r8TlfwsfyvNrVvTibm2LbGmiPAyRxuGAwDweiGpbYQypjUFAJ0dM9r80V+DpV2YgOpJCnq9YszVTBO8OGJARagkQ95kBzleMifOxXMx0p3zSgNBKjGH4hlZYGrT4Xhb1ZrDLV09rqfVPrrLctgsJHlZZWmjiAA9kwFyS2G8slMyIIoVZ2U+cnHVdric0cdb+g3XtdGQZUIXK7mZgLRBX9P9Z7XItlSdyPP0ZNDqqR8Rc249HMcZpBJW+N1e9qxVErEAqxtq7POt7KR9DsQoVpsakSjCUzUKOsw4+WivIq+g2yrWMkwztMqKc025qWMVvqwmFvRq/jQabfvGXNpk/XeocdSfpAO+o4OswyVTtOxhGL9lLG5rA6WoE5HOs5XJYYq5hS1YWkeRNHsleQOG+IYPCNtT98+14+V8zyhRqvc1Q5V/dmTNqXCTEd54cZONOSvdNQ7PusE0xcv2bN13dofdbhGcRrvwff/lZ3bYLdT4PhsCUJITqr3DtryaynSgwjz8efjcxYMjFl0AoKUzoTlf+Z4Z6iyGxM9fheq9/5Efadd5E8H4IQnwiufhwKSR+3O5u+LqQl2IGYtmCaoapqh0kAfAoIdYpgfBf838jebo8KDjuTh0+4YNZSXOnGJnym93Ru7L1BTxq7yY/aSswTHJST8Yg06lyv9nT9md4Ma5L0IeqdeGXNItsd5eXyOTja0RJfVZ6boVCkDjzuEe5L5BHKJEYzD071GyOxgckoEGhTbzWtmgghVjOVf43KzppQqHddryyvfa3N82M29B8yMZd2GT1SCoYqFYVXgYBqclMQnI2HsOEo7IDt2IF8fpDgtAcV8aoAXkimAT8gOR4MqezWPt8OraC9mAkTwqk+UgSNSAChXhk1bN06SNKH6Chz+fSm6TeM5tsdj+rEGdGOO9Qo6yNQ5GNEqSXXauqa5M0gS0pYqEf9R6AoR7v2P+J0H94sxMK0YdgDEV9xFfAXFNSb8TK6A55TQIRj45JJB71GokgYCcqt8L4qw6/+BCggOvTHJ/gv3r1BwENRSw1dQH11ppFzWsVKLx+NYN5Aq/fOPn1nqyJJH6KmIXejwnaP2dNgwQ51UjS71nCI5k49tyL8gv4ntxz7rxxBbIHhC9IxXkRyPIwdtDGd2ZT0D1OV42KcvSlWdHorn4J93hvq/E1s/VslSfoQ1QNop95PiUxHjFDmcRBHYY+i5JxbbRapYQTsiGIpDmLPiO6uZ/rEGy0rVgNBm4TmajuFrc0kiMd3QmVzKftA7MmtmiSxiKYRo2XABym+sCSVH8qBUco1MvoeDjPM1gKcMUQLEmNhd3fvC5mGGZq6ZKpxvGHSRTJIFO0zk99xdW+w19Hm8L038ItthiSxiI4UYcKQaftIaYyVA7hQsbWj2JIj04ltGIJ9LIB5hVCXqBu6vNky/zH7HIcjQW7O2FRJsPdFqBtnkObP4n29TZIkFlH9ZVH0xWr99h1lAVZgvB71aloZIWVbf3rrbRco4oqPRNhZC1pDEPK32bJrRGr1OVCk4jdw4OYs3O6Frp4fjk8Wv22bJ8lAkNUxHp6IvsK7y7y0tAZ/+Bk409QgcfZhEXfd4a8qZwerkBVv4vNZgY/klc7O3lf07GXogcVvnwFMuoIBz0YCpk6migsDDs89qfawiiRJgaihozv6CoOIw4wle3MOe+K4uTuAwNkGKKuX1sAVwxFrkAjvCQHv4vDwHvard6C3+63NynaOQO4U9fUNcwH4uUiQNFT6uHipu6f39HA0eQ1raEWSpIEocZpZjPchgXI6yvLIXTlXpwDAJGAwUUScxXaCSDBuMm8p1BmI/Ndpw44U6c+R/F8Kpq5kID5SN/V8lG+r6HDOzdLK35pN9t/3i7aTGT4QqrgoNjqjFhRJkkVE5dpXo69BoJWYathxnMHAxzImjUG5fSzOQmMgkpZuNMrwlfi+XESyhFUAHUV4xaYEqUV7jbRszWNeaswrNGDzcSMwsVGEPRbFBuxo64A8FhlbDyrrEBy+D4XYt5Lo/uaLVfxrPRmQc4moSHVCRXkV5bVMlsJDDz5F0eqmDZ+u/Vs6hqlFkuQR0cAKn7NceiEOQ9BiiUHAUahrnIgEyWY8s1eRHH8OtAWfDaexbkjvJkWSFDEkiBLjlwyAYhjMxtkvWyuIFGr1uWAI7m+1N0YCdadJjj4USVJEXkA+HRSfDHW1uSj6HWigSCXZIwaJikvw9eyGzo6F2Y7gWSRJETmDudE8jikGMwfuMnsdc/DUDlm8Pe29NKGO9VLox41NuYxPUCRJEVmD2efYlQuoE8BqgYGJG0qyEbSDEIwEzxPLVQFLhRAtFPMgS/dOibyThAK1QU9Ic5Q+Awt1J1qLr/fbd5EYmxgKSe/r9TcoIn2Q6FTXZP+JRGF5OJsuGOwLjO2HM0b1YHN8XehGfWIl3o/ysH8EqniXgXh7w8Z1b2VbhNKDvJOkhPGHwci1pvRCyJSKOm5QY0lIJwKwS8mxyepzfY6/zstCsJdDKlv+1Ve9bxbKsubWhp89aykXAkaGQPwgqew9JMo39NzZFhP/8rCfixB9OkcQdREK3LAJQFBn39C3FK2C+FZV+eqent7/rTi4+ZtC9ODcesStSEaqSUiaXxFpJk5Qei1+19v4Y71O8W3x2b8pOje9VYytlTmiERKzHrW/UILoDcTWQ5LBUKLhTUkUYBIlBRpRplr9rs9xRKMgZu8Ipr6HI9uHQ7GjXMTwwdZMknig6X8yzjaT8Xho3wqkVFrKkDzfMsE+Ekx8grPSZygKfIry8GchAV9907vyq3xFWC+i8LCtkSQZxiI5xgKD2vCnMH8gHCdkvHES+Z1/R+E08RwFcPgWiUY+KZ/6re57hrLRReQeRZJoA0lsY/EQju0Fm0PrkHk4K5JkK0eRJBlAMMjbWn0RQ4ciSTKBYJ8MdROKyD2KJMkIanEm2QZQJEkGAPJTKGKrx7ZGkjd7g73HZutmq1axj7N1ryIKF9sUSchbT0s2pCKKiMU2RZIiikgHRZIUsU2BghFGY61pRpEkRWwzoKB2o6Wxz1o8LmezvXFQONNEKJIkh4gE6ZbswPiOzbbGvyQrS342pQJcgrO9UHnaDgC4oFhXqlixZm3w36lyk8cD+X0csNiyo6LIu0kcxolwVBZRAirbKECsJ9u0zk71w1wFk9MKSvhZVSVNwH95JyHUkRx4Kf7fIRXERgDxbXe3+sXyuc1fpWtGT7laKqZUns+AU0Y0BSR2Hz4bs9b7FUmSRVDo/9rRjhpJEnMYA8eokcoMFnnGal2TrbHN4Xt/4DWRjLDydaXAT6OwQbFpFMIHDmxMtfJDvcfV0GpvjBuqaGAbTNUOF157hNnrcLJIvK8t96O/fEvyhopyiVn9zg8pJ4cA9e8tDb7WXPt0mJeYt+OK8RDBwYmtqMH/7yd9zQOIuqBwMj+NtLHEKFEipPUWv+stYKJFDUFzcN2Gpe3z2jclqydMjsmVR1TsUnUFfoyN8Vxf73H8jkXiQadEkSQZAjvveM6ZE39Tl7naQamzq+P45nFZUk7A40WxJ80+x77YQZ7Ft7ukqKa0C8RHyQpEO8TJ2IYL8eNEff8F7IpN3hWYdJrZ43jf7HPd1NrR9Hg03V7WYPHbTVjH+dxYciCLJCDSg1FY3sTILVhilxuqK7qQ3OTo1aYK8RoXsDIUCvVIMh/JBPxUANRWTKmirAFxo2ri73VTXVPdiwPTLMRDkSQZwOp3/VOWwukbUv7eAOznLIYkFq/zMJzyn2KRQHTJIVhLsoxPJGujOPFIViIdAtsNx/K/IdnOQRKfGLA1vZ7pLSl3iMz4nUgQe8bt24ISbKwFjxYOEZ9hiUe7szYX4ipZLr8Nj8ekKlgkSSYQ4rMYk+BU+Cnl8Vtqa/oGyfVr4EAJL7U9fxD/jneadA6Tx3EpiihXa76XduyNusFSq9d5tr/BfX+6N0ER6VSZSZSgs+BywOAPdzS277Fma6M7WbkiSTKAECyAFDlXa3kjY3uZvU4D10MQqicEiwaeC+seHvv9WP+JWu+TBowol9yHYs3OgQbPlXp0lUjudPttqPuck8P2ZQwQ7K7aBbV7JdNviiTJACEBK/Q8QMG4HfUXygys57IPmu2Ng/QRczXlJodcEiQGcDnqKkSQK7VegTPcjXgoaIKEAWyKUlV2HL67L1GRIkkyAIUxQtFpDYtEi08JHPUvYDoj7ohocqFY4Mh+Cd7mZD33yRjArkDR639aRC/Ut45CcfLCfDQrc4gHWlpDDyXL01gkSeagUV4TSVgaIalQwulHEpPXWSdxuFbvfbICDnegMv9qMmU+vLxrLLkrn81KE9/g61y/1f00syYvuK2RpKTWbUs7quBGWPv1QJMGHOlXYs+fmXnT4mJdW1uwrS/gczSJJmWYTed368LWvoE8/R4bXYV03Y/pV6aNqMw/he3YO1FgDG40Xsq0DxoDsQaf53/xef6ARwNElrJpxS6deHe0GjiC9U/l14n/+8sC2IL1wW8f12qesk2RhEIMGRQl6X5DMhhYNQXV+1e/k4J9lcO0PEvCKQOiQILMTyOJJiqk4rqu7h/vis0LWP9i/QhpRNnvsOm0Cz1Sx/2mjjNMOh+P1w/8osbrHFXB4RSd7aNnGFBVdlVre1PrwPzts5bYdjIalNNQVJ3Pwmsfmu/56sovew/ecUelShLdRhESG1rntn6fzkbpNkWSnADEdxkmrwpHRBdMtAshVnOAUvyBp1NKAiHUzaIWZdEqMY68QOe9NwgWcjVbPUsHfhEN0nc7ik9unB18TEcqO+ywF8/0Oe592da0JvZ8OYh5+G3qfZ9YCPHnQKvn/DA54uyiRFNYX1bvCe9JNeL7Km2NZA0TdpaOarY1Prr5XJrB74okyRAUqjPNBAI0oj3ULdTLae9k4JfTm6ZfIHfLm0e9EuOI/2P6Mz+dHo8gsUD94l3Uc45BPadJx30rShicySKz0GYAcJfO9vkDds98LaM7meRY/K4TcDjSnMoN23MVX8CfyNRyoEiSTMEhnbCpm4Qqjm1ucP8jUYFYeTmy5+A4VWcdrwYamp7QMnq2NLg9Vp+zkVEue40AgFOxA/5hQAfUp5sJmj+0iz/N1sYXrT7XcpwlDtB4yU9M1Q7S6JJuFqZCkSQZAn/hTp3CVjd2q0MCdrdX6wX1bgflk5+sqxZVPKCnAwrBHkAxSs9MsIO5qoEWTsMzEPlpjJbH7qTj+u8Cdm+bbhEIBA4soJUkyCdBdmJFkgwlsB/2hOMMawT22jsD9kbNBCFwKSzr62pXdzCoq2OsV79bMpqP7WG0PqERgvHDWZQk5XL1GKavke+ko0QLBm/p22iC6XrrGIgiSTJHMHWRGAimyysuAnDovGBlOEe5DpB4h6LMGzpEGRS5hKXvvSSgXA9FhBBpBSgHFa/TMShhm/TMbnFRJEmG4JyWLKWc3Z+MIo3A99B1kRBpBbugFBXY/TSTBHvg7qbFpspoRH5dgwXoWc6NASpARp1PW99qWxwUSVLgUATss9lDSiuAaXZNHYAPdZYHMJQSgdtZT89aZtSxNwkwSWddYXAQu+gUPZM6ZmlBkSQFDg6wdxqXfZFWZUL8j2m2/I+Cs93xb3vr8tY1ZpODslhpHbl3P2CxbYflc32r9VUITl3FBfta3/0HY1sjySeoKt6Y7sVC8Ley2RhNADFFr9KuChE3x2TK6xj7Rq/gyKPuwbSYa/G73sGWztB6aWmJchYeL9NaF5kUGRTll7oaCOxtXeXjYJsiCcrc3wRsjZr8mgsHoF/xVHlaJJEi9k66IPrt1As/tlcrSWjSOt/scfm0rPbVumurFKXiGaZTlxGq8OgpHw/bFEmGKcbpvUBl6aygMdYTCv5o4Iqua7CjV26uNxh6TpLli5KVHwADl9hii8/5R7Wr6454KfnId798cuUvDHIFSQCTdDWOsbWdm9a+pPOaQSiSpNAhwtlsdYFztSedqiRJ1n2dEGLzyN7i8L5m9bnasb21Om5hAICrpdLSS61+1+t4v3eReD8IwUbicULFlCqamfQYYMY0jt2bjdTWRZIUOkCU6tVJKGpIOlUJAfr2fNjgpVw1FJzPZbmd6V8Xp03MmUiYsGmL3vWDOPh6gxA3ZXwXViTJMADk7TeS1G6JSTq3LwD67ZoHHN7lKD5dR7NDFpumF2pIFScmizCjB0WSFD669F4gSZJm05JY9DJu1H2hEIOcr1rsnmvNHns1EuisdNqRKZC181sa3Euydb8iSQodgm3SrZOkuZstMdB9nQAYROKoTdbZVq/zfcbhZpaFXW+NCGGLzm22uv+azZsWSVLoALJx0qmTCP2dPVyVzHVfByyxDZa/wX23yetcJHEgv5Oj8aVv6UwfvhQs9Ntmq8eX7RsXSVLwgK90XwFCr3NW9Do+Ru81qOwn3TFHsYd2/0+Y7XNcbAQ4Dmu5BD9XJrtGJ9bjbHvH9x29f0onqLgWFElS8BD/0zuTgA5X3P5VqeMY6HOzBGCrUpWx+O2zDYyfgaUPZuku5/YHrcItQ5nuqe7uH56K9d3PBYokKXCoAv6rxzKcAABj06uN76D7EqEOipTfByTHDBDSbQBSrU6eEwleEELQUraM/89GrGidYLAShcn/dKr8tWytXGlBkSQFDi7EW3o3DVAESs+HAthPdF4huno2/DfeFxa/83Jg0tV4T337JUIs7A0FL46XpmKoUCRJgWNV78r/jDdO0mNdS4P21HTqAsH21DnifxhP1KEIk8DgOp3V031O8tvcz+m8LucokqTAQUHgrD5nq54gDdjR9+HXcD4whlUyhAPfGSftp6txQgxaSarz2ycqTLomXvGkt2LsiFTR3YcKRZIMA6As/hIO8HqCNIwy19nJD+UNrReMM04yM50RHYUIx8HqB1lIxyBJ9S71bmxZ06TL7z+fGAYkgZymJhsO2NTV+0xZqXIL05OugYeTC2kmCeI3OpvVsWbt14MsbFF92l/nfQhl5mq7B/WYRhBiI4vYkPV7qSB6APhGEWKdIdG7prubrc5XrsfCJ4lIN+7e1gPy3rP4XW6cTeZqvQZ1glNqFtX8SYsVrMVt2RkU41F62oQj19Nvz3t7kCElnq9KzzYRLHidhUH8NFV9+RNBovcKU+RwpjFa4XoPa21TQ7Cktb3Jr0fE1Iq8kwSYkPSs+wtgWc3bN1wBQr2FAddMEsS4ivLKOznnv0sWuod0F7PJcTfTJ2oF8Za3JfhOt61ZBhjFwgHxYCaX2Pn4f3xp9TluWdXzxX2JAnqng/zPJAC6lgSRVNv8TELw25r8Vr9zGT6RWdqvghNMHrtx34W2M14/zLdu4LfTFkwzmCIEOVhnc55oaXB/GrdGJj7U7YeePeyMA8lfxhsnnWpqajiW/FuycdOhELd0rpsXZ5I+oOR5DjAJiaI9+jAA/GbUSGUOimuP40cfqOJrVcBILokZY6rHU5rmVJl/B2Jdt1AvTthGlXmAszN13jPb2F2S5TYUx47zWxszXlLOO0lw3pd0yqy6HYG2VjRbPa9Yfc77sOefpvNS0hN+z+gVzo9OSE9zEEI9P16A7z50frp2ccUuVZ/j7SelVUH2QOLj02afQwRsTQsyudFQzCT6lhnT9NfeWtHT0TnfUF1Rh2+n5btu/C2ebLY1PZSszIqTV/TWe1y/liVGARjK89S0RJA48MesXucH/gZ32lFThkJxH61zFMuJZedwBWWJrffbfy4zqQ0/6re1ShtixZo1QU2R7VvtjS+b3A21KPLcpdPfPRcoFRwe5NfwWemufA3BTAL6zLghrdQGWzVarZ5PcLQ+MDpap5t6TQ/+q3Z3H/T2vIDmAavF6aUYZXWzG22TDAblYBwWaTefgldTpq68zjAUC8xUZ/85vk2Y6iIZ8kqSaJ4NbZmK+pCFCHxbI3C0ftPicc1CJXlxGiniNANFrBZ106bD44X70YJo4O47Y89R1i7ZWD5OiizhVqBUVMFUUQq0qMNBwvcKjv4GEGoZDpLbYTffkUXESwqpmpZrMnA4gw0Hkhyw2EL/rE6dRF2Zo+YMe1B+9xqvc/8KgNvx42+zfHsUTcSfOj9eeyXpGdm8cdQoUrcPSDglnjLiYCTSeSwyM+mBaabPUT0whZ0W5JUkBoO0j95ruIC4pthFRBD1qzjB7HE9waVwCNd0zEL6AWcPXyjELmq1u19Nlb45n4iS6ym+gD9jrrY/QPtAOi6nODC0x7QoZckByCtJgHG9eTY2BNZ63k14PyFW4k3btNcPaaUkSAY1KNZLstDcBuyC6QWzTgEKFYri7AyT12YFJp2Epw5i+rwAyQ7qBcFCD9BSs976UUfaR5JYnZayoIp2f4Nbj11ZP1AKutoFtWcYqsudUVFMEzgLp7AoXJJMftRWMnGCoss+CNGWLCkkPuj78XB/Zi3LDNFd3fqhbEMfouYnZL7u49fYZHO9VCOA74dTA0V+3wlHiQoQzIjHH4UQPwCwL1Co+iikhl5rW+p/IxO7J1liZKaiad4JZeF50Sqfxed6Ev+HC7Vegw9HM6FikTeSTJwg0waYLt9r/Kf+naPmbPWI5n9fFn2lht45PgYk65cCN2stv4llHumdgAR5U98VoiKdevJCEloGNBoUvY443aK765mcNKiIrMJAeQlBu6nMa23BTtaQeb1CFSroSg2XnttFzkkS9Xh7Gt+O0HMdigNPBuYE0kohUER+wUFsr2eDeEa9REu/uleZBgIAdK1wARNp7bnllCRkhm2qtz/M9Ob3JnPrUM8fctGmIrIP7Ky6IjSWCCAFf2EmdU5bYKsYU60cp+caIeB/6dSVM5JE/BTs9+Ij1OvxRm6hf2p2NH+Wi3YVkQuAPtMhDhfyBXxRskWZVBhTLd/BdOq4KkWeSQM5IUnNopoyc739MXx4+lJ3RfDamo5V12e9UUXkDqr4WE/aaCw521Rlv3/agmmnxfNuTIbIKikRRNceCaFr7drgyzqvCSPrJKn326dWlFeiDpJWkvnvRLD7CL0ProihxYZP175ZMaWKZhPNq0coop04pnrcTKvfdeP3a3r/mSpEKSUhLSuVfz5xgjKf6feBIfHk3+mGQc06SSQmkadbOgT5UQ0GDwkUxaxhBzJbwc7+T3x7rL4rgTb3HkPdosfid72PM8wHKGqTjVgXADMIIch2ayc8P6WsVNmZpesEwyiIOLs93WuzTpIeof7GCJzW5vVEA1wfUsXBLQ7v8my3p4j8INQbvFVS5GNYeh3ZgBfthce9YoNVQhbSXRGQeC+2NLh1WEX0R9ZJQl5rZp/jYA58KYtYeSaHYJ+rTD2spaHpP9luSxH5A5nGW3yuB7BfnzLUbRmAjl4InZ7JDXKiuAdsTe+aPa5fcolRXKZkgcr+tWFj74n5ip9URG6xpqN3PopO5GT1s6FuSxS9KKEc1d7g0Z2+IhY5WwImgzuzz3U6B/ZAnK87VEFWpk0PJQt3U8TwAinGFrflQFCMAaZP3M4FelShHo0SSmHncQ/YGh+0+J1TgEFfbu8elK/u7untvK7d2d5RDDu39aHZ2fxlrd9eb2ASbRbq9fnIFr4VLPTrgC07Wa9ybpbS0uK51GyyjxUCvuvu6f3rsjm+tHY9ixg+aLd6vpq6ZGrtOOPEa3CAPJdBy7cAAAAAtklEQVSl6U2YBkgqeULt7pqfTZOmnJMkan59Yq7rKaKwEI2geHG93/6AJKTzUKH/LctdglHynHwBxasbUR9+Pds3L/xYwEUMa1DQCjycYVpsuhxKSg9DHZUCeZNZfaZ5E38QgjWDEI3dIP6RLBZYpiiSpIi8IBpI4hF6UUCQek/D7sDYdGB8FwFsMp7fDgSrZkCRVISBcgGj8NSDn7tQhurAsqsEE1+ByshT9e1AW/DtqM9MzvH/uFCgxBI9EGYAAAAASUVORK5CYII= + mediatype: image/png + maintainers: + - name: JFrog + email: partner-support@jfrog.com + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.7.3 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.7.3 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - apiGroups: + - "" + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - "" + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - "DevOps" + - "CI/CD" + - "Developers" + - "Software" + - "Productivity" + - "Artifact Repository" + - "Repository Manager" + - "Docker" + - "Maven" + - "Git" + - "Helm" + - "npm" + - "go" + - "golang" + - "kubernetes" + - "k8s" + - "rpm" + - "yum" + maturity: alpha + version: 1.0.3 + replaces: artifactory-ha-operator.v1.0.2 \ No newline at end of file diff --git a/Openshift4/openshift-artifactory-ha/CHANGELOG.md b/Openshift4/openshift-artifactory-ha/CHANGELOG.md index 49b249e..fc38d3a 100755 --- a/Openshift4/openshift-artifactory-ha/CHANGELOG.md +++ b/Openshift4/openshift-artifactory-ha/CHANGELOG.md @@ -1,6 +1,9 @@ # JFrog Openshift Artifactory-ha Chart Changelog All changes to this chart will be documented in this file. +## [3.1.0] - Aug 17, 2020 +* Updating to latest jfrog/artifactory-ha helm chart version 3.1.0 artifactory version 3.1.0 + ## [3.0.5] - Jul 16, 2020 * Updating to latest jfrog/artifactory helm chart version 3.0.5 artifactory version 7.6.3 diff --git a/Openshift4/openshift-artifactory-ha/Chart.yaml b/Openshift4/openshift-artifactory-ha/Chart.yaml index 0538934..9350d53 100755 --- a/Openshift4/openshift-artifactory-ha/Chart.yaml +++ b/Openshift4/openshift-artifactory-ha/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 -appVersion: 7.6.3 +appVersion: 7.7.3 description: Openshift JFrog Artifactory HA subcharting Artifactory HA to work in Openshift environment home: https://www.jfrog.com/artifactory/ icon: https://raw.githubusercontent.com/jfrog/charts/master/stable/artifactory-ha/logo/artifactory-logo.png @@ -16,4 +16,4 @@ name: openshift-artifactory-ha sources: - https://bintray.com/jfrog/product/JFrog-Artifactory-Pro/view - https://github.com/jfrog/charts -version: 3.0.5 +version: 3.1.0 diff --git a/Openshift4/openshift-artifactory-ha/requirements.lock b/Openshift4/openshift-artifactory-ha/requirements.lock index 2f3a482..f05ba73 100644 --- a/Openshift4/openshift-artifactory-ha/requirements.lock +++ b/Openshift4/openshift-artifactory-ha/requirements.lock @@ -1,6 +1,6 @@ dependencies: - name: artifactory-ha repository: https://charts.jfrog.io/ - version: 3.0.5 -digest: sha256:59deb56ee27e8a629a22f48cc051453e774999228ece09c77584d95c8c54ce6d -generated: "2020-07-16T14:29:16.129919-07:00" + version: 3.1.0 +digest: sha256:8cbd890dcfbb9c90b239bbe9a2fa6aef0f6131ebb5efcd32319a5bba819e9aab +generated: "2020-08-17T14:21:11.261071-07:00" diff --git a/Openshift4/openshift-artifactory-ha/requirements.yaml b/Openshift4/openshift-artifactory-ha/requirements.yaml index 13f0413..e52e870 100644 --- a/Openshift4/openshift-artifactory-ha/requirements.yaml +++ b/Openshift4/openshift-artifactory-ha/requirements.yaml @@ -1,4 +1,4 @@ dependencies: - name: artifactory-ha - version: 3.0.5 + version: 3.1.0 repository: https://charts.jfrog.io/ diff --git a/Openshift4/openshift-artifactory-ha/values.yaml b/Openshift4/openshift-artifactory-ha/values.yaml index a9b883e..5e06d6e 100755 --- a/Openshift4/openshift-artifactory-ha/values.yaml +++ b/Openshift4/openshift-artifactory-ha/values.yaml @@ -34,7 +34,7 @@ artifactory-ha: ## Change to use RH UBI images image: repository: registry.connect.redhat.com/jfrog/artifactory-pro - version: 7.6.3 + version: 7.7.3 node: replicaCount: 2 waitForPrimaryStartup: diff --git a/Openshift4/openshift-xray/CHANGELOG.md b/Openshift4/openshift-xray/CHANGELOG.md index 8019f5a..87f3b19 100755 --- a/Openshift4/openshift-xray/CHANGELOG.md +++ b/Openshift4/openshift-xray/CHANGELOG.md @@ -1,6 +1,9 @@ # JFrog Openshift Artifactory-Xray Chart Changelog All changes to this chart will be documented in this file. +## [4.2.0] Aug 17, 2020 +* Updating to Xray chart version 4.2.0 and Xray app version 3.8.0 + ## [4.1.2] July 28, 2020 * Updating to Xray chart version 4.1.2 and Xray app version 3.6.2 diff --git a/Openshift4/openshift-xray/Chart.yaml b/Openshift4/openshift-xray/Chart.yaml index e12b961..5f3b194 100755 --- a/Openshift4/openshift-xray/Chart.yaml +++ b/Openshift4/openshift-xray/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 -appVersion: 3.6.2 +appVersion: 3.8.0 description: Universal component scan for security and license inventory and impact analysis sources: - https://bintray.com/jfrog/product/xray/view @@ -13,4 +13,4 @@ maintainers: - email: johnp@jfrog.com name: John Peterson name: openshift-xray -version: 4.1.2 +version: 4.2.0 diff --git a/Openshift4/openshift-xray/requirements.lock b/Openshift4/openshift-xray/requirements.lock index 567c569..521af70 100644 --- a/Openshift4/openshift-xray/requirements.lock +++ b/Openshift4/openshift-xray/requirements.lock @@ -1,6 +1,6 @@ dependencies: - name: xray repository: https://charts.jfrog.io/ - version: 4.1.2 -digest: sha256:79e535f41be683f61d7f181a094d91f2688df43b7c3511be0c5c3216a6ce342b -generated: "2020-07-28T11:11:46.534466-07:00" + version: 4.2.0 +digest: sha256:5e016b3e02e80668003980f2e0399f152f7d83e39957813db3aa3efa9651474f +generated: "2020-08-17T14:49:47.771127-07:00" diff --git a/Openshift4/openshift-xray/requirements.yaml b/Openshift4/openshift-xray/requirements.yaml index e1c2ab9..b0a88e0 100644 --- a/Openshift4/openshift-xray/requirements.yaml +++ b/Openshift4/openshift-xray/requirements.yaml @@ -1,4 +1,4 @@ dependencies: - name: xray - version: 4.1.2 + version: 4.2.0 repository: https://charts.jfrog.io/ diff --git a/Openshift4/xray-operator/CHANGELOG.md b/Openshift4/xray-operator/CHANGELOG.md index 1e81a2a..e4ff9e8 100755 --- a/Openshift4/xray-operator/CHANGELOG.md +++ b/Openshift4/xray-operator/CHANGELOG.md @@ -1,6 +1,9 @@ # JFrog Openshift Xray Chart Changelog All changes to this chart will be documented in this file. +## [3.8.0] Aug 17, 2020 +* Deploying JFrog Xray 3.8.0 as an Operator into Openshift + ## [3.6.2] - July 28, 2020 * Deploying JFrog Xray 3.6.2 as an Operator into Openshift diff --git a/Openshift4/xray-operator/bundle/openshiftxray-operator.package.yaml b/Openshift4/xray-operator/bundle/openshiftxray-operator.package.yaml index 1b20c08..09eb964 100644 --- a/Openshift4/xray-operator/bundle/openshiftxray-operator.package.yaml +++ b/Openshift4/xray-operator/bundle/openshiftxray-operator.package.yaml @@ -1,4 +1,4 @@ packageName: openshiftxray-operator channels: - name: alpha - currentCSV: xray-operator.v1.0.2 \ No newline at end of file + currentCSV: xray-operator.v1.0.3 \ No newline at end of file diff --git a/Openshift4/xray-operator/bundle/xray-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/xray-operator/bundle/xray-operator.v1.0.3.clusterserviceversion.yaml new file mode 100644 index 0000000..72c92b5 --- /dev/null +++ b/Openshift4/xray-operator/bundle/xray-operator.v1.0.3.clusterserviceversion.yaml @@ -0,0 +1,376 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "charts.helm.k8s.io/v1alpha1", + "kind": "OpenshiftXray", + "metadata": { + "name": "openshiftxray" + }, + "spec": { + "xray": { + "analysis": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-analysis", + "version": "3.8.0" + }, + "name": "xray-analysis", + "podManagementPolicy": "Parallel", + "preStartCommand": null, + "updateStrategy": "RollingUpdate" + }, + "database": { + "password": "OVERRIDE", + "url": "OVERRIDE", + "user": "OVERRIDE" + }, + "global": { + "postgresqlTlsSecret": null + }, + "indexer": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-indexer", + "version": "3.8.0" + }, + "name": "xray-indexer", + "podManagementPolicy": "Parallel", + "updateStrategy": "RollingUpdate" + }, + "persist": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-persist", + "version": "3.8.0" + }, + "name": "xray-persist", + "persistence": { + "size": "10Gi" + }, + "podManagementPolicy": "Parallel", + "preStartCommand": null, + "updateStrategy": "RollingUpdate" + }, + "postgresql": { + "enabled": false + }, + "rabbitmq-ha": { + "enabled": true, + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-rabbitmq", + "tag": "3.8.0" + }, + "rabbitmqEpmdPort": 4369, + "rabbitmqUsername": "guest", + "rabbitmqPassword": "guest", + "replicaCount": 1 + }, + "replicaCount": 1, + "unifiedUpgradeAllowed": "true", + "router": { + "image": { + "imagePullPolicy": "IfNotPresent", + "repository": "registry.connect.redhat.com/jfrog/xray-router", + "version": "1.4.2" + }, + "name": "router" + }, + "server": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-server", + "version": "3.8.0" + }, + "name": "xray-server", + "podManagementPolicy": "Parallel", + "replicaCount": 1, + "updateStrategy": "RollingUpdate" + }, + "xray": { + "consoleLog": false, + "jfrogUrl": "OVERRIDE", + "joinKey": "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "masterKey": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + } + } + } + } + ] + capabilities: Basic Install + categories: "Developer Tools,Integration & Delivery" + description: "JFrog Xray Enterprise deploys Xray continuous security scanner into Openshift (Requires Jfrog Artifactory)" + containerImage: registry.connect.redhat.com/jfrog/xray-operator:3.8 + createdAt: 2020-05-22T00:00:00Z + support: JFrog + certified: "true" + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + name: xray-operator.v1.0.3 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Xray Instances + displayName: Xray + kind: OpenshiftXray + name: openshiftxrays.charts.helm.k8s.io + resources: + - kind: Deployment + version: v1 + - kind: Service + version: v1 + - kind: ReplicaSet + version: v1 + - kind: Pod + version: v1 + - kind: Secret + version: v1 + - kind: ConfigMap + version: v1 + - kind: StatefulSet + version: apps/v1 + version: v1alpha1 + description: | + ## Overview + + Openshift Operator to deploy JFrog Xray Continuous Security scanner into your Openshift cluster. + + ## Usage + + An external DB is required. The operator will not deploy a DB but will require you to specify the configuration values to connect to it. + + Search for JFrog and click JFrog Xray Operator to install. + + Go to the Installed Operators. + + Wait for the JFrog Xray Operator to complete the installation. + + Open the Operator and click on the provided API: Xray + + Click Create New Instance and provide the following parameters for your DB configuration: + + ``` + JFROG_URL + DATABASE_URL + DATABASE_USER + DATABASE_PASSWORD + ``` + + JFROG_URL is the external ip or DNS of your Artifactory to connect Xray to. Artifactory is required to use this operator. + + DATABASE_URL must be a Postgresql URL in the format: `postgres://postgres-postgresql:5432/xraydb?sslmode=disable` + + DATABASE_USER and DATABASE_PASSWORD must supply a valid user on Postgresql. + + Click Create for Xray to deploy into OpenShift. + + Open Artifactory in a web browser to complete the onboarding wizard for Xray! + + displayName: JFrog Xray Continuous Security Operator + provider: + name: JFrog + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Xray Continuous Security + url: https://jfrog.com/xray/ + - name: JFrog Xray Continuous Security Video + url: https://youtu.be/wGzyKlQklKQ + icon: + - base64data: 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 + mediatype: image/png + maintainers: + - name: JFrog + email: partner-support@jfrog.com + install: + spec: + deployments: + - name: xray-operator + spec: + replicas: 1 + selector: + matchLabels: + name: xray-operator + strategy: {} + template: + metadata: + labels: + name: xray-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: xray-operator + - name: RELATED_IMAGE_XRAY_SERVER_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-server:3.8.0 + - name: RELATED_IMAGE_XRAY_ANALYSIS_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-analysis:3.8.0 + - name: RELATED_IMAGE_XRAY_PERSIST_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-persist:3.8.0 + - name: RELATED_IMAGE_XRAY_INDEXER_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-indexer:3.8.0 + - name: RELATED_IMAGE_XRAY_ROUTER_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-router:1.4.2 + - name: RELATED_IMAGE_XRAY_RABBITMQ_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-rabbitmq:3.8.0 + image: registry.connect.redhat.com/jfrog/xray-operator:3.8 + imagePullPolicy: Always + name: xray-operator + resources: {} + serviceAccountName: xray-operator + permissions: + - rules: + - apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - apiGroups: + - "" + resourceNames: + - xray-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - "" + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - xray-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: xray-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - "DevOps" + - "CI/CD" + - "Developers" + - "Software" + - "Productivity" + - "Artifact Repository" + - "Repository Manager" + - "Docker" + - "Maven" + - "Git" + - "Helm" + - "npm" + - "go" + - "golang" + - "kubernetes" + - "k8s" + - "rpm" + - "yum" + maturity: alpha + version: 1.0.3 + replaces: xray-operator.v1.0.2 diff --git a/Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.3/xray-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.3/xray-operator.v1.0.3.clusterserviceversion.yaml new file mode 100644 index 0000000..72c92b5 --- /dev/null +++ b/Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.3/xray-operator.v1.0.3.clusterserviceversion.yaml @@ -0,0 +1,376 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "charts.helm.k8s.io/v1alpha1", + "kind": "OpenshiftXray", + "metadata": { + "name": "openshiftxray" + }, + "spec": { + "xray": { + "analysis": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-analysis", + "version": "3.8.0" + }, + "name": "xray-analysis", + "podManagementPolicy": "Parallel", + "preStartCommand": null, + "updateStrategy": "RollingUpdate" + }, + "database": { + "password": "OVERRIDE", + "url": "OVERRIDE", + "user": "OVERRIDE" + }, + "global": { + "postgresqlTlsSecret": null + }, + "indexer": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-indexer", + "version": "3.8.0" + }, + "name": "xray-indexer", + "podManagementPolicy": "Parallel", + "updateStrategy": "RollingUpdate" + }, + "persist": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-persist", + "version": "3.8.0" + }, + "name": "xray-persist", + "persistence": { + "size": "10Gi" + }, + "podManagementPolicy": "Parallel", + "preStartCommand": null, + "updateStrategy": "RollingUpdate" + }, + "postgresql": { + "enabled": false + }, + "rabbitmq-ha": { + "enabled": true, + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-rabbitmq", + "tag": "3.8.0" + }, + "rabbitmqEpmdPort": 4369, + "rabbitmqUsername": "guest", + "rabbitmqPassword": "guest", + "replicaCount": 1 + }, + "replicaCount": 1, + "unifiedUpgradeAllowed": "true", + "router": { + "image": { + "imagePullPolicy": "IfNotPresent", + "repository": "registry.connect.redhat.com/jfrog/xray-router", + "version": "1.4.2" + }, + "name": "router" + }, + "server": { + "image": { + "repository": "registry.connect.redhat.com/jfrog/xray-server", + "version": "3.8.0" + }, + "name": "xray-server", + "podManagementPolicy": "Parallel", + "replicaCount": 1, + "updateStrategy": "RollingUpdate" + }, + "xray": { + "consoleLog": false, + "jfrogUrl": "OVERRIDE", + "joinKey": "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", + "masterKey": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + } + } + } + } + ] + capabilities: Basic Install + categories: "Developer Tools,Integration & Delivery" + description: "JFrog Xray Enterprise deploys Xray continuous security scanner into Openshift (Requires Jfrog Artifactory)" + containerImage: registry.connect.redhat.com/jfrog/xray-operator:3.8 + createdAt: 2020-05-22T00:00:00Z + support: JFrog + certified: "true" + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + name: xray-operator.v1.0.3 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Xray Instances + displayName: Xray + kind: OpenshiftXray + name: openshiftxrays.charts.helm.k8s.io + resources: + - kind: Deployment + version: v1 + - kind: Service + version: v1 + - kind: ReplicaSet + version: v1 + - kind: Pod + version: v1 + - kind: Secret + version: v1 + - kind: ConfigMap + version: v1 + - kind: StatefulSet + version: apps/v1 + version: v1alpha1 + description: | + ## Overview + + Openshift Operator to deploy JFrog Xray Continuous Security scanner into your Openshift cluster. + + ## Usage + + An external DB is required. The operator will not deploy a DB but will require you to specify the configuration values to connect to it. + + Search for JFrog and click JFrog Xray Operator to install. + + Go to the Installed Operators. + + Wait for the JFrog Xray Operator to complete the installation. + + Open the Operator and click on the provided API: Xray + + Click Create New Instance and provide the following parameters for your DB configuration: + + ``` + JFROG_URL + DATABASE_URL + DATABASE_USER + DATABASE_PASSWORD + ``` + + JFROG_URL is the external ip or DNS of your Artifactory to connect Xray to. Artifactory is required to use this operator. + + DATABASE_URL must be a Postgresql URL in the format: `postgres://postgres-postgresql:5432/xraydb?sslmode=disable` + + DATABASE_USER and DATABASE_PASSWORD must supply a valid user on Postgresql. + + Click Create for Xray to deploy into OpenShift. + + Open Artifactory in a web browser to complete the onboarding wizard for Xray! + + displayName: JFrog Xray Continuous Security Operator + provider: + name: JFrog + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Xray Continuous Security + url: https://jfrog.com/xray/ + - name: JFrog Xray Continuous Security Video + url: https://youtu.be/wGzyKlQklKQ + icon: + - base64data: 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 + mediatype: image/png + maintainers: + - name: JFrog + email: partner-support@jfrog.com + install: + spec: + deployments: + - name: xray-operator + spec: + replicas: 1 + selector: + matchLabels: + name: xray-operator + strategy: {} + template: + metadata: + labels: + name: xray-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: xray-operator + - name: RELATED_IMAGE_XRAY_SERVER_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-server:3.8.0 + - name: RELATED_IMAGE_XRAY_ANALYSIS_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-analysis:3.8.0 + - name: RELATED_IMAGE_XRAY_PERSIST_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-persist:3.8.0 + - name: RELATED_IMAGE_XRAY_INDEXER_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-indexer:3.8.0 + - name: RELATED_IMAGE_XRAY_ROUTER_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-router:1.4.2 + - name: RELATED_IMAGE_XRAY_RABBITMQ_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/xray-rabbitmq:3.8.0 + image: registry.connect.redhat.com/jfrog/xray-operator:3.8 + imagePullPolicy: Always + name: xray-operator + resources: {} + serviceAccountName: xray-operator + permissions: + - rules: + - apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - apiGroups: + - "" + resourceNames: + - xray-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - "" + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - xray-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: xray-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - "DevOps" + - "CI/CD" + - "Developers" + - "Software" + - "Productivity" + - "Artifact Repository" + - "Repository Manager" + - "Docker" + - "Maven" + - "Git" + - "Helm" + - "npm" + - "go" + - "golang" + - "kubernetes" + - "k8s" + - "rpm" + - "yum" + maturity: alpha + version: 1.0.3 + replaces: xray-operator.v1.0.2 diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/CHANGELOG.md b/Openshift4/xray-operator/helm-charts/openshift-xray/CHANGELOG.md index 8019f5a..87f3b19 100644 --- a/Openshift4/xray-operator/helm-charts/openshift-xray/CHANGELOG.md +++ b/Openshift4/xray-operator/helm-charts/openshift-xray/CHANGELOG.md @@ -1,6 +1,9 @@ # JFrog Openshift Artifactory-Xray Chart Changelog All changes to this chart will be documented in this file. +## [4.2.0] Aug 17, 2020 +* Updating to Xray chart version 4.2.0 and Xray app version 3.8.0 + ## [4.1.2] July 28, 2020 * Updating to Xray chart version 4.1.2 and Xray app version 3.6.2 diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/Chart.yaml b/Openshift4/xray-operator/helm-charts/openshift-xray/Chart.yaml index 7b67432..d917f4d 100644 --- a/Openshift4/xray-operator/helm-charts/openshift-xray/Chart.yaml +++ b/Openshift4/xray-operator/helm-charts/openshift-xray/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 -appVersion: 3.6.2 +appVersion: 3.8.0 description: Universal component scan for security and license inventory and impact analysis keywords: @@ -14,4 +14,4 @@ name: openshift-xray sources: - https://bintray.com/jfrog/product/xray/view - https://github.com/jfrog/charts -version: 4.1.2 +version: 4.2.0 diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.lock b/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.lock index 567c569..521af70 100644 --- a/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.lock +++ b/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.lock @@ -1,6 +1,6 @@ dependencies: - name: xray repository: https://charts.jfrog.io/ - version: 4.1.2 -digest: sha256:79e535f41be683f61d7f181a094d91f2688df43b7c3511be0c5c3216a6ce342b -generated: "2020-07-28T11:11:46.534466-07:00" + version: 4.2.0 +digest: sha256:5e016b3e02e80668003980f2e0399f152f7d83e39957813db3aa3efa9651474f +generated: "2020-08-17T14:49:47.771127-07:00" diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.yaml b/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.yaml index e1c2ab9..b0a88e0 100644 --- a/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.yaml +++ b/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.yaml @@ -1,4 +1,4 @@ dependencies: - name: xray - version: 4.1.2 + version: 4.2.0 repository: https://charts.jfrog.io/ From 203e7dae3a2985300c5dbf54d63f1a1537a1a376 Mon Sep 17 00:00:00 2001 From: jefferyfry Date: Tue, 25 Aug 2020 14:13:07 -0700 Subject: [PATCH 03/28] Fixed azure playbook name. --- Ansible/test/azure/{playbook.yaml => playbook-ha-install.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ansible/test/azure/{playbook.yaml => playbook-ha-install.yaml} (100%) diff --git a/Ansible/test/azure/playbook.yaml b/Ansible/test/azure/playbook-ha-install.yaml similarity index 100% rename from Ansible/test/azure/playbook.yaml rename to Ansible/test/azure/playbook-ha-install.yaml From 4fbfb8505b85adb7aab1b254c3f8daf47bdc4e3c Mon Sep 17 00:00:00 2001 From: jefferyfry Date: Tue, 25 Aug 2020 15:14:20 -0700 Subject: [PATCH 04/28] Fixed licenses in Ansible playbook. --- Ansible/test/aws/playbook-ha-install.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Ansible/test/aws/playbook-ha-install.yaml b/Ansible/test/aws/playbook-ha-install.yaml index ba59220..0587e30 100644 --- a/Ansible/test/aws/playbook-ha-install.yaml +++ b/Ansible/test/aws/playbook-ha-install.yaml @@ -37,7 +37,9 @@ db_url: "jdbc:postgresql://{{ AWSDeployment.stack_outputs.DBInstancePrivate }}:5432/artifactory" server_name: "{{ AWSDeployment.stack_outputs.ALBHostName }}" artifactory_is_primary: true - artifactory_license_file: "{{ lookup('env', 'artifactory_license_file') }}" + artifactory_license1: "{{ lookup('env', 'artifactory_license1') }}" + artifactory_license2: "{{ lookup('env', 'artifactory_license2') }}" + artifactory_license3: "{{ lookup('env', 'artifactory_license3') }}" groups: - artifactory From e0c74e4f95a06a6955b9ceee974a7c0f19ec173f Mon Sep 17 00:00:00 2001 From: jefferyfry Date: Tue, 25 Aug 2020 15:47:47 -0700 Subject: [PATCH 05/28] Changed RT services to start. --- .../jfrog/installers/roles/artifactory/tasks/install.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml b/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml index a97d554..b704b05 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml @@ -149,7 +149,7 @@ - name: start and enable the primary node service: name: artifactory - state: restarted + state: started become: yes when: artifactory_is_primary == true @@ -161,6 +161,6 @@ - name: start and enable the secondary nodes service: name: artifactory - state: restarted + state: started become: yes when: artifactory_is_primary == false From 2da3a81e7625271c4f5fce3670cd2299fc2d8c12 Mon Sep 17 00:00:00 2001 From: jefferyfry Date: Tue, 25 Aug 2020 16:32:04 -0700 Subject: [PATCH 06/28] added step to ensure ownership of data dir. --- .../jfrog/installers/roles/artifactory/tasks/install.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml b/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml index b704b05..c1114f7 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml @@ -146,6 +146,13 @@ shell: "{{ artifactory_home }}/app/bin/installService.sh" become: yes +- name: ensure ownership of var/data + file: + path: "{{ artifactory_home }}/var/data" + owner: "artifactory" + group: "artifactory" + become: yes + - name: start and enable the primary node service: name: artifactory From d702466785057c221cd87d20f467d0ecde940a7b Mon Sep 17 00:00:00 2001 From: jefferyfry Date: Tue, 25 Aug 2020 17:58:40 -0700 Subject: [PATCH 07/28] Added xray version check for erlang install. --- .../jfrog/installers/roles/xray/tasks/Debian.yml | 11 +++++++++-- .../jfrog/installers/roles/xray/tasks/RedHat.yml | 10 +++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml index 8aa2a79..6002940 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml @@ -27,10 +27,17 @@ name: libwxbase3.0-0v5 update_cache: yes state: present - ignore_errors: yes + when become: yes -- name: Install erlang +- name: Install erlang 21.2.1-1 apt: deb: "{{ xray_home }}/app/third-party/rabbitmq/esl-erlang_21.2.1-1~ubuntu~xenial_amd64.deb" + when: {{ xray_version is version('3.8.0','<') }} + become: yes + +- name: Install erlang 22.3.4.1-1 + apt: + deb: "{{ xray_home }}/app/third-party/rabbitmq/esl-erlang_22.3.4.1-1_ubuntu_xenial_amd64.deb" + when: {{ xray_version is version('3.8.0','>=') }} become: yes \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/RedHat.yml b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/RedHat.yml index 35792f9..a9fbfe6 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/RedHat.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/RedHat.yml @@ -11,8 +11,16 @@ state: present become: yes -- name: Install erlang +- name: Install erlang 21.1.4-1 yum: name: "{{ xray_home }}/app/third-party/rabbitmq/erlang-21.1.4-1.el7.centos.x86_64.rpm" state: present + when: {{ xray_version is version('3.8.0','<') }} + become: yes + +- name: Install erlang 22.3.4.1-1 + yum: + name: "{{ xray_home }}/app/third-party/rabbitmq/erlang-22.3.4.1-1.el7.centos.x86_64.rpm" + state: present + when: {{ xray_version is version('3.8.0','>=') }} become: yes \ No newline at end of file From e47c8fc3cec2955748f8f8295e0c1cf47fe56b93 Mon Sep 17 00:00:00 2001 From: jefferyfry Date: Tue, 25 Aug 2020 18:20:12 -0700 Subject: [PATCH 08/28] Updated syntax. --- .../jfrog/installers/roles/xray/tasks/Debian.yml | 4 ++-- .../jfrog/installers/roles/xray/tasks/RedHat.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml index 6002940..ea405b4 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml @@ -33,11 +33,11 @@ - name: Install erlang 21.2.1-1 apt: deb: "{{ xray_home }}/app/third-party/rabbitmq/esl-erlang_21.2.1-1~ubuntu~xenial_amd64.deb" - when: {{ xray_version is version('3.8.0','<') }} + when: xray_version is version("3.8.0","<") become: yes - name: Install erlang 22.3.4.1-1 apt: deb: "{{ xray_home }}/app/third-party/rabbitmq/esl-erlang_22.3.4.1-1_ubuntu_xenial_amd64.deb" - when: {{ xray_version is version('3.8.0','>=') }} + when: xray_version is version("3.8.0",">=") become: yes \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/RedHat.yml b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/RedHat.yml index a9fbfe6..a24f774 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/RedHat.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/RedHat.yml @@ -15,12 +15,12 @@ yum: name: "{{ xray_home }}/app/third-party/rabbitmq/erlang-21.1.4-1.el7.centos.x86_64.rpm" state: present - when: {{ xray_version is version('3.8.0','<') }} + when: xray_version is version("3.8.0","<") become: yes - name: Install erlang 22.3.4.1-1 yum: name: "{{ xray_home }}/app/third-party/rabbitmq/erlang-22.3.4.1-1.el7.centos.x86_64.rpm" state: present - when: {{ xray_version is version('3.8.0','>=') }} + when: xray_version is version("3.8.0",">=") become: yes \ No newline at end of file From c32b4c521c3c541265ed3305f3908225d252c850 Mon Sep 17 00:00:00 2001 From: jefferyfry Date: Tue, 25 Aug 2020 19:28:28 -0700 Subject: [PATCH 09/28] Fixed typo --- .../jfrog/installers/roles/xray/tasks/Debian.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml index ea405b4..ec28e0a 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/Debian.yml @@ -27,7 +27,6 @@ name: libwxbase3.0-0v5 update_cache: yes state: present - when become: yes - name: Install erlang 21.2.1-1 From cd8e0debdebd8a003bc51ea04ab10eddf0a34335 Mon Sep 17 00:00:00 2001 From: jefferyfry Date: Tue, 25 Aug 2020 20:23:01 -0700 Subject: [PATCH 10/28] Simplified pipeline. --- Ansible/pipelines.yaml | 56 ++---------------------------------------- 1 file changed, 2 insertions(+), 54 deletions(-) diff --git a/Ansible/pipelines.yaml b/Ansible/pipelines.yaml index 8c22a43..83fb517 100644 --- a/Ansible/pipelines.yaml +++ b/Ansible/pipelines.yaml @@ -5,7 +5,7 @@ resources: gitProvider: jefferyfryGithub path: jefferyfry/JFrog-Cloud-Installers pipelines: - - name: ansible_aws_azure_automation_pipeline + - name: ansible_automation_pipeline steps: - name: execute_aws_ansible_playbook type: Bash @@ -55,56 +55,4 @@ pipelines: - ssh-add <(echo "$int_ansiblePrivateKey_key") - ansible-playbook Ansible/test/aws/playbook-ha-install.yaml onComplete: - - echo "AWS Ansible playbook complete." - - name: execute_azure_ansible_playbook - type: Bash - configuration: - runtime: - type: image - image: - auto: - language: java - versions: - - "8" - integrations: - - name: ansibleAzureKeys - - name: ansibleEnvVars - - name: ansiblePrivateKey - inputResources: - - name: ansibleRepo - execution: - onStart: - - echo "Executing Azure Ansible playbook..." - onExecute: - - sudo apt-get update - - sudo apt-get install gnupg2 - - sudo apt-get install software-properties-common - - sudo apt-add-repository --yes --update ppa:ansible/ansible - - sudo apt -y --allow-unauthenticated install ansible - - sudo pip install packaging - - sudo pip install msrestazure - - sudo pip install ansible[azure] - - cd dependencyState/resources/ansibleRepo - - echo 'Setting environment variables...' - - export artifactory_version="$int_ansibleEnvVars_artifactory_version" - - export xray_version="$int_ansibleEnvVars_xray_version" - - export artifactory_license1="$int_ansibleEnvVars_artifactory_license1" - - export artifactory_license2="$int_ansibleEnvVars_artifactory_license2" - - export artifactory_license3="$int_ansibleEnvVars_artifactory_license3" - - export master_key="$int_ansibleEnvVars_master_key" - - export join_key="$int_ansibleEnvVars_join_key" - - export ssh_public_key="$int_ansibleEnvVars_ssh_public_key" - - export arm_template="$int_ansibleEnvVars_arm_template" - - export azure_resource_group="$int_ansibleEnvVars_azure_resource_group" - - export clientId="$int_ansibleAzureKeys_appId" - - export clientSecret="$int_ansibleAzureKeys_password" - - export tenantId="$int_ansibleAzureKeys_tenant" - - printenv - - pwd - - ls - - eval $(ssh-agent -s) - - ssh-add <(echo "$int_ansiblePrivateKey_key") - - az login --service-principal -u "$clientId" -p "$clientSecret" --tenant "$tenantId" - - ansible-playbook Ansible/test/azure/playbook-ha-install.yaml - onComplete: - - echo "Azure Ansible playbook complete." \ No newline at end of file + - echo "AWS Ansible playbook complete." \ No newline at end of file From b2d8fe15d76145bdbfbb79791cfb398d0e7e8d50 Mon Sep 17 00:00:00 2001 From: Daniel Miakotkin <55418063+danielmkn@users.noreply.github.com> Date: Mon, 21 Sep 2020 13:26:57 -0700 Subject: [PATCH 11/28] Azure xray 3.8.5 (#42) * ARM templates - Xray config script, added value to support Azure Postgres service * ARM templates - Xray 3.8.5 * ARM templates - Xray, fixed bug in MP submission, removed Postgres workaround from README.md --- .../Xray/MP_submission/createUiDefinition.json | 6 +++++- .../Xray/MP_submission/mainTemplate.json | 8 +++++--- .../Xray/MP_submission/scripts/install_xray.sh | 2 ++ AzureResourceManager/Xray/README.md | 12 +----------- AzureResourceManager/Xray/azuredeploy_xray_vmss.json | 12 +++++++----- AzureResourceManager/Xray/scripts/install_xray.sh | 2 ++ .../Xray/vm_install/install_xray_to_vm.sh | 2 +- 7 files changed, 23 insertions(+), 21 deletions(-) diff --git a/AzureResourceManager/Xray/MP_submission/createUiDefinition.json b/AzureResourceManager/Xray/MP_submission/createUiDefinition.json index 80c03e4..d4ca300 100644 --- a/AzureResourceManager/Xray/MP_submission/createUiDefinition.json +++ b/AzureResourceManager/Xray/MP_submission/createUiDefinition.json @@ -123,7 +123,7 @@ "name": "xrayVersion", "type": "Microsoft.Common.DropDown", "label": "Xray-vm image version to deploy.", - "defaultValue": "3.8.2", + "defaultValue": "3.8.5", "toolTip": "Version of Xray to deploy", "constraints": { "allowedValues": [ @@ -134,6 +134,10 @@ { "label": "3.8.2", "value": "0.0.4" + }, + { + "label": "3.8.5", + "value": "0.0.5" } ], "required": true diff --git a/AzureResourceManager/Xray/MP_submission/mainTemplate.json b/AzureResourceManager/Xray/MP_submission/mainTemplate.json index 391dcd4..4d0b228 100644 --- a/AzureResourceManager/Xray/MP_submission/mainTemplate.json +++ b/AzureResourceManager/Xray/MP_submission/mainTemplate.json @@ -19,10 +19,11 @@ }, "xrayVersion": { "type": "string", - "defaultValue": "0.0.4", + "defaultValue": "0.0.5", "allowedValues": [ "0.0.3", - "0.0.4" + "0.0.4", + "0.0.5" ], "metadata": { "description": "Xray-vm image version to deploy." @@ -182,6 +183,7 @@ "publicIPAddressType": "Dynamic", "db_server": "[parameters('db_server')]", "db_user": "[concat(parameters('db_user'), '@', parameters('db_server'))]", + "actual_db_user": "[parameters('db_user')]", "db_password": "[parameters('db_password')]", "db_location": "[parameters('location')]", "db_name": "[parameters('databases').properties[0].name]", @@ -351,7 +353,7 @@ "computerNamePrefix": "[variables('namingInfix')]", "adminUsername": "[parameters('adminUsername')]", "adminPassword": "[parameters('adminPassword')]", - "customData": "[base64(concat('#INSTALL SCRIPT INPUTS\nXRAY_VERSION=', parameters('xrayVersion'),'\nARTIFACTORY_URL=',variables('artifactoryURL'),'\nDB_SERVER=',variables('db_server'),'\nDB_NAME=',variables('db_name'),'\nDB_ADMIN_USER=',variables('db_user'),'\nDB_ADMIN_PASSWD=',variables('db_password'),'\nMASTER_KEY=',variables('masterKey'),'\nJOIN_KEY=',variables('joinKey'),'\n'))]" + "customData": "[base64(concat('#INSTALL SCRIPT INPUTS\nXRAY_VERSION=', parameters('xrayVersion'),'\nARTIFACTORY_URL=',variables('artifactoryURL'),'\nDB_SERVER=',variables('db_server'),'\nDB_NAME=',variables('db_name'),'\nDB_ADMIN_USER=',variables('db_user'),'\nACTUAL_DB_ADMIN_USER=',variables('actual_db_user'),'\nDB_ADMIN_PASSWD=',variables('db_password'),'\nMASTER_KEY=',variables('masterKey'),'\nJOIN_KEY=',variables('joinKey'),'\n'))]" }, "networkProfile": { "networkInterfaceConfigurations": [ diff --git a/AzureResourceManager/Xray/MP_submission/scripts/install_xray.sh b/AzureResourceManager/Xray/MP_submission/scripts/install_xray.sh index 95db4a2..f2195cf 100644 --- a/AzureResourceManager/Xray/MP_submission/scripts/install_xray.sh +++ b/AzureResourceManager/Xray/MP_submission/scripts/install_xray.sh @@ -1,6 +1,7 @@ #!/bin/bash DB_NAME=$(cat /var/lib/cloud/instance/user-data.txt | grep "^DB_NAME=" | sed "s/DB_NAME=//") DB_USER=$(cat /var/lib/cloud/instance/user-data.txt | grep "^DB_ADMIN_USER=" | sed "s/DB_ADMIN_USER=//") +ACTUAL_DB_USER=$(cat /var/lib/cloud/instance/user-data.txt | grep "^ACTUAL_DB_ADMIN_USER=" | sed "s/ACTUAL_DB_ADMIN_USER=//") DB_PASSWORD=$(cat /var/lib/cloud/instance/user-data.txt | grep "^DB_ADMIN_PASSWD=" | sed "s/DB_ADMIN_PASSWD=//") DB_SERVER=$(cat /var/lib/cloud/instance/user-data.txt | grep "^DB_SERVER=" | sed "s/DB_SERVER=//") MASTER_KEY=$(cat /var/lib/cloud/instance/user-data.txt | grep "^MASTER_KEY=" | sed "s/MASTER_KEY=//") @@ -25,6 +26,7 @@ EOF HOSTNAME=$(hostname -i) yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.database.url postgres://${DB_SERVER}.postgres.database.azure.com:5432/${DB_NAME}?sslmode=disable yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.database.username ${DB_USER} +yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.database.actualUsername ${ACTUAL_DB_USER} yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.database.password ${DB_PASSWORD} yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.rabbitMq.password JFXR_RABBITMQ_COOKIE yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.jfrogUrl ${ARTIFACTORY_URL} diff --git a/AzureResourceManager/Xray/README.md b/AzureResourceManager/Xray/README.md index 6c6a61e..766cc75 100644 --- a/AzureResourceManager/Xray/README.md +++ b/AzureResourceManager/Xray/README.md @@ -14,7 +14,7 @@ This template can help you setup [JFrog Xray](https://jfrog.com/xray/) on Azure 2. Deployed Postgresql instance (if "existing DB" is selected as a parameter). ## Postgresql deployment -Xray could fail to connect to "out of the box" Azure Postgresql. You can deploy a compatible Postgresql instance using this link: +You can deploy a compatible Postgresql instance using this link: @@ -33,16 +33,6 @@ In the Databases field, use the object: ] } ``` -Before deploying Xray, please do following steps: -1. Use the admin role given by Azure that you initially connected with to PSDB (for example xray) - Remember the password of this role to connect when setting up with Xray. - -2. Create a new role named xray@{hostname}, where {hostname} is a DB server name. - -3. Add xray@{hostname} membership to the base Azure user. In the client tab (PgAdmin for example) right click on properties of role "azure_pg_admin" and under Membership tab, add the relevant "xray@{hostname}", click on the checkbox on the tag, save. - -4. Change ownership of Xray database. Right click On the name of the database and change owner to "xray@{hostname}" - -After these steps are done, run Xray deployment. ## Installation 1. Click "Deploy to Azure" button. If you don't have an Azure subscription, it will guide you on how to signup for a free trial. diff --git a/AzureResourceManager/Xray/azuredeploy_xray_vmss.json b/AzureResourceManager/Xray/azuredeploy_xray_vmss.json index a495022..e8c4339 100644 --- a/AzureResourceManager/Xray/azuredeploy_xray_vmss.json +++ b/AzureResourceManager/Xray/azuredeploy_xray_vmss.json @@ -19,10 +19,11 @@ }, "xrayVersion": { "type": "string", - "defaultValue": "0.0.4", + "defaultValue": "0.0.5", "allowedValues": [ "0.0.3", - "0.0.4" + "0.0.4", + "0.0.5" ], "metadata": { "description": "Xray-vm image version to deploy." @@ -182,6 +183,7 @@ "publicIPAddressType": "Dynamic", "db_server": "[parameters('db_server')]", "db_user": "[concat(parameters('db_user'), '@', parameters('db_server'))]", + "actual_db_user": "[parameters('db_user')]", "db_password": "[parameters('db_password')]", "db_location": "[parameters('location')]", "db_name": "[parameters('databases').properties[0].name]", @@ -189,7 +191,7 @@ "joinKey": "[parameters('joinKey')]", "osType": { "publisher": "jfrog", - "offer": "x-ray-vm-preview", + "offer": "x-ray-vm", "sku": "x-ray-vm", "version": "[parameters('xrayVersion')]" }, @@ -325,7 +327,7 @@ "plan": { "name": "x-ray-vm", "publisher": "jfrog", - "product": "x-ray-vm-preview" + "product": "x-ray-vm" }, "sku": { "name": "[parameters('virtualMachineSize')]", @@ -351,7 +353,7 @@ "computerNamePrefix": "[variables('namingInfix')]", "adminUsername": "[parameters('adminUsername')]", "adminPassword": "[parameters('adminPassword')]", - "customData": "[base64(concat('#INSTALL SCRIPT INPUTS\nXRAY_VERSION=', parameters('xrayVersion'),'\nARTIFACTORY_URL=',variables('artifactoryURL'),'\nDB_SERVER=',variables('db_server'),'\nDB_NAME=',variables('db_name'),'\nDB_ADMIN_USER=',variables('db_user'),'\nDB_ADMIN_PASSWD=',variables('db_password'),'\nMASTER_KEY=',variables('masterKey'),'\nJOIN_KEY=',variables('joinKey'),'\n'))]" + "customData": "[base64(concat('#INSTALL SCRIPT INPUTS\nXRAY_VERSION=', parameters('xrayVersion'),'\nARTIFACTORY_URL=',variables('artifactoryURL'),'\nDB_SERVER=',variables('db_server'),'\nDB_NAME=',variables('db_name'),'\nDB_ADMIN_USER=',variables('db_user'),'\nACTUAL_DB_ADMIN_USER=',variables('actual_db_user'),'\nDB_ADMIN_PASSWD=',variables('db_password'),'\nMASTER_KEY=',variables('masterKey'),'\nJOIN_KEY=',variables('joinKey'),'\n'))]" }, "networkProfile": { "networkInterfaceConfigurations": [ diff --git a/AzureResourceManager/Xray/scripts/install_xray.sh b/AzureResourceManager/Xray/scripts/install_xray.sh index 95db4a2..f2195cf 100644 --- a/AzureResourceManager/Xray/scripts/install_xray.sh +++ b/AzureResourceManager/Xray/scripts/install_xray.sh @@ -1,6 +1,7 @@ #!/bin/bash DB_NAME=$(cat /var/lib/cloud/instance/user-data.txt | grep "^DB_NAME=" | sed "s/DB_NAME=//") DB_USER=$(cat /var/lib/cloud/instance/user-data.txt | grep "^DB_ADMIN_USER=" | sed "s/DB_ADMIN_USER=//") +ACTUAL_DB_USER=$(cat /var/lib/cloud/instance/user-data.txt | grep "^ACTUAL_DB_ADMIN_USER=" | sed "s/ACTUAL_DB_ADMIN_USER=//") DB_PASSWORD=$(cat /var/lib/cloud/instance/user-data.txt | grep "^DB_ADMIN_PASSWD=" | sed "s/DB_ADMIN_PASSWD=//") DB_SERVER=$(cat /var/lib/cloud/instance/user-data.txt | grep "^DB_SERVER=" | sed "s/DB_SERVER=//") MASTER_KEY=$(cat /var/lib/cloud/instance/user-data.txt | grep "^MASTER_KEY=" | sed "s/MASTER_KEY=//") @@ -25,6 +26,7 @@ EOF HOSTNAME=$(hostname -i) yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.database.url postgres://${DB_SERVER}.postgres.database.azure.com:5432/${DB_NAME}?sslmode=disable yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.database.username ${DB_USER} +yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.database.actualUsername ${ACTUAL_DB_USER} yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.database.password ${DB_PASSWORD} yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.rabbitMq.password JFXR_RABBITMQ_COOKIE yq w -i /var/opt/jfrog/xray/etc/system.yaml shared.jfrogUrl ${ARTIFACTORY_URL} diff --git a/AzureResourceManager/Xray/vm_install/install_xray_to_vm.sh b/AzureResourceManager/Xray/vm_install/install_xray_to_vm.sh index 6827c90..191d4ab 100644 --- a/AzureResourceManager/Xray/vm_install/install_xray_to_vm.sh +++ b/AzureResourceManager/Xray/vm_install/install_xray_to_vm.sh @@ -1,7 +1,7 @@ #!/bin/bash # Upgrade version for every release -XRAY_VERSION=3.8.2 +XRAY_VERSION=3.8.5 export DEBIAN_FRONTEND=noninteractive From e99814b3447d16cd3afac591f8a112306c35d8bb Mon Sep 17 00:00:00 2001 From: John Peterson Date: Wed, 23 Sep 2020 11:47:51 -0700 Subject: [PATCH 12/28] Openshift pipelines work in progress --- Openshift4/openshift-pipelines/CHANGELOG.md | 5 + Openshift4/openshift-pipelines/Chart.yaml | 16 + Openshift4/openshift-pipelines/LICENSE | 201 ++ Openshift4/openshift-pipelines/README.md | 223 ++ Openshift4/openshift-pipelines/helminstall.sh | 35 + Openshift4/openshift-pipelines/out | 3093 +++++++++++++++++ .../openshift-pipelines/requirements.lock | 6 + .../openshift-pipelines/requirements.yaml | 4 + Openshift4/openshift-pipelines/values.yaml | 1117 ++++++ 9 files changed, 4700 insertions(+) create mode 100755 Openshift4/openshift-pipelines/CHANGELOG.md create mode 100755 Openshift4/openshift-pipelines/Chart.yaml create mode 100755 Openshift4/openshift-pipelines/LICENSE create mode 100755 Openshift4/openshift-pipelines/README.md create mode 100755 Openshift4/openshift-pipelines/helminstall.sh create mode 100644 Openshift4/openshift-pipelines/out create mode 100644 Openshift4/openshift-pipelines/requirements.lock create mode 100644 Openshift4/openshift-pipelines/requirements.yaml create mode 100755 Openshift4/openshift-pipelines/values.yaml diff --git a/Openshift4/openshift-pipelines/CHANGELOG.md b/Openshift4/openshift-pipelines/CHANGELOG.md new file mode 100755 index 0000000..eed6c8c --- /dev/null +++ b/Openshift4/openshift-pipelines/CHANGELOG.md @@ -0,0 +1,5 @@ +# JFrog Openshift Pipelines Chart Changelog +All changes to this chart will be documented in this file. + +## [1.4.5] Sept 21, 2020 +* Adding Openshift Pipelines helm chart version 1.4.5 app version 1.7.2 diff --git a/Openshift4/openshift-pipelines/Chart.yaml b/Openshift4/openshift-pipelines/Chart.yaml new file mode 100755 index 0000000..64af46c --- /dev/null +++ b/Openshift4/openshift-pipelines/Chart.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +appVersion: 1.7.2 +description: A Helm chart for JFrog Pipelines +home: https://jfrog.com/pipelines/ +icon: https://raw.githubusercontent.com/jfrog/charts/master/stable/pipelines/icon/pipelines-logo.png +keywords: + - pipelines + - jfrog + - devops +maintainers: +- email: vinaya@jfrog.com + name: Vinay Aggarwal +- email: johnp@jfrog.com + name: John Peterson +name: openshift-pipelines +version: 1.4.5 diff --git a/Openshift4/openshift-pipelines/LICENSE b/Openshift4/openshift-pipelines/LICENSE new file mode 100755 index 0000000..8dada3e --- /dev/null +++ b/Openshift4/openshift-pipelines/LICENSE @@ -0,0 +1,201 @@ + 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. diff --git a/Openshift4/openshift-pipelines/README.md b/Openshift4/openshift-pipelines/README.md new file mode 100755 index 0000000..32cae28 --- /dev/null +++ b/Openshift4/openshift-pipelines/README.md @@ -0,0 +1,223 @@ +# JFrog Pipelines on Kubernetes Helm Chart + +[JFrog Pipelines](https://jfrog.com/pipelines/) + +## Prerequisites Details + +* Kubernetes 1.12+ + +## Chart Details + +This chart will do the following: + +- Deploy PostgreSQL (optionally with an external PostgreSQL instance) +- Deploy RabbitMQ (optionally as an HA cluster) +- Deploy Redis (optionally as an HA cluster) +- Deploy Vault (optionally as an HA cluster) +- Deploy JFrog Pipelines + +## Requirements + +- A running Kubernetes cluster + - Dynamic storage provisioning enabled + - Default StorageClass set to allow services using the default StorageClass for persistent storage +- A running Artifactory 7.7.x with Enterprise+ License + - Precreated repository `jfrogpipelines` in Artifactory type `Generic` with layout `maven-2-default` +- [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) installed and setup to use the cluster +- [Helm](https://helm.sh/) v2 or v3 installed + + +## Install JFrog Pipelines + +### Add ChartCenter Helm repository + +Before installing JFrog helm charts, you need to add the [ChartCenter helm repository](https://chartcenter.io) to your helm client + +```bash +helm repo add center https://repo.chartcenter.io +helm repo update +``` + +### Artifactory Connection Details + +In order to connect Pipelines to your Artifactory installation, you have to use a Join Key, hence it is *MANDATORY* to provide a Join Key and Jfrog Url to your Pipelines installation. Here's how you do that: + +Retrieve the connection details of your Artifactory installation, from the UI - https://www.jfrog.com/confluence/display/JFROG/General+Security+Settings#GeneralSecuritySettings-ViewingtheJoinKey. + +### Install Pipelines Chart with Ingress + +#### Pre-requisites + +Before deploying Pipelines you need to have the following +- A running Kubernetes cluster +- An [Artifactory ](https://hub.helm.sh/charts/jfrog/artifactory) or [Artifactory HA](https://hub.helm.sh/charts/jfrog/artifactory-ha) with Enterprise+ License + - Precreated repository `jfrogpipelines` in Artifactiry type `Generic` with layout `maven-2-default` +- Deployed [Nginx-ingress controller](https://hub.helm.sh/charts/stable/nginx-ingress) +- [Optional] Deployed [Cert-manager](https://hub.helm.sh/charts/jetstack/cert-manager) for automatic management of TLS certificates with [Lets Encrypt](https://letsencrypt.org/) +- [Optional] TLS secret needed for https access + +#### Prepare configurations + +Fetch the JFrog Pipelines helm chart to get the needed configuration files + +```bash +helm fetch center/jfrog/pipelines --untar +``` + +Edit local copies of `values-ingress.yaml`, `values-ingress-passwords.yaml` and `values-ingress-external-secret.yaml` with the needed configuration values + +- URLs in `values-ingress.yaml` + - Artifactory URL + - Ingress hosts + - Ingress tls secrets +- Passwords `uiUserPassword`, `postgresqlPassword` and `rabbitmq.password` must be set, and same for `masterKey` and `joinKey` in `values-ingress-passwords.yaml` + +#### Install JFrog Pipelines + +Install JFrog Pipelines + +```bash +kubectl create ns pipelines +helm upgrade --install pipelines --namespace pipelines center/jfrog/pipelines -f pipelines/values-ingress.yaml -f pipelines/values-ingress-passwords.yaml +``` + +### Use external secret + +**Note:** Best practice is to use external secrets instead of storing passwords in `values.yaml` files. + +Don't forget to **update** URLs in `values-ingress-external-secret.yaml` file. + +Fill in all required passwords, `masterKey` and `joinKey` in `values-ingress-passwords.yaml` and then create and install the external secret. + +**Note:** Helm release name for secrets generation and `helm install` must be set the same, in this case it is `pipelines`. + +With Helm v2: + +```bash +## Generate pipelines-system-yaml secret +helm template --name-template pipelines pipelines/ -x templates/pipelines-system-yaml.yaml \ + -f pipelines/values-ingress-external-secret.yaml -f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f - + +## Generate pipelines-database secret +helm template --name-template pipelines pipelines/ -x templates/database-secret.yaml \ + -f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f - + +## Generate pipelines-rabbitmq-secret secret +helm template --name-template pipelines pipelines/ -x templates/rabbitmq-secret.yaml \ + -f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f - +``` + +With Helm v3: + +```bash +## Generate pipelines-system-yaml secret +helm template --name-template pipelines pipelines/ -s templates/pipelines-system-yaml.yaml \ + -f pipelines/values-ingress-external-secret.yaml -f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f - + +## Generate pipelines-database secret +helm template --name-template pipelines pipelines/ -s templates/database-secret.yaml \ + -f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f - + +## Generate pipelines-rabbitmq-secret secret +helm template --name-template pipelines pipelines/ -s templates/rabbitmq-secret.yaml \ + -f pipelines/values-ingress-passwords.yaml | kubectl apply --namespace pipelines -f - +``` + +Install JFrog Pipelines: + +```bash +helm upgrade --install pipelines --namespace pipelines center/jfrog/pipelines -f values-ingress-external-secret.yaml +``` + +### Using external Rabbitmq + +If you want to use external Rabbitmq, set `rabbitmq.enabled=false` and create `values-external-rabbitmq.yaml` with below yaml configuration + +```yaml +rabbitmq: + enabled: false + internal_ip: "{{ .Release.Name }}-rabbitmq" + msg_hostname: "{{ .Release.Name }}-rabbitmq" + port: 5672 + manager_port: 15672 + ms_username: admin + ms_password: password + cp_username: admin + cp_password: password + build_username: admin + build_password: password + root_vhost_exchange_name: rootvhost + erlang_cookie: secretcookie + build_vhost_name: pipelines + root_vhost_name: pipelinesRoot + protocol: amqp +``` + +```bash +helm upgrade --install pipelines --namespace pipelines center/jfrog/pipelines -f values-external-rabbitmq.yaml +``` + +### Using external Vault + +If you want to use external Vault, set `vault.enabled=false` and create `values-external-vault.yaml` with below yaml configuration + +```yaml +vault: + enabled: false + +global: + vault: + host: vault_url + port: vault_port + token: vault_token + ## Set Vault token using existing secret + # existingSecret: vault-secret +``` + +If you store external Vault token in a pre-existing Kubernetes Secret, you can specify it via `existingSecret`. + +To create a secret containing the Vault token: + +```bash +kubectl create secret generic vault-secret --from-literal=token=${VAULT_TOKEN} +``` + +```bash +helm upgrade --install pipelines --namespace pipelines center/jfrog/pipelines -f values-external-vault.yaml +``` + +### Status + +See the status of deployed **helm** release: + +With Helm v2: + +```bash +helm status pipelines +``` + +With Helm v3: + +```bash +helm status pipelines --namespace pipelines +``` + +### Pipelines Version +- By default, the pipelines images will use the value `appVersion` in the Chart.yml. This can be over-ridden by adding `version` to the pipelines section of the values.yml + +### Build Plane + +#### Build Plane with static and dynamic node-pool VMs + +To start using Pipelines you need to setup a Build Plane: +- For Static VMs Node-pool setup, please read [Managing Node Pools](https://www.jfrog.com/confluence/display/JFROG/Managing+Pipelines+Node+Pools#ManagingPipelinesNodePools-static-node-poolsAdministeringStaticNodePools). + +- For Dynamic VMs Node-pool setup, please read [Managing Dynamic Node Pools](https://www.jfrog.com/confluence/display/JFROG/Managing+Pipelines+Node+Pools#ManagingPipelinesNodePools-dynamic-node-poolsAdministeringDynamicNodePools). + +- For Kubernetes Node-pool setup, please read [Managing Dynamic Node Pools](https://www.jfrog.com/confluence/display/JFROG/Managing+Pipelines+Node+Pools#ManagingPipelinesNodePools-dynamic-node-poolsAdministeringDynamicNodePools). + +## Useful links + +- https://www.jfrog.com/confluence/display/JFROG/Pipelines+Quickstart +- https://www.jfrog.com/confluence/display/JFROG/Using+Pipelines +- https://www.jfrog.com/confluence/display/JFROG/Managing+Runtimes diff --git a/Openshift4/openshift-pipelines/helminstall.sh b/Openshift4/openshift-pipelines/helminstall.sh new file mode 100755 index 0000000..b67bd7e --- /dev/null +++ b/Openshift4/openshift-pipelines/helminstall.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +echo "Installing Pipelines" + +if [ -z "$MASTER_KEY" ] +then + MASTER_KEY=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +fi + +if [ -z "$JOIN_KEY" ] +then + JOIN_KEY=EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +fi + +helm upgrade --install pipelines . \ + --set pipelines.pipelines.jfrogUrl=http://openshiftartifactoryha-nginx \ + --set pipelines.pipelines.jfrogUrlUI=http://openshiftartifactoryha-nginx \ + --set pipelines.pipelines.masterKey=$MASTER_KEY \ + --set pipelines.pipelines.joinKey=$JOIN_KEY \ + --set pipelines.pipelines.accessControlAllowOrigins_0=http://openshiftartifactoryha-nginx \ + --set pipelines.pipelines.accessControlAllowOrigins_1=http://openshiftartifactoryha-nginx \ + --set pipelines.pipelines.msg.uiUser=guest \ + --set pipelines.pipelines.msg.uiUserPassword=guest \ + --set pipelines.postgresql.enabled=false \ + --set pipelines.global.postgresql.host=postgres-postgresql \ + --set pipelines.global.postgresql.port=5432 \ + --set pipelines.global.postgresql.database=pipelinesdb \ + --set pipelines.global.postgresql.user=artifactory \ + --set pipelines.global.postgresql.password=password \ + --set pipelines.global.postgresql.ssl=false \ + --set pipelines.rabbitmq.rabbitmq.username=monitor \ + --set pipelines.rabbitmq.rabbitmq.password=monitor \ + --set pipelines.rabbitmq.externalUrl=amqps://pipelines-rabbit.jfrog.tech \ + --set pipelines.pipelines.api.externalUrl=http://pipelines-api.jfrog.tech \ + --set pipelines.pipelines.www.externalUrl=http://pipelines-www.jfrog.tech diff --git a/Openshift4/openshift-pipelines/out b/Openshift4/openshift-pipelines/out new file mode 100644 index 0000000..5e20f17 --- /dev/null +++ b/Openshift4/openshift-pipelines/out @@ -0,0 +1,3093 @@ +NAME: pipelines +LAST DEPLOYED: Wed Sep 23 10:16:50 2020 +NAMESPACE: default +STATUS: pending-install +REVISION: 1 +TEST SUITE: None +USER-SUPPLIED VALUES: +pipelines: + global: + postgresql: + database: pipelinesdb + host: postgres-postgresql + password: password + port: 5432 + ssl: false + user: artifactory + pipelines: + accessControlAllowOrigins_0: http://openshiftartifactoryha-nginx + accessControlAllowOrigins_1: http://openshiftartifactoryha-nginx + api: + externalUrl: http://pipelines-api.jfrog.tech + jfrogUrl: http://openshiftartifactoryha-nginx + jfrogUrlUI: http://openshiftartifactoryha-nginx + joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE + masterKey: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + msg: + uiUser: monitor + uiUserPassword: monitor + www: + externalUrl: http://pipelines-www.jfrog.tech + postgresql: + enabled: false + rabbitmq: + externalUrl: amqps://pipelines-rabbit.jfrog.tech + rabbitmq: + password: guest + username: guest + +COMPUTED VALUES: +pipelines: + buildPlane: + dynamic: + customer: + accountId: "" + nodePoolName: "" + nodelimit: "" + provider: + aws: + accessKey: "" + enabled: false + existingSecret: null + instanceType: c4.xlarge + keyPairName: testaccountSSHKeyPair + nodePoolName: aws-dynamic-node-pool + nodelimit: "3" + region: us-east-1 + secretKey: "" + securityGroupId: testsecuritygroupId + subnetId: test-subnetId + vpcId: testVPCId + k8s: + cpu: "1" + enabled: false + existingSecret: null + kubeconfig: "" + labels: null + memory: "1000" + namespace: default + nodePoolName: k8s-dynamic-node-pool + nodelimit: "3" + storageClass: standard + existingSecret: null + filebeat: + enabled: false + filebeatYml: | + logging.level: info + path.data: {{ .Values.pipelines.logPath }}/filebeat + name: pipelines-filebeat + queue.spool: ~ + filebeat.inputs: + - type: log + enabled: true + close_eof: ${CLOSE:false} + paths: + - {{ .Values.pipelines.logPath }}/*.log + fields: + service: "jfpip" + log_type: "pipelines" + output: + logstash: + hosts: ["{{ .Values.filebeat.logstashUrl }}"] + image: + repository: docker.elastic.co/beats/filebeat + version: 7.5.1 + livenessProbe: + exec: + command: + - sh + - -c + - | + #!/usr/bin/env bash -e + curl --fail 127.0.0.1:5066 + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + logstashUrl: logstash:5044 + name: pipelines-filebeat + readinessProbe: + exec: + command: + - sh + - -c + - | + #!/usr/bin/env bash -e + filebeat test output + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + resources: {} + terminationGracePeriod: 10 + global: + postgresql: + database: pipelinesdb + host: postgres-postgresql + password: password + port: 5432 + ssl: false + user: artifactory + vault: + host: OVERRIDE + port: OVERRIDE + token: OVERRIDE + imagePullSecrets: null + imageRegistry: registry.connect.redhat.com + initContainer: + image: quay.io/jfrog/init:1.0.0 + pullPolicy: IfNotPresent + pipelines: + accessControlAllowOrigins_0: http://openshiftartifactoryha-nginx + accessControlAllowOrigins_1: http://openshiftartifactoryha-nginx + affinity: {} + api: + externalUrl: http://pipelines-api.jfrog.tech + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-api + ingress: + annotations: {} + enabled: false + hosts: + - chart-example.local + path: / + tls: [] + resources: {} + service: + annotations: null + loadBalancerIP: null + loadBalancerSourceRanges: [] + port: 30000 + type: ClusterIP + artifactoryServiceId: FFFFFFFFFFFF + authToken: c7595edd-b63d-4fd6-9e1e-13924d6637f0 + autoscaling: + enabled: false + maxReplicas: 3 + minReplicas: 1 + targetCPUUtilizationPercentage: 70 + configMaps: "" + cron: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-micro + resources: {} + customInitContainers: | + - name: "redhat-custom-setup" + image: quay.io/jfrog/init:1.0.0 + imagePullPolicy: Always + command: + - 'sh' + - '-c' + - 'chown -R 1117:1117 /opt/jfrog/pipelines/var/etc' + securityContext: + runAsUser: 0 + volumeMounts: + - mountPath: "/opt/jfrog/pipelines/var/etc" + name: volume + customSidecarContainers: "" + customVolumeMounts: "" + customVolumes: "" + extensionSync: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-micro + resources: {} + hookHandler: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-micro + resources: {} + jfrogUrl: http://openshiftartifactoryha-nginx + jfrogUrlUI: http://openshiftartifactoryha-nginx + joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE + licenseId: FFFFFFFFF + logPath: /opt/jfrog/pipelines/var/log + logup: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-micro + resources: {} + marshaller: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-micro + resources: {} + masterKey: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + mountPath: /opt/jfrog/pipelines/var/etc + msg: + uiUser: monitor + uiUserPassword: monitor + nexec: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-micro + resources: {} + nodeSelector: {} + pipelineSync: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-micro + resources: {} + pipelinesInit: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-installer + resources: {} + rabbitmqHealthCheckIntervalInMins: 1 + rbac: + role: + rules: + - apiGroups: + - "" + - extensions + - apps + resources: + - deployments + - persistentvolumes + - persistentvolumeclaims + - pods + - deployments/scale + verbs: + - '*' + replicaCount: 1 + rootBucket: jfrogpipelines + router: + externalPort: 8082 + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-router + internalPort: 8046 + mountPath: /opt/jfrog/router/var/etc + resources: {} + runTrigger: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-micro + resources: {} + serviceId: jfpip@12345 + stepTrigger: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-micro + resources: {} + systemYaml: | + shared: + ## Artifactory configuration + ## + artifactory: + ## Artifactory URL + ## + baseUrl: "{{ tpl (required "\n\npipelines.jfrogUrl is required!\n" .Values.pipelines.jfrogUrl) . }}" + ## Unified UI URL + ## + baseUrlUI: "{{ tpl (required "\n\npipelines.jfrogUrlUI is required!\n" .Values.pipelines.jfrogUrlUI) . }}" + ## Pipelines Service ID + ## + serviceId: "{{ .Values.pipelines.serviceId }}" + ## Artifactory Service ID + ## + artifactoryServiceId: "{{ .Values.pipelines.artifactoryServiceId }}" + ## Artifactory License ID + ## + licenseId: "{{ .Values.pipelines.licenseId }}" + ## Proxy to connect to Artifactory + ## + proxy: + url: "" + username: "" + password: "" + + ## Router configuration + ## + router: + ip: "" + accessPort: {{ .Values.pipelines.router.internalPort }} + dataPort: {{ .Values.pipelines.router.externalPort }} + joinKey: "{{ .Values.pipelines.joinKey }}" + + security: + masterKey: "{{ .Values.pipelines.masterKey }}" + + ## Database configuration + ## + db: + type: "postgres" + {{- if .Values.postgresql.enabled }} + ip: {{ tpl .Release.Name . }}-postgresql + port: "{{ .Values.postgresql.service.port }}" + name: {{ .Values.postgresql.postgresqlDatabase }} + username: {{ .Values.postgresql.postgresqlUsername }} + password: {{ .Values.postgresql.postgresqlPassword }} + {{- else }} + ip: {{ tpl .Values.global.postgresql.host . }} + port: "{{ .Values.global.postgresql.port }}" + name: {{ .Values.global.postgresql.database }} + username: {{ .Values.global.postgresql.user }} + password: {{ .Values.global.postgresql.password }} + {{- end }} + externalUrl: "" + {{- if .Values.postgresql.enabled }} + connectionString: "{{ tpl (printf "postgres://%s:%s@%s-postgresql:%v/%s" .Values.postgresql.postgresqlUsername .Values.postgresql.postgresqlPassword .Release.Name .Values.postgresql.service.port .Values.postgresql.postgresqlDatabase) . }}" + {{- else if and (not .Values.postgresql.enabled) (.Values.global.postgresql.ssl) }} + connectionString: "{{ tpl (printf "postgres://%s:%s@%v:%v/%s?sslmode=require" .Values.global.postgresql.user .Values.global.postgresql.password .Values.global.postgresql.host .Values.global.postgresql.port .Values.global.postgresql.database) . }}" + {{- else }} + connectionString: "{{ tpl (printf "postgres://%s:%s@%v:%v/%s" .Values.global.postgresql.user .Values.global.postgresql.password .Values.global.postgresql.host .Values.global.postgresql.port .Values.global.postgresql.database) . }}" + {{- end }} + + ## RabbitMQ configuration + ## + msg: + {{- if .Values.rabbitmq.enabled }} + ip: {{ .Release.Name }}-rabbitmq + port: {{ .Values.rabbitmq.service.port }} + adminPort: {{ .Values.rabbitmq.service.managerPort }} + erlangCookie: {{ .Values.rabbitmq.rabbitmq.erlangCookie }} + username: {{ .Values.rabbitmq.rabbitmq.username }} + password: {{ .Values.rabbitmq.rabbitmq.password }} + defaultExchange: pipelinesEx + amqpVhost: pipelines + amqpRootVhost: pipelinesRoot + {{- else }} + ip: {{ tpl .Values.rabbitmq.internal_ip . }} + port: {{ .Values.rabbitmq.port}} + adminPort: {{ .Values.rabbitmq.manager_port }} + erlangCookie: {{ .Values.rabbitmq.erlang_cookie }} + username: {{ .Values.rabbitmq.ms_username }} + password: {{ .Values.rabbitmq.ms_password }} + defaultExchange: {{ .Values.rabbitmq.root_vhost_exchange_name }} + amqpVhost: {{ .Values.rabbitmq.build_vhost_name}} + amqpRootVhost: {{ .Values.rabbitmq.root_vhost_name }} + protocol: {{ .Values.rabbitmq.protocol }} + {{- end }} + queues: + - "core.pipelineSync" + - "core.runTrigger" + - "core.stepTrigger" + - "core.marshaller" + - "cluster.init" + - "core.logup" + - "www.signals" + - "core.nexec" + - "core.hookHandler" + - "core.extensionSync" + ui: + {{- if .Values.rabbitmq.enabled }} + username: {{ .Values.pipelines.msg.uiUser }} + password: {{ .Values.pipelines.msg.uiUserPassword }} + {{- else }} + protocol: http + username: {{ .Values.rabbitmq.cp_username }} + password: {{ .Values.rabbitmq.cp_password }} + {{- end }} + external: + ## URL for build plane VMs to access RabbitMQ + {{- if .Values.rabbitmq.externalUrl }} + url: {{ .Values.rabbitmq.externalUrl }} + {{- else if (and .Values.rabbitmq.serviceVmLb.enabled .Values.rabbitmq.serviceVmLb.loadBalancerIP) }} + url: amqp://{{ .Values.rabbitmq.serviceVmLb.loadBalancerIP }} + {{- else if .Values.rabbitmq.enabled }} + url: amqp://{{ tpl .Release.Name . }}-rabbitmq + {{- else }} + url: {{ .Values.rabbitmq.protocol }}://{{ tpl .Values.rabbitmq.msg_hostname . }}:{{ .Values.rabbitmq.port }} + {{- end }} + rootUrl: "" + adminUrl: "" + {{- if not .Values.rabbitmq.enabled }} + build: + username: {{ .Values.rabbitmq.build_username }} + password: {{ .Values.rabbitmq.build_password }} + {{- end }} + + ## Vault configuration + ## + vault: + {{- if .Values.vault.enabled }} + ip: {{ include "pipelines.vault.name" . }} + port: {{ .Values.vault.service.port }} + {{- else }} + ip: {{ .Values.global.vault.host }} + port: {{ .Values.global.vault.port }} + {{- end }} + ## DO NOT CHANGE THE TOKEN VALUE!!! + token: "_VAULT_TOKEN_" + unsealKeys: + - "" + - "" + - "" + - "" + - "" + + ## Redis configuration + ## + redis: + ip: {{ .Release.Name }}-redis-master + port: 6379 + clusterEnabled: false + + ## This section is used for bringing up the core services and setting up + ## configurations required by the installer & the services + ## + core: + ## id is automatically determined based on the current hostname + ## or set using the SHARED_NODE_ID environment variable. + ## + id: "afd8df9d08bf257ae9b7d7dbbf348b7a3a574ebdd3a61d350d4b64e3129dee85" + installerIP: "1.2.3.4" + installerAuthToken: "{{ .Values.pipelines.authToken }}" + installerImage: "jfrog/pipelines-installer" + registryUrl: "{{ .Values.imageRegistry }}" + os: "Ubuntu_16.04" + osDistribution: "xenial" + architecture: "x86_64" + dockerVersion: "" + runMode: "{{ .Values.runMode }}" + user: "" + group: "" + noVerifySsl: false + ignoreTLSErrors: false + controlplaneVersion: "{{ default .Chart.AppVersion .Values.pipelines.version }}" + buildplaneVersion: "{{ default .Chart.AppVersion .Values.pipelines.version }}" + accessControlAllowOrigins: + - {{ .Values.pipelines.accessControlAllowOrigins_0 }} + - {{ .Values.pipelines.accessControlAllowOrigins_1 }} + rabbitmqHealthCheckIntervalInMins: {{ .Values.pipelines.rabbitmqHealthCheckIntervalInMins}} + ## Global proxy settings, to be applied to all services + ## + proxy: + httpProxy: "" + httpsProxy: "" + noProxy: "" + username: "" + password: "" + + ## Mailserver settings + ## + mailserver: + host: "" + port: "" + username: "" + password: "" + tls: "" + ssl: "" + apiRetryIntervalMs: 3000 + accountSyncFrequencyHr: 1 + imageRegistrySecret: "{{ .Values.imagePullSecrets }}" + hardDeleteIntervalInMins: 60 + configBackupCount: 5 + lastUpdateTime: "" + callHomeUrl: "https://api.bintray.com/products/jfrog/pipelines/stats/usage" + allowCallHome: true + serviceInstanceHealthCheckIntervalInMins: 1 + serviceInstanceStatsCutOffIntervalInHours: 24 + + ## Service configuration + ## + services: + api: + name: {{ include "pipelines.api.name" . }} + port: {{ .Values.pipelines.api.service.port }} + {{- if (and .Values.pipelines.api.ingress.enabled .Values.pipelines.api.ingress.tls) }} + {{- range .Values.pipelines.api.ingress.hosts }} + externalUrl: https://{{ . }} + {{- end }} + {{- else if .Values.pipelines.api.ingress.enabled }} + {{- range .Values.pipelines.api.ingress.hosts }} + externalUrl: http://{{ . }} + {{- end }} + {{- else }} + externalUrl: {{ .Values.pipelines.api.externalUrl }} + {{- end }} + www: + name: {{ include "pipelines.www.name" . }} + port: {{ .Values.pipelines.www.service.port }} + {{- if (and .Values.pipelines.www.ingress.enabled .Values.pipelines.www.ingress.tls) }} + {{- range .Values.pipelines.www.ingress.hosts }} + externalUrl: https://{{ . }} + {{- end }} + {{- else if .Values.pipelines.www.ingress.enabled }} + {{- range .Values.pipelines.www.ingress.hosts }} + externalUrl: http://{{ . }} + {{- end }} + {{- else }} + externalUrl: {{ .Values.pipelines.www.externalUrl }} + {{- end }} + sessionSecret: "{{ .Values.pipelines.authToken }}" + pipelineSync: + name: pipelineSync + runTrigger: + name: runTrigger + stepTrigger: + name: stepTrigger + cron: + name: cron + nexec: + name: nexec + hookHandler: + name: hookHandler + marshaller: + name: marshaller + extensionSync: + name: extensionSync + + ## Runtime configuration + ## + runtime: + rootBucket: "{{ .Values.pipelines.rootBucket }}" + defaultMinionCount: 1 + nodeCacheIntervalMS: 600000 + jobConsoleBatchSize: 10 + jobConsoleBufferIntervalMs: 3 + maxDiskUsagePercentage: 90 + stepTimeoutMS: 3600000 + nodeStopDayOfWeek: 0 + nodeStopIntervalDays: 30 + maxNodeCheckInDelayMin: 15 + defaultMinionInstanceSize: "c4.large" + allowDynamicNodes: true + allowCustomNodes: true + {{- range $key, $value := .Values.runtimeOverride }} + {{ $key }}: {{ $value | quote }} + {{- end }} + languageImages: + - architecture: x86_64 + os: Ubuntu_16.04 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: Ubuntu_16.04 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16java + defaultVersion: 13 + - architecture: x86_64 + os: Ubuntu_16.04 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16cpp + defaultVersion: 9.0.0 + - architecture: x86_64 + os: Ubuntu_16.04 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: Ubuntu_18.04 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: Ubuntu_18.04 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18java + defaultVersion: 13 + - architecture: x86_64 + os: Ubuntu_18.04 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18cpp + defaultVersion: 9.0.0 + - architecture: x86_64 + os: Ubuntu_18.04 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: CentOS_7 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: CentOS_7 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7java + defaultVersion: 11 + - architecture: x86_64 + os: CentOS_7 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7cpp + defaultVersion: 3.4.2 + - architecture: x86_64 + os: CentOS_7 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: WindowsServer_2019 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19node + defaultVersion: 10.18.0 + - architecture: x86_64 + os: WindowsServer_2019 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19java + defaultVersion: 11 + - architecture: x86_64 + os: WindowsServer_2019 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19cpp + defaultVersion: 9.0.0 + - architecture: x86_64 + os: WindowsServer_2019 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: WindowsServer_2019 + language: dotnetcore + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19dotnetcore + isDefault: true + defaultVersion: 3.1 + - architecture: x86_64 + os: RHEL_7 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: RHEL_7 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7java + defaultVersion: 11 + - architecture: x86_64 + os: RHEL_7 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7cpp + defaultVersion: 3.4.2 + - architecture: x86_64 + os: RHEL_7 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7go + defaultVersion: 1.12.14 + tolerations: [] + updateStrategy: RollingUpdate + version: 1.7.1 + www: + externalUrl: http://pipelines-www.jfrog.tech + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-www + ingress: + annotations: {} + enabled: false + hosts: + - chart-example.local + path: / + tls: [] + resources: {} + service: + annotations: null + loadBalancerIP: null + loadBalancerSourceRanges: [] + port: 30001 + type: ClusterIP + postgresql: + enabled: false + extraEnv: [] + global: + postgresql: + database: pipelinesdb + host: null + password: "" + port: 5432 + ssl: false + user: apiuser + vault: + host: null + port: null + token: null + image: + debug: false + pullPolicy: IfNotPresent + registry: docker.bintray.io + repository: bitnami/postgresql + tag: 9.6.18-debian-10-r7 + ldap: + baseDN: "" + bind_password: null + bindDN: "" + enabled: false + port: "" + prefix: "" + scheme: "" + search_attr: "" + search_filter: "" + server: "" + suffix: "" + tls: false + url: "" + livenessProbe: + enabled: true + failureThreshold: 6 + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + master: + affinity: {} + annotations: {} + extraInitContainers: [] + extraVolumeMounts: [] + extraVolumes: [] + labels: {} + nodeSelector: {} + podAnnotations: {} + podLabels: {} + priorityClassName: "" + resources: {} + service: {} + sidecars: [] + tolerations: [] + metrics: + enabled: false + image: + pullPolicy: IfNotPresent + registry: docker.io + repository: bitnami/postgres-exporter + tag: 0.8.0-debian-10-r72 + livenessProbe: + enabled: true + failureThreshold: 6 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + prometheusRule: + additionalLabels: {} + enabled: false + namespace: "" + rules: [] + readinessProbe: + enabled: true + failureThreshold: 6 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + securityContext: + enabled: false + runAsUser: 1001 + service: + annotations: + prometheus.io/port: "9187" + prometheus.io/scrape: "true" + loadBalancerIP: null + type: ClusterIP + serviceMonitor: + additionalLabels: {} + enabled: false + networkPolicy: + allowExternal: true + enabled: false + explicitNamespacesSelector: {} + persistence: + accessModes: + - ReadWriteOnce + annotations: {} + enabled: true + existingClaim: null + mountPath: /bitnami/postgresql + size: 50Gi + subPath: "" + postgresqlDataDir: /bitnami/postgresql/data + postgresqlDatabase: pipelinesdb + postgresqlPassword: "" + postgresqlUsername: apiuser + readinessProbe: + enabled: true + failureThreshold: 6 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + replication: + applicationName: my_application + enabled: false + numSynchronousReplicas: 0 + password: repl_password + slaveReplicas: 1 + synchronousCommit: "off" + user: repl_user + resources: + requests: + cpu: 250m + memory: 256Mi + securityContext: + enabled: true + fsGroup: 1001 + runAsUser: 1001 + service: + annotations: {} + port: 5432 + type: ClusterIP + serviceAccount: + enabled: false + shmVolume: + chmod: + enabled: true + enabled: true + slave: + affinity: {} + annotations: {} + extraInitContainers: | + # - name: do-something + # image: busybox + # command: ['do', 'something'] + extraVolumeMounts: [] + extraVolumes: [] + labels: {} + nodeSelector: {} + podAnnotations: {} + podLabels: {} + priorityClassName: "" + service: {} + sidecars: [] + tolerations: [] + updateStrategy: + type: RollingUpdate + volumePermissions: + enabled: false + image: + pullPolicy: Always + registry: docker.io + repository: bitnami/minideb + tag: buster + securityContext: + runAsUser: 0 + rabbitmq: + affinity: {} + enabled: true + externalUrl: amqps://pipelines-rabbit.jfrog.tech + extraSecrets: {} + extraVolumeMounts: [] + extraVolumes: [] + forceBoot: + enabled: false + global: + postgresql: + database: pipelinesdb + host: postgres-postgresql + password: password + port: 5432 + ssl: false + user: artifactory + vault: + host: OVERRIDE + port: OVERRIDE + token: OVERRIDE + image: + debug: false + pullPolicy: IfNotPresent + registry: registry.connect.redhat.com + repository: jfrog/xray-rabbitmq + tag: 3.8.6 + ingress: + annotations: null + enabled: false + path: / + tls: true + tlsSecret: OVERRIDE + ldap: + enabled: false + port: "389" + server: "" + tls: + enabled: false + user_dn_pattern: cn=${username},dc=example,dc=org + livenessProbe: + commandOverride: [] + enabled: true + failureThreshold: 6 + initialDelaySeconds: 120 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 20 + metrics: + enabled: false + plugins: rabbitmq_prometheus + podAnnotations: + prometheus.io/port: '{{ .Values.metrics.port }}' + prometheus.io/scrape: "true" + port: 9419 + prometheusRule: + additionalLabels: {} + enabled: false + namespace: "" + rules: [] + serviceMonitor: + additionalLabels: {} + enabled: false + honorLabels: false + interval: 30s + networkPolicy: + allowExternal: true + enabled: false + nodeSelector: {} + persistence: + accessMode: ReadWriteOnce + enabled: true + path: /opt/bitnami/rabbitmq/var/lib/rabbitmq + size: 20Gi + podAnnotations: {} + podDisruptionBudget: {} + podLabels: {} + podManagementPolicy: OrderedReady + protocol: amqps + rabbitmq: + advancedConfiguration: "" + clustering: + address_type: hostname + k8s_domain: cluster.local + rebalance: false + configuration: |- + ## Clustering + cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s + cluster_formation.k8s.host = kubernetes.default.svc.cluster.local + cluster_formation.node_cleanup.interval = 10 + cluster_formation.node_cleanup.only_log_warning = true + cluster_partition_handling = autoheal + # queue master locator + queue_master_locator=min-masters + # enable guest user + loopback_users.guest = false + env: {} + erlangCookie: PIPELINESRABBITMQCLUSTER + extraConfiguration: |- + #disk_free_limit.absolute = 50MB + #management.load_definitions = /app/load_definition.json + extraPlugins: "" + loadDefinition: + enabled: false + secretName: load-definition + logs: '-' + maxAvailableSchedulers: 2 + onlineSchedulers: 1 + password: guest + plugins: rabbitmq_management rabbitmq_peer_discovery_k8s + setUlimitNofiles: true + tls: + caCertificate: "" + enabled: false + failIfNoPeerCert: true + serverCertificate: "" + serverKey: "" + sslOptionsVerify: verify_peer + ulimitNofiles: "65536" + username: guest + rbacEnabled: true + readinessProbe: + commandOverride: [] + enabled: true + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 20 + replicas: 1 + resources: {} + securityContext: + enabled: true + extra: {} + fsGroup: 1001 + runAsUser: 1001 + service: + annotations: {} + distPort: 25672 + managerPort: 15672 + port: 5672 + tlsPort: 5671 + type: ClusterIP + serviceVmLb: + annotations: null + enabled: false + loadBalancerIP: null + loadBalancerSourceRanges: [] + tolerations: [] + updateStrategy: + type: RollingUpdate + volumePermissions: + enabled: false + image: + pullPolicy: Always + registry: docker.io + repository: bitnami/minideb + tag: buster + resources: {} + rbac: + create: true + redis: + cluster: + enabled: false + slaveCount: 2 + clusterDomain: cluster.local + configmap: |- + # Enable AOF https://redis.io/topics/persistence#append-only-file + appendonly yes + # Disable RDB persistence, AOF persistence already enabled. + save "" + enabled: true + global: + postgresql: + database: pipelinesdb + host: postgres-postgresql + password: password + port: 5432 + ssl: false + user: artifactory + redis: {} + vault: + host: OVERRIDE + port: OVERRIDE + token: OVERRIDE + image: + pullPolicy: IfNotPresent + registry: registry.redhat.io + repository: rhel8/redis-5 + tag: 1-98 + master: + affinity: {} + command: "" + configmap: |- + appendonly yes + loglevel notice + disableCommands: + - FLUSHDB + - FLUSHALL + extraFlags: [] + livenessProbe: + enabled: true + failureThreshold: 5 + initialDelaySeconds: 5 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 5 + persistence: + accessModes: + - ReadWriteOnce + enabled: true + matchExpressions: {} + matchLabels: {} + path: /data + size: 8Gi + subPath: "" + podAnnotations: {} + podLabels: {} + readinessProbe: + enabled: true + failureThreshold: 5 + initialDelaySeconds: 5 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + service: + annotations: {} + labels: {} + loadBalancerIP: null + port: 6379 + type: ClusterIP + statefulset: + updateStrategy: RollingUpdate + metrics: + enabled: false + image: + pullPolicy: IfNotPresent + registry: docker.io + repository: bitnami/redis-exporter + tag: 1.5.2-debian-10-r21 + podAnnotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + prometheusRule: + additionalLabels: {} + enabled: false + namespace: "" + rules: [] + service: + annotations: {} + labels: {} + type: ClusterIP + serviceMonitor: + enabled: false + selector: + prometheus: kube-prometheus + networkPolicy: + enabled: false + ingressNSMatchLabels: {} + ingressNSPodMatchLabels: {} + password: "" + persistence: {} + podSecurityPolicy: + create: false + rbac: + create: false + role: + rules: [] + redisPort: 6379 + securityContext: + enabled: true + fsGroup: 1001 + runAsUser: 1001 + sentinel: + configmap: null + downAfterMilliseconds: 60000 + enabled: false + failoverTimeout: 18000 + image: + pullPolicy: IfNotPresent + registry: docker.io + repository: bitnami/redis-sentinel + tag: 5.0.8-debian-10-r25 + initialCheckTimeout: 5 + livenessProbe: + enabled: true + failureThreshold: 5 + initialDelaySeconds: 5 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 5 + masterSet: mymaster + parallelSyncs: 1 + port: 26379 + quorum: 2 + readinessProbe: + enabled: true + failureThreshold: 5 + initialDelaySeconds: 5 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 1 + service: + annotations: {} + labels: {} + loadBalancerIP: null + redisPort: 6379 + sentinelPort: 26379 + type: ClusterIP + staticID: false + usePassword: true + serviceAccount: + create: false + name: null + slave: + affinity: {} + command: /run.sh + configmap: null + disableCommands: + - FLUSHDB + - FLUSHALL + extraFlags: [] + livenessProbe: + enabled: true + failureThreshold: 5 + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + persistence: + accessModes: + - ReadWriteOnce + enabled: true + matchExpressions: {} + matchLabels: {} + path: /data + size: 8Gi + subPath: "" + podAnnotations: {} + podLabels: {} + port: 6379 + readinessProbe: + enabled: true + failureThreshold: 5 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + resources: {} + service: + annotations: {} + labels: {} + loadBalancerIP: null + port: 6379 + type: ClusterIP + statefulset: + updateStrategy: RollingUpdate + sysctlImage: + command: [] + enabled: false + mountHostSys: false + pullPolicy: Always + registry: docker.io + repository: bitnami/minideb + resources: {} + tag: buster + usePassword: false + usePasswordFile: false + volumePermissions: + enabled: false + image: + pullPolicy: Always + registry: docker.io + repository: bitnami/minideb + tag: buster + resources: {} + runMode: production + runtimeOverride: {} + securityContext: + enabled: true + gid: 1030 + uid: 1030 + vault: + affinity: {} + configMaps: "" + customInitContainers: "" + customVolumeMounts: "" + customVolumes: "" + disablemlock: false + enabled: true + image: + pullPolicy: IfNotPresent + repository: registry.connect.redhat.com/jfrog/pipelines-vault + tag: 1.7.1 + init: + image: + pullPolicy: IfNotPresent + repository: jfrog/pipelines-vault-init + nodeSelector: {} + rbac: + role: + rules: + - apiGroups: + - "" + resources: + - secrets + verbs: + - '*' + resources: {} + service: + port: 30100 + type: ClusterIP + tolerations: [] + updateStrategy: RollingUpdate + +HOOKS: +MANIFEST: +--- +# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pipelines-rabbitmq + namespace: default + labels: + app: rabbitmq + chart: rabbitmq-6.25.0 + release: "pipelines" + heritage: "Helm" +secrets: + - name: "pipelines-rabbitmq" +--- +# Source: openshift-pipelines/charts/pipelines/templates/service-account.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pipelines + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm +--- +# Source: openshift-pipelines/charts/pipelines/templates/vault-serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pipelines-pipelines-vault + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm + component: pipelines-pipelines-vault +--- +# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/secrets.yaml +apiVersion: v1 +kind: Secret +metadata: + name: pipelines-rabbitmq + namespace: default + labels: + app: rabbitmq + chart: rabbitmq-6.25.0 + release: "pipelines" + heritage: "Helm" +type: Opaque +data: + + rabbitmq-password: "Z3Vlc3Q=" + + + rabbitmq-erlang-cookie: "UElQRUxJTkVTUkFCQklUTVFDTFVTVEVS" +--- +# Source: openshift-pipelines/charts/pipelines/templates/database-secret.yaml +apiVersion: v1 +kind: Secret +metadata: + name: pipelines-database + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: + postgresql-password: "cGFzc3dvcmQ=" + postgresql-url: cG9zdGdyZXM6Ly9hcnRpZmFjdG9yeTpwYXNzd29yZEBwb3N0Z3Jlcy1wb3N0Z3Jlc3FsOjU0MzIvcGlwZWxpbmVzZGI/c3NsbW9kZT1kaXNhYmxl +--- +# Source: openshift-pipelines/charts/pipelines/templates/pipelines-system-yaml.yaml +apiVersion: v1 +kind: Secret +metadata: + name: pipelines-system-yaml + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: +stringData: + system.yaml: | + shared: + ## Artifactory configuration + ## + artifactory: + ## Artifactory URL + ## + baseUrl: "http://openshiftartifactoryha-nginx" + ## Unified UI URL + ## + baseUrlUI: "http://openshiftartifactoryha-nginx" + ## Pipelines Service ID + ## + serviceId: "jfpip@12345" + ## Artifactory Service ID + ## + artifactoryServiceId: "FFFFFFFFFFFF" + ## Artifactory License ID + ## + licenseId: "FFFFFFFFF" + ## Proxy to connect to Artifactory + ## + proxy: + url: "" + username: "" + password: "" + + ## Router configuration + ## + router: + ip: "" + accessPort: 8046 + dataPort: 8082 + joinKey: "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" + + security: + masterKey: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + + ## Database configuration + ## + db: + type: "postgres" + ip: postgres-postgresql + port: "5432" + name: pipelinesdb + username: artifactory + password: password + externalUrl: "" + connectionString: "postgres://artifactory:password@postgres-postgresql:5432/pipelinesdb" + + ## RabbitMQ configuration + ## + msg: + ip: pipelines-rabbitmq + port: 5672 + adminPort: 15672 + erlangCookie: PIPELINESRABBITMQCLUSTER + username: guest + password: guest + defaultExchange: pipelinesEx + amqpVhost: pipelines + amqpRootVhost: pipelinesRoot + queues: + - "core.pipelineSync" + - "core.runTrigger" + - "core.stepTrigger" + - "core.marshaller" + - "cluster.init" + - "core.logup" + - "www.signals" + - "core.nexec" + - "core.hookHandler" + - "core.extensionSync" + ui: + username: monitor + password: monitor + external: + ## URL for build plane VMs to access RabbitMQ + url: amqps://pipelines-rabbit.jfrog.tech + rootUrl: "" + adminUrl: "" + + ## Vault configuration + ## + vault: + ip: pipelines-pipelines-vault + port: 30100 + ## DO NOT CHANGE THE TOKEN VALUE!!! + token: "_VAULT_TOKEN_" + unsealKeys: + - "" + - "" + - "" + - "" + - "" + + ## Redis configuration + ## + redis: + ip: pipelines-redis-master + port: 6379 + clusterEnabled: false + + ## This section is used for bringing up the core services and setting up + ## configurations required by the installer & the services + ## + core: + ## id is automatically determined based on the current hostname + ## or set using the SHARED_NODE_ID environment variable. + ## + id: "afd8df9d08bf257ae9b7d7dbbf348b7a3a574ebdd3a61d350d4b64e3129dee85" + installerIP: "1.2.3.4" + installerAuthToken: "c7595edd-b63d-4fd6-9e1e-13924d6637f0" + installerImage: "jfrog/pipelines-installer" + registryUrl: "registry.connect.redhat.com" + os: "Ubuntu_16.04" + osDistribution: "xenial" + architecture: "x86_64" + dockerVersion: "" + runMode: "production" + user: "" + group: "" + noVerifySsl: false + ignoreTLSErrors: false + controlplaneVersion: "1.7.1" + buildplaneVersion: "1.7.1" + accessControlAllowOrigins: + - http://openshiftartifactoryha-nginx + - http://openshiftartifactoryha-nginx + rabbitmqHealthCheckIntervalInMins: 1 + ## Global proxy settings, to be applied to all services + ## + proxy: + httpProxy: "" + httpsProxy: "" + noProxy: "" + username: "" + password: "" + + ## Mailserver settings + ## + mailserver: + host: "" + port: "" + username: "" + password: "" + tls: "" + ssl: "" + apiRetryIntervalMs: 3000 + accountSyncFrequencyHr: 1 + imageRegistrySecret: "" + hardDeleteIntervalInMins: 60 + configBackupCount: 5 + lastUpdateTime: "" + callHomeUrl: "https://api.bintray.com/products/jfrog/pipelines/stats/usage" + allowCallHome: true + serviceInstanceHealthCheckIntervalInMins: 1 + serviceInstanceStatsCutOffIntervalInHours: 24 + + ## Service configuration + ## + services: + api: + name: pipelines-pipelines-api + port: 30000 + externalUrl: http://pipelines-api.jfrog.tech + www: + name: pipelines-pipelines-www + port: 30001 + externalUrl: http://pipelines-www.jfrog.tech + sessionSecret: "c7595edd-b63d-4fd6-9e1e-13924d6637f0" + pipelineSync: + name: pipelineSync + runTrigger: + name: runTrigger + stepTrigger: + name: stepTrigger + cron: + name: cron + nexec: + name: nexec + hookHandler: + name: hookHandler + marshaller: + name: marshaller + extensionSync: + name: extensionSync + + ## Runtime configuration + ## + runtime: + rootBucket: "jfrogpipelines" + defaultMinionCount: 1 + nodeCacheIntervalMS: 600000 + jobConsoleBatchSize: 10 + jobConsoleBufferIntervalMs: 3 + maxDiskUsagePercentage: 90 + stepTimeoutMS: 3600000 + nodeStopDayOfWeek: 0 + nodeStopIntervalDays: 30 + maxNodeCheckInDelayMin: 15 + defaultMinionInstanceSize: "c4.large" + allowDynamicNodes: true + allowCustomNodes: true + languageImages: + - architecture: x86_64 + os: Ubuntu_16.04 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: Ubuntu_16.04 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16java + defaultVersion: 13 + - architecture: x86_64 + os: Ubuntu_16.04 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16cpp + defaultVersion: 9.0.0 + - architecture: x86_64 + os: Ubuntu_16.04 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: Ubuntu_18.04 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: Ubuntu_18.04 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18java + defaultVersion: 13 + - architecture: x86_64 + os: Ubuntu_18.04 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18cpp + defaultVersion: 9.0.0 + - architecture: x86_64 + os: Ubuntu_18.04 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: CentOS_7 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: CentOS_7 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7java + defaultVersion: 11 + - architecture: x86_64 + os: CentOS_7 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7cpp + defaultVersion: 3.4.2 + - architecture: x86_64 + os: CentOS_7 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: WindowsServer_2019 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19node + defaultVersion: 10.18.0 + - architecture: x86_64 + os: WindowsServer_2019 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19java + defaultVersion: 11 + - architecture: x86_64 + os: WindowsServer_2019 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19cpp + defaultVersion: 9.0.0 + - architecture: x86_64 + os: WindowsServer_2019 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: WindowsServer_2019 + language: dotnetcore + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19dotnetcore + isDefault: true + defaultVersion: 3.1 + - architecture: x86_64 + os: RHEL_7 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: RHEL_7 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7java + defaultVersion: 11 + - architecture: x86_64 + os: RHEL_7 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7cpp + defaultVersion: 3.4.2 + - architecture: x86_64 + os: RHEL_7 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7go + defaultVersion: 1.12.14 +--- +# Source: openshift-pipelines/charts/pipelines/templates/rabbitmq-secret.yaml +apiVersion: v1 +kind: Secret +metadata: + name: pipelines-rabbitmq-secret + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm +type: Opaque +data: + rabbitmq-erlang-cookie: "UElQRUxJTkVTUkFCQklUTVFDTFVTVEVS" + rabbitmq-password: "Z3Vlc3Q=" +--- +# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/configuration.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: pipelines-rabbitmq-config + namespace: default + labels: + app: rabbitmq + chart: rabbitmq-6.25.0 + release: "pipelines" + heritage: "Helm" +data: + enabled_plugins: |- + [rabbitmq_management, rabbitmq_peer_discovery_k8s]. + rabbitmq.conf: |- + ##username and password + default_user=guest + default_pass=CHANGEME + ## Clustering + cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s + cluster_formation.k8s.host = kubernetes.default.svc.cluster.local + cluster_formation.node_cleanup.interval = 10 + cluster_formation.node_cleanup.only_log_warning = true + cluster_partition_handling = autoheal + # queue master locator + queue_master_locator=min-masters + # enable guest user + loopback_users.guest = false + #disk_free_limit.absolute = 50MB + #management.load_definitions = /app/load_definition.json +--- +# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/healthchecks.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: pipelines-rabbitmq-healthchecks + namespace: default + labels: + app: rabbitmq + chart: rabbitmq-6.25.0 + release: "pipelines" + heritage: "Helm" +data: + rabbitmq-health-check: |- + #!/bin/sh + START_FLAG=/opt/bitnami/rabbitmq/var/lib/rabbitmq/.start + if [ -f ${START_FLAG} ]; then + rabbitmqctl node_health_check + RESULT=$? + if [ $RESULT -ne 0 ]; then + rabbitmqctl status + exit $? + fi + rm -f ${START_FLAG} + exit ${RESULT} + fi + rabbitmq-api-check $1 $2 + rabbitmq-api-check: |- + #!/bin/sh + set -e + URL=$1 + EXPECTED=$2 + ACTUAL=$(curl --silent --show-error --fail "${URL}") + echo "${ACTUAL}" + test "${EXPECTED}" = "${ACTUAL}" +--- +# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: pipelines-redis + namespace: default + labels: + app: redis + chart: redis-10.6.3 + heritage: Helm + release: pipelines +data: + redis.conf: |- + # User-supplied configuration: + # Enable AOF https://redis.io/topics/persistence#append-only-file + appendonly yes + # Disable RDB persistence, AOF persistence already enabled. + save "" + master.conf: |- + dir /data + # User-supplied master configuration: + appendonly yes + loglevel notice + rename-command FLUSHDB "" + rename-command FLUSHALL "" + replica.conf: |- + dir /data + slave-read-only yes + rename-command FLUSHDB "" + rename-command FLUSHALL "" +--- +# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/health-configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: pipelines-redis-health + namespace: default + labels: + app: redis + chart: redis-10.6.3 + heritage: Helm + release: pipelines +data: + ping_readiness_local.sh: |- + #!/bin/bash + response=$( + timeout -s 9 $1 \ + redis-cli \ + -h localhost \ + -p $REDIS_PORT \ + ping + ) + if [ "$response" != "PONG" ]; then + echo "$response" + exit 1 + fi + ping_liveness_local.sh: |- + #!/bin/bash + response=$( + timeout -s 9 $1 \ + redis-cli \ + -h localhost \ + -p $REDIS_PORT \ + ping + ) + if [ "$response" != "PONG" ] && [ "$response" != "LOADING Redis is loading the dataset in memory" ]; then + echo "$response" + exit 1 + fi + ping_readiness_master.sh: |- + #!/bin/bash + response=$( + timeout -s 9 $1 \ + redis-cli \ + -h $REDIS_MASTER_HOST \ + -p $REDIS_MASTER_PORT_NUMBER \ + ping + ) + if [ "$response" != "PONG" ]; then + echo "$response" + exit 1 + fi + ping_liveness_master.sh: |- + #!/bin/bash + response=$( + timeout -s 9 $1 \ + redis-cli \ + -h $REDIS_MASTER_HOST \ + -p $REDIS_MASTER_PORT_NUMBER \ + ping + ) + if [ "$response" != "PONG" ] && [ "$response" != "LOADING Redis is loading the dataset in memory" ]; then + echo "$response" + exit 1 + fi + ping_readiness_local_and_master.sh: |- + script_dir="$(dirname "$0")" + exit_status=0 + "$script_dir/ping_readiness_local.sh" $1 || exit_status=$? + "$script_dir/ping_readiness_master.sh" $1 || exit_status=$? + exit $exit_status + ping_liveness_local_and_master.sh: |- + script_dir="$(dirname "$0")" + exit_status=0 + "$script_dir/ping_liveness_local.sh" $1 || exit_status=$? + "$script_dir/ping_liveness_master.sh" $1 || exit_status=$? + exit $exit_status +--- +# Source: openshift-pipelines/charts/pipelines/templates/pipelines-role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: pipelines + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm +rules: +- apiGroups: + - "" + - extensions + - apps + resources: + - deployments + - persistentvolumes + - persistentvolumeclaims + - pods + - deployments/scale + verbs: + - '*' +--- +# Source: openshift-pipelines/charts/pipelines/templates/pipelines-rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: pipelines + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm +subjects: +- kind: ServiceAccount + name: pipelines + namespace: default +roleRef: + kind: ClusterRole + apiGroup: rbac.authorization.k8s.io + name: pipelines +--- +# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/role.yaml +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: pipelines-rabbitmq-endpoint-reader + namespace: default + labels: + app: rabbitmq + chart: rabbitmq-6.25.0 + release: "pipelines" + heritage: "Helm" +rules: +- apiGroups: [""] + resources: ["endpoints"] + verbs: ["get"] +- apiGroups: [""] + resources: ["events"] + verbs: ["create"] +--- +# Source: openshift-pipelines/charts/pipelines/templates/vault-role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: pipelines-pipelines-vault + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm + component: pipelines-pipelines-vault +rules: +- apiGroups: + - "" + resources: + - secrets + verbs: + - '*' +--- +# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/rolebinding.yaml +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: pipelines-rabbitmq-endpoint-reader + namespace: default + labels: + app: rabbitmq + chart: rabbitmq-6.25.0 + release: "pipelines" + heritage: "Helm" +subjects: +- kind: ServiceAccount + name: pipelines-rabbitmq +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: pipelines-rabbitmq-endpoint-reader +--- +# Source: openshift-pipelines/charts/pipelines/templates/vault-rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: pipelines-pipelines-vault + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm + component: pipelines-pipelines-vault +subjects: +- kind: ServiceAccount + name: pipelines-pipelines-vault +roleRef: + kind: Role + apiGroup: rbac.authorization.k8s.io + name: pipelines-pipelines-vault +--- +# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/svc-headless.yaml +apiVersion: v1 +kind: Service +metadata: + name: pipelines-rabbitmq-headless + namespace: default + labels: + app: rabbitmq + chart: rabbitmq-6.25.0 + release: "pipelines" + heritage: "Helm" +spec: + clusterIP: None + ports: + - name: epmd + port: 4369 + targetPort: epmd + - name: amqp + port: 5672 + targetPort: amqp + - name: dist + port: 25672 + targetPort: dist + - name: stats + port: 15672 + targetPort: stats + selector: + app: rabbitmq + release: "pipelines" +--- +# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/svc.yaml +apiVersion: v1 +kind: Service +metadata: + name: pipelines-rabbitmq + namespace: default + labels: + app: rabbitmq + chart: rabbitmq-6.25.0 + release: "pipelines" + heritage: "Helm" +spec: + type: ClusterIP + ports: + - name: epmd + port: 4369 + targetPort: epmd + nodePort: null + - name: amqp + port: 5672 + targetPort: amqp + nodePort: null + - name: dist + port: 25672 + targetPort: dist + nodePort: null + - name: stats + port: 15672 + targetPort: stats + nodePort: null + selector: + app: rabbitmq + release: "pipelines" +--- +# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/headless-svc.yaml +apiVersion: v1 +kind: Service +metadata: + name: pipelines-redis-headless + namespace: default + labels: + app: redis + chart: redis-10.6.3 + release: pipelines + heritage: Helm +spec: + type: ClusterIP + clusterIP: None + ports: + - name: redis + port: 6379 + targetPort: redis + selector: + app: redis + release: pipelines +--- +# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/redis-master-svc.yaml +apiVersion: v1 +kind: Service +metadata: + name: pipelines-redis-master + namespace: default + labels: + app: redis + chart: redis-10.6.3 + release: pipelines + heritage: Helm +spec: + type: ClusterIP + ports: + - name: redis + port: 6379 + targetPort: redis + selector: + app: redis + release: pipelines + role: master +--- +# Source: openshift-pipelines/charts/pipelines/templates/api-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: pipelines-pipelines-api + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm + component: pipelines-pipelines-api +spec: + type: ClusterIP + ports: + - port: 30000 + targetPort: 30000 + protocol: TCP + name: api + selector: + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + component: pipelines-pipelines-services +--- +# Source: openshift-pipelines/charts/pipelines/templates/pipelines-service-headless.yaml +apiVersion: v1 +kind: Service +metadata: + name: pipelines-pipelines-services-headless + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + clusterIP: None + ports: + - port: 30000 + targetPort: 30000 + protocol: TCP + name: api + - port: 30001 + targetPort: 30001 + protocol: TCP + name: www + selector: + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + component: pipelines-pipelines-services +--- +# Source: openshift-pipelines/charts/pipelines/templates/vault-service-headless.yaml +apiVersion: v1 +kind: Service +metadata: + name: pipelines-pipelines-vault-headless + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm + component: pipelines-pipelines-vault +spec: + type: ClusterIP + clusterIP: None + ports: + - name: http + port: 30100 + targetPort: 30100 + protocol: TCP + - name: server + port: 30101 + protocol: TCP + selector: + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + component: pipelines-pipelines-vault +--- +# Source: openshift-pipelines/charts/pipelines/templates/vault-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: pipelines-pipelines-vault + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm + component: pipelines-pipelines-vault +spec: + type: ClusterIP + ports: + - name: http + port: 30100 + targetPort: 30100 + protocol: TCP + - name: server + port: 30101 + protocol: TCP + selector: + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + component: pipelines-pipelines-vault +--- +# Source: openshift-pipelines/charts/pipelines/templates/www-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: pipelines-pipelines-www + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm + component: pipelines-pipelines-www +spec: + type: ClusterIP + ports: + - port: 30001 + targetPort: 30001 + protocol: TCP + name: www + selector: + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + component: pipelines-pipelines-services +--- +# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/statefulset.yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: pipelines-rabbitmq + namespace: default + labels: + app: rabbitmq + chart: rabbitmq-6.25.0 + release: "pipelines" + heritage: "Helm" +spec: + serviceName: pipelines-rabbitmq-headless + podManagementPolicy: OrderedReady + replicas: 1 + updateStrategy: + type: RollingUpdate + selector: + matchLabels: + app: rabbitmq + release: "pipelines" + template: + metadata: + labels: + app: rabbitmq + release: "pipelines" + chart: rabbitmq-6.25.0 + annotations: + checksum/secret: cd200625b24962e95e00a823013671ecf528464dc6d000ff2103710176764a2a + spec: + serviceAccountName: pipelines-rabbitmq + terminationGracePeriodSeconds: 10 + containers: + - name: rabbitmq + image: registry.connect.redhat.com/jfrog/xray-rabbitmq:3.8.6 + imagePullPolicy: "IfNotPresent" + command: + - bash + - -ec + - | + mkdir -p /opt/bitnami/rabbitmq/.rabbitmq/ + mkdir -p /opt/bitnami/rabbitmq/etc/rabbitmq/ + touch /opt/bitnami/rabbitmq/var/lib/rabbitmq/.start + #persist the erlang cookie in both places for server and cli tools + echo $RABBITMQ_ERL_COOKIE > /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie + cp /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie /opt/bitnami/rabbitmq/.rabbitmq/ + #change permission so only the user has access to the cookie file + chmod 600 /opt/bitnami/rabbitmq/.rabbitmq/.erlang.cookie /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie + #copy the mounted configuration to both places + cp /opt/bitnami/rabbitmq/conf/* /opt/bitnami/rabbitmq/etc/rabbitmq + # Apply resources limits + ulimit -n "${RABBITMQ_ULIMIT_NOFILES}" + #replace the default password that is generated + sed -i "/CHANGEME/cdefault_pass=${RABBITMQ_PASSWORD//\\/\\\\}" /opt/bitnami/rabbitmq/etc/rabbitmq/rabbitmq.conf + exec rabbitmq-server + volumeMounts: + - name: config-volume + mountPath: /opt/bitnami/rabbitmq/conf + - name: healthchecks + mountPath: /usr/local/sbin/rabbitmq-api-check + subPath: rabbitmq-api-check + - name: healthchecks + mountPath: /usr/local/sbin/rabbitmq-health-check + subPath: rabbitmq-health-check + - name: data + mountPath: "/opt/bitnami/rabbitmq/var/lib/rabbitmq" + ports: + - name: epmd + containerPort: 4369 + - name: amqp + containerPort: 5672 + - name: dist + containerPort: 25672 + - name: stats + containerPort: 15672 + livenessProbe: + exec: + command: + - sh + - -c + - rabbitmq-api-check "http://guest:$RABBITMQ_PASSWORD@127.0.0.1:15672/api/healthchecks/node" '{"status":"ok"}' + initialDelaySeconds: 120 + timeoutSeconds: 20 + periodSeconds: 30 + failureThreshold: 6 + successThreshold: 1 + readinessProbe: + exec: + command: + - sh + - -c + - rabbitmq-health-check "http://guest:$RABBITMQ_PASSWORD@127.0.0.1:15672/api/healthchecks/node" '{"status":"ok"}' + initialDelaySeconds: 10 + timeoutSeconds: 20 + periodSeconds: 30 + failureThreshold: 3 + successThreshold: 1 + env: + - name: BITNAMI_DEBUG + value: "false" + - name: MY_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: MY_POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: MY_POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: K8S_SERVICE_NAME + value: "pipelines-rabbitmq-headless" + - name: K8S_ADDRESS_TYPE + value: hostname + - name: RABBITMQ_NODENAME + value: "rabbit@$(MY_POD_NAME).$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local" + - name: K8S_HOSTNAME_SUFFIX + value: ".$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local" + - name: RABBITMQ_LOGS + value: "-" + - name: RABBITMQ_ULIMIT_NOFILES + value: "65536" + - name: RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS + value: +S 2:1 + - name: RABBITMQ_USE_LONGNAME + value: "true" + - name: RABBITMQ_ERL_COOKIE + valueFrom: + secretKeyRef: + name: pipelines-rabbitmq + key: rabbitmq-erlang-cookie + - name: RABBITMQ_PASSWORD + valueFrom: + secretKeyRef: + name: pipelines-rabbitmq + key: rabbitmq-password + securityContext: + fsGroup: 1001 + runAsUser: 1001 + volumes: + - name: config-volume + configMap: + name: pipelines-rabbitmq-config + items: + - key: rabbitmq.conf + path: rabbitmq.conf + - key: enabled_plugins + path: enabled_plugins + - name: healthchecks + configMap: + name: pipelines-rabbitmq-healthchecks + items: + - key: rabbitmq-health-check + path: rabbitmq-health-check + mode: 111 + - key: rabbitmq-api-check + path: rabbitmq-api-check + mode: 111 + volumeClaimTemplates: + - metadata: + name: data + labels: + app: rabbitmq + release: "pipelines" + heritage: "Helm" + spec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: "20Gi" +--- +# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/redis-master-statefulset.yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: pipelines-redis-master + namespace: default + labels: + app: redis + chart: redis-10.6.3 + release: pipelines + heritage: Helm +spec: + selector: + matchLabels: + app: redis + release: pipelines + role: master + serviceName: pipelines-redis-headless + template: + metadata: + labels: + app: redis + chart: redis-10.6.3 + release: pipelines + role: master + annotations: + checksum/health: 5d2e8523ae6c0cac2452aab66904ac5b5d6dc0a529ac4e9333177b412c6e8fd1 + checksum/configmap: 58a5a052638c9f5d1252ef740b81decddd00d24176a06b07b57f3e4b1987e666 + checksum/secret: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + spec: + securityContext: + fsGroup: 1001 + serviceAccountName: "default" + containers: + - name: redis + image: "registry.redhat.io/rhel8/redis-5:1-98" + imagePullPolicy: "IfNotPresent" + securityContext: + runAsUser: 1001 + command: + - /bin/bash + - -c + - | + if [[ -n $REDIS_PASSWORD_FILE ]]; then + password_aux=`cat ${REDIS_PASSWORD_FILE}` + export REDIS_PASSWORD=$password_aux + fi + if [[ ! -f /opt/bitnami/redis/etc/master.conf ]];then + cp /opt/bitnami/redis/mounted-etc/master.conf /opt/bitnami/redis/etc/master.conf + fi + if [[ ! -f /opt/bitnami/redis/etc/redis.conf ]];then + cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf + fi + ARGS=("--port" "${REDIS_PORT}") + ARGS+=("--protected-mode" "no") + ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf") + ARGS+=("--include" "/opt/bitnami/redis/etc/master.conf") + redis-server "${ARGS[@]}" + env: + - name: REDIS_REPLICATION_MODE + value: master + - name: ALLOW_EMPTY_PASSWORD + value: "yes" + - name: REDIS_PORT + value: "6379" + ports: + - name: redis + containerPort: 6379 + livenessProbe: + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 5 + exec: + command: + - sh + - -c + - /health/ping_liveness_local.sh 5 + readinessProbe: + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 5 + exec: + command: + - sh + - -c + - /health/ping_readiness_local.sh 5 + resources: + {} + volumeMounts: + - name: health + mountPath: /health + - name: redis-data + mountPath: /data + subPath: + - name: config + mountPath: /opt/bitnami/redis/mounted-etc + - name: redis-tmp-conf + mountPath: /opt/bitnami/redis/etc/ + volumes: + - name: health + configMap: + name: pipelines-redis-health + defaultMode: 0755 + - name: config + configMap: + name: pipelines-redis + - name: redis-tmp-conf + emptyDir: {} + volumeClaimTemplates: + - metadata: + name: redis-data + labels: + app: redis + release: pipelines + heritage: Helm + component: master + spec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: "8Gi" + + selector: + updateStrategy: + type: RollingUpdate +--- +# Source: openshift-pipelines/charts/pipelines/templates/pipelines-statefulset.yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: pipelines-pipelines-services + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm +spec: + serviceName: pipelines-pipelines-services-headless + replicas: 1 + updateStrategy: + type: RollingUpdate + selector: + matchLabels: + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + component: pipelines-pipelines-services + template: + metadata: + labels: + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + component: pipelines-pipelines-services + annotations: + checksum/systemyaml: f5d51f2f399be165ea4c3d48b085ab08baed54b2591828cd38fb5f847af16cae + checksum/secretdb: 48459e973b36b16071c353caa94a8ca3d3b446a893f79f86af191ce6f3856887 + checksum/secretaws: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b + checksum/configaws: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b + checksum/secretk8s: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b + checksum/configk8s: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b + checksum/configfilebeat: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + spec: + serviceAccountName: pipelines + initContainers: + - name: copy-system-yaml + image: "quay.io/jfrog/init:1.0.0" + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + command: + - '/bin/sh' + - '-c' + - > + echo "Copy system.yaml to /opt/jfrog/pipelines/var/etc"; + cp -fv /tmp/etc/system.yaml /opt/jfrog/pipelines/var/etc/system.yaml; + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: systemyaml + mountPath: "/tmp/etc/system.yaml" + subPath: system.yaml + - name: wait-for-vault + image: "quay.io/jfrog/init:1.0.0" + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + command: + - 'sh' + - '-c' + - > + echo "Waiting for Vault to come up..."; + until nc -z -w 2 pipelines-pipelines-vault 30100 && echo Vault ok; do + sleep 2; + done; + - name: pipelines-installer + image: "registry.connect.redhat.com/jfrog/pipelines-installer:1.7.1" + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + env: + - name: VAULT_TOKEN + valueFrom: + secretKeyRef: + name: root-vault-secret + key: token + - name: PIPELINES_SHARED_DB_CONNECTIONSTRING + valueFrom: + secretKeyRef: + name: pipelines-database + key: postgresql-url + - name: PIPELINES_NODE_ID + valueFrom: + fieldRef: + fieldPath: "metadata.name" + command: + - 'sh' + - '-c' + - > + echo "Waiting for RabbitMQ to come up..."; + until nc -z -w 2 pipelines-rabbitmq 5672 && echo rabbitmq ok; do + sleep 2; + done; + echo "Waiting for Redis to come up..."; + until nc -z -w 2 pipelines-redis-master 6379 && echo redis ok; do + sleep 2; + done; + sleep 20; + ./pipelines-k8s; + echo "Setting router as user for system.yaml"; + chown 1117:1117 /opt/jfrog/pipelines/var/etc/system.yaml; + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + + - name: "redhat-custom-setup" + image: quay.io/jfrog/init:1.0.0 + imagePullPolicy: Always + command: + - 'sh' + - '-c' + - 'chown -R 1117:1117 /opt/jfrog/pipelines/var/etc' + securityContext: + runAsUser: 0 + volumeMounts: + - mountPath: "/opt/jfrog/pipelines/var/etc" + name: volume + + containers: + - name: router + image: "registry.connect.redhat.com/jfrog/pipelines-router:1.7.1" + imagePullPolicy: IfNotPresent + env: + - name: JF_ROUTER_SERVICEREGISTRY_URL + value: "http://openshiftartifactoryha-nginx/access" + - name: JF_ROUTER_SERVICEREGISTRY_GRPCADDRESS + value: "openshiftartifactoryha-nginx" + - name: JF_ROUTER_ENTRYPOINTS_INTERNALPORT + value: "8046" + - name: JF_ROUTER_ENTRYPOINTS_EXTERNALPORT + value: "8082" + - name: JF_ROUTER_LOGGING_ROUTER_LOGLEVEL + value: "DEBUG" + - name: JF_SHARED_NODE_ID + valueFrom: + fieldRef: + fieldPath: "metadata.name" + - name: JF_SHARED_NODE_IP + valueFrom: + fieldRef: + fieldPath: "status.podIP" + - name: JF_SHARED_SECURITY_JOINKEY + value: "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" + - name: JF_ROUTER_ENCRYPTSYSTEMCONFIG + value: "true" + ports: + - name: router + containerPort: 8046 + securityContext: + allowPrivilegeEscalation: false + resources: + + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/router/var/etc + - name: api + image: "registry.connect.redhat.com/jfrog/pipelines-api:1.7.1" + imagePullPolicy: IfNotPresent + env: + - name: PIPELINES_NODE_ID + valueFrom: + fieldRef: + fieldPath: "metadata.name" + ports: + - name: api + containerPort: 30000 + livenessProbe: + httpGet: + path: / + port: api + initialDelaySeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + readinessProbe: + httpGet: + path: / + port: api + initialDelaySeconds: 10 + timeoutSeconds: 3 + periodSeconds: 5 + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: www + image: "registry.connect.redhat.com/jfrog/pipelines-www:1.7.1" + imagePullPolicy: IfNotPresent + ports: + - name: www + containerPort: 30001 + livenessProbe: + httpGet: + path: / + port: www + initialDelaySeconds: 10 + failureThreshold: 6 + timeoutSeconds: 5 + readinessProbe: + httpGet: + path: / + port: www + initialDelaySeconds: 10 + timeoutSeconds: 3 + periodSeconds: 5 + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: pipelinesync + image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" + imagePullPolicy: IfNotPresent + workingDir: /opt/jfrog/pipelines/app/micro/pipelineSync + env: + - name: COMPONENT + value: pipelinesync + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: runtrigger + image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" + imagePullPolicy: IfNotPresent + workingDir: /opt/jfrog/pipelines/app/micro/runTrigger + env: + - name: COMPONENT + value: runtrigger + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: steptrigger + image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" + imagePullPolicy: IfNotPresent + workingDir: /opt/jfrog/pipelines/app/micro/stepTrigger + env: + - name: COMPONENT + value: steptrigger + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: cron + image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" + imagePullPolicy: IfNotPresent + workingDir: /opt/jfrog/pipelines/app/micro/cron + env: + - name: COMPONENT + value: cron + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: nexec + image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" + imagePullPolicy: IfNotPresent + workingDir: /opt/jfrog/pipelines/app/micro/nexec + env: + - name: COMPONENT + value: nexec + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: hookhandler + image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" + imagePullPolicy: IfNotPresent + workingDir: /opt/jfrog/pipelines/app/micro/hookHandler + env: + - name: COMPONENT + value: hookhandler + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: marshaller + image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" + imagePullPolicy: IfNotPresent + workingDir: /opt/jfrog/pipelines/app/micro/marshaller + env: + - name: COMPONENT + value: marshaller + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: logup + image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" + imagePullPolicy: IfNotPresent + workingDir: /opt/jfrog/pipelines/app/micro/logup + env: + - name: COMPONENT + value: logup + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + - name: extensionsync + image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" + imagePullPolicy: IfNotPresent + workingDir: /opt/jfrog/pipelines/app/micro/extensionSync + env: + - name: COMPONENT + value: extensionsync + resources: + {} + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: jfrog-pipelines-logs + mountPath: /opt/jfrog/pipelines/var/log + volumes: + - name: jfrog-pipelines-folder + emptyDir: {} + - name: jfrog-pipelines-logs + emptyDir: {} + - name: systemyaml + secret: + secretName: pipelines-system-yaml +--- +# Source: openshift-pipelines/charts/pipelines/templates/vault-statefulset.yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: pipelines-pipelines-vault + labels: + helm.sh/chart: pipelines-1.4.5 + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + app.kubernetes.io/version: "1.7.2" + app.kubernetes.io/managed-by: Helm + component: pipelines-pipelines-vault +spec: + serviceName: pipelines-pipelines-vault-headless + replicas: 1 + updateStrategy: + type: RollingUpdate + selector: + matchLabels: + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + component: pipelines-pipelines-vault + template: + metadata: + labels: + app.kubernetes.io/name: pipelines + app.kubernetes.io/instance: pipelines + component: pipelines-pipelines-vault + spec: + serviceAccountName: pipelines-pipelines-vault + initContainers: + - name: config + image: 'quay.io/jfrog/init:1.0.0' + imagePullPolicy: IfNotPresent + env: + - name: PIPELINES_SHARED_DB_CONNECTIONSTRING + valueFrom: + secretKeyRef: + name: pipelines-database + key: postgresql-url + command: ["/bin/sh", "-c"] + args: + - | + cat > /etc/vault/config/vault.hcl < + echo "Waiting for Postgres to come up..."; + until nc -z -w 2 postgres-postgresql 5432 && echo database ok; do + sleep 2; + done; + sleep 10; + - name: create-vault-table + image: "registry.connect.redhat.com/jfrog/pipelines-installer:1.7.1" + imagePullPolicy: IfNotPresent + env: + - name: PIPELINES_SHARED_DB_CONNECTIONSTRING + valueFrom: + secretKeyRef: + name: pipelines-database + key: postgresql-url + command: + - 'sh' + - '-c' + - > + echo "Copy system.yaml to /opt/jfrog/pipelines/var/etc"; + cp -fv /tmp/etc/system.yaml /opt/jfrog/pipelines/var/etc/system.yaml; + echo "Creating Vault Table..."; + ./pipelines-k8s initVault; + volumeMounts: + - name: jfrog-pipelines-folder + mountPath: /opt/jfrog/pipelines/var/etc + - name: systemyaml + mountPath: "/tmp/etc/system.yaml" + subPath: system.yaml + containers: + - name: vault-init + image: "registry.connect.redhat.com/jfrog/pipelines-vault-init:1.7.1" + imagePullPolicy: IfNotPresent + env: + - name: CHECK_INTERVAL + value: "10s" + - name: VAULT_NAMESPACE + value: default + - name: VAULT_ADDRESS + value: "http://localhost:30100" + resources: + requests: + memory: 10Mi + cpu: 10m + limits: + memory: 50Mi + cpu: 50m + - name: vault + image: "registry.connect.redhat.com/jfrog/pipelines-vault:1.7.1" + imagePullPolicy: IfNotPresent + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: "status.podIP" + - name: "VAULT_API_ADDR" + value: "http://$(POD_IP):30100" + - name: "VAULT_CLUSTER_ADDR" + value: "http://$(POD_IP):30101" + args: + - "server" + - "-config=/etc/vault/config/vault.hcl" + ports: + - name: http + containerPort: 30100 + protocol: "TCP" + - name: server + containerPort: 30101 + protocol: "TCP" + readinessProbe: + httpGet: + path: "/v1/sys/health?standbyok=true" + port: 30100 + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + {} + securityContext: + capabilities: + add: + - IPC_LOCK + volumeMounts: + - name: vault-config + mountPath: /etc/vault/config + volumes: + - name: vault-config + emptyDir: {} + - name: jfrog-pipelines-folder + emptyDir: {} + - name: systemyaml + secret: + secretName: pipelines-system-yaml + diff --git a/Openshift4/openshift-pipelines/requirements.lock b/Openshift4/openshift-pipelines/requirements.lock new file mode 100644 index 0000000..a315dab --- /dev/null +++ b/Openshift4/openshift-pipelines/requirements.lock @@ -0,0 +1,6 @@ +dependencies: +- name: pipelines + repository: https://charts.jfrog.io/ + version: 1.4.5 +digest: sha256:83b0fa740797074925e7f237762ff493727faf58476c3884f247acc44428202b +generated: "2020-09-21T10:32:37.846331-07:00" diff --git a/Openshift4/openshift-pipelines/requirements.yaml b/Openshift4/openshift-pipelines/requirements.yaml new file mode 100644 index 0000000..1a1825b --- /dev/null +++ b/Openshift4/openshift-pipelines/requirements.yaml @@ -0,0 +1,4 @@ +dependencies: + - name: pipelines + version: 1.4.5 + repository: https://charts.jfrog.io/ diff --git a/Openshift4/openshift-pipelines/values.yaml b/Openshift4/openshift-pipelines/values.yaml new file mode 100755 index 0000000..d69ed25 --- /dev/null +++ b/Openshift4/openshift-pipelines/values.yaml @@ -0,0 +1,1117 @@ +pipelines: + # MUST SET FOR EXTERNAL POSTGRESQL AND VAULT + global: + postgresql: + host: OVERRIDE + port: OVERRIDE + database: OVERRIDE + user: OVERRIDE + password: OVERRIDE + ssl: OVERRIDE + + vault: + host: OVERRIDE + port: OVERRIDE + token: OVERRIDE + + ## Common + initContainer: + #image: registry.connect.redhat.com/jfrog/init:1.0.0 + image: quay.io/jfrog/init:1.0.0 + pullPolicy: IfNotPresent + + ## Available modes: devmode (enable it for debuging) and production + runMode: production + + ## Image Registry to pull images for Pipelines components from + ## You can override it with your private Artifactory registry + imageRegistry: registry.connect.redhat.com + + ## For supporting pulling from private registries + ## Secret type: kubernetes.io/dockerconfigjson + imagePullSecrets: + + ## Existing secret with Pipelines system.yaml + existingSecret: + + ## String to partially override pipelines.fullname template (will maintain the release name) + # nameOverride: + + ## String to fully override pipelines.fullname template + # fullnameOverride: + + ## Set user/group to run Pipelines components with + securityContext: + enabled: true + uid: 1030 + gid: 1030 + + ## Pipelines components + pipelines: + + version: 1.7.1 + + ## Artifactory URL - Mandatory + jfrogUrl: OVERRIDE + ## Artifactory UI URL - Mandatory + jfrogUrlUI: OVERRIDE + + ## Join Key to connect to Artifactory + ## IMPORTANT: You should NOT use the example joinKey for a production deployment! + joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE + + ## Pipelines requires a unique master key + ## You can generate one with the command: "openssl rand -hex 32" + ## IMPORTANT: You should NOT use the example masterKey for a production deployment! + masterKey: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + + ## Installer Authentication Token + ## The unique token can be generated with: uuidgen | tr '[:upper:]' '[:lower:]' + authToken: "c7595edd-b63d-4fd6-9e1e-13924d6637f0" + + ## Pipelines ID in Artifactory + ## For production, the unique ID should be generated instead of using 12345: openssl rand | tr -dc 1-9 | head -c 10 + serviceId: jfpip@12345 + + ## Artifactory Service ID + ## This should be set to the Artifactory Service ID + artifactoryServiceId: "FFFFFFFFFFFF" + + ## Artifactory License ID + ## + licenseId: "FFFFFFFFF" + + ## A name must be unique if the same Artifactory is shared between different Pipelines + ## Repository type `Generic` with layout `maven-2-default` must be precreated in advance + rootBucket: jfrogpipelines + + mountPath: /opt/jfrog/pipelines/var/etc + + logPath: /opt/jfrog/pipelines/var/log + + replicaCount: 1 + + # CORS configuration. Default values are artifactory url and www external url + accessControlAllowOrigins_0: OVERRIDE + accessControlAllowOrigins_1: OVERRIDE + + # RabbitMQ health check interval in mins + rabbitmqHealthCheckIntervalInMins: 1 + + updateStrategy: RollingUpdate + + nodeSelector: {} + tolerations: [] + affinity: {} + + ## Apply horizontal pod auto scaling on Pipelines pods + ## Ref: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 70 + + api: + image: + repository: jfrog/pipelines-api + pullPolicy: IfNotPresent + + service: + ## Supported service types: ClusterIP, NodePort and LoadBalancer + type: ClusterIP + port: 30000 + + annotations: + # external-dns.alpha.kubernetes.io/hostname: example.org + # service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp + # service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-east-1:XXXXXX:certificate/XXXXXX + + ## Set LB static IP + loadBalancerIP: + + ## Whitelist IPs allowed to LoadBalancer type services + ## Example: loadBalancerSourceRanges={82.82.190.51/32,141.141.8.8/32} + loadBalancerSourceRanges: [] + + ## External URL, it is ignored if ingress is enabled + externalUrl: OVERRIDE + + ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + path: / + hosts: + - chart-example.local + + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + router: + image: + repository: jfrog/pipelines-router + pullPolicy: IfNotPresent + + internalPort: 8046 + externalPort: 8082 + + mountPath: "/opt/jfrog/router/var/etc" + + resources: {} + # requests: + # memory: "2Gi" + # cpu: "500m" + # limits: + # memory: "4Gi" + # cpu: "2" + + www: + image: + repository: jfrog/pipelines-www + pullPolicy: IfNotPresent + + service: + ## Supported service types: ClusterIP, NodePort and LoadBalancer + type: ClusterIP + port: 30001 + + annotations: + # external-dns.alpha.kubernetes.io/hostname: example.org + # service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp + # service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-east-1:XXXXXX:certificate/XXXXXX + + ## Set LB static IP + loadBalancerIP: + + ## Whitelist IPs allowed to LoadBalancer type services + ## Example: loadBalancerSourceRanges={82.82.190.51/32,141.141.8.8/32} + loadBalancerSourceRanges: [] + + ## External URL, it is ignored if ingress is enabled + externalUrl: OVERRIDE + + ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + path: / + hosts: + - chart-example.local + + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + msg: + uiUser: OVERRIDE + uiUserPassword: OVERRIDE + + pipelineSync: + image: + repository: jfrog/pipelines-micro + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + runTrigger: + image: + repository: jfrog/pipelines-micro + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + stepTrigger: + image: + repository: jfrog/pipelines-micro + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + cron: + image: + repository: jfrog/pipelines-micro + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + nexec: + image: + repository: jfrog/pipelines-micro + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + hookHandler: + image: + repository: jfrog/pipelines-micro + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + marshaller: + image: + repository: jfrog/pipelines-micro + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + logup: + image: + repository: jfrog/pipelines-micro + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + extensionSync: + image: + repository: jfrog/pipelines-micro + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + ## Pipelines installer + pipelinesInit: + image: + repository: jfrog/pipelines-installer + pullPolicy: IfNotPresent + + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + ## Cluster Role Based Access + ## Ref: https://kubernetes.io/docs/admin/authorization/rbac/ + rbac: + role: + ## Rules to create. It follows the role specification + rules: + - apiGroups: ["", "extensions", "apps"] + resources: + - deployments + - persistentvolumes + - persistentvolumeclaims + - pods + - deployments/scale + verbs: ["*"] + + # Add any list of configmaps to Pipelines + configMaps: | + # posthook-start.sh: |- + # echo "This is a post start script" + # posthook-end.sh: |- + # echo "This is a post end script" + + ## Add custom volumes + customVolumes: | + # - name: custom-script + # configMap: + # name: custom-script + + ## Add custom volumesMounts + customVolumeMounts: | + # - name: custom-script + # mountPath: /scripts/script.sh + # subPath: script.sh + + ## Add custom init containers + customInitContainers: | + - name: "redhat-custom-setup" + image: {{ .Values.initContainer.image }} + imagePullPolicy: Always + command: + - 'sh' + - '-c' + - 'mkdir -p /opt/jfrog/pipelines/var/etc && mkdir -p /opt/jfrog/pipelines/var/tmp && mkdir -p /opt/jfrog/pipelines/var/log && chown -R 1117:1117 /opt/jfrog/pipelines && chmod -R 0777 /opt/jfrog/pipelines' + securityContext: + runAsUser: 0 + volumeMounts: + - mountPath: "/opt/jfrog/pipelines" + name: jfrog-pipelines-folder + + ## Add custom sidecar containers + # - The provided example uses a custom volume (customVolumes) + customSidecarContainers: | + # - name: "sidecar-list-etc" + # image: "{{ .Values.initContainer.image }}" + # imagePullPolicy: "{{ .Values.initContainer.pullPolicy }}" + # securityContext: + # allowPrivilegeEscalation: false + # command: + # - 'sh' + # - '-c' + # - 'sh /scripts/script.sh' + # volumeMounts: + # - mountPath: "{{ .Values.pipelines.mountPath }}" + # name: volume + # - mountPath: "/scripts/script.sh" + # name: custom-script + # subPath: script.sh + # resources: + # requests: + # memory: "32Mi" + # cpu: "50m" + # limits: + # memory: "128Mi" + # cpu: "100m" + + systemYaml: | + shared: + ## Artifactory configuration + ## + artifactory: + ## Artifactory URL + ## + baseUrl: "{{ tpl (required "\n\npipelines.jfrogUrl is required!\n" .Values.pipelines.jfrogUrl) . }}" + ## Unified UI URL + ## + baseUrlUI: "{{ tpl (required "\n\npipelines.jfrogUrlUI is required!\n" .Values.pipelines.jfrogUrlUI) . }}" + ## Pipelines Service ID + ## + serviceId: "{{ .Values.pipelines.serviceId }}" + ## Artifactory Service ID + ## + artifactoryServiceId: "{{ .Values.pipelines.artifactoryServiceId }}" + ## Artifactory License ID + ## + licenseId: "{{ .Values.pipelines.licenseId }}" + ## Proxy to connect to Artifactory + ## + proxy: + url: "" + username: "" + password: "" + + ## Router configuration + ## + router: + ip: "" + accessPort: {{ .Values.pipelines.router.internalPort }} + dataPort: {{ .Values.pipelines.router.externalPort }} + joinKey: "{{ .Values.pipelines.joinKey }}" + + security: + masterKey: "{{ .Values.pipelines.masterKey }}" + + ## Database configuration + ## + db: + type: "postgres" + {{- if .Values.postgresql.enabled }} + ip: {{ tpl .Release.Name . }}-postgresql + port: "{{ .Values.postgresql.service.port }}" + name: {{ .Values.postgresql.postgresqlDatabase }} + username: {{ .Values.postgresql.postgresqlUsername }} + password: {{ .Values.postgresql.postgresqlPassword }} + {{- else }} + ip: {{ tpl .Values.global.postgresql.host . }} + port: "{{ .Values.global.postgresql.port }}" + name: {{ .Values.global.postgresql.database }} + username: {{ .Values.global.postgresql.user }} + password: {{ .Values.global.postgresql.password }} + {{- end }} + externalUrl: "" + {{- if .Values.postgresql.enabled }} + connectionString: "{{ tpl (printf "postgres://%s:%s@%s-postgresql:%v/%s" .Values.postgresql.postgresqlUsername .Values.postgresql.postgresqlPassword .Release.Name .Values.postgresql.service.port .Values.postgresql.postgresqlDatabase) . }}" + {{- else if and (not .Values.postgresql.enabled) (.Values.global.postgresql.ssl) }} + connectionString: "{{ tpl (printf "postgres://%s:%s@%v:%v/%s?sslmode=require" .Values.global.postgresql.user .Values.global.postgresql.password .Values.global.postgresql.host .Values.global.postgresql.port .Values.global.postgresql.database) . }}" + {{- else }} + connectionString: "{{ tpl (printf "postgres://%s:%s@%v:%v/%s" .Values.global.postgresql.user .Values.global.postgresql.password .Values.global.postgresql.host .Values.global.postgresql.port .Values.global.postgresql.database) . }}" + {{- end }} + + ## RabbitMQ configuration + ## + msg: + {{- if .Values.rabbitmq.enabled }} + ip: {{ .Release.Name }}-rabbitmq + port: {{ .Values.rabbitmq.service.port }} + adminPort: {{ .Values.rabbitmq.service.managerPort }} + erlangCookie: {{ .Values.rabbitmq.rabbitmq.erlangCookie }} + username: {{ .Values.rabbitmq.rabbitmq.username }} + password: {{ .Values.rabbitmq.rabbitmq.password }} + defaultExchange: pipelinesEx + amqpVhost: pipelines + amqpRootVhost: pipelinesRoot + {{- else }} + ip: {{ tpl .Values.rabbitmq.internal_ip . }} + port: {{ .Values.rabbitmq.port}} + adminPort: {{ .Values.rabbitmq.manager_port }} + erlangCookie: {{ .Values.rabbitmq.erlang_cookie }} + username: {{ .Values.rabbitmq.ms_username }} + password: {{ .Values.rabbitmq.ms_password }} + defaultExchange: {{ .Values.rabbitmq.root_vhost_exchange_name }} + amqpVhost: {{ .Values.rabbitmq.build_vhost_name}} + amqpRootVhost: {{ .Values.rabbitmq.root_vhost_name }} + protocol: {{ .Values.rabbitmq.protocol }} + {{- end }} + queues: + - "core.pipelineSync" + - "core.runTrigger" + - "core.stepTrigger" + - "core.marshaller" + - "cluster.init" + - "core.logup" + - "www.signals" + - "core.nexec" + - "core.hookHandler" + - "core.extensionSync" + ui: + {{- if .Values.rabbitmq.enabled }} + username: {{ .Values.pipelines.msg.uiUser }} + password: {{ .Values.pipelines.msg.uiUserPassword }} + {{- else }} + protocol: http + username: {{ .Values.rabbitmq.cp_username }} + password: {{ .Values.rabbitmq.cp_password }} + {{- end }} + external: + ## URL for build plane VMs to access RabbitMQ + {{- if .Values.rabbitmq.externalUrl }} + url: {{ .Values.rabbitmq.externalUrl }} + {{- else if (and .Values.rabbitmq.serviceVmLb.enabled .Values.rabbitmq.serviceVmLb.loadBalancerIP) }} + url: amqp://{{ .Values.rabbitmq.serviceVmLb.loadBalancerIP }} + {{- else if .Values.rabbitmq.enabled }} + url: amqp://{{ tpl .Release.Name . }}-rabbitmq + {{- else }} + url: {{ .Values.rabbitmq.protocol }}://{{ tpl .Values.rabbitmq.msg_hostname . }}:{{ .Values.rabbitmq.port }} + {{- end }} + rootUrl: "" + adminUrl: "" + {{- if not .Values.rabbitmq.enabled }} + build: + username: {{ .Values.rabbitmq.build_username }} + password: {{ .Values.rabbitmq.build_password }} + {{- end }} + + ## Vault configuration + ## + vault: + {{- if .Values.vault.enabled }} + ip: {{ include "pipelines.vault.name" . }} + port: {{ .Values.vault.service.port }} + {{- else }} + ip: {{ .Values.global.vault.host }} + port: {{ .Values.global.vault.port }} + {{- end }} + ## DO NOT CHANGE THE TOKEN VALUE!!! + token: "_VAULT_TOKEN_" + unsealKeys: + - "" + - "" + - "" + - "" + - "" + + ## Redis configuration + ## + redis: + ip: {{ .Release.Name }}-redis-master + port: 6379 + clusterEnabled: false + + ## This section is used for bringing up the core services and setting up + ## configurations required by the installer & the services + ## + core: + ## id is automatically determined based on the current hostname + ## or set using the SHARED_NODE_ID environment variable. + ## + id: "afd8df9d08bf257ae9b7d7dbbf348b7a3a574ebdd3a61d350d4b64e3129dee85" + installerIP: "1.2.3.4" + installerAuthToken: "{{ .Values.pipelines.authToken }}" + installerImage: "jfrog/pipelines-installer" + registryUrl: "{{ .Values.imageRegistry }}" + os: "Ubuntu_16.04" + osDistribution: "xenial" + architecture: "x86_64" + dockerVersion: "" + runMode: "{{ .Values.runMode }}" + user: "" + group: "" + noVerifySsl: false + ignoreTLSErrors: false + controlplaneVersion: "{{ default .Chart.AppVersion .Values.pipelines.version }}" + buildplaneVersion: "{{ default .Chart.AppVersion .Values.pipelines.version }}" + accessControlAllowOrigins: + - {{ .Values.pipelines.accessControlAllowOrigins_0 }} + - {{ .Values.pipelines.accessControlAllowOrigins_1 }} + rabbitmqHealthCheckIntervalInMins: {{ .Values.pipelines.rabbitmqHealthCheckIntervalInMins}} + ## Global proxy settings, to be applied to all services + ## + proxy: + httpProxy: "" + httpsProxy: "" + noProxy: "" + username: "" + password: "" + + ## Mailserver settings + ## + mailserver: + host: "" + port: "" + username: "" + password: "" + tls: "" + ssl: "" + apiRetryIntervalMs: 3000 + accountSyncFrequencyHr: 1 + imageRegistrySecret: "{{ .Values.imagePullSecrets }}" + hardDeleteIntervalInMins: 60 + configBackupCount: 5 + lastUpdateTime: "" + callHomeUrl: "https://api.bintray.com/products/jfrog/pipelines/stats/usage" + allowCallHome: true + serviceInstanceHealthCheckIntervalInMins: 1 + serviceInstanceStatsCutOffIntervalInHours: 24 + + ## Service configuration + ## + services: + api: + name: {{ include "pipelines.api.name" . }} + port: {{ .Values.pipelines.api.service.port }} + {{- if (and .Values.pipelines.api.ingress.enabled .Values.pipelines.api.ingress.tls) }} + {{- range .Values.pipelines.api.ingress.hosts }} + externalUrl: https://{{ . }} + {{- end }} + {{- else if .Values.pipelines.api.ingress.enabled }} + {{- range .Values.pipelines.api.ingress.hosts }} + externalUrl: http://{{ . }} + {{- end }} + {{- else }} + externalUrl: {{ .Values.pipelines.api.externalUrl }} + {{- end }} + www: + name: {{ include "pipelines.www.name" . }} + port: {{ .Values.pipelines.www.service.port }} + {{- if (and .Values.pipelines.www.ingress.enabled .Values.pipelines.www.ingress.tls) }} + {{- range .Values.pipelines.www.ingress.hosts }} + externalUrl: https://{{ . }} + {{- end }} + {{- else if .Values.pipelines.www.ingress.enabled }} + {{- range .Values.pipelines.www.ingress.hosts }} + externalUrl: http://{{ . }} + {{- end }} + {{- else }} + externalUrl: {{ .Values.pipelines.www.externalUrl }} + {{- end }} + sessionSecret: "{{ .Values.pipelines.authToken }}" + pipelineSync: + name: pipelineSync + runTrigger: + name: runTrigger + stepTrigger: + name: stepTrigger + cron: + name: cron + nexec: + name: nexec + hookHandler: + name: hookHandler + marshaller: + name: marshaller + extensionSync: + name: extensionSync + + ## Runtime configuration + ## + runtime: + rootBucket: "{{ .Values.pipelines.rootBucket }}" + defaultMinionCount: 1 + nodeCacheIntervalMS: 600000 + jobConsoleBatchSize: 10 + jobConsoleBufferIntervalMs: 3 + maxDiskUsagePercentage: 90 + stepTimeoutMS: 3600000 + nodeStopDayOfWeek: 0 + nodeStopIntervalDays: 30 + maxNodeCheckInDelayMin: 15 + defaultMinionInstanceSize: "c4.large" + allowDynamicNodes: true + allowCustomNodes: true + {{- range $key, $value := .Values.runtimeOverride }} + {{ $key }}: {{ $value | quote }} + {{- end }} + languageImages: + - architecture: x86_64 + os: Ubuntu_16.04 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: Ubuntu_16.04 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16java + defaultVersion: 13 + - architecture: x86_64 + os: Ubuntu_16.04 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16cpp + defaultVersion: 9.0.0 + - architecture: x86_64 + os: Ubuntu_16.04 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-u16go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: Ubuntu_18.04 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: Ubuntu_18.04 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18java + defaultVersion: 13 + - architecture: x86_64 + os: Ubuntu_18.04 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18cpp + defaultVersion: 9.0.0 + - architecture: x86_64 + os: Ubuntu_18.04 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-u18go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: CentOS_7 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: CentOS_7 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7java + defaultVersion: 11 + - architecture: x86_64 + os: CentOS_7 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7cpp + defaultVersion: 3.4.2 + - architecture: x86_64 + os: CentOS_7 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: WindowsServer_2019 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19node + defaultVersion: 10.18.0 + - architecture: x86_64 + os: WindowsServer_2019 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19java + defaultVersion: 11 + - architecture: x86_64 + os: WindowsServer_2019 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19cpp + defaultVersion: 9.0.0 + - architecture: x86_64 + os: WindowsServer_2019 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19go + defaultVersion: 1.12.14 + - architecture: x86_64 + os: WindowsServer_2019 + language: dotnetcore + registryUrl: docker.bintray.io + image: jfrog/pipelines-w19dotnetcore + isDefault: true + defaultVersion: 3.1 + - architecture: x86_64 + os: RHEL_7 + language: node + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7node + isDefault: true + defaultVersion: 10.18.0 + - architecture: x86_64 + os: RHEL_7 + language: java + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7java + defaultVersion: 11 + - architecture: x86_64 + os: RHEL_7 + language: cpp + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7cpp + defaultVersion: 3.4.2 + - architecture: x86_64 + os: RHEL_7 + language: go + registryUrl: docker.bintray.io + image: jfrog/pipelines-c7go + defaultVersion: 1.12.14 + + ## Runtime Override Properties Section + runtimeOverride: {} + + # PostgreSQL + ## https://hub.helm.sh/charts/bitnami/postgresql + ## Configuration values for the postgresql dependency + ## ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md + ## + postgresql: + enabled: false + + ## RabbitMQ HA + ## https://hub.helm.sh/charts/bitnami/rabbitmq + ## Configuration values for the rabbitmq dependency + ## ref: https://github.com/kubernetes/charts/blob/master/stable/rabbitmq/README.md + ## + # /var/lib/rabbitmq + rabbitmq: + enabled: true + protocol: amqps + replicas: 1 + image: + registry: registry.connect.redhat.com + repository: jfrog/xray-rabbitmq + tag: 3.8.6 + + rabbitmq: + username: admin + password: "" + + ## Erlang cookie to determine whether different nodes are allowed to communicate with each other + erlangCookie: PIPELINESRABBITMQCLUSTER + # existingErlangSecret: name-of-existing-secret + + extraPlugins: "" + + service: + type: ClusterIP + + ## Service annotations + annotations: {} + + ## Load Balancer sources + # loadBalancerSourceRanges: + # - 10.10.10.0/24 + + persistence: + enabled: true + size: 20Gi + + resources: {} + + affinity: {} + + ingress: + ## Set to true to enable ingress record generation + enabled: false + + ## The list of hostnames to be covered with this ingress record. + ## Most likely this will be just one host, but in the event more hosts are needed, this is an array + # hostName: foo.bar.com + path: / + + ## Set this to true in order to enable TLS on the ingress record + ## A side effect of this will be that the backend wordpress service will be connected at port 443 + tls: true + + ## If TLS is set to true, you must declare what secret will store the key/certificate for TLS + tlsSecret: OVERRIDE + + ## Ingress annotations done as key:value pairs + annotations: + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: true + + ## External URL for Build Plane VMs to access RabbitMQ + ## e.g. amqps://pipelines-msg.doamin.com + ## It should be set for the LoadBalancer below IP with proper domain name and TLS if external IP is used. + externalUrl: OVERRIDE + + ## Service with external/internal LoadBalancer to access RabbitMQ by Node-pool VMs + serviceVmLb: + enabled: false + + annotations: + ## Set internal LB for Azure + # service.beta.kubernetes.io/azure-load-balancer-internal: "true" + ## Set internal LB for AWS + # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 + ## Set internal LB for GCP + # cloud.google.com/load-balancer-type: "Internal" + + ## You must to provide internal LB static IP + loadBalancerIP: + + ## Whitelist IPs allowed to LoadBalancer type services + ## Example: loadBalancerSourceRanges={82.82.190.51/32,141.141.8.8/32} + loadBalancerSourceRanges: [] + + ## Redis + ## Configuration values for the redis dependency + ## ref: https://github.com/bitnami/charts/tree/master/bitnami/redis + ## + redis: + enabled: true + image: + registry: registry.redhat.io + repository: rhel8/redis-5 + tag: 1-98 + + redisPort: 6379 + + cluster: + enabled: false + slaveCount: 2 + + usePassword: false + + master: + command: "" + configmap: |- + appendonly yes + loglevel notice + + resources: {} + # requests: + # memory: 200Mi + # cpu: 100m + # limits: + # memory: 700Mi + + affinity: {} + + slave: + resources: {} + # requests: + # memory: 200Mi + # cpu: 100m + # limits: + # memory: 200Mi + + affinity: {} + + ## Vault + vault: + enabled: true + + updateStrategy: RollingUpdate + + image: + repository: registry.connect.redhat.com/jfrog/pipelines-vault + tag: 1.7.1 + pullPolicy: IfNotPresent + + init: + image: + repository: jfrog/pipelines-vault-init + pullPolicy: IfNotPresent + + service: + # Supported service types: ClusterIP and NodePort + type: ClusterIP + port: 30100 + + # PRODUCTION environments should always enable mlock + disablemlock: false + + resources: {} + # requests: + # memory: 256Mi + # cpu: 200m + # limits: + # memory: 1Gi + # cpu: 600m + + affinity: {} + nodeSelector: {} + tolerations: [] + + ## Role Based Access + ## Ref: https://kubernetes.io/docs/admin/authorization/rbac/ + rbac: + role: + ## Rules to create. It follows the role specification + rules: + - apiGroups: + - '' + resources: + - secrets + verbs: + - "*" + + # Add any list of configmaps to vault + configMaps: | + # posthook-start.sh: |- + # echo "This is a post start script" + # posthook-end.sh: |- + # echo "This is a post end script" + + ## Add custom volumes + customVolumes: | + # - name: custom-script + # configMap: + # name: custom-script + + ## Add custom volumesMounts + customVolumeMounts: | + # - name: custom-script + # mountPath: /scripts/script.sh + # subPath: script.sh + + ## Add custom init containers + customInitContainers: | + # - name: "custom-setup" + # image: "{{ .Values.initContainer.image }}" + # imagePullPolicy: "{{ .Values.initContainer.pullPolicy}}" + # command: + # - 'sh' + # - '-c' + # - 'touch {{ .Values.pipelines.mountPath }}/example-custom-setup' + # volumeMounts: + # - mountPath: "{{ .Values.pipelines.mountPath}}" + # name: pipelines-data + + # Filebeat Sidecar container + filebeat: + enabled: false + + ## The Build Plane is where the actual builds will run + buildPlane: + ## Dynamic Build Plane integration for the initial bootstrapping of the build planes. + ## Any required changes post install need to be done in UI: Administration/Pipelines/Integrations + dynamic: + ## customer part is not needed for on-prem install + customer: + accountId: "" + nodePoolName: "" + nodelimit: "" + provider: + aws: + enabled: false + ## Replace the dummy values with the real ones + nodePoolName: "aws-dynamic-node-pool" + nodelimit: "3" + instanceType: c4.xlarge + securityGroupId: testsecuritygroupId + subnetId: test-subnetId + keyPairName: testaccountSSHKeyPair + vpcId: testVPCId + region: us-east-1 + ## + accessKey: "" + secretKey: "" + ## Existing secret with AWS keys + existingSecret: + k8s: + enabled: false + ## Replace the dummy values with the real ones + nodePoolName: "k8s-dynamic-node-pool" + nodelimit: "3" + cpu: "1" + memory: "1000" + namespace: default + storageClass: standard + ## Node Affinity values: {key1:value1,key2:value2} + labels: + ## Kubernetes node pool kubeconfig base64 encoded + kubeconfig: "" + ## Existing secret with kubeconfig + existingSecret: From 0195cdfeccc9f4c9bd638d1661db73e2183b2bbc Mon Sep 17 00:00:00 2001 From: John Peterson Date: Wed, 23 Sep 2020 11:48:12 -0700 Subject: [PATCH 13/28] Openshift pipelines removing out file --- Openshift4/openshift-pipelines/out | 3093 ---------------------------- 1 file changed, 3093 deletions(-) delete mode 100644 Openshift4/openshift-pipelines/out diff --git a/Openshift4/openshift-pipelines/out b/Openshift4/openshift-pipelines/out deleted file mode 100644 index 5e20f17..0000000 --- a/Openshift4/openshift-pipelines/out +++ /dev/null @@ -1,3093 +0,0 @@ -NAME: pipelines -LAST DEPLOYED: Wed Sep 23 10:16:50 2020 -NAMESPACE: default -STATUS: pending-install -REVISION: 1 -TEST SUITE: None -USER-SUPPLIED VALUES: -pipelines: - global: - postgresql: - database: pipelinesdb - host: postgres-postgresql - password: password - port: 5432 - ssl: false - user: artifactory - pipelines: - accessControlAllowOrigins_0: http://openshiftartifactoryha-nginx - accessControlAllowOrigins_1: http://openshiftartifactoryha-nginx - api: - externalUrl: http://pipelines-api.jfrog.tech - jfrogUrl: http://openshiftartifactoryha-nginx - jfrogUrlUI: http://openshiftartifactoryha-nginx - joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - masterKey: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - msg: - uiUser: monitor - uiUserPassword: monitor - www: - externalUrl: http://pipelines-www.jfrog.tech - postgresql: - enabled: false - rabbitmq: - externalUrl: amqps://pipelines-rabbit.jfrog.tech - rabbitmq: - password: guest - username: guest - -COMPUTED VALUES: -pipelines: - buildPlane: - dynamic: - customer: - accountId: "" - nodePoolName: "" - nodelimit: "" - provider: - aws: - accessKey: "" - enabled: false - existingSecret: null - instanceType: c4.xlarge - keyPairName: testaccountSSHKeyPair - nodePoolName: aws-dynamic-node-pool - nodelimit: "3" - region: us-east-1 - secretKey: "" - securityGroupId: testsecuritygroupId - subnetId: test-subnetId - vpcId: testVPCId - k8s: - cpu: "1" - enabled: false - existingSecret: null - kubeconfig: "" - labels: null - memory: "1000" - namespace: default - nodePoolName: k8s-dynamic-node-pool - nodelimit: "3" - storageClass: standard - existingSecret: null - filebeat: - enabled: false - filebeatYml: | - logging.level: info - path.data: {{ .Values.pipelines.logPath }}/filebeat - name: pipelines-filebeat - queue.spool: ~ - filebeat.inputs: - - type: log - enabled: true - close_eof: ${CLOSE:false} - paths: - - {{ .Values.pipelines.logPath }}/*.log - fields: - service: "jfpip" - log_type: "pipelines" - output: - logstash: - hosts: ["{{ .Values.filebeat.logstashUrl }}"] - image: - repository: docker.elastic.co/beats/filebeat - version: 7.5.1 - livenessProbe: - exec: - command: - - sh - - -c - - | - #!/usr/bin/env bash -e - curl --fail 127.0.0.1:5066 - failureThreshold: 3 - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - logstashUrl: logstash:5044 - name: pipelines-filebeat - readinessProbe: - exec: - command: - - sh - - -c - - | - #!/usr/bin/env bash -e - filebeat test output - failureThreshold: 3 - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - resources: {} - terminationGracePeriod: 10 - global: - postgresql: - database: pipelinesdb - host: postgres-postgresql - password: password - port: 5432 - ssl: false - user: artifactory - vault: - host: OVERRIDE - port: OVERRIDE - token: OVERRIDE - imagePullSecrets: null - imageRegistry: registry.connect.redhat.com - initContainer: - image: quay.io/jfrog/init:1.0.0 - pullPolicy: IfNotPresent - pipelines: - accessControlAllowOrigins_0: http://openshiftartifactoryha-nginx - accessControlAllowOrigins_1: http://openshiftartifactoryha-nginx - affinity: {} - api: - externalUrl: http://pipelines-api.jfrog.tech - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-api - ingress: - annotations: {} - enabled: false - hosts: - - chart-example.local - path: / - tls: [] - resources: {} - service: - annotations: null - loadBalancerIP: null - loadBalancerSourceRanges: [] - port: 30000 - type: ClusterIP - artifactoryServiceId: FFFFFFFFFFFF - authToken: c7595edd-b63d-4fd6-9e1e-13924d6637f0 - autoscaling: - enabled: false - maxReplicas: 3 - minReplicas: 1 - targetCPUUtilizationPercentage: 70 - configMaps: "" - cron: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-micro - resources: {} - customInitContainers: | - - name: "redhat-custom-setup" - image: quay.io/jfrog/init:1.0.0 - imagePullPolicy: Always - command: - - 'sh' - - '-c' - - 'chown -R 1117:1117 /opt/jfrog/pipelines/var/etc' - securityContext: - runAsUser: 0 - volumeMounts: - - mountPath: "/opt/jfrog/pipelines/var/etc" - name: volume - customSidecarContainers: "" - customVolumeMounts: "" - customVolumes: "" - extensionSync: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-micro - resources: {} - hookHandler: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-micro - resources: {} - jfrogUrl: http://openshiftartifactoryha-nginx - jfrogUrlUI: http://openshiftartifactoryha-nginx - joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - licenseId: FFFFFFFFF - logPath: /opt/jfrog/pipelines/var/log - logup: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-micro - resources: {} - marshaller: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-micro - resources: {} - masterKey: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - mountPath: /opt/jfrog/pipelines/var/etc - msg: - uiUser: monitor - uiUserPassword: monitor - nexec: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-micro - resources: {} - nodeSelector: {} - pipelineSync: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-micro - resources: {} - pipelinesInit: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-installer - resources: {} - rabbitmqHealthCheckIntervalInMins: 1 - rbac: - role: - rules: - - apiGroups: - - "" - - extensions - - apps - resources: - - deployments - - persistentvolumes - - persistentvolumeclaims - - pods - - deployments/scale - verbs: - - '*' - replicaCount: 1 - rootBucket: jfrogpipelines - router: - externalPort: 8082 - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-router - internalPort: 8046 - mountPath: /opt/jfrog/router/var/etc - resources: {} - runTrigger: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-micro - resources: {} - serviceId: jfpip@12345 - stepTrigger: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-micro - resources: {} - systemYaml: | - shared: - ## Artifactory configuration - ## - artifactory: - ## Artifactory URL - ## - baseUrl: "{{ tpl (required "\n\npipelines.jfrogUrl is required!\n" .Values.pipelines.jfrogUrl) . }}" - ## Unified UI URL - ## - baseUrlUI: "{{ tpl (required "\n\npipelines.jfrogUrlUI is required!\n" .Values.pipelines.jfrogUrlUI) . }}" - ## Pipelines Service ID - ## - serviceId: "{{ .Values.pipelines.serviceId }}" - ## Artifactory Service ID - ## - artifactoryServiceId: "{{ .Values.pipelines.artifactoryServiceId }}" - ## Artifactory License ID - ## - licenseId: "{{ .Values.pipelines.licenseId }}" - ## Proxy to connect to Artifactory - ## - proxy: - url: "" - username: "" - password: "" - - ## Router configuration - ## - router: - ip: "" - accessPort: {{ .Values.pipelines.router.internalPort }} - dataPort: {{ .Values.pipelines.router.externalPort }} - joinKey: "{{ .Values.pipelines.joinKey }}" - - security: - masterKey: "{{ .Values.pipelines.masterKey }}" - - ## Database configuration - ## - db: - type: "postgres" - {{- if .Values.postgresql.enabled }} - ip: {{ tpl .Release.Name . }}-postgresql - port: "{{ .Values.postgresql.service.port }}" - name: {{ .Values.postgresql.postgresqlDatabase }} - username: {{ .Values.postgresql.postgresqlUsername }} - password: {{ .Values.postgresql.postgresqlPassword }} - {{- else }} - ip: {{ tpl .Values.global.postgresql.host . }} - port: "{{ .Values.global.postgresql.port }}" - name: {{ .Values.global.postgresql.database }} - username: {{ .Values.global.postgresql.user }} - password: {{ .Values.global.postgresql.password }} - {{- end }} - externalUrl: "" - {{- if .Values.postgresql.enabled }} - connectionString: "{{ tpl (printf "postgres://%s:%s@%s-postgresql:%v/%s" .Values.postgresql.postgresqlUsername .Values.postgresql.postgresqlPassword .Release.Name .Values.postgresql.service.port .Values.postgresql.postgresqlDatabase) . }}" - {{- else if and (not .Values.postgresql.enabled) (.Values.global.postgresql.ssl) }} - connectionString: "{{ tpl (printf "postgres://%s:%s@%v:%v/%s?sslmode=require" .Values.global.postgresql.user .Values.global.postgresql.password .Values.global.postgresql.host .Values.global.postgresql.port .Values.global.postgresql.database) . }}" - {{- else }} - connectionString: "{{ tpl (printf "postgres://%s:%s@%v:%v/%s" .Values.global.postgresql.user .Values.global.postgresql.password .Values.global.postgresql.host .Values.global.postgresql.port .Values.global.postgresql.database) . }}" - {{- end }} - - ## RabbitMQ configuration - ## - msg: - {{- if .Values.rabbitmq.enabled }} - ip: {{ .Release.Name }}-rabbitmq - port: {{ .Values.rabbitmq.service.port }} - adminPort: {{ .Values.rabbitmq.service.managerPort }} - erlangCookie: {{ .Values.rabbitmq.rabbitmq.erlangCookie }} - username: {{ .Values.rabbitmq.rabbitmq.username }} - password: {{ .Values.rabbitmq.rabbitmq.password }} - defaultExchange: pipelinesEx - amqpVhost: pipelines - amqpRootVhost: pipelinesRoot - {{- else }} - ip: {{ tpl .Values.rabbitmq.internal_ip . }} - port: {{ .Values.rabbitmq.port}} - adminPort: {{ .Values.rabbitmq.manager_port }} - erlangCookie: {{ .Values.rabbitmq.erlang_cookie }} - username: {{ .Values.rabbitmq.ms_username }} - password: {{ .Values.rabbitmq.ms_password }} - defaultExchange: {{ .Values.rabbitmq.root_vhost_exchange_name }} - amqpVhost: {{ .Values.rabbitmq.build_vhost_name}} - amqpRootVhost: {{ .Values.rabbitmq.root_vhost_name }} - protocol: {{ .Values.rabbitmq.protocol }} - {{- end }} - queues: - - "core.pipelineSync" - - "core.runTrigger" - - "core.stepTrigger" - - "core.marshaller" - - "cluster.init" - - "core.logup" - - "www.signals" - - "core.nexec" - - "core.hookHandler" - - "core.extensionSync" - ui: - {{- if .Values.rabbitmq.enabled }} - username: {{ .Values.pipelines.msg.uiUser }} - password: {{ .Values.pipelines.msg.uiUserPassword }} - {{- else }} - protocol: http - username: {{ .Values.rabbitmq.cp_username }} - password: {{ .Values.rabbitmq.cp_password }} - {{- end }} - external: - ## URL for build plane VMs to access RabbitMQ - {{- if .Values.rabbitmq.externalUrl }} - url: {{ .Values.rabbitmq.externalUrl }} - {{- else if (and .Values.rabbitmq.serviceVmLb.enabled .Values.rabbitmq.serviceVmLb.loadBalancerIP) }} - url: amqp://{{ .Values.rabbitmq.serviceVmLb.loadBalancerIP }} - {{- else if .Values.rabbitmq.enabled }} - url: amqp://{{ tpl .Release.Name . }}-rabbitmq - {{- else }} - url: {{ .Values.rabbitmq.protocol }}://{{ tpl .Values.rabbitmq.msg_hostname . }}:{{ .Values.rabbitmq.port }} - {{- end }} - rootUrl: "" - adminUrl: "" - {{- if not .Values.rabbitmq.enabled }} - build: - username: {{ .Values.rabbitmq.build_username }} - password: {{ .Values.rabbitmq.build_password }} - {{- end }} - - ## Vault configuration - ## - vault: - {{- if .Values.vault.enabled }} - ip: {{ include "pipelines.vault.name" . }} - port: {{ .Values.vault.service.port }} - {{- else }} - ip: {{ .Values.global.vault.host }} - port: {{ .Values.global.vault.port }} - {{- end }} - ## DO NOT CHANGE THE TOKEN VALUE!!! - token: "_VAULT_TOKEN_" - unsealKeys: - - "" - - "" - - "" - - "" - - "" - - ## Redis configuration - ## - redis: - ip: {{ .Release.Name }}-redis-master - port: 6379 - clusterEnabled: false - - ## This section is used for bringing up the core services and setting up - ## configurations required by the installer & the services - ## - core: - ## id is automatically determined based on the current hostname - ## or set using the SHARED_NODE_ID environment variable. - ## - id: "afd8df9d08bf257ae9b7d7dbbf348b7a3a574ebdd3a61d350d4b64e3129dee85" - installerIP: "1.2.3.4" - installerAuthToken: "{{ .Values.pipelines.authToken }}" - installerImage: "jfrog/pipelines-installer" - registryUrl: "{{ .Values.imageRegistry }}" - os: "Ubuntu_16.04" - osDistribution: "xenial" - architecture: "x86_64" - dockerVersion: "" - runMode: "{{ .Values.runMode }}" - user: "" - group: "" - noVerifySsl: false - ignoreTLSErrors: false - controlplaneVersion: "{{ default .Chart.AppVersion .Values.pipelines.version }}" - buildplaneVersion: "{{ default .Chart.AppVersion .Values.pipelines.version }}" - accessControlAllowOrigins: - - {{ .Values.pipelines.accessControlAllowOrigins_0 }} - - {{ .Values.pipelines.accessControlAllowOrigins_1 }} - rabbitmqHealthCheckIntervalInMins: {{ .Values.pipelines.rabbitmqHealthCheckIntervalInMins}} - ## Global proxy settings, to be applied to all services - ## - proxy: - httpProxy: "" - httpsProxy: "" - noProxy: "" - username: "" - password: "" - - ## Mailserver settings - ## - mailserver: - host: "" - port: "" - username: "" - password: "" - tls: "" - ssl: "" - apiRetryIntervalMs: 3000 - accountSyncFrequencyHr: 1 - imageRegistrySecret: "{{ .Values.imagePullSecrets }}" - hardDeleteIntervalInMins: 60 - configBackupCount: 5 - lastUpdateTime: "" - callHomeUrl: "https://api.bintray.com/products/jfrog/pipelines/stats/usage" - allowCallHome: true - serviceInstanceHealthCheckIntervalInMins: 1 - serviceInstanceStatsCutOffIntervalInHours: 24 - - ## Service configuration - ## - services: - api: - name: {{ include "pipelines.api.name" . }} - port: {{ .Values.pipelines.api.service.port }} - {{- if (and .Values.pipelines.api.ingress.enabled .Values.pipelines.api.ingress.tls) }} - {{- range .Values.pipelines.api.ingress.hosts }} - externalUrl: https://{{ . }} - {{- end }} - {{- else if .Values.pipelines.api.ingress.enabled }} - {{- range .Values.pipelines.api.ingress.hosts }} - externalUrl: http://{{ . }} - {{- end }} - {{- else }} - externalUrl: {{ .Values.pipelines.api.externalUrl }} - {{- end }} - www: - name: {{ include "pipelines.www.name" . }} - port: {{ .Values.pipelines.www.service.port }} - {{- if (and .Values.pipelines.www.ingress.enabled .Values.pipelines.www.ingress.tls) }} - {{- range .Values.pipelines.www.ingress.hosts }} - externalUrl: https://{{ . }} - {{- end }} - {{- else if .Values.pipelines.www.ingress.enabled }} - {{- range .Values.pipelines.www.ingress.hosts }} - externalUrl: http://{{ . }} - {{- end }} - {{- else }} - externalUrl: {{ .Values.pipelines.www.externalUrl }} - {{- end }} - sessionSecret: "{{ .Values.pipelines.authToken }}" - pipelineSync: - name: pipelineSync - runTrigger: - name: runTrigger - stepTrigger: - name: stepTrigger - cron: - name: cron - nexec: - name: nexec - hookHandler: - name: hookHandler - marshaller: - name: marshaller - extensionSync: - name: extensionSync - - ## Runtime configuration - ## - runtime: - rootBucket: "{{ .Values.pipelines.rootBucket }}" - defaultMinionCount: 1 - nodeCacheIntervalMS: 600000 - jobConsoleBatchSize: 10 - jobConsoleBufferIntervalMs: 3 - maxDiskUsagePercentage: 90 - stepTimeoutMS: 3600000 - nodeStopDayOfWeek: 0 - nodeStopIntervalDays: 30 - maxNodeCheckInDelayMin: 15 - defaultMinionInstanceSize: "c4.large" - allowDynamicNodes: true - allowCustomNodes: true - {{- range $key, $value := .Values.runtimeOverride }} - {{ $key }}: {{ $value | quote }} - {{- end }} - languageImages: - - architecture: x86_64 - os: Ubuntu_16.04 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-u16node - isDefault: true - defaultVersion: 10.18.0 - - architecture: x86_64 - os: Ubuntu_16.04 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-u16java - defaultVersion: 13 - - architecture: x86_64 - os: Ubuntu_16.04 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-u16cpp - defaultVersion: 9.0.0 - - architecture: x86_64 - os: Ubuntu_16.04 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-u16go - defaultVersion: 1.12.14 - - architecture: x86_64 - os: Ubuntu_18.04 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-u18node - isDefault: true - defaultVersion: 10.18.0 - - architecture: x86_64 - os: Ubuntu_18.04 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-u18java - defaultVersion: 13 - - architecture: x86_64 - os: Ubuntu_18.04 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-u18cpp - defaultVersion: 9.0.0 - - architecture: x86_64 - os: Ubuntu_18.04 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-u18go - defaultVersion: 1.12.14 - - architecture: x86_64 - os: CentOS_7 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7node - isDefault: true - defaultVersion: 10.18.0 - - architecture: x86_64 - os: CentOS_7 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7java - defaultVersion: 11 - - architecture: x86_64 - os: CentOS_7 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7cpp - defaultVersion: 3.4.2 - - architecture: x86_64 - os: CentOS_7 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7go - defaultVersion: 1.12.14 - - architecture: x86_64 - os: WindowsServer_2019 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19node - defaultVersion: 10.18.0 - - architecture: x86_64 - os: WindowsServer_2019 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19java - defaultVersion: 11 - - architecture: x86_64 - os: WindowsServer_2019 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19cpp - defaultVersion: 9.0.0 - - architecture: x86_64 - os: WindowsServer_2019 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19go - defaultVersion: 1.12.14 - - architecture: x86_64 - os: WindowsServer_2019 - language: dotnetcore - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19dotnetcore - isDefault: true - defaultVersion: 3.1 - - architecture: x86_64 - os: RHEL_7 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7node - isDefault: true - defaultVersion: 10.18.0 - - architecture: x86_64 - os: RHEL_7 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7java - defaultVersion: 11 - - architecture: x86_64 - os: RHEL_7 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7cpp - defaultVersion: 3.4.2 - - architecture: x86_64 - os: RHEL_7 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7go - defaultVersion: 1.12.14 - tolerations: [] - updateStrategy: RollingUpdate - version: 1.7.1 - www: - externalUrl: http://pipelines-www.jfrog.tech - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-www - ingress: - annotations: {} - enabled: false - hosts: - - chart-example.local - path: / - tls: [] - resources: {} - service: - annotations: null - loadBalancerIP: null - loadBalancerSourceRanges: [] - port: 30001 - type: ClusterIP - postgresql: - enabled: false - extraEnv: [] - global: - postgresql: - database: pipelinesdb - host: null - password: "" - port: 5432 - ssl: false - user: apiuser - vault: - host: null - port: null - token: null - image: - debug: false - pullPolicy: IfNotPresent - registry: docker.bintray.io - repository: bitnami/postgresql - tag: 9.6.18-debian-10-r7 - ldap: - baseDN: "" - bind_password: null - bindDN: "" - enabled: false - port: "" - prefix: "" - scheme: "" - search_attr: "" - search_filter: "" - server: "" - suffix: "" - tls: false - url: "" - livenessProbe: - enabled: true - failureThreshold: 6 - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - master: - affinity: {} - annotations: {} - extraInitContainers: [] - extraVolumeMounts: [] - extraVolumes: [] - labels: {} - nodeSelector: {} - podAnnotations: {} - podLabels: {} - priorityClassName: "" - resources: {} - service: {} - sidecars: [] - tolerations: [] - metrics: - enabled: false - image: - pullPolicy: IfNotPresent - registry: docker.io - repository: bitnami/postgres-exporter - tag: 0.8.0-debian-10-r72 - livenessProbe: - enabled: true - failureThreshold: 6 - initialDelaySeconds: 5 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - prometheusRule: - additionalLabels: {} - enabled: false - namespace: "" - rules: [] - readinessProbe: - enabled: true - failureThreshold: 6 - initialDelaySeconds: 5 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - securityContext: - enabled: false - runAsUser: 1001 - service: - annotations: - prometheus.io/port: "9187" - prometheus.io/scrape: "true" - loadBalancerIP: null - type: ClusterIP - serviceMonitor: - additionalLabels: {} - enabled: false - networkPolicy: - allowExternal: true - enabled: false - explicitNamespacesSelector: {} - persistence: - accessModes: - - ReadWriteOnce - annotations: {} - enabled: true - existingClaim: null - mountPath: /bitnami/postgresql - size: 50Gi - subPath: "" - postgresqlDataDir: /bitnami/postgresql/data - postgresqlDatabase: pipelinesdb - postgresqlPassword: "" - postgresqlUsername: apiuser - readinessProbe: - enabled: true - failureThreshold: 6 - initialDelaySeconds: 5 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - replication: - applicationName: my_application - enabled: false - numSynchronousReplicas: 0 - password: repl_password - slaveReplicas: 1 - synchronousCommit: "off" - user: repl_user - resources: - requests: - cpu: 250m - memory: 256Mi - securityContext: - enabled: true - fsGroup: 1001 - runAsUser: 1001 - service: - annotations: {} - port: 5432 - type: ClusterIP - serviceAccount: - enabled: false - shmVolume: - chmod: - enabled: true - enabled: true - slave: - affinity: {} - annotations: {} - extraInitContainers: | - # - name: do-something - # image: busybox - # command: ['do', 'something'] - extraVolumeMounts: [] - extraVolumes: [] - labels: {} - nodeSelector: {} - podAnnotations: {} - podLabels: {} - priorityClassName: "" - service: {} - sidecars: [] - tolerations: [] - updateStrategy: - type: RollingUpdate - volumePermissions: - enabled: false - image: - pullPolicy: Always - registry: docker.io - repository: bitnami/minideb - tag: buster - securityContext: - runAsUser: 0 - rabbitmq: - affinity: {} - enabled: true - externalUrl: amqps://pipelines-rabbit.jfrog.tech - extraSecrets: {} - extraVolumeMounts: [] - extraVolumes: [] - forceBoot: - enabled: false - global: - postgresql: - database: pipelinesdb - host: postgres-postgresql - password: password - port: 5432 - ssl: false - user: artifactory - vault: - host: OVERRIDE - port: OVERRIDE - token: OVERRIDE - image: - debug: false - pullPolicy: IfNotPresent - registry: registry.connect.redhat.com - repository: jfrog/xray-rabbitmq - tag: 3.8.6 - ingress: - annotations: null - enabled: false - path: / - tls: true - tlsSecret: OVERRIDE - ldap: - enabled: false - port: "389" - server: "" - tls: - enabled: false - user_dn_pattern: cn=${username},dc=example,dc=org - livenessProbe: - commandOverride: [] - enabled: true - failureThreshold: 6 - initialDelaySeconds: 120 - periodSeconds: 30 - successThreshold: 1 - timeoutSeconds: 20 - metrics: - enabled: false - plugins: rabbitmq_prometheus - podAnnotations: - prometheus.io/port: '{{ .Values.metrics.port }}' - prometheus.io/scrape: "true" - port: 9419 - prometheusRule: - additionalLabels: {} - enabled: false - namespace: "" - rules: [] - serviceMonitor: - additionalLabels: {} - enabled: false - honorLabels: false - interval: 30s - networkPolicy: - allowExternal: true - enabled: false - nodeSelector: {} - persistence: - accessMode: ReadWriteOnce - enabled: true - path: /opt/bitnami/rabbitmq/var/lib/rabbitmq - size: 20Gi - podAnnotations: {} - podDisruptionBudget: {} - podLabels: {} - podManagementPolicy: OrderedReady - protocol: amqps - rabbitmq: - advancedConfiguration: "" - clustering: - address_type: hostname - k8s_domain: cluster.local - rebalance: false - configuration: |- - ## Clustering - cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s - cluster_formation.k8s.host = kubernetes.default.svc.cluster.local - cluster_formation.node_cleanup.interval = 10 - cluster_formation.node_cleanup.only_log_warning = true - cluster_partition_handling = autoheal - # queue master locator - queue_master_locator=min-masters - # enable guest user - loopback_users.guest = false - env: {} - erlangCookie: PIPELINESRABBITMQCLUSTER - extraConfiguration: |- - #disk_free_limit.absolute = 50MB - #management.load_definitions = /app/load_definition.json - extraPlugins: "" - loadDefinition: - enabled: false - secretName: load-definition - logs: '-' - maxAvailableSchedulers: 2 - onlineSchedulers: 1 - password: guest - plugins: rabbitmq_management rabbitmq_peer_discovery_k8s - setUlimitNofiles: true - tls: - caCertificate: "" - enabled: false - failIfNoPeerCert: true - serverCertificate: "" - serverKey: "" - sslOptionsVerify: verify_peer - ulimitNofiles: "65536" - username: guest - rbacEnabled: true - readinessProbe: - commandOverride: [] - enabled: true - failureThreshold: 3 - initialDelaySeconds: 10 - periodSeconds: 30 - successThreshold: 1 - timeoutSeconds: 20 - replicas: 1 - resources: {} - securityContext: - enabled: true - extra: {} - fsGroup: 1001 - runAsUser: 1001 - service: - annotations: {} - distPort: 25672 - managerPort: 15672 - port: 5672 - tlsPort: 5671 - type: ClusterIP - serviceVmLb: - annotations: null - enabled: false - loadBalancerIP: null - loadBalancerSourceRanges: [] - tolerations: [] - updateStrategy: - type: RollingUpdate - volumePermissions: - enabled: false - image: - pullPolicy: Always - registry: docker.io - repository: bitnami/minideb - tag: buster - resources: {} - rbac: - create: true - redis: - cluster: - enabled: false - slaveCount: 2 - clusterDomain: cluster.local - configmap: |- - # Enable AOF https://redis.io/topics/persistence#append-only-file - appendonly yes - # Disable RDB persistence, AOF persistence already enabled. - save "" - enabled: true - global: - postgresql: - database: pipelinesdb - host: postgres-postgresql - password: password - port: 5432 - ssl: false - user: artifactory - redis: {} - vault: - host: OVERRIDE - port: OVERRIDE - token: OVERRIDE - image: - pullPolicy: IfNotPresent - registry: registry.redhat.io - repository: rhel8/redis-5 - tag: 1-98 - master: - affinity: {} - command: "" - configmap: |- - appendonly yes - loglevel notice - disableCommands: - - FLUSHDB - - FLUSHALL - extraFlags: [] - livenessProbe: - enabled: true - failureThreshold: 5 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 5 - persistence: - accessModes: - - ReadWriteOnce - enabled: true - matchExpressions: {} - matchLabels: {} - path: /data - size: 8Gi - subPath: "" - podAnnotations: {} - podLabels: {} - readinessProbe: - enabled: true - failureThreshold: 5 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 1 - resources: {} - service: - annotations: {} - labels: {} - loadBalancerIP: null - port: 6379 - type: ClusterIP - statefulset: - updateStrategy: RollingUpdate - metrics: - enabled: false - image: - pullPolicy: IfNotPresent - registry: docker.io - repository: bitnami/redis-exporter - tag: 1.5.2-debian-10-r21 - podAnnotations: - prometheus.io/port: "9121" - prometheus.io/scrape: "true" - prometheusRule: - additionalLabels: {} - enabled: false - namespace: "" - rules: [] - service: - annotations: {} - labels: {} - type: ClusterIP - serviceMonitor: - enabled: false - selector: - prometheus: kube-prometheus - networkPolicy: - enabled: false - ingressNSMatchLabels: {} - ingressNSPodMatchLabels: {} - password: "" - persistence: {} - podSecurityPolicy: - create: false - rbac: - create: false - role: - rules: [] - redisPort: 6379 - securityContext: - enabled: true - fsGroup: 1001 - runAsUser: 1001 - sentinel: - configmap: null - downAfterMilliseconds: 60000 - enabled: false - failoverTimeout: 18000 - image: - pullPolicy: IfNotPresent - registry: docker.io - repository: bitnami/redis-sentinel - tag: 5.0.8-debian-10-r25 - initialCheckTimeout: 5 - livenessProbe: - enabled: true - failureThreshold: 5 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 5 - masterSet: mymaster - parallelSyncs: 1 - port: 26379 - quorum: 2 - readinessProbe: - enabled: true - failureThreshold: 5 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 1 - service: - annotations: {} - labels: {} - loadBalancerIP: null - redisPort: 6379 - sentinelPort: 26379 - type: ClusterIP - staticID: false - usePassword: true - serviceAccount: - create: false - name: null - slave: - affinity: {} - command: /run.sh - configmap: null - disableCommands: - - FLUSHDB - - FLUSHALL - extraFlags: [] - livenessProbe: - enabled: true - failureThreshold: 5 - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - persistence: - accessModes: - - ReadWriteOnce - enabled: true - matchExpressions: {} - matchLabels: {} - path: /data - size: 8Gi - subPath: "" - podAnnotations: {} - podLabels: {} - port: 6379 - readinessProbe: - enabled: true - failureThreshold: 5 - initialDelaySeconds: 5 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 10 - resources: {} - service: - annotations: {} - labels: {} - loadBalancerIP: null - port: 6379 - type: ClusterIP - statefulset: - updateStrategy: RollingUpdate - sysctlImage: - command: [] - enabled: false - mountHostSys: false - pullPolicy: Always - registry: docker.io - repository: bitnami/minideb - resources: {} - tag: buster - usePassword: false - usePasswordFile: false - volumePermissions: - enabled: false - image: - pullPolicy: Always - registry: docker.io - repository: bitnami/minideb - tag: buster - resources: {} - runMode: production - runtimeOverride: {} - securityContext: - enabled: true - gid: 1030 - uid: 1030 - vault: - affinity: {} - configMaps: "" - customInitContainers: "" - customVolumeMounts: "" - customVolumes: "" - disablemlock: false - enabled: true - image: - pullPolicy: IfNotPresent - repository: registry.connect.redhat.com/jfrog/pipelines-vault - tag: 1.7.1 - init: - image: - pullPolicy: IfNotPresent - repository: jfrog/pipelines-vault-init - nodeSelector: {} - rbac: - role: - rules: - - apiGroups: - - "" - resources: - - secrets - verbs: - - '*' - resources: {} - service: - port: 30100 - type: ClusterIP - tolerations: [] - updateStrategy: RollingUpdate - -HOOKS: -MANIFEST: ---- -# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: pipelines-rabbitmq - namespace: default - labels: - app: rabbitmq - chart: rabbitmq-6.25.0 - release: "pipelines" - heritage: "Helm" -secrets: - - name: "pipelines-rabbitmq" ---- -# Source: openshift-pipelines/charts/pipelines/templates/service-account.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: pipelines - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm ---- -# Source: openshift-pipelines/charts/pipelines/templates/vault-serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: pipelines-pipelines-vault - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm - component: pipelines-pipelines-vault ---- -# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/secrets.yaml -apiVersion: v1 -kind: Secret -metadata: - name: pipelines-rabbitmq - namespace: default - labels: - app: rabbitmq - chart: rabbitmq-6.25.0 - release: "pipelines" - heritage: "Helm" -type: Opaque -data: - - rabbitmq-password: "Z3Vlc3Q=" - - - rabbitmq-erlang-cookie: "UElQRUxJTkVTUkFCQklUTVFDTFVTVEVS" ---- -# Source: openshift-pipelines/charts/pipelines/templates/database-secret.yaml -apiVersion: v1 -kind: Secret -metadata: - name: pipelines-database - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm -type: Opaque -data: - postgresql-password: "cGFzc3dvcmQ=" - postgresql-url: cG9zdGdyZXM6Ly9hcnRpZmFjdG9yeTpwYXNzd29yZEBwb3N0Z3Jlcy1wb3N0Z3Jlc3FsOjU0MzIvcGlwZWxpbmVzZGI/c3NsbW9kZT1kaXNhYmxl ---- -# Source: openshift-pipelines/charts/pipelines/templates/pipelines-system-yaml.yaml -apiVersion: v1 -kind: Secret -metadata: - name: pipelines-system-yaml - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm -type: Opaque -data: -stringData: - system.yaml: | - shared: - ## Artifactory configuration - ## - artifactory: - ## Artifactory URL - ## - baseUrl: "http://openshiftartifactoryha-nginx" - ## Unified UI URL - ## - baseUrlUI: "http://openshiftartifactoryha-nginx" - ## Pipelines Service ID - ## - serviceId: "jfpip@12345" - ## Artifactory Service ID - ## - artifactoryServiceId: "FFFFFFFFFFFF" - ## Artifactory License ID - ## - licenseId: "FFFFFFFFF" - ## Proxy to connect to Artifactory - ## - proxy: - url: "" - username: "" - password: "" - - ## Router configuration - ## - router: - ip: "" - accessPort: 8046 - dataPort: 8082 - joinKey: "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" - - security: - masterKey: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - - ## Database configuration - ## - db: - type: "postgres" - ip: postgres-postgresql - port: "5432" - name: pipelinesdb - username: artifactory - password: password - externalUrl: "" - connectionString: "postgres://artifactory:password@postgres-postgresql:5432/pipelinesdb" - - ## RabbitMQ configuration - ## - msg: - ip: pipelines-rabbitmq - port: 5672 - adminPort: 15672 - erlangCookie: PIPELINESRABBITMQCLUSTER - username: guest - password: guest - defaultExchange: pipelinesEx - amqpVhost: pipelines - amqpRootVhost: pipelinesRoot - queues: - - "core.pipelineSync" - - "core.runTrigger" - - "core.stepTrigger" - - "core.marshaller" - - "cluster.init" - - "core.logup" - - "www.signals" - - "core.nexec" - - "core.hookHandler" - - "core.extensionSync" - ui: - username: monitor - password: monitor - external: - ## URL for build plane VMs to access RabbitMQ - url: amqps://pipelines-rabbit.jfrog.tech - rootUrl: "" - adminUrl: "" - - ## Vault configuration - ## - vault: - ip: pipelines-pipelines-vault - port: 30100 - ## DO NOT CHANGE THE TOKEN VALUE!!! - token: "_VAULT_TOKEN_" - unsealKeys: - - "" - - "" - - "" - - "" - - "" - - ## Redis configuration - ## - redis: - ip: pipelines-redis-master - port: 6379 - clusterEnabled: false - - ## This section is used for bringing up the core services and setting up - ## configurations required by the installer & the services - ## - core: - ## id is automatically determined based on the current hostname - ## or set using the SHARED_NODE_ID environment variable. - ## - id: "afd8df9d08bf257ae9b7d7dbbf348b7a3a574ebdd3a61d350d4b64e3129dee85" - installerIP: "1.2.3.4" - installerAuthToken: "c7595edd-b63d-4fd6-9e1e-13924d6637f0" - installerImage: "jfrog/pipelines-installer" - registryUrl: "registry.connect.redhat.com" - os: "Ubuntu_16.04" - osDistribution: "xenial" - architecture: "x86_64" - dockerVersion: "" - runMode: "production" - user: "" - group: "" - noVerifySsl: false - ignoreTLSErrors: false - controlplaneVersion: "1.7.1" - buildplaneVersion: "1.7.1" - accessControlAllowOrigins: - - http://openshiftartifactoryha-nginx - - http://openshiftartifactoryha-nginx - rabbitmqHealthCheckIntervalInMins: 1 - ## Global proxy settings, to be applied to all services - ## - proxy: - httpProxy: "" - httpsProxy: "" - noProxy: "" - username: "" - password: "" - - ## Mailserver settings - ## - mailserver: - host: "" - port: "" - username: "" - password: "" - tls: "" - ssl: "" - apiRetryIntervalMs: 3000 - accountSyncFrequencyHr: 1 - imageRegistrySecret: "" - hardDeleteIntervalInMins: 60 - configBackupCount: 5 - lastUpdateTime: "" - callHomeUrl: "https://api.bintray.com/products/jfrog/pipelines/stats/usage" - allowCallHome: true - serviceInstanceHealthCheckIntervalInMins: 1 - serviceInstanceStatsCutOffIntervalInHours: 24 - - ## Service configuration - ## - services: - api: - name: pipelines-pipelines-api - port: 30000 - externalUrl: http://pipelines-api.jfrog.tech - www: - name: pipelines-pipelines-www - port: 30001 - externalUrl: http://pipelines-www.jfrog.tech - sessionSecret: "c7595edd-b63d-4fd6-9e1e-13924d6637f0" - pipelineSync: - name: pipelineSync - runTrigger: - name: runTrigger - stepTrigger: - name: stepTrigger - cron: - name: cron - nexec: - name: nexec - hookHandler: - name: hookHandler - marshaller: - name: marshaller - extensionSync: - name: extensionSync - - ## Runtime configuration - ## - runtime: - rootBucket: "jfrogpipelines" - defaultMinionCount: 1 - nodeCacheIntervalMS: 600000 - jobConsoleBatchSize: 10 - jobConsoleBufferIntervalMs: 3 - maxDiskUsagePercentage: 90 - stepTimeoutMS: 3600000 - nodeStopDayOfWeek: 0 - nodeStopIntervalDays: 30 - maxNodeCheckInDelayMin: 15 - defaultMinionInstanceSize: "c4.large" - allowDynamicNodes: true - allowCustomNodes: true - languageImages: - - architecture: x86_64 - os: Ubuntu_16.04 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-u16node - isDefault: true - defaultVersion: 10.18.0 - - architecture: x86_64 - os: Ubuntu_16.04 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-u16java - defaultVersion: 13 - - architecture: x86_64 - os: Ubuntu_16.04 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-u16cpp - defaultVersion: 9.0.0 - - architecture: x86_64 - os: Ubuntu_16.04 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-u16go - defaultVersion: 1.12.14 - - architecture: x86_64 - os: Ubuntu_18.04 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-u18node - isDefault: true - defaultVersion: 10.18.0 - - architecture: x86_64 - os: Ubuntu_18.04 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-u18java - defaultVersion: 13 - - architecture: x86_64 - os: Ubuntu_18.04 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-u18cpp - defaultVersion: 9.0.0 - - architecture: x86_64 - os: Ubuntu_18.04 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-u18go - defaultVersion: 1.12.14 - - architecture: x86_64 - os: CentOS_7 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7node - isDefault: true - defaultVersion: 10.18.0 - - architecture: x86_64 - os: CentOS_7 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7java - defaultVersion: 11 - - architecture: x86_64 - os: CentOS_7 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7cpp - defaultVersion: 3.4.2 - - architecture: x86_64 - os: CentOS_7 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7go - defaultVersion: 1.12.14 - - architecture: x86_64 - os: WindowsServer_2019 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19node - defaultVersion: 10.18.0 - - architecture: x86_64 - os: WindowsServer_2019 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19java - defaultVersion: 11 - - architecture: x86_64 - os: WindowsServer_2019 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19cpp - defaultVersion: 9.0.0 - - architecture: x86_64 - os: WindowsServer_2019 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19go - defaultVersion: 1.12.14 - - architecture: x86_64 - os: WindowsServer_2019 - language: dotnetcore - registryUrl: docker.bintray.io - image: jfrog/pipelines-w19dotnetcore - isDefault: true - defaultVersion: 3.1 - - architecture: x86_64 - os: RHEL_7 - language: node - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7node - isDefault: true - defaultVersion: 10.18.0 - - architecture: x86_64 - os: RHEL_7 - language: java - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7java - defaultVersion: 11 - - architecture: x86_64 - os: RHEL_7 - language: cpp - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7cpp - defaultVersion: 3.4.2 - - architecture: x86_64 - os: RHEL_7 - language: go - registryUrl: docker.bintray.io - image: jfrog/pipelines-c7go - defaultVersion: 1.12.14 ---- -# Source: openshift-pipelines/charts/pipelines/templates/rabbitmq-secret.yaml -apiVersion: v1 -kind: Secret -metadata: - name: pipelines-rabbitmq-secret - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm -type: Opaque -data: - rabbitmq-erlang-cookie: "UElQRUxJTkVTUkFCQklUTVFDTFVTVEVS" - rabbitmq-password: "Z3Vlc3Q=" ---- -# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/configuration.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: pipelines-rabbitmq-config - namespace: default - labels: - app: rabbitmq - chart: rabbitmq-6.25.0 - release: "pipelines" - heritage: "Helm" -data: - enabled_plugins: |- - [rabbitmq_management, rabbitmq_peer_discovery_k8s]. - rabbitmq.conf: |- - ##username and password - default_user=guest - default_pass=CHANGEME - ## Clustering - cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s - cluster_formation.k8s.host = kubernetes.default.svc.cluster.local - cluster_formation.node_cleanup.interval = 10 - cluster_formation.node_cleanup.only_log_warning = true - cluster_partition_handling = autoheal - # queue master locator - queue_master_locator=min-masters - # enable guest user - loopback_users.guest = false - #disk_free_limit.absolute = 50MB - #management.load_definitions = /app/load_definition.json ---- -# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/healthchecks.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: pipelines-rabbitmq-healthchecks - namespace: default - labels: - app: rabbitmq - chart: rabbitmq-6.25.0 - release: "pipelines" - heritage: "Helm" -data: - rabbitmq-health-check: |- - #!/bin/sh - START_FLAG=/opt/bitnami/rabbitmq/var/lib/rabbitmq/.start - if [ -f ${START_FLAG} ]; then - rabbitmqctl node_health_check - RESULT=$? - if [ $RESULT -ne 0 ]; then - rabbitmqctl status - exit $? - fi - rm -f ${START_FLAG} - exit ${RESULT} - fi - rabbitmq-api-check $1 $2 - rabbitmq-api-check: |- - #!/bin/sh - set -e - URL=$1 - EXPECTED=$2 - ACTUAL=$(curl --silent --show-error --fail "${URL}") - echo "${ACTUAL}" - test "${EXPECTED}" = "${ACTUAL}" ---- -# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/configmap.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: pipelines-redis - namespace: default - labels: - app: redis - chart: redis-10.6.3 - heritage: Helm - release: pipelines -data: - redis.conf: |- - # User-supplied configuration: - # Enable AOF https://redis.io/topics/persistence#append-only-file - appendonly yes - # Disable RDB persistence, AOF persistence already enabled. - save "" - master.conf: |- - dir /data - # User-supplied master configuration: - appendonly yes - loglevel notice - rename-command FLUSHDB "" - rename-command FLUSHALL "" - replica.conf: |- - dir /data - slave-read-only yes - rename-command FLUSHDB "" - rename-command FLUSHALL "" ---- -# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/health-configmap.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: pipelines-redis-health - namespace: default - labels: - app: redis - chart: redis-10.6.3 - heritage: Helm - release: pipelines -data: - ping_readiness_local.sh: |- - #!/bin/bash - response=$( - timeout -s 9 $1 \ - redis-cli \ - -h localhost \ - -p $REDIS_PORT \ - ping - ) - if [ "$response" != "PONG" ]; then - echo "$response" - exit 1 - fi - ping_liveness_local.sh: |- - #!/bin/bash - response=$( - timeout -s 9 $1 \ - redis-cli \ - -h localhost \ - -p $REDIS_PORT \ - ping - ) - if [ "$response" != "PONG" ] && [ "$response" != "LOADING Redis is loading the dataset in memory" ]; then - echo "$response" - exit 1 - fi - ping_readiness_master.sh: |- - #!/bin/bash - response=$( - timeout -s 9 $1 \ - redis-cli \ - -h $REDIS_MASTER_HOST \ - -p $REDIS_MASTER_PORT_NUMBER \ - ping - ) - if [ "$response" != "PONG" ]; then - echo "$response" - exit 1 - fi - ping_liveness_master.sh: |- - #!/bin/bash - response=$( - timeout -s 9 $1 \ - redis-cli \ - -h $REDIS_MASTER_HOST \ - -p $REDIS_MASTER_PORT_NUMBER \ - ping - ) - if [ "$response" != "PONG" ] && [ "$response" != "LOADING Redis is loading the dataset in memory" ]; then - echo "$response" - exit 1 - fi - ping_readiness_local_and_master.sh: |- - script_dir="$(dirname "$0")" - exit_status=0 - "$script_dir/ping_readiness_local.sh" $1 || exit_status=$? - "$script_dir/ping_readiness_master.sh" $1 || exit_status=$? - exit $exit_status - ping_liveness_local_and_master.sh: |- - script_dir="$(dirname "$0")" - exit_status=0 - "$script_dir/ping_liveness_local.sh" $1 || exit_status=$? - "$script_dir/ping_liveness_master.sh" $1 || exit_status=$? - exit $exit_status ---- -# Source: openshift-pipelines/charts/pipelines/templates/pipelines-role.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: pipelines - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm -rules: -- apiGroups: - - "" - - extensions - - apps - resources: - - deployments - - persistentvolumes - - persistentvolumeclaims - - pods - - deployments/scale - verbs: - - '*' ---- -# Source: openshift-pipelines/charts/pipelines/templates/pipelines-rolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: pipelines - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm -subjects: -- kind: ServiceAccount - name: pipelines - namespace: default -roleRef: - kind: ClusterRole - apiGroup: rbac.authorization.k8s.io - name: pipelines ---- -# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/role.yaml -kind: Role -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: pipelines-rabbitmq-endpoint-reader - namespace: default - labels: - app: rabbitmq - chart: rabbitmq-6.25.0 - release: "pipelines" - heritage: "Helm" -rules: -- apiGroups: [""] - resources: ["endpoints"] - verbs: ["get"] -- apiGroups: [""] - resources: ["events"] - verbs: ["create"] ---- -# Source: openshift-pipelines/charts/pipelines/templates/vault-role.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: pipelines-pipelines-vault - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm - component: pipelines-pipelines-vault -rules: -- apiGroups: - - "" - resources: - - secrets - verbs: - - '*' ---- -# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/rolebinding.yaml -kind: RoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: pipelines-rabbitmq-endpoint-reader - namespace: default - labels: - app: rabbitmq - chart: rabbitmq-6.25.0 - release: "pipelines" - heritage: "Helm" -subjects: -- kind: ServiceAccount - name: pipelines-rabbitmq -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: pipelines-rabbitmq-endpoint-reader ---- -# Source: openshift-pipelines/charts/pipelines/templates/vault-rolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: pipelines-pipelines-vault - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm - component: pipelines-pipelines-vault -subjects: -- kind: ServiceAccount - name: pipelines-pipelines-vault -roleRef: - kind: Role - apiGroup: rbac.authorization.k8s.io - name: pipelines-pipelines-vault ---- -# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/svc-headless.yaml -apiVersion: v1 -kind: Service -metadata: - name: pipelines-rabbitmq-headless - namespace: default - labels: - app: rabbitmq - chart: rabbitmq-6.25.0 - release: "pipelines" - heritage: "Helm" -spec: - clusterIP: None - ports: - - name: epmd - port: 4369 - targetPort: epmd - - name: amqp - port: 5672 - targetPort: amqp - - name: dist - port: 25672 - targetPort: dist - - name: stats - port: 15672 - targetPort: stats - selector: - app: rabbitmq - release: "pipelines" ---- -# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/svc.yaml -apiVersion: v1 -kind: Service -metadata: - name: pipelines-rabbitmq - namespace: default - labels: - app: rabbitmq - chart: rabbitmq-6.25.0 - release: "pipelines" - heritage: "Helm" -spec: - type: ClusterIP - ports: - - name: epmd - port: 4369 - targetPort: epmd - nodePort: null - - name: amqp - port: 5672 - targetPort: amqp - nodePort: null - - name: dist - port: 25672 - targetPort: dist - nodePort: null - - name: stats - port: 15672 - targetPort: stats - nodePort: null - selector: - app: rabbitmq - release: "pipelines" ---- -# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/headless-svc.yaml -apiVersion: v1 -kind: Service -metadata: - name: pipelines-redis-headless - namespace: default - labels: - app: redis - chart: redis-10.6.3 - release: pipelines - heritage: Helm -spec: - type: ClusterIP - clusterIP: None - ports: - - name: redis - port: 6379 - targetPort: redis - selector: - app: redis - release: pipelines ---- -# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/redis-master-svc.yaml -apiVersion: v1 -kind: Service -metadata: - name: pipelines-redis-master - namespace: default - labels: - app: redis - chart: redis-10.6.3 - release: pipelines - heritage: Helm -spec: - type: ClusterIP - ports: - - name: redis - port: 6379 - targetPort: redis - selector: - app: redis - release: pipelines - role: master ---- -# Source: openshift-pipelines/charts/pipelines/templates/api-service.yaml -apiVersion: v1 -kind: Service -metadata: - name: pipelines-pipelines-api - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm - component: pipelines-pipelines-api -spec: - type: ClusterIP - ports: - - port: 30000 - targetPort: 30000 - protocol: TCP - name: api - selector: - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - component: pipelines-pipelines-services ---- -# Source: openshift-pipelines/charts/pipelines/templates/pipelines-service-headless.yaml -apiVersion: v1 -kind: Service -metadata: - name: pipelines-pipelines-services-headless - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm -spec: - type: ClusterIP - clusterIP: None - ports: - - port: 30000 - targetPort: 30000 - protocol: TCP - name: api - - port: 30001 - targetPort: 30001 - protocol: TCP - name: www - selector: - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - component: pipelines-pipelines-services ---- -# Source: openshift-pipelines/charts/pipelines/templates/vault-service-headless.yaml -apiVersion: v1 -kind: Service -metadata: - name: pipelines-pipelines-vault-headless - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm - component: pipelines-pipelines-vault -spec: - type: ClusterIP - clusterIP: None - ports: - - name: http - port: 30100 - targetPort: 30100 - protocol: TCP - - name: server - port: 30101 - protocol: TCP - selector: - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - component: pipelines-pipelines-vault ---- -# Source: openshift-pipelines/charts/pipelines/templates/vault-service.yaml -apiVersion: v1 -kind: Service -metadata: - name: pipelines-pipelines-vault - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm - component: pipelines-pipelines-vault -spec: - type: ClusterIP - ports: - - name: http - port: 30100 - targetPort: 30100 - protocol: TCP - - name: server - port: 30101 - protocol: TCP - selector: - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - component: pipelines-pipelines-vault ---- -# Source: openshift-pipelines/charts/pipelines/templates/www-service.yaml -apiVersion: v1 -kind: Service -metadata: - name: pipelines-pipelines-www - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm - component: pipelines-pipelines-www -spec: - type: ClusterIP - ports: - - port: 30001 - targetPort: 30001 - protocol: TCP - name: www - selector: - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - component: pipelines-pipelines-services ---- -# Source: openshift-pipelines/charts/pipelines/charts/rabbitmq/templates/statefulset.yaml -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: pipelines-rabbitmq - namespace: default - labels: - app: rabbitmq - chart: rabbitmq-6.25.0 - release: "pipelines" - heritage: "Helm" -spec: - serviceName: pipelines-rabbitmq-headless - podManagementPolicy: OrderedReady - replicas: 1 - updateStrategy: - type: RollingUpdate - selector: - matchLabels: - app: rabbitmq - release: "pipelines" - template: - metadata: - labels: - app: rabbitmq - release: "pipelines" - chart: rabbitmq-6.25.0 - annotations: - checksum/secret: cd200625b24962e95e00a823013671ecf528464dc6d000ff2103710176764a2a - spec: - serviceAccountName: pipelines-rabbitmq - terminationGracePeriodSeconds: 10 - containers: - - name: rabbitmq - image: registry.connect.redhat.com/jfrog/xray-rabbitmq:3.8.6 - imagePullPolicy: "IfNotPresent" - command: - - bash - - -ec - - | - mkdir -p /opt/bitnami/rabbitmq/.rabbitmq/ - mkdir -p /opt/bitnami/rabbitmq/etc/rabbitmq/ - touch /opt/bitnami/rabbitmq/var/lib/rabbitmq/.start - #persist the erlang cookie in both places for server and cli tools - echo $RABBITMQ_ERL_COOKIE > /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie - cp /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie /opt/bitnami/rabbitmq/.rabbitmq/ - #change permission so only the user has access to the cookie file - chmod 600 /opt/bitnami/rabbitmq/.rabbitmq/.erlang.cookie /opt/bitnami/rabbitmq/var/lib/rabbitmq/.erlang.cookie - #copy the mounted configuration to both places - cp /opt/bitnami/rabbitmq/conf/* /opt/bitnami/rabbitmq/etc/rabbitmq - # Apply resources limits - ulimit -n "${RABBITMQ_ULIMIT_NOFILES}" - #replace the default password that is generated - sed -i "/CHANGEME/cdefault_pass=${RABBITMQ_PASSWORD//\\/\\\\}" /opt/bitnami/rabbitmq/etc/rabbitmq/rabbitmq.conf - exec rabbitmq-server - volumeMounts: - - name: config-volume - mountPath: /opt/bitnami/rabbitmq/conf - - name: healthchecks - mountPath: /usr/local/sbin/rabbitmq-api-check - subPath: rabbitmq-api-check - - name: healthchecks - mountPath: /usr/local/sbin/rabbitmq-health-check - subPath: rabbitmq-health-check - - name: data - mountPath: "/opt/bitnami/rabbitmq/var/lib/rabbitmq" - ports: - - name: epmd - containerPort: 4369 - - name: amqp - containerPort: 5672 - - name: dist - containerPort: 25672 - - name: stats - containerPort: 15672 - livenessProbe: - exec: - command: - - sh - - -c - - rabbitmq-api-check "http://guest:$RABBITMQ_PASSWORD@127.0.0.1:15672/api/healthchecks/node" '{"status":"ok"}' - initialDelaySeconds: 120 - timeoutSeconds: 20 - periodSeconds: 30 - failureThreshold: 6 - successThreshold: 1 - readinessProbe: - exec: - command: - - sh - - -c - - rabbitmq-health-check "http://guest:$RABBITMQ_PASSWORD@127.0.0.1:15672/api/healthchecks/node" '{"status":"ok"}' - initialDelaySeconds: 10 - timeoutSeconds: 20 - periodSeconds: 30 - failureThreshold: 3 - successThreshold: 1 - env: - - name: BITNAMI_DEBUG - value: "false" - - name: MY_POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: MY_POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: MY_POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: K8S_SERVICE_NAME - value: "pipelines-rabbitmq-headless" - - name: K8S_ADDRESS_TYPE - value: hostname - - name: RABBITMQ_NODENAME - value: "rabbit@$(MY_POD_NAME).$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local" - - name: K8S_HOSTNAME_SUFFIX - value: ".$(K8S_SERVICE_NAME).$(MY_POD_NAMESPACE).svc.cluster.local" - - name: RABBITMQ_LOGS - value: "-" - - name: RABBITMQ_ULIMIT_NOFILES - value: "65536" - - name: RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS - value: +S 2:1 - - name: RABBITMQ_USE_LONGNAME - value: "true" - - name: RABBITMQ_ERL_COOKIE - valueFrom: - secretKeyRef: - name: pipelines-rabbitmq - key: rabbitmq-erlang-cookie - - name: RABBITMQ_PASSWORD - valueFrom: - secretKeyRef: - name: pipelines-rabbitmq - key: rabbitmq-password - securityContext: - fsGroup: 1001 - runAsUser: 1001 - volumes: - - name: config-volume - configMap: - name: pipelines-rabbitmq-config - items: - - key: rabbitmq.conf - path: rabbitmq.conf - - key: enabled_plugins - path: enabled_plugins - - name: healthchecks - configMap: - name: pipelines-rabbitmq-healthchecks - items: - - key: rabbitmq-health-check - path: rabbitmq-health-check - mode: 111 - - key: rabbitmq-api-check - path: rabbitmq-api-check - mode: 111 - volumeClaimTemplates: - - metadata: - name: data - labels: - app: rabbitmq - release: "pipelines" - heritage: "Helm" - spec: - accessModes: - - "ReadWriteOnce" - resources: - requests: - storage: "20Gi" ---- -# Source: openshift-pipelines/charts/pipelines/charts/redis/templates/redis-master-statefulset.yaml -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: pipelines-redis-master - namespace: default - labels: - app: redis - chart: redis-10.6.3 - release: pipelines - heritage: Helm -spec: - selector: - matchLabels: - app: redis - release: pipelines - role: master - serviceName: pipelines-redis-headless - template: - metadata: - labels: - app: redis - chart: redis-10.6.3 - release: pipelines - role: master - annotations: - checksum/health: 5d2e8523ae6c0cac2452aab66904ac5b5d6dc0a529ac4e9333177b412c6e8fd1 - checksum/configmap: 58a5a052638c9f5d1252ef740b81decddd00d24176a06b07b57f3e4b1987e666 - checksum/secret: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - spec: - securityContext: - fsGroup: 1001 - serviceAccountName: "default" - containers: - - name: redis - image: "registry.redhat.io/rhel8/redis-5:1-98" - imagePullPolicy: "IfNotPresent" - securityContext: - runAsUser: 1001 - command: - - /bin/bash - - -c - - | - if [[ -n $REDIS_PASSWORD_FILE ]]; then - password_aux=`cat ${REDIS_PASSWORD_FILE}` - export REDIS_PASSWORD=$password_aux - fi - if [[ ! -f /opt/bitnami/redis/etc/master.conf ]];then - cp /opt/bitnami/redis/mounted-etc/master.conf /opt/bitnami/redis/etc/master.conf - fi - if [[ ! -f /opt/bitnami/redis/etc/redis.conf ]];then - cp /opt/bitnami/redis/mounted-etc/redis.conf /opt/bitnami/redis/etc/redis.conf - fi - ARGS=("--port" "${REDIS_PORT}") - ARGS+=("--protected-mode" "no") - ARGS+=("--include" "/opt/bitnami/redis/etc/redis.conf") - ARGS+=("--include" "/opt/bitnami/redis/etc/master.conf") - redis-server "${ARGS[@]}" - env: - - name: REDIS_REPLICATION_MODE - value: master - - name: ALLOW_EMPTY_PASSWORD - value: "yes" - - name: REDIS_PORT - value: "6379" - ports: - - name: redis - containerPort: 6379 - livenessProbe: - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 5 - successThreshold: 1 - failureThreshold: 5 - exec: - command: - - sh - - -c - - /health/ping_liveness_local.sh 5 - readinessProbe: - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 5 - exec: - command: - - sh - - -c - - /health/ping_readiness_local.sh 5 - resources: - {} - volumeMounts: - - name: health - mountPath: /health - - name: redis-data - mountPath: /data - subPath: - - name: config - mountPath: /opt/bitnami/redis/mounted-etc - - name: redis-tmp-conf - mountPath: /opt/bitnami/redis/etc/ - volumes: - - name: health - configMap: - name: pipelines-redis-health - defaultMode: 0755 - - name: config - configMap: - name: pipelines-redis - - name: redis-tmp-conf - emptyDir: {} - volumeClaimTemplates: - - metadata: - name: redis-data - labels: - app: redis - release: pipelines - heritage: Helm - component: master - spec: - accessModes: - - "ReadWriteOnce" - resources: - requests: - storage: "8Gi" - - selector: - updateStrategy: - type: RollingUpdate ---- -# Source: openshift-pipelines/charts/pipelines/templates/pipelines-statefulset.yaml -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: pipelines-pipelines-services - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm -spec: - serviceName: pipelines-pipelines-services-headless - replicas: 1 - updateStrategy: - type: RollingUpdate - selector: - matchLabels: - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - component: pipelines-pipelines-services - template: - metadata: - labels: - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - component: pipelines-pipelines-services - annotations: - checksum/systemyaml: f5d51f2f399be165ea4c3d48b085ab08baed54b2591828cd38fb5f847af16cae - checksum/secretdb: 48459e973b36b16071c353caa94a8ca3d3b446a893f79f86af191ce6f3856887 - checksum/secretaws: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b - checksum/configaws: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b - checksum/secretk8s: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b - checksum/configk8s: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b - checksum/configfilebeat: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - spec: - serviceAccountName: pipelines - initContainers: - - name: copy-system-yaml - image: "quay.io/jfrog/init:1.0.0" - imagePullPolicy: IfNotPresent - securityContext: - allowPrivilegeEscalation: false - command: - - '/bin/sh' - - '-c' - - > - echo "Copy system.yaml to /opt/jfrog/pipelines/var/etc"; - cp -fv /tmp/etc/system.yaml /opt/jfrog/pipelines/var/etc/system.yaml; - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: systemyaml - mountPath: "/tmp/etc/system.yaml" - subPath: system.yaml - - name: wait-for-vault - image: "quay.io/jfrog/init:1.0.0" - imagePullPolicy: IfNotPresent - securityContext: - allowPrivilegeEscalation: false - command: - - 'sh' - - '-c' - - > - echo "Waiting for Vault to come up..."; - until nc -z -w 2 pipelines-pipelines-vault 30100 && echo Vault ok; do - sleep 2; - done; - - name: pipelines-installer - image: "registry.connect.redhat.com/jfrog/pipelines-installer:1.7.1" - imagePullPolicy: IfNotPresent - securityContext: - allowPrivilegeEscalation: false - env: - - name: VAULT_TOKEN - valueFrom: - secretKeyRef: - name: root-vault-secret - key: token - - name: PIPELINES_SHARED_DB_CONNECTIONSTRING - valueFrom: - secretKeyRef: - name: pipelines-database - key: postgresql-url - - name: PIPELINES_NODE_ID - valueFrom: - fieldRef: - fieldPath: "metadata.name" - command: - - 'sh' - - '-c' - - > - echo "Waiting for RabbitMQ to come up..."; - until nc -z -w 2 pipelines-rabbitmq 5672 && echo rabbitmq ok; do - sleep 2; - done; - echo "Waiting for Redis to come up..."; - until nc -z -w 2 pipelines-redis-master 6379 && echo redis ok; do - sleep 2; - done; - sleep 20; - ./pipelines-k8s; - echo "Setting router as user for system.yaml"; - chown 1117:1117 /opt/jfrog/pipelines/var/etc/system.yaml; - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - - name: "redhat-custom-setup" - image: quay.io/jfrog/init:1.0.0 - imagePullPolicy: Always - command: - - 'sh' - - '-c' - - 'chown -R 1117:1117 /opt/jfrog/pipelines/var/etc' - securityContext: - runAsUser: 0 - volumeMounts: - - mountPath: "/opt/jfrog/pipelines/var/etc" - name: volume - - containers: - - name: router - image: "registry.connect.redhat.com/jfrog/pipelines-router:1.7.1" - imagePullPolicy: IfNotPresent - env: - - name: JF_ROUTER_SERVICEREGISTRY_URL - value: "http://openshiftartifactoryha-nginx/access" - - name: JF_ROUTER_SERVICEREGISTRY_GRPCADDRESS - value: "openshiftartifactoryha-nginx" - - name: JF_ROUTER_ENTRYPOINTS_INTERNALPORT - value: "8046" - - name: JF_ROUTER_ENTRYPOINTS_EXTERNALPORT - value: "8082" - - name: JF_ROUTER_LOGGING_ROUTER_LOGLEVEL - value: "DEBUG" - - name: JF_SHARED_NODE_ID - valueFrom: - fieldRef: - fieldPath: "metadata.name" - - name: JF_SHARED_NODE_IP - valueFrom: - fieldRef: - fieldPath: "status.podIP" - - name: JF_SHARED_SECURITY_JOINKEY - value: "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" - - name: JF_ROUTER_ENCRYPTSYSTEMCONFIG - value: "true" - ports: - - name: router - containerPort: 8046 - securityContext: - allowPrivilegeEscalation: false - resources: - - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/router/var/etc - - name: api - image: "registry.connect.redhat.com/jfrog/pipelines-api:1.7.1" - imagePullPolicy: IfNotPresent - env: - - name: PIPELINES_NODE_ID - valueFrom: - fieldRef: - fieldPath: "metadata.name" - ports: - - name: api - containerPort: 30000 - livenessProbe: - httpGet: - path: / - port: api - initialDelaySeconds: 10 - timeoutSeconds: 5 - failureThreshold: 6 - readinessProbe: - httpGet: - path: / - port: api - initialDelaySeconds: 10 - timeoutSeconds: 3 - periodSeconds: 5 - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: www - image: "registry.connect.redhat.com/jfrog/pipelines-www:1.7.1" - imagePullPolicy: IfNotPresent - ports: - - name: www - containerPort: 30001 - livenessProbe: - httpGet: - path: / - port: www - initialDelaySeconds: 10 - failureThreshold: 6 - timeoutSeconds: 5 - readinessProbe: - httpGet: - path: / - port: www - initialDelaySeconds: 10 - timeoutSeconds: 3 - periodSeconds: 5 - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: pipelinesync - image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" - imagePullPolicy: IfNotPresent - workingDir: /opt/jfrog/pipelines/app/micro/pipelineSync - env: - - name: COMPONENT - value: pipelinesync - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: runtrigger - image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" - imagePullPolicy: IfNotPresent - workingDir: /opt/jfrog/pipelines/app/micro/runTrigger - env: - - name: COMPONENT - value: runtrigger - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: steptrigger - image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" - imagePullPolicy: IfNotPresent - workingDir: /opt/jfrog/pipelines/app/micro/stepTrigger - env: - - name: COMPONENT - value: steptrigger - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: cron - image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" - imagePullPolicy: IfNotPresent - workingDir: /opt/jfrog/pipelines/app/micro/cron - env: - - name: COMPONENT - value: cron - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: nexec - image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" - imagePullPolicy: IfNotPresent - workingDir: /opt/jfrog/pipelines/app/micro/nexec - env: - - name: COMPONENT - value: nexec - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: hookhandler - image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" - imagePullPolicy: IfNotPresent - workingDir: /opt/jfrog/pipelines/app/micro/hookHandler - env: - - name: COMPONENT - value: hookhandler - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: marshaller - image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" - imagePullPolicy: IfNotPresent - workingDir: /opt/jfrog/pipelines/app/micro/marshaller - env: - - name: COMPONENT - value: marshaller - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: logup - image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" - imagePullPolicy: IfNotPresent - workingDir: /opt/jfrog/pipelines/app/micro/logup - env: - - name: COMPONENT - value: logup - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - - name: extensionsync - image: "registry.connect.redhat.com/jfrog/pipelines-micro:1.7.1" - imagePullPolicy: IfNotPresent - workingDir: /opt/jfrog/pipelines/app/micro/extensionSync - env: - - name: COMPONENT - value: extensionsync - resources: - {} - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: jfrog-pipelines-logs - mountPath: /opt/jfrog/pipelines/var/log - volumes: - - name: jfrog-pipelines-folder - emptyDir: {} - - name: jfrog-pipelines-logs - emptyDir: {} - - name: systemyaml - secret: - secretName: pipelines-system-yaml ---- -# Source: openshift-pipelines/charts/pipelines/templates/vault-statefulset.yaml -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: pipelines-pipelines-vault - labels: - helm.sh/chart: pipelines-1.4.5 - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - app.kubernetes.io/version: "1.7.2" - app.kubernetes.io/managed-by: Helm - component: pipelines-pipelines-vault -spec: - serviceName: pipelines-pipelines-vault-headless - replicas: 1 - updateStrategy: - type: RollingUpdate - selector: - matchLabels: - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - component: pipelines-pipelines-vault - template: - metadata: - labels: - app.kubernetes.io/name: pipelines - app.kubernetes.io/instance: pipelines - component: pipelines-pipelines-vault - spec: - serviceAccountName: pipelines-pipelines-vault - initContainers: - - name: config - image: 'quay.io/jfrog/init:1.0.0' - imagePullPolicy: IfNotPresent - env: - - name: PIPELINES_SHARED_DB_CONNECTIONSTRING - valueFrom: - secretKeyRef: - name: pipelines-database - key: postgresql-url - command: ["/bin/sh", "-c"] - args: - - | - cat > /etc/vault/config/vault.hcl < - echo "Waiting for Postgres to come up..."; - until nc -z -w 2 postgres-postgresql 5432 && echo database ok; do - sleep 2; - done; - sleep 10; - - name: create-vault-table - image: "registry.connect.redhat.com/jfrog/pipelines-installer:1.7.1" - imagePullPolicy: IfNotPresent - env: - - name: PIPELINES_SHARED_DB_CONNECTIONSTRING - valueFrom: - secretKeyRef: - name: pipelines-database - key: postgresql-url - command: - - 'sh' - - '-c' - - > - echo "Copy system.yaml to /opt/jfrog/pipelines/var/etc"; - cp -fv /tmp/etc/system.yaml /opt/jfrog/pipelines/var/etc/system.yaml; - echo "Creating Vault Table..."; - ./pipelines-k8s initVault; - volumeMounts: - - name: jfrog-pipelines-folder - mountPath: /opt/jfrog/pipelines/var/etc - - name: systemyaml - mountPath: "/tmp/etc/system.yaml" - subPath: system.yaml - containers: - - name: vault-init - image: "registry.connect.redhat.com/jfrog/pipelines-vault-init:1.7.1" - imagePullPolicy: IfNotPresent - env: - - name: CHECK_INTERVAL - value: "10s" - - name: VAULT_NAMESPACE - value: default - - name: VAULT_ADDRESS - value: "http://localhost:30100" - resources: - requests: - memory: 10Mi - cpu: 10m - limits: - memory: 50Mi - cpu: 50m - - name: vault - image: "registry.connect.redhat.com/jfrog/pipelines-vault:1.7.1" - imagePullPolicy: IfNotPresent - env: - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: "status.podIP" - - name: "VAULT_API_ADDR" - value: "http://$(POD_IP):30100" - - name: "VAULT_CLUSTER_ADDR" - value: "http://$(POD_IP):30101" - args: - - "server" - - "-config=/etc/vault/config/vault.hcl" - ports: - - name: http - containerPort: 30100 - protocol: "TCP" - - name: server - containerPort: 30101 - protocol: "TCP" - readinessProbe: - httpGet: - path: "/v1/sys/health?standbyok=true" - port: 30100 - scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - resources: - {} - securityContext: - capabilities: - add: - - IPC_LOCK - volumeMounts: - - name: vault-config - mountPath: /etc/vault/config - volumes: - - name: vault-config - emptyDir: {} - - name: jfrog-pipelines-folder - emptyDir: {} - - name: systemyaml - secret: - secretName: pipelines-system-yaml - From a0812bba472cb564ef2b9edcb97bd29a7ce003d3 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Wed, 23 Sep 2020 16:17:26 -0700 Subject: [PATCH 14/28] Openshift pipelines working w/ bitnami rabbitmq need to refactor to jfrog rabbitmq --- Openshift4/openshift-pipelines/helminstall.sh | 8 ++++---- Openshift4/openshift-pipelines/values.yaml | 13 +++++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Openshift4/openshift-pipelines/helminstall.sh b/Openshift4/openshift-pipelines/helminstall.sh index b67bd7e..aa93c2b 100755 --- a/Openshift4/openshift-pipelines/helminstall.sh +++ b/Openshift4/openshift-pipelines/helminstall.sh @@ -19,8 +19,8 @@ helm upgrade --install pipelines . \ --set pipelines.pipelines.joinKey=$JOIN_KEY \ --set pipelines.pipelines.accessControlAllowOrigins_0=http://openshiftartifactoryha-nginx \ --set pipelines.pipelines.accessControlAllowOrigins_1=http://openshiftartifactoryha-nginx \ - --set pipelines.pipelines.msg.uiUser=guest \ - --set pipelines.pipelines.msg.uiUserPassword=guest \ + --set pipelines.pipelines.msg.uiUser=monitor \ + --set pipelines.pipelines.msg.uiUserPassword=monitor \ --set pipelines.postgresql.enabled=false \ --set pipelines.global.postgresql.host=postgres-postgresql \ --set pipelines.global.postgresql.port=5432 \ @@ -28,8 +28,8 @@ helm upgrade --install pipelines . \ --set pipelines.global.postgresql.user=artifactory \ --set pipelines.global.postgresql.password=password \ --set pipelines.global.postgresql.ssl=false \ - --set pipelines.rabbitmq.rabbitmq.username=monitor \ - --set pipelines.rabbitmq.rabbitmq.password=monitor \ + --set pipelines.rabbitmq.rabbitmq.username=user \ + --set pipelines.rabbitmq.rabbitmq.password=bitnami \ --set pipelines.rabbitmq.externalUrl=amqps://pipelines-rabbit.jfrog.tech \ --set pipelines.pipelines.api.externalUrl=http://pipelines-api.jfrog.tech \ --set pipelines.pipelines.www.externalUrl=http://pipelines-www.jfrog.tech diff --git a/Openshift4/openshift-pipelines/values.yaml b/Openshift4/openshift-pipelines/values.yaml index d69ed25..24800fc 100755 --- a/Openshift4/openshift-pipelines/values.yaml +++ b/Openshift4/openshift-pipelines/values.yaml @@ -866,10 +866,15 @@ pipelines: enabled: true protocol: amqps replicas: 1 - image: - registry: registry.connect.redhat.com - repository: jfrog/xray-rabbitmq - tag: 3.8.6 + + #image: + # registry: registry.connect.redhat.com + # repository: jfrog/xray-rabbitmq + # tag: 3.8.6 + #image: + # registry: quay.io + # repository: jfrog/rabbitmq + # tag: 3.8.3 rabbitmq: username: admin From f33f5ecf142f515fde03ad750f4af2850de59149 Mon Sep 17 00:00:00 2001 From: Jeff Fry Date: Sun, 27 Sep 2020 11:18:13 -0700 Subject: [PATCH 15/28] Added creation of var/data. --- .../installers/roles/artifactory/tasks/install.yml | 8 +++++--- .../roles/artifactory_nginx/tasks/main.yml | 12 ++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml b/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml index 12e5ca3..a0e98ff 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/artifactory/tasks/install.yml @@ -64,11 +64,13 @@ group: "{{ artifactory_group }}" become: yes -- name: ensure ownership of data +- name: ensure data exists file: path: "{{ artifactory_home }}/var/data" - owner: "artifactory" - group: "artifactory" + state: directory + owner: "{{ artifactory_user }}" + group: "{{ artifactory_group }}" + become: yes - name: ensure etc exists file: diff --git a/Ansible/ansible_collections/jfrog/installers/roles/artifactory_nginx/tasks/main.yml b/Ansible/ansible_collections/jfrog/installers/roles/artifactory_nginx/tasks/main.yml index 2d92de3..fba3324 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/artifactory_nginx/tasks/main.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/artifactory_nginx/tasks/main.yml @@ -1,7 +1,9 @@ --- -- name: Nginx Install Block +- name: install nginx block: - - name: install nginx + - debug: + msg: "Attempting nginx installation without dependencies for potential offline mode." + - name: install nginx without dependencies package: name: nginx state: present @@ -11,9 +13,11 @@ become: yes until: package_res is success rescue: - - name: perform dependency installation + - debug: + msg: "Attempting nginx installation with dependencies for potential online mode." + - name: install dependencies include_tasks: "{{ ansible_os_family }}.yml" - - name: install nginx + - name: install nginx after dependency installation package: name: nginx state: present From 31bbbed809bc1bc5d894e88eee4de89ea59f54e6 Mon Sep 17 00:00:00 2001 From: Jeff Fry Date: Sun, 27 Sep 2020 11:49:08 -0700 Subject: [PATCH 16/28] Fixed xray home variable. --- .../jfrog/installers/roles/xray/tasks/install.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/install.yml b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/install.yml index ca00381..64155c8 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/install.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/xray/tasks/install.yml @@ -54,17 +54,17 @@ - name: use specified system yaml copy: - src: "{{ artifactory_system_yaml }}" - dest: "{{ artifactory_home }}/var/etc/system.yaml" + src: "{{ xray_system_yaml }}" + dest: "{{ xray_home }}/var/etc/system.yaml" become: yes - when: artifactory_system_yaml is defined + when: xray_system_yaml is defined - name: configure system yaml template template: - src: "{{ artifactory_system_yaml_template }}" - dest: "{{ artifactory_home }}/var/etc/system.yaml" + src: "{{ xray_system_yaml_template }}" + dest: "{{ xray_home }}/var/etc/system.yaml" become: yes - when: artifactory_system_yaml is not defined + when: xray_system_yaml is not defined - name: ensure {{ xray_home }}/var/etc/security/ exists file: From 2bfacc990e4a45803f0caa56007c3112a82a6295 Mon Sep 17 00:00:00 2001 From: Jeff Fry Date: Sun, 27 Sep 2020 12:09:08 -0700 Subject: [PATCH 17/28] Added python psycopg error handling. --- .../jfrog/installers/roles/postgres/tasks/Debian.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Ansible/ansible_collections/jfrog/installers/roles/postgres/tasks/Debian.yml b/Ansible/ansible_collections/jfrog/installers/roles/postgres/tasks/Debian.yml index 611332e..04c9e91 100644 --- a/Ansible/ansible_collections/jfrog/installers/roles/postgres/tasks/Debian.yml +++ b/Ansible/ansible_collections/jfrog/installers/roles/postgres/tasks/Debian.yml @@ -4,12 +4,14 @@ name: python-psycopg2 update_cache: yes become: yes + ignore_errors: yes - name: install python3 psycopg2 apt: name: python3-psycopg2 update_cache: yes become: yes + ignore_errors: yes - name: add postgres apt key apt_key: From 4b9437d7d941cdf5d068b962736996a0325b1604 Mon Sep 17 00:00:00 2001 From: Jeff Fry Date: Sun, 27 Sep 2020 14:24:35 -0700 Subject: [PATCH 18/28] Created package 1.1.0. --- Ansible/CHANGELOG.md | 13 +++++++++++++ .../installers/jfrog-installers-1.1.0.tar.gz | Bin 0 -> 31110 bytes 2 files changed, 13 insertions(+) create mode 100644 Ansible/CHANGELOG.md create mode 100644 Ansible/ansible_collections/jfrog/installers/jfrog-installers-1.1.0.tar.gz diff --git a/Ansible/CHANGELOG.md b/Ansible/CHANGELOG.md new file mode 100644 index 0000000..ce008f9 --- /dev/null +++ b/Ansible/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [Unreleased] + +## [1.1.0] - 2020-09-27 + +- Validated for Artifactory 7.7.8 and Xray 3.8.6. +- Added offline support for Artifactory and Xray. +- Added support for configurable Postgres pg_hba.conf. +- Misc fixes due to Artifactory 7.7.8. +- Published 1.1.0 to [Ansible Galaxy](https://galaxy.ansible.com/jfrog/installers). \ No newline at end of file diff --git a/Ansible/ansible_collections/jfrog/installers/jfrog-installers-1.1.0.tar.gz b/Ansible/ansible_collections/jfrog/installers/jfrog-installers-1.1.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..5e8aebb43e15bc5664720581957dbad6f873318c GIT binary patch literal 31110 zcmV)mK%T!JiwFqz0&!mg|7vD(Z)YuOZgX^DY;0w6b1gA0F)lDJbYXG;?7dri+%}dd znw~S~`)2CA%;R~)NbM~5T`ZR*cMNvNl1N|ySOC@yYc2Hpz5XBH(6etC4O#xhjXauo&ikop zrq%q8?{(d>jW5XA7q{@ti<0Kh{I&=Ack&n>nU?XCJ<=UbH!R(=oSvr-Tu=8pU#RC- z|GeCP_59hv;Zg6$B1^xxx&7~0)_MEi&~#^Y|C^fq1<}<0zwzgn4%rE^Bw;}rXXz+T zqiknL;4Rrn>68^S8ZdaV^JA1}9~PJ z^D>TTP-gjpeWJQq2vr_i>Xc8BsK?IrQ*+~p#NS-C| zZP0uf;o1QR!IF&Fn*Hx{V6RAqjL^4CpVCOz1}^h7FJziChBhxOixPCwd4}UxqP)Oxm42Sy4ccuX-ghl^jK}| z>EY-QBv7{6Xe};XBrk0cm?F~;sUMoAZTN<%+l&T&WVsP_m~A`OzysNc+3rBsL*}!{ zGnj80n$6tEb{vqacCOa%Su!7kZg88Zl1;7%$6G*I07ziYz;HE#1$r35-V8!NFuf=; zYyfdxpbg=G`J$lN)VZE6=A%=el{;>^YX6R?T56ach-22 zfqssP(=B#@tG2h^V1Fi+>$_{Ye?s%SZodDPh2PM!x0oi|q7HUoYMx~oe&p(IVENV{ zaH;28ffebx&n%01R3EsG9(ukvuqZrE;D(_QnU3yySEUY{2J@8pF-^BQ7}GLAn~nxl zv%}E$qtNhlO&@r=MF&Xy2Bzn@j9S#UJdZg{bA2N)BQ2t~tNXgU^RY8CnvJ_5i|9Pr z>LgkIz=GL`s0-?U2&7y0B13n4-86hUu)RRjd@nRZANU-LT+6i#HV7hj;4>|-^k6IF z8uXlPj!E-^&^2|}q0|g)-7~1~1&%gw2EK3lI&gVEFf7vzJ;&2@J3_|J!oh$JT;G8e zdA%`}v^c)YUCi6Rfo&X80|Xr>bPW#{f#XC*=z3;o7(O7_XQAynwrAUsAHdJZj)DQR zEeZ?CbOu@!Xdi*i8`#Ho2umOY8P7FCI|x}|x$eNAUSPm7j|^BLLBOa_t$}Vt+F;;N z)26zoc{HN1M2wFa&6LL5rAZ)3G1FmYWQC3%Xog{e97;pOq`?6G?+=jlM3fF-(Zgo& zJx7lQjOvD_4Q%I{W0|tsl}k1>zjaIodf+-<80d@|kqvav@)&hZEebWmWWI0dGy=td znVuC|j$vp<;0$!;IgX9Q)4Coew=R#{Ivsc#t^wO}nG*!mW$WT?E)*l=2n$l=`Lws)rGAu45m}dx1G>}4FkK!Hcc;dfrC)fhvK(hIUQ>iuYJ3%jru zU0@TYdSGZE$!gF|kdXkV?iHmJ6{>To29)=oBibG)o_zY->9}aBS8`y@WJ5gi}LdOTbZw`PH*)EJOa6m*D zgrNDG*Bi)$reS?dd^c;q>cZB^2_1wWJc9xh=#jxd4$<-G%?$=Fwe8T>P2Y7514IpA z)P^z8e5yMRpwb4y4P^Vn7X12&_buYG)%YE$x9uL>k!-%!h5mdt&S}WDxu!hLq`pl< z%``k%HxBGr_@vQDH$ZH6VINu`mIGmd4XQ_8;5%027>Cv||h zgDgHUscsK+jcOqSO*;g^Ju;#&8rY`G3_UbZ-=ogmx5t?O`G$5%iNb62O9p*6a+W6eM zybhX$t$CVF-GG`QD43vlnjk~kp6=S=fP!*iIGQ<#JU;*qKwN<3f~M0FQcVo>NU!`G;btQJH~_|*tq2lkycFrtBLdRpkZ z*IyxbD7bIzM*D3qNapA()swDXTa4% z)5slw#$|>fNC-fHK*0rmWxKW(xltGb5!FoJf(Ztdz>k=5F*L7;htGe8ZV0UwAQUGrdaLsTb&&;><51U?``@NHn!HYi9yvV+hHSm;`wX$2q=xin&7sJlM1w8$CIfoH(JqoIE7 z0p6X$xv3XhXNG8OaBOYhf*P-xksAQ19su8?4(t!4#b_ROna^z8?6|s|z+#&2I+{gc z8m^1iQ96#(vr$nbcZ%4i8+WgVuJmQ=Q*C$}bD0f#l3{oejes$^E(LaE8j)kU9tfAr zGTq411|Si;q2Ub%o-^=F<`00r*dIUDpMa*l+L^6m*&YNAutU@LY|S+_&0rd{Y|k{E zFtBXUtEpxNPGnnw>sc-cJ`ts!fug)`d)@~gFK!;#oojY0ec8SQA87*(G+;9vfbi%U zCah~}0J`nS1AgZRjQJYKDW>OnCj1%su7)dH!xJz^i?)E{?Vrv77t>78-atIoy@)}# zK`DjZX#~1v8nz#S#^MjWJ1^2bklr<>qZ!O~Y*;e`Pmidk2e#{&zOLIK0B?g5eiFLirVcG@h1)&+ zuzjkV5#SsY2`BPF(~g*K4K&~PEz8p>^O%hUQ-eJ_@O)U-zU4S9aP%Mq6>6|e#PLn7r5xO21??9nNgs* zFw-#CTNu?Rp>u5L&-O)9P`52xgLQ9cAxNQy6AavTz>-S{ZzD$U!%tH$!Hrl=X@6gW@uZXWrsTKp~wnZh&CSGqi6x~ z(LW_HJ=?cJ+h?Y$LCL@kbrbatZ{TkOzc=88M=h6nHf1jQXzDuCU5ACRiVR?=14B18 zSW*G3BH)xR2*9510I6n?ZGt>UeZ$?#u(mF9QeUGs9!Z*(;ewp+8SsDKu`MeA1;%t8 zP+O=rFip$1f$AAL>>iL%9nJ9!TQ@#(P@jlScr*Io!1ZYeJlhTND8V0iuns(*Ma&98 z;t0?+EATy#Lu`;JqXGK-hOU7WCei{u{79C)eO=H+**FSAkVJIdWx5aQp98wAMZ<8Q zn*-2I7-c$+cMyUkVuyhr!a4zc5I6V7u9Z(n5B#<2fPE1s_X!}FccjmM=i1)3@C(Qq z!0!XxcQ(+kfNGizA{{7oei#gxuETB&LmyN^XAqhiwLI$UpzT@A4+3g_ED`^N^y}Nv ztv$yDZfP@{`X;c9fn$aiXw9J+0g6A;V@&+Qz~9Js*53@gw=orQ)SS-u8yr@@{N zJYO?Fj@Avw9QY1U-VpRLgX;8y=k2bvsiy54P@tIO7*42rfR}-<1t3g0Aae(xB-x;Z zYIr_l`;ilXEEahhi00G;o@E&}NRW}qjB8@?CLBFA(*kj3V8i2vut&WhV38Mip#jR1 z51ZFCodHNWp#NzhM)^=n4?WZMjgW$ZXkB+G+gJZAjEw*(-f>)DXRZl&2Q3ifF4xdu zYz|BnkSK%Nfdfn41+~ebpz0a{EPmGvgX@mu27FbG0nkubN1*V*`hxZ3m;uuQKQcfs ziOfiMm=hQQ=(dig=`@HU$DwxFdbFZhHICcmpkr99Y-X*Dzg#6@a7` zfYRz|hC^Lug608a1t`!!(>e8aB29Ax!!}_Fxz2}UaO+yBW&*p3EX_w2!vfs}3px@p=0wUOMJ*B}dbrw%Q*e?zXAo~8u>u!;dt zDc8Y30Nc`aOAAdWWFXuEjk19#0Y`By*i&8r2o57Z^lZ-srPKWgjQ-ubDXt9X@83Uh zWk5IUnCQX-b7a9}*pcnq%rZ?NkO2h&F+i1D4=DNx2Yz4=9Nobziw;KOc)rU#`x+zr zd)Ku2Ans1NUTS{pq+J6cm4S-oGltP8KJMB9HK^f*(Et$(KS0TdT-P=t9bTEfAHYhn z4cOf@x+*5OA8Zl;<#cSv)y%*GeQ2P83PE8FSUSk0LFiC>0Bbz*TrJRm!#kF1GK@-u zEo%(Uarf@<^sy={sLKC&d-*>NXFdO?sq%l`O8!ry%Kr(R4wM|wa(bFd{rUOq|0?O? z4YqM{{!ftjwYB`8j^nEQpSSe<=J7n#zxd)`;MafpLj3&V-llT!-~atZ`33u;fPaf9 zECN5v68`NUT4jF2VJv@Fk9yRj9`&e4J)fWqAb$MQ|D#Z$9`&ea1AQR!=O5+I{}exe zBftNH{P~ZqI{zYn68ZCw^5=hwpTCji{z3lyNBQ%gQRq+)boiv>il1w|5xY#nq}ezNb3CmGkU6<1aGnp+z+m8 zpTGZCf5-EG=L=%1{jcc1ntw(A)pO(YzjjW(q5Xfp|Cgpa?yCQnp#!^6{$IE7?2;#0 zlCYqRv$P;@#A+Z<=6TN2 zGFgyfKAUBE2?O;P6~2a@&JREQ(E0EG`mg`~um6PqSJlv6pZxcK{eSW;9Zi4 zvXz$s;C%gElK3<@UVWX!nB-#hZI-5NQ*%+A!1S!VoRsB^&f=A~ae4wn#znRKKFPA< z`E2E7d*(KNT78?caznq12}_dIcV$jXHeT%p3}YInG+BFHl=4+I8<-q`Pf%x{MDrve zNnDhzg^BC5sCG(}&0+b_l6?2)EI*FZG5K>`PO6>u{e8q$G3@ulEGT+Z%zqE2urGh_ z8@)llqSEqbZ&FT^2R$YKDf+)n`OmO5(=$vZ|9wV}xFh~%+qj1QZ(6R>|CRo)=Kpr- z|3EhkSJD5^j{ax!ayBn-iVb`?{nuSh(SJq%)%+{^ub$hZ{~;}D|7Q08htYq-F*HU0 z75!K9ujs#eZjJs2*$K<(nDw{6|38fWo3>^s`mgA}n*Up+|AuWkwzB_!PLIg1ce8C= z$Nq2XivE8#^xw4B>A#`q|E*XKxBoAS|IrL{ zW&hinrK$Lz+jzR&Zl_aC|EOU33Cl;pG#tfgT!#LT^yfw1pN)&3lI}0Rkkyj#UlC_1 zdH=re$7#Keeo8i!ogI%`<+}wd=QARjA>F5Ioj_-VQIZ7|qfVe7ur&Kg?2EqiFYXK0 zT_07JM)9}>a%TgOrB(sd&Kel}5eIC9(MdznjQC>obk6GzZ?KLT5?7;~S9apl5ndK@ zaj7_DX?cZm?5t#YN|Vtn4%@{QQT&V^CI2b;Psx8u{%gyB&GoRiBmY^tu_phi`0r0i z{^N32E$Q?x7X;52>%^Cl2vZ)C1uL#D`CYXKctPCd;$NSY!AHV8PZs>+g|NCD)>Q?< zo$HN%=W-!(=fg1o(l-L=A*`LN2%y(&gM+xZl?~#nKvh0ZuiPM?iXK4N`Am79lK+(a zr{q5+|E=5qMze8O-lqMLqTnU+pJp^?LvsJSy6q_W@9)q4SBrgHFxPDm6xDWB{9o;V z#sAfFOZpL%Yc{%_d<^b-BgG%bDg z{NK=BrT^WU{?{eq06R_r8A(D8-W6Kj$u%j~x*WDH4#jdMC-Ubz$IR(lb}XP|BufFpt~5DBKOFXlXr zdJ?BBPWcf!2NANOl!1aXxYyJHriL<3))7`JZI!sePVnCGjP&Jw_Nf! z^1pZ^0BA<`X5(<&6_xkuPq+w3cgDzG(f{AQFZ0=S=c|5yyt%+1{#T!V)%$YkdkG^U z-IVC?7tO~Kx9p4s^OEAl1caM;U}zKg5=>}1X5mQedSRo%w=6gwO|y_S?{YQka(PCIUBJ&&pH&-@p+yI z84@pRIz2sIl^>@pjAf=H;HxzCaP&(_!S zKUl77Df#cV<-d?caf%n1HtfHPx1GjO9PmqC(FDk4DRIZ@h@04!Ok`Oxis&>>7Qh#A z1?{wqb=(Bpx*ioz2mF}dtvXLj5=SIu0V@j1#hS((J)`AhbFv1kJ>s>oE2AX#N8D3w z1XGIE!WA=F-SnDpC@h#)1>b1~HDfspV|u|j_{*h%EW5_b9_GQv4KbUQFcnz3Jz`#w ziC0m9_mU1tnx*Wc5wJRbDbrDTLu|D`I61lU3c-jzKqI0F?a0||v34FY%QIXUy|5-( zT`bv>07L=UQG~8US@dt&{~_2}D!w};PP zzuLJ#XAq|Ud0wr!l1*o5D<3XzCwVZ{`_b5GEv1cPTn-PGmiy{pOYE`J6fs%Vl&3M- ze75pVtit)D{Pf{Cdz9bdthNu@T9Lb*RYga40FaaumvpWX}EgUaZz0K zDiub4ThS!ZP`F8BuRHTimV^XIP@GhI3_6T=ZqH}@X6}5Rrg4he<|&QK5s)KEZDGR? ziEWui1M7+4L5QKIJ&DTJ6fV=o22G;m%Ghy<^kBMLXh%|C6sK7pE*GiZ*2VBzZ6K@D z7#C$%ucwUHk}!+E$wS!t-+li;)=V>4sN*3i^EtzFvVy@LE9+K^wGq>rC|zgRp?}_> zmnK;5kM?)|sxH9NAPZrxhJ@3*mC>#bv>wIRIi3K{^7y16us1{hI-}s#B}b9SxL`0S z7+*A&4dxHg00Fu#4pTY1ZQ=cjg9V7VMcQMM`{`r0orKCa-pW1;nLi&3*wX?gXXkBI zc8vs(E3~SVDs}#+>_2~p_8-%>9ZR>A{pa(w|4i8p+yHr<{LhB1{QnjGSM#svzj|() z{%_g*e`)-;W3KvtSdOOhKi|qTrU^Y;jN&xPPy?j%a+0AA|0fnjGUpUC`bhwLrz*4jq$Y03){Tce2bd8?& z01Hgxw02*X#^WI|dIS6>am+oPS4?m6Pu`7ACuB30hAa(Yw3dGN{pZ5}mH+46@&C>D zzuAtb?tl9X`TyI4{iiPvded;*`~M>UPsemu^*_r|`Co43*=<DQX7&PduHpq>P^aN@_+8v3JB$oFogaSq zp|iOd%0q}TaaOW}?+{PT@eGuP7uCe^KWG>N96V0edi;NV4c>z0GRbfT%N(}!&U@Zy z=gTjTzIlE~4!?Q*?!{B`>h%$Md_dkE9y}$_UcV)8-oAeN?#a>f*ROhCeu;(OaW`TZ z7a*qUKhAQNCJVwlUgIXurc28iS3Is~4hdHB!5N*-p!S=DF8nMz=KT@gHe%%MlOaxp z*JMMeq2xbB|8G_P(>=52na*I~sQf>lq5LO#&~{S*eYpMK0)bK4|34f1zoP%28vXYM zj-}}TXH5UMc?NKa{%^VVs{U_VuA%h*+jvkT*(Go0Wuw)`DQG-2;kT=l@rlS6!*#~f zxSW9Y-8j4VI#+cWuX2GvV}HgZ9;j8#TCH9klJtBBO>YOGJrygqN(zHkfj4cZHDQC0 zMvV1VYFquzpyzOahoVviFHWoY#9`-xj1-$4^5nLqXKm3 z9Bm<(FA4Q&)XNKk#uaG%Kb{?K=yI0Kr)(4#qo1Rqh1b@w%Q8+eRPzkono}0w>=o;f zRtgLWaDa`FiV1Wm9QpGof)T9)TK*1j4DaRRbNUpcPd-fpHagAnb*G^p};W8wGDB~cWahkE-%7w*+OY@b7bG0#C zG!;PGj>RC$oTdd0Hh22mqPQv%_>*=#0=Jy)K%p?3N`ui32>|3eU{MIVJZ2*-0d&Ob zX`DE`L;ERrsx2o}5Qo}4%WbRqJOxUz0SPNU(HjU&hD7~X%RbZKd zZ-gdD$$6mKgyu3(VO(4cttoH?fMXI?ks=#m$&W242bd-RYmRZDKtUhl>ld5*!gC6Y z>OwGuQjFR;ze6~iXb0pIycsNhmbu$5!4?KSoP#I)KH}e(z{J5sIEJHPw~(FM4529o z1H<64b4DeDMsQ$sUS=b920RbA=QIoF$%Y}e3ytbPkh+gA<20Vqq@KA7aafI1uwkEF z0vJbtXYp+7e)U!(f^g;@ZOKc4cUKf*IB#&%XKtm|GkxGmvk?B8nX!|wg{Gu9C5-rm)3_8 z+;@um8v%eKMztu5cph>73%7b^`E`A3f7{9_^sJQpTOmY0`T@ zP>qF^I->z2Q@S8NcLNK1ggnWnLa#+LYMhoisGtE0x&0d8?d8Y4UQ5@OK>esX?_e? z@uBqTL#XuAJm!9n)wn0~67!3Tyc9Bwzsvw!t8Ib4{dCbO76dA6eF<=M&LIlaA zEL~ila^+W3CR%(*SZ~~Wh-Z&r?cDL>H{5m_WZ>GdGY$mK6*ADZoL6Xyq1ZOB;>HA>O^6D$Amdw&fHxR zms9uY(y9hna$UoQeDn3w{iFSMuA~~+!-fLFQssmjc8D;#KaJ6Q_?LT_dF!04K0L`# zlX(m%78?D~m`U!v@2q@%ME1_l542MD{rf#^nI#2>w7U+f?&ID+|MM=VIamg%JB2== z39?B`_RshLzY|-sqAx{7N*?g0(h$Z8ZGF&)q5Qwb6LX^Fz#K=jI21jDD(f#V9PxVb z)qx}9T`wiK37We>cqkL})d$v@qW!(hDS7k!X)OVq=5bjvlx;S4ZjU1b3t?=)O8pPS z*9}n2C$C?Qy6FZZ}G1tRa|^R&wYJs$C_TbGqxaXx@r8&>dYq4)1E>p?M}u^i7vM#wGz zNVw99d2xLZSI$O7796v(rZ2IW2A;SPWTcjE{E+m^>1^);bhlt!0e|h*d1|?4^IWkO zjD8vyg&eHrx-M4s**KQ|J6d(vl?5eDaEFVN(aSsMXX%e1^8nZ^ibQD|qAGzGaY+&Q zB&OuCD0g*;BdPMqk+#=kDOIw0rGQ-ymG7=Y7R-U#h`5aXWg3keaG7k6Q0he;>=DsH zFhuxz(RDNpbAlF;2va@pUN-415K2 zcJu5MP%oDjFAJ;f>%+tSH_u^Dp@RDFEcaQS!NNJt{c4(Ev~{nO$WRcm?pQ3LvQPb~GG2z#9Gg!2$5u z7Y7efNc(HhUmbn>;^V;wJbUg6>?f~|t_JNU zq=L5xhp*qgeS!gF`(GcB`|K=Wvy%LI|HXrw5ecMH4Sy{=)NSUCD`g~WMD12LyyM4L zpeK|0m~q!5Y@y5-ynL2E#MQ`6B;{35a~XYe!sGGAr;U0gMNrvXY$N1JD9_>+=+vE~N2` zawkEMc)7P-Sh36s0%=14nYZ#$gyC3x^m6!)1*6~O%y^!(v!Nu;tDM%CfJ*5~irO)- zd?3l?e3tMD)NM38Ls_0sv=BT#BCQH?10kKms+IfLSDYov^}jp7_7saab{ zks-xsid*nP8Hhc!Yz&0Msw5Ghn?K?EN%PlfoQBzH(Yyd5ZdUz;C^%A1*k!E~h~DNk%Hv@Fhus-^&~$MxJq+>1%n7EJ*c zN?AhQvI4{_U|;VF*yX%!oGR{P%sm;aRvzIbY1M=o_T?jz(>N2BQ*_VHX(cGngx6Th zb!-o_)K(TzSbhR*r3isC{g^A$-}1Fcp0b2;GPo-jCwfN0(!#f#U?4Z>LXTI>iS5$d zqjJKLtJmeBMv$X*c~fB&n>iw`RvZL-E&~{sm#=2o5GdAH%5p3`hTVe_KMf75;K(ijb06+2OyeHFsT)=BA}pfg=@f~WL`{0G%7hHTQ`m$^A*Qv!Q;=ltNj?S z{M2e*Ads_PEYe_-XK6Ms$YVC4CvnCRbe=!=X8L+=>G$tDn|!zd%6UrZT2Tq&0{`jr zHQbB5yRQcLQpg)>0pQ&%2}earXT>A~PBMYo6HK>V@c>kYKn)6ik5s0blHbGhU^0X$ zzw)ZQ3XAqJ4O1GftN`uu+23p%tHLVqo(drO|N2NoZ=iMPLho`h13Ou|vkB_ORk^Kf z2Lz*?wHetoYuBFZB~#b-W!gW#eSUO6_P;sUe@b4w{`zL**tR`u_mm<=L6{PUF6h)- zNe1{kx9lgNhjV6@WMlaCDwd`QNrKdSu_#|!!nQ8h^)Y9QK~CXyK_ga5HjQ9GvgD_U z{D2kal%ItK6c~P8W}fE2R!;C7D3Lb%Aj|VPmqSq7Y$(zQZ9kmA3njez6#p!i4j+B3 z#&Fr1TiI~v)2xK)NBUU*MQ5{Q!Lfm=D54Jmj)XHWG{Q&z&o?71VfqhlTgNt<*HQI~ z+^-shaq+v?AGAuXRN~#{W0MI(R@&jkqj{1DhRRD8)gHx-wrT6PgP*ERnc|)#9JS>2 zzsta>e@20W&!9Mc;@cUtS8PjIqJg;}cG0|q7E!7Gb3@N=<<8#z2*Nb>w%djvmN$Cq zV~j+rK0nS4GhUC#Jh)q*E|N4P;z zT+ahcuIHh3xGqHGmnt9u5CVc!m*_nW2Gzh?MyFvrR}q%l08Xi(agT67!hW(MROP`W zKEWc~Aj4NaVnJ?l#=JhV96C~v zJ-lq4{4423q(4o|z92e%2@xdzJ^=V1|APcGZ2H_Hd(DWOCB~&4U`fG-!I9!LF44z? zPd9QU*{gIu^-;KvYTMe&=TBJ@-09@dg&1h_k(4JmAX@Wd`X$kO_aGDdqQ_ z;_^Tbpmc$5MQO-+7%fF^vVw6(8!kU^R*QV9C$(I@PcffnUYnUvbv10*kSntadsBB_J|>I?lcjmvZMxQ4AP#KPT|wv?61zO#d|a*Zj*29c zJy;!F8!Nojo<8nCz1{WL!)`G_7wn{2;3qGRNIH zXQ{JhD(b_jT_JBs0IBSjEQ#W*8xSz?Q zDClu^$wIlE{Mj2;`kv( zk>Iu?Lf0wq%ppL+rOKxaj9j@GqGntfpuI^$yT}YiC}jdwYL3Rd&Ms1h4Ij8!qB%8|1(3{VQSG%@(fdEWe*OxCD75hb zAK`jf%NAQJy*EPh58l3g{T4N=*Kd!2>~j~x7q7qm`o>s5onq-l#$Xsl|zZ$2)nN;+k zJ&Y;C5T72Al^ZTB#YLHFVFqs*t_gll+9Pj8C&Ri+OY#h_TJ)}T1}x-qk=!X+h|$E+ zhQXt3mk!0ewY|w_n9*a*XRUcJ0-5R#bNKQ=ubvJW>_Pn^OXeVeW*CW+i2PnKEa7_3 z+d~+YKVIYL*u6)4yye}xAz?z9p|F%MHzcorMu9j&aqRvB!hi+LaOYJ`RC`Wyq{WYC z(#FNfKSbg%K#Zsceg!v1gkR?K6a-8*0$Q5O54CmvdBmv|_d-VU2aBN|Q5E%4uXr3G zA0`#{^^~2qOD73*sVZEx3c|WLU;{}wMHLYheOx^C8hMP-UUN|DWEE~)#s!fDNHIxc zyGQJGWei0%l84;GB}=Q7RVyQaGGth*j*pFsMYGdu?r+J7O1m+C7pvJyn(qL9bIfROG9p>_6BrWe?H@d*%?OET z*_^fFrPZL9w}vnBTGdWGfCc{MSC0a6zt%pGCP&eO7E-Enni zV8AJ7;|NtX#ZNsZEY9nLpyDCoPCK#O<$bM7 zuJ;wAH+e8Ze1?qT59Hny*01onFJ>%28;>9pEkbaQq8Yp~nlD9kz~?!9o);^T9`HWo z;j%J6?aDWl@`dMwNT`Q93;i8hMJCHdT3`72q4a@#{o z_`H(o#U;so9{2q&1*EcB7ED^+758GOTOXLx77e?HGl>z}oK&>l2Ru?*I4>-XE@^$> z!R5;|1WFXG5;Bgx>UOKt3Fc{t^KuT8-98CgYV3?Vm$yHX`x>q|^sQ|V@F#4u%w{6K z7nlqBNytt##rU&)U?-~I!*zIXuX-a6bpLQ~e(&DB5LRYqIUVBVi@#NNY55CJ-E7>- zy-2=-^~q?+t4OnWXDNB&IT4!62^KLfQ=CNsW?&fAYJ=$b8NH|h0|)awo3Z|5mcy#slf3DT+5?$ zY9&o)vU zsinn;A0su6G={~kj2DG+!4L|um{-jo+_4;EF1Zeb?X)E%X?+#GZa_=WYQv`*xGq{o zKs990zjX)o9`CX|q^(a@D?Gl;(imenrLPPwYc4ej>3C@e&VRJITZQ;Bnl5ZqYRqPLt&xZ6}MHsItUPBV^Err`OKI9@MdCh-gBc870 zCfI5vr89mU+Jv?8KdX3wRvVa0da0`X(LOt|HR*5I@-oRzD+fk-)>?H?)L#NAbLCzi zrUbC5pZtVrBrap)2Mh-H!;m5eI;!y1$7zr}6uzK`YtZydp>670lr#1-<8v+SWJZYV-GorvbooP3^yvke9Zzes(i{}Tg zj#^nN$kT&o`|n;H-HH{>M^GvwBfxNM|xds**@%C#|$$BB~3ntxx&%2G-u;gUA?n3iW1ng9nDde1unsVhz7+5|69^3AD)z1|#*ULbykjJ<> zMzAH3S}nontU78~E3{7bRso)0^c={j=+Kck9zdK=*qK;$@XJGametukn zO*qybf16dg1omM3CCm`KhB&c`7>L3wc80M1)+UjDb*UD%u8y`5AfKU5QaHrO4%#x6Br@rRK%{9NiC+n3DS- zWuY9-<0jCc)iNJ|@)OhQ&%b7K5!1u3=f#k25G_utTW_1t7>tnUSA)jriN45Sl+#g^ zWE4}tjN`KLBP$)`xLlG^4IF{lf=-D{Vc21Kz|9@qvkhRbA z+yvbthT;D#v>N;~^dAy`&e6YE$>Z1SBtiS&VvnVxcZa=qN6)(6p0o$>wS*_EGKm5= zCssDX#_o*zPQk$ea!R?*F9KJWi|RFs)j_mlFlU$5mJ;A{T`9hY;$|Ea*;!noYnBi@nsAd6Q`e;^uT>{cGVqHR{5Q;f!?%=( ziX4g1?#itzXN{aBoqc510TBcKZ#R`V^4asRMaJFdub#Yk_w?YV67CjN3g|+_lQcr2 za7#o^4BVebRER^Ktnoq~Uk3&lm%<;ds9|u&RdKj1tFF|&nMrbVw z+k?ZywW|zX9vpr1`e|oZ+GDr}R@+lfW_}SaO*}jF{o29n!9()=&56bTb;$jfPi-LC z@ctgp{EcQDvRbnCziX8S@JofOvV4j!D7REtCM0i{uP-rOs|A%{?9(3RZ*JG%H=Od) z6+S>vO?_opRAJjKh;)NA(jY0_ASKcuN=QpLNH+u0h=8-kDdexdY%% z05~1Bfsn9$_J=be8i6-V0xu^I(r||zG}Wg#qtI?dK3}q55;&*)7Jr$Nz5dN5;X#1H z_00;i20jh==~1&~)LeRfH7Ui%Und~o;c>7x(Tf}Jokk8VO;-Sn^|S3y5~nNp`EYLq ztYy+fs@(9+o5t)h)bgX3E<9a2UWyE)R-%G`Ra9^$Yy(awXI=3q>u-8rf@=?5A(K_d zMqr~etP`gJ3{`8@S(y?>>b`fpR-=kUb#&1_X@p`N9cco&PqP{`M$WK|O8Iu|g!*~| zE4>fyDbnMcdPa6wjjU|G0+Fz(-&|A@St=8~YJ#iZm&){TWgQ{=Wn!4MUfri^=QbHQ) zC^vd!tt9=|(gT`5N+rzcJ1_O(O?y$-JoI|4*w%XF17lpX<9$c;*<>uec{b|6`E074 z&rt4nQpW|?z!2LOgk!emhDThDx8Aqt>Pl-(l$Da}Qo3=8JuH=dZhT`$Tz5aY6FD=) z;QUJXtL?W>-FR6Mi&{6oe1vkUQa5UjWEsdl)FEqO8SNM)Sgxe?sDC$C9a^C?Cn2-U zbbv92mO>h;|AcXqFGv$=wK?hwTgHG1K~-x9Chmr_wa7|i`Wi>$`nHkx0-s6p?39>rnQ z!7LG-4U0aOI)vU$Y=fK&UY&`_d`>d(1sOPEugB)uE5iYSZBQH0q00P( z_Oo)HYz5yPb~d8yCru+5HJj1sXFagmND5j~^-2ib402zSdNb#s@@_J0C^ir8 z9Ne&6+{kkUwvxY=IAqrWFv}$*7C3zp#z}RxeBWA)#%Tqd8jcgnF6`C~Ku_01lJ&>b z4&{_L{?ftME~z`Ap4y@Y+N5=7D$ASK+p^jh)PgR1L|9YRecWn0y6NXkj$|{z*oQ{a zxXnU0WVo2Kk%nDY$zlPrS8wJ!SGpVcT8$U-HecRQb1T{y?J`|Ta_-bWR~qvC=`LOBPuE>qJqg$E=-im%i{Q7v%h4(;N3ys%nnU9+kA@tUo=>bb{TTM} z(Cg<++jD8#H}Sg=q&u~t5c()mq}VddYv7PAa?ynj@spyYj*Zjh}5d8tUTthi_e=`d`ABKH#KYG;yHgRg&U&W&GsrPYdDM`LHo(YQaHo3vuEE2 z2%oYCkR6DAuH1ZxWmYjkKRRKadF*;s!*HxLrArT0>9S!7%ZRP9qjHYxYL7JCN-~;S zI6C{m#h5GDK^ywK`fIdBkjJHHU`s%^4_hc)vDEp#X6z|&PH^2?FRCSGEXC1u=>^?Q z;v%Fxf&G2++A1@NHO1)BuS)81x1T@JL1ncc=6Y*#B-B&H{9eD)85efkQKji! zHysOQ9u8B8P;6%R{K9&86FuBEwl4kUn8J#k`>m5zXFl_9SBos&z2CIC@+PQY(P(Pa zj;YedRXJ&o=dIrvdpe|$wBVo-pymSLcU<`h2OUDsJg=n4tD92*BGhg?mUrMvvgh(xPhz@*L->@76ZAJDR-Err4cIwv__Y#lW1fl_5 zC~Yg){2*l$$Pol`>J!!ipf$Ut_uT($l@ZScRL`M9Zy>qKQLiC zF*-iPBnbPwi{@n4nEsMoWcf?wJR|5gRiFtoBV?wN?u|j_Z*)p<3iquC@KHd3TeRlZGt_w@ruZBE!z@3!FFMJ5ej0x# zCV9hb+yL@uA*c0VErfPx$KsUn>m#*xfN{kW)9|k8osY*~!)wtPGxXkJ^Lo>ODK8M{ zT?pn8rQ``RX%AJQrR&oVRYxhNcg{hO?apL(LoF|^%H_0 zt06!eI`mIY`T$f0+q1H*H*5pW__sOT68mcXRi^;(i zGlYz%TOMO7ksROg+eE6xaIZ=I{4{~{63b;xvSKRfI*sWT&610sjs`^LQ{ToH_c2oH zw`1HkhJ$ln++mO{aKqr;9Y@~A^>w2zwobrX6}};ZgC|qNF`{-P`puK0nkQ~sWmBFl zh|JEWOdK^I%lqiAN4&Sq4r3oWmuc_|^G?hi%v)|~4n5_$I|Oh$_EQ%ncWY~b`#sAp zfcQ}<@N0m{1(_a&>(0k_fqW7DdeMZ z{@2D>0_5UDH2>7kUo!jA@L~+fbiW*i3pH}h+PFnh`qOtTQBvF~2mh>UX?6H4cSC{D zCXe=O6U;r4@QByacs$QjBH#l=vR_xleDL4cQ$HHNb69MtUTyHW-?*9B)Z?D;)UlOa zG4fZ0N2@$9&hmftatde%E(g(_!{m(byguD|X>9l0i>{ny4`TZD7)2;be_W*Hiuiaf zgj^XedAXB1S+LtLS7+kQtgamp3yVh@!+h0^g!%X(=|N)MiBIdrZZ-ekyNKN&`o&Mu zim>C*n{Fu4bnR|#TWC--F|5maUi8Uc$x<}#@D8!XUq7_lnLO(rsxt{= zpGibk9@b3QJe?D~V?v=u?!v{c;Lno&LF2=2AjeeDfosj&Az08S@N@eOkXo>6!YQhC zQgdHW2ko_sqfDjQpX67{TE^2e3oqgM)XnrM%3yPpdphiJlzRbPw8@p;>ne|p_P*zIEZii3jgzOggco23S zH+z7+zu+}L{AFwxe=;TC@+`uSh+spNb5X}n+Fpjf6b)%+k-s%>$n!V{iYWdc* zgIBrDx`j8SmGriy!_LcLjT+y_WnlBcpz;@C$!D{y$hJhHlz7y0`J@f5ImP_69(1}0 z#(dendP@|tke+@tw(4lb@z}kFCqGWfB|pVmAtk^12I$CsmY~f^9!}Wo<{*FW1R(Vb zZeF>uboWBEY4v z1Hk_t0Q3Gxuj_z}`DGX=wjO}YgpBMuS?c}REu7<2?8sdVcL{1U{LMC6WW<0}^&M5h z=^}}=Z(dm@Ipq)@;35knFv6;5YjOL|;s((Fk_cYQvS9O@DpPNf8I-iz;mixhh)zJ2 zuIfrx>u%5_cK36dlp}9i3dXN7urF}m!KQihTf;4z_D?moyU zEO&f;5Q-^htRtTh&;Zu*l~vf3V-?gYb(c+SOY12Y+ff$KuPbEBdsSSMW^u(-sru4| zJvz^6b;&{8ma>ig%YW%F9lh=lbCw!rWO!lD_(-?=`&M>EQ;)YQE;Vj}(Nsa- zo?D&lzvb7SvhNJZKiGlX^BgE-SAG{z|Z1Bg5;A zWw+Z|YB7rWJxxCS#)UGc4{DqFZ#h2RWiC!L?^VdrB(NKQiGMo!QS2jXN2HxajP>1g z>f~dB8H1e;rfmI^ps59)IDfVeZe7HXi&(Y!=RIj-8_Y<=@*bW{txorFcGr`Y-ZuL| z7jO<*Jk_R~d9adldW0p9BHFjX18Ct6ES_$kUVRC`D{sKc_lw!c=ajcnLpm4#F@J)M z9-V)tzd3&a)4k4_1-`j`a~y}49Q}$$xC|Fls*gb}7f@IHx%}^eZ|~N;CV{X*n1^1hsclV~G z^7~3-FK>q7D+PO#w>i{Zfls=w_Y3_6A*tKLN4k^QAlT^%{Gagucf%exUhTbb4WJrp zoahySE*Hp%rZVazH1zf-Hqjs_p$yJY%y=kwyJ8A^{rwPmnqjn?6i7z4laf#}c={Q) z;jducjc;A6k_hh{Ud4+)@v)IO56xnSb8YC?6$=XJa??-K!Zju|UsR+vhDIzBnDb)p zH-7MtXRBS}d?a45euvap=rZCKcj+CXm%#NYQXybNf|YjUzM0K_ZX;qxi2->eK|U@b zi+9?+Lau~YQ5%EVT400C3`q7XR2kZf@FsY=9UtBOTwnHNb1=|Ic}%Zp?n05nlPx7l zhJNDRI~=MoH~cC6>!ft@akc_#t-x;(y~eD`6UXyJ5lhA(eAh3iIPD(=92*NLO<5twHM{eSg>Ups z2gtwtIS`)|>Lmo|#pwL+F()^l~XNf$sA<*|*w;s{D$oRwVn$YJ* z{2{neN1poUQW@lY-eJf{dEoHFkg`cx!;iJJFnP&NcG71H&(YVgYVEV=Mv~_56%t3% zBf10+s^v2g!&(+*M-~zlK4Hd3If^MAP*t-!tSMF{gh&~V7^@S2xvQfTV4()3jqriC z=E<-QutVDgX3QlNX`w55^W%jwv)SK(Th%7Lz7V`^t7#ox z8n+AS2SdEpyk7kL@Xx7S1XNgOKxu8h{H`fqI)nr3P*8d_pnYvJj_|@9wlO|}3?2Y! zz+e)vZdC?4zAJ146}$d!a4(7e)P>t7- z*a(UR@$*2{3~1$A6;VI(fv<3LzI}Mge|+{Ub8|4-|FyV#sQ@jXQ9J(tv-P?#DYYHI zM?9_;xOfs2UV;zUyX@C z+PT8!vzF9ZD_L)J`Y**(V|+ZRO$78aQCMfV6F1u#C9J-UDzH3@PJK6Tryqkhk|~}( z5~avF{{2*Lt^_w$?!LZTn0VuLQ~oswk$6yjnPa;WTg36tTrUgHK+J2?4>enq$^ara z;C~+c$43zM9=Lg@It$Qehi~a*^Q!GHnT2A~ya(kYY<;FIFsV9LhDqrfpg->1;98;D zb#wL7Bu~HD9ra;ix}GgpPv*IEh33gd5fdIBBC);d5DcTdkR6u=#+yPMtfYgz^5;xAmqs*ll2` zg5FS%|2p;DwTfs&%3hQG$Ev5PJ>x>JHGZm}q@4QuNmN$I+`B=EputSB`^oqMVaS*A zfjg5oJ1!!~J~;RN|MTi$|J%Q3HuHxMHKu9*_HRSSPdBgTzS#%I_s(_D7H={Fp1J%h zW{SKn(pFJ@I|c7?EkmsZ#VGE-;VX;|e;LJ3%#rBS+U@TgUIu!1HF(c|Yk2v5k?(a4 zQmFBlSvTjVMFg+GDmJ=Bd>?J)F#T}&Azv8N=>Gy-Z>t&R#7frSmeFtNL9nYT_il?? zib)KO|J*Ynyk-JXA8H=Joqx^>jC!g!0Lv}7?ybrHE?x0r0FedOEdU>yUpNKL&cV1_ zE-`=_yJBseslD6(to;$72raUZRjN=Rx8lzsv7FdC3TvGUQel1X{7y+61SwKlt>5%e0XQJrB>k~KB_)}eIR*@2Nt&boXCm18Q* z_C;l91G-CTNpg+!cC1Sb2GVs4bajfM*TQd6G){EtCO z6anU=b<_``z0U1alN7i=K!ZI%*ajGIz7eC6*9%m>iVu6{w@tXT;z#$xDB()^2ZWTT zo=wi?OdfP+-SGS(#J(=A4yjH)!67F2jQ|D`BjdfwXNfYG)odHha&%fk&e1DQa3vPE z*4*zUTblkc_!-<;2}EhTe6rUfo2LJK1mSE`$59F4jG3*=jHin-?TRbD zcG$MwFw;VKsq;5dnG!=z-71j-CrBAT4Ip9P`w4Ml@^Y$i1e$;{HG2j_u>*NFBK&>R zYh+Sh4mpJOnx5bM>lja6+)AJ}p)%UjWZ~nMAN8|IYD;>e<-#Niq-DOzeUCA6p9Lv6 z^Di^S80!W%rZb3YdD2f4!R}!I#GYIp52+*0wzvK4a=UX7r3=PIvxyJl(B0)69lgqv zs<88dNQ)Z!(0=;Hz3BGnN)zOq3$i#MM5=}8+P(V&9zh`=pn&>=ls;K9PVT>k8x2(KA^4LnzLHli7t>xrh{~?XKRyS= zPj_U6gQ)Ny5r+!@_jskgkueZwICk32ODxOivYG&s_M>MsdN4C;U`_}Q!A>LVmCyT4 zO?zJa2Kp$Q4?LBO{5%9d)$`=~c~pG-nX;0#H+$E~m#acpO(6MY7)z>X#?8rhJS zIyfKixt(NZzVBp+NSd-q{XX?XO{xx>QQ~Lo86;XN8OuQ`HB&t7q>zY{uQ@dpI+@k` zD>eP3lKd1c!v3!T1#(GPw;2QzB?kZ5ek3ay3M!QFx3wRL#6>Pwn z!7SjVBsj|s*F6A51E6jwq|SX-3uSC~S}12Y>-- zpxkJjHZu1lQ0oblRF~byA#S`K+E+zy`rjy&&yj;>Z%BeEsK7+eA~|@in5e`xO#C>e{h^__)67JGnyRdy0Ms639#7BR3(7WT@WmnpWHljd{uYGX`dQF~fzOWM`n zifE(&9jM6?=qwg+ZU*4MiKM;Picme|f#b{0vCB+&lA`1>YsOl8>};Xe?Dl|Ci{ug~ z83TP3uYCP;TZ3^I(9<9eQiAW|M1RVx;1taeOHl8+AUV$NMid24#`$~>pnHYnKm2g! z;dgrZbe8LUEF}~Ow|B;BeYV~cJG-vPA5i+qSv3p{TaTHUS=n!Wy*v>AUmgdAK6ZX*Se+A&~}VB zi84nV6K|&U)|)qpkdjH;XhcJUX#YcYaeYpr1Xsf^2+t3>dfYhc6&0LoO6p!275-oH z->XY20v-h8jfnqPO3tTIR6h@HtA8E2K_<{zI*%+eANOqj#hZDRw_Nzz5n=Z~n6)Yw z-fOrtkhl#{J>-Z2Qp)g!lRI?Dg?$hu9B7m@N9|IAfffWGX~W?e55m`wLaG9QY6d_z zolJn1w3u GH}>;{%goKDv+VkE)z?d6$lCnl1}_CL<+Ch0 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 literal 0 HcmV?d00001 From 2ac27effa23445291425413e69162d337d66a9ee Mon Sep 17 00:00:00 2001 From: Jeff Fry Date: Sun, 27 Sep 2020 17:04:43 -0700 Subject: [PATCH 19/28] Fixed changelog. --- Ansible/CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/Ansible/CHANGELOG.md b/Ansible/CHANGELOG.md index ce008f9..25ace90 100644 --- a/Ansible/CHANGELOG.md +++ b/Ansible/CHANGELOG.md @@ -2,8 +2,6 @@ All notable changes to this project will be documented in this file. -## [Unreleased] - ## [1.1.0] - 2020-09-27 - Validated for Artifactory 7.7.8 and Xray 3.8.6. From a24727d7c5e2620eaf8941fad9d90ee3450823f0 Mon Sep 17 00:00:00 2001 From: Ram <1331672+chukka@users.noreply.github.com> Date: Wed, 30 Sep 2020 12:57:24 +0530 Subject: [PATCH 20/28] Fix documentation --- Ansible/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ansible/README.md b/Ansible/README.md index 7e87f54..894dd34 100644 --- a/Ansible/README.md +++ b/Ansible/README.md @@ -57,7 +57,7 @@ ansible-playbook -i hosts.yml playbook.yml --extra-vars "master_key=$(openssl ra You may want to auto-generate your master amd join keys and apply it to all the nodes. ``` -ansible-playbook -i hosts.yml playbook.yml --extra-vars "master_key=$(openssl rand -hex 16) join_key=$(openssl rand -hex 16)" +ansible-playbook -i hosts.yml playbook.yml --extra-vars "master_key=$(openssl rand -hex 32) join_key=$(openssl rand -hex 32)" ``` ## Using [Ansible Vault](https://docs.ansible.com/ansible/latest/user_guide/vault.html) to Encrypt Vars From 5ae88d7c6dc801699f8c7754a7265edf0750c1fb Mon Sep 17 00:00:00 2001 From: Ram <1331672+chukka@users.noreply.github.com> Date: Wed, 30 Sep 2020 12:58:05 +0530 Subject: [PATCH 21/28] Fix documentation --- Ansible/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ansible/README.md b/Ansible/README.md index 894dd34..f22db8d 100644 --- a/Ansible/README.md +++ b/Ansible/README.md @@ -50,7 +50,7 @@ This Ansible directory consists of the following directories that support the JF 5. Then execute with the following command to provision the JFrog software with Ansible. Variables can also be passed in at the command-line. ``` -ansible-playbook -i hosts.yml playbook.yml --extra-vars "master_key=$(openssl rand -hex 16) join_key=$(openssl rand -hex 16)" +ansible-playbook -i hosts.yml playbook.yml --extra-vars "master_key=$(openssl rand -hex 32) join_key=$(openssl rand -hex 32)" ``` ## Autogenerating Master and Join Keys From 36ab48f40782d18d29885c19393e598e8a067be6 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Thu, 1 Oct 2020 14:48:28 -0700 Subject: [PATCH 22/28] Openshift Artifactory Operator v1.1.0 --- Openshift4/artifactory-ha-operator/.gitignore | 24 ++ Openshift4/artifactory-ha-operator/Dockerfile | 13 + Openshift4/artifactory-ha-operator/Makefile | 92 +++++ Openshift4/artifactory-ha-operator/PROJECT | 4 + ...operator.v1.0.0.clusterserviceversion.yaml | 274 +++++++++++++ ...operator.v1.0.0.clusterserviceversion.yaml | 274 +++++++++++++ ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ .../bundle/1.0.0/metadata/annotations.yaml | 7 + ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ ...operator.v1.0.1.clusterserviceversion.yaml | 275 +++++++++++++ ...operator.v1.0.1.clusterserviceversion.yaml | 275 +++++++++++++ ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ .../bundle/1.0.1/metadata/annotations.yaml | 7 + ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ ...operator.v1.0.2.clusterserviceversion.yaml | 329 +++++++++++++++ ...operator.v1.0.2.clusterserviceversion.yaml | 329 +++++++++++++++ ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ .../bundle/1.0.2/metadata/annotations.yaml | 7 + ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ ...operator.v1.0.3.clusterserviceversion.yaml | 329 +++++++++++++++ ...operator.v1.0.3.clusterserviceversion.yaml | 329 +++++++++++++++ ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ .../bundle/1.0.3/metadata/annotations.yaml | 7 + ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ ...operator.v1.1.0.clusterserviceversion.yaml | 374 +++++++++++++++++ ...operator.v1.1.0.clusterserviceversion.yaml | 376 ++++++++++++++++++ ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ .../bundle/1.1.0/metadata/annotations.yaml | 12 + ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 29 ++ .../bundle/bundle-1.0.0.Dockerfile | 13 + .../bundle/bundle-1.0.1.Dockerfile | 13 + .../bundle/bundle-1.0.2.Dockerfile | 13 + .../bundle/bundle-1.0.3.Dockerfile | 14 + .../bundle/bundle-1.1.0.Dockerfile | 26 ++ ...enshiftartifactoryha-operator.package.yaml | 7 +- ...operator.v1.0.0.clusterserviceversion.yaml | 0 ...operator.v1.0.1.clusterserviceversion.yaml | 0 ...operator.v1.0.2.clusterserviceversion.yaml | 0 ...operator.v1.0.3.clusterserviceversion.yaml | 0 .../openshiftartifactoryha-operator.crd.yaml | 0 ...enshiftartifactoryha-operator.package.yaml | 4 + .../config/default/kustomization.yaml | 26 ++ .../default/manager_auth_proxy_patch.yaml | 26 ++ .../config/manager/kustomization.yaml | 8 + .../config/manager/manager.yaml | 38 ++ ...ory-ha-operator.clusterserviceversion.yaml | 340 ++++++++++++++++ .../config/manifests/kustomization.yaml | 4 + .../config/prometheus/kustomization.yaml | 2 + .../config/prometheus/monitor.yaml | 16 + .../rbac/auth_proxy_client_clusterrole.yaml | 7 + .../config/rbac/auth_proxy_role.yaml | 13 + .../config/rbac/auth_proxy_role_binding.yaml | 12 + .../config/rbac/auth_proxy_service.yaml | 14 + .../config/rbac/kustomization.yaml | 12 + .../config/rbac/leader_election_role.yaml | 25 ++ .../rbac/leader_election_role_binding.yaml | 12 + .../config/rbac/role.yaml | 31 ++ .../config/rbac/role_binding.yaml | 12 + .../config/scorecard/bases/config.yaml | 7 + .../config/scorecard/kustomization.yaml | 16 + .../scorecard/patches/basic.config.yaml | 10 + .../config/scorecard/patches/olm.config.yaml | 50 +++ ...io_v1alpha1_openshiftartifactoryha_cr.yaml | 63 ++- ...operator.v1.1.0.clusterserviceversion.yaml | 374 +++++++++++++++++ .../openshift-artifactory-ha/CHANGELOG.md | 5 +- .../openshift-artifactory-ha/Chart.yaml | 4 +- .../openshift-artifactory-ha/helminstall.sh | 4 +- .../requirements.lock | 6 +- .../requirements.yaml | 2 +- .../openshift-artifactory-ha/values.yaml | 36 +- 70 files changed, 4823 insertions(+), 69 deletions(-) create mode 100644 Openshift4/artifactory-ha-operator/.gitignore create mode 100644 Openshift4/artifactory-ha-operator/Dockerfile create mode 100644 Openshift4/artifactory-ha-operator/Makefile create mode 100644 Openshift4/artifactory-ha-operator/PROJECT create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.0/metadata/annotations.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.1/metadata/annotations.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.1/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.2/metadata/annotations.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.2/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.3/metadata/annotations.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.0.3/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.1.0/metadata/annotations.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/1.1.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml create mode 100644 Openshift4/artifactory-ha-operator/bundle/bundle-1.0.0.Dockerfile create mode 100644 Openshift4/artifactory-ha-operator/bundle/bundle-1.0.1.Dockerfile create mode 100644 Openshift4/artifactory-ha-operator/bundle/bundle-1.0.2.Dockerfile create mode 100644 Openshift4/artifactory-ha-operator/bundle/bundle-1.0.3.Dockerfile create mode 100644 Openshift4/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile rename Openshift4/artifactory-ha-operator/{bundle => bundle_old}/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml (100%) rename Openshift4/artifactory-ha-operator/{bundle => bundle_old}/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml (100%) rename Openshift4/artifactory-ha-operator/{bundle => bundle_old}/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml (100%) rename Openshift4/artifactory-ha-operator/{bundle => bundle_old}/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml (100%) rename Openshift4/artifactory-ha-operator/{bundle => bundle_old}/openshiftartifactoryha-operator.crd.yaml (100%) create mode 100644 Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.package.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/default/kustomization.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/default/manager_auth_proxy_patch.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/manager/kustomization.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/manager/manager.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/manifests/bases/artifactory-ha-operator.clusterserviceversion.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/manifests/kustomization.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/prometheus/kustomization.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/prometheus/monitor.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_client_clusterrole.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role_binding.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_service.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/rbac/kustomization.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/rbac/leader_election_role.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/rbac/leader_election_role_binding.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/rbac/role.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/rbac/role_binding.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/scorecard/bases/config.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/scorecard/kustomization.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/scorecard/patches/basic.config.yaml create mode 100644 Openshift4/artifactory-ha-operator/config/scorecard/patches/olm.config.yaml create mode 100644 Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/.gitignore b/Openshift4/artifactory-ha-operator/.gitignore new file mode 100644 index 0000000..d97ffc5 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/.gitignore @@ -0,0 +1,24 @@ + +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib +bin + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Kubernetes Generated files - skip generated files, except for vendored files + +!vendor/**/zz_generated.* + +# editor and IDE paraphernalia +.idea +*.swp +*.swo +*~ diff --git a/Openshift4/artifactory-ha-operator/Dockerfile b/Openshift4/artifactory-ha-operator/Dockerfile new file mode 100644 index 0000000..b9ff158 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/Dockerfile @@ -0,0 +1,13 @@ +# Build the manager binary +FROM quay.io/operator-framework/helm-operator:v1.0.1 +LABEL name="JFrog Artifactory Enterprise Operator" \ + description="Openshift operator to deploy JFrog Artifactory Enterprise based on the Red Hat Universal Base Image." \ + vendor="JFrog" \ + summary="JFrog Artifactory Enterprise Operator" \ + com.jfrog.license_terms="https://jfrog.com/artifactory/eula/" + +COPY licenses/ /licenses +ENV HOME=/opt/helm +COPY watches.yaml ${HOME}/watches.yaml +COPY helm-charts ${HOME}/helm-charts +WORKDIR ${HOME} diff --git a/Openshift4/artifactory-ha-operator/Makefile b/Openshift4/artifactory-ha-operator/Makefile new file mode 100644 index 0000000..18155ac --- /dev/null +++ b/Openshift4/artifactory-ha-operator/Makefile @@ -0,0 +1,92 @@ +# Current Operator version +VERSION ?= 0.0.1 +# Default bundle image tag +BUNDLE_IMG ?= controller-bundle:$(VERSION) +# Options for 'bundle-build' +ifneq ($(origin CHANNELS), undefined) +BUNDLE_CHANNELS := --channels=$(CHANNELS) +endif +ifneq ($(origin DEFAULT_CHANNEL), undefined) +BUNDLE_DEFAULT_CHANNEL := --default-channel=$(DEFAULT_CHANNEL) +endif +BUNDLE_METADATA_OPTS ?= $(BUNDLE_CHANNELS) $(BUNDLE_DEFAULT_CHANNEL) + +# Image URL to use all building/pushing image targets +IMG ?= controller:latest + +all: docker-build + +# Run against the configured Kubernetes cluster in ~/.kube/config +run: helm-operator + $(HELM_OPERATOR) run + +# Install CRDs into a cluster +install: kustomize + $(KUSTOMIZE) build config/crd | kubectl apply -f - + +# Uninstall CRDs from a cluster +uninstall: kustomize + $(KUSTOMIZE) build config/crd | kubectl delete -f - + +# Deploy controller in the configured Kubernetes cluster in ~/.kube/config +deploy: kustomize + cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} + $(KUSTOMIZE) build config/default | kubectl apply -f - + +# Undeploy controller in the configured Kubernetes cluster in ~/.kube/config +undeploy: kustomize + $(KUSTOMIZE) build config/default | kubectl delete -f - + +# Build the docker image +docker-build: + docker build . -t ${IMG} + +# Push the docker image +docker-push: + docker push ${IMG} + +PATH := $(PATH):$(PWD)/bin +SHELL := env PATH=$(PATH) /bin/sh +OS = $(shell uname -s | tr '[:upper:]' '[:lower:]') +ARCH = $(shell uname -m | sed 's/x86_64/amd64/') +OSOPER = $(shell uname -s | tr '[:upper:]' '[:lower:]' | sed 's/darwin/apple-darwin/' | sed 's/linux/linux-gnu/') +ARCHOPER = $(shell uname -m ) + +kustomize: +ifeq (, $(shell which kustomize 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p bin ;\ + curl -sSLo - https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v3.5.4/kustomize_v3.5.4_$(OS)_$(ARCH).tar.gz | tar xzf - -C bin/ ;\ + } +KUSTOMIZE=$(realpath ./bin/kustomize) +else +KUSTOMIZE=$(shell which kustomize) +endif + +helm-operator: +ifeq (, $(shell which helm-operator 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p bin ;\ + curl -LO https://github.com/operator-framework/operator-sdk/releases/download/v1.0.1/helm-operator-v1.0.1-$(ARCHOPER)-$(OSOPER) ;\ + mv helm-operator-v1.0.1-$(ARCHOPER)-$(OSOPER) ./bin/helm-operator ;\ + chmod +x ./bin/helm-operator ;\ + } +HELM_OPERATOR=$(realpath ./bin/helm-operator) +else +HELM_OPERATOR=$(shell which helm-operator) +endif + +# Generate bundle manifests and metadata, then validate generated files. +.PHONY: bundle +bundle: kustomize + operator-sdk generate kustomize manifests -q + cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) + $(KUSTOMIZE) build config/manifests | operator-sdk generate bundle -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) + operator-sdk bundle validate ./bundle + +# Build the bundle image. +.PHONY: bundle-build +bundle-build: + docker build -f bundle.Dockerfile -t $(BUNDLE_IMG) . diff --git a/Openshift4/artifactory-ha-operator/PROJECT b/Openshift4/artifactory-ha-operator/PROJECT new file mode 100644 index 0000000..f6e99ea --- /dev/null +++ b/Openshift4/artifactory-ha-operator/PROJECT @@ -0,0 +1,4 @@ +domain: jfrog.com +layout: helm.sdk.operatorframework.io/v1 +projectName: artifactory-ha-operator +version: 3-alpha diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml new file mode 100644 index 0000000..a836900 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml @@ -0,0 +1,274 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: "[\n {\n \"apiVersion\": \"charts.helm.k8s.io/v1alpha1\",\n\ + \ \"kind\": \"OpenshiftArtifactoryHa\",\n \"metadata\": {\n \"name\"\ + : \"openshiftartifactoryha\"\n },\n \"spec\": {\n \"artifactory-ha\"\ + : {\n \"artifactory\": {\n \"image\": {\n \"repository\"\ + : \"registry.connect.redhat.com/jfrog/artifactory-pro\",\n \"version\"\ + : \"7.4.3\"\n },\n \"joinKey\": \"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\"\ + ,\n \"masterKey\": \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"\ + ,\n \"node\": {\n \"replicaCount\": 2,\n \"waitForPrimaryStartup\"\ + : {\n \"enabled\": false\n }\n }\n },\n\ + \ \"database\": {\n \"driver\": \"OVERRIDE\",\n \"\ + password\": \"OVERRIDE\",\n \"type\": \"OVERRIDE\",\n \"url\"\ + : \"OVERRIDE\",\n \"user\": \"OVERRIDE\"\n },\n \"initContainerImage\"\ + : \"registry.redhat.io/ubi8-minimal\",\n \"nginx\": {\n \"http\"\ + : {\n \"externalPort\": 80,\n \"internalPort\": 8080\n\ + \ },\n \"https\": {\n \"externalPort\": 443,\n\ + \ \"internalPort\": 8443\n },\n \"image\": {\n\ + \ \"repository\": \"registry.redhat.io/rhel8/nginx-116\",\n \ + \ \"version\": \"latest\"\n },\n \"service\": {\n \ + \ \"ssloffload\": false\n },\n \"tlsSecretName\"\ + : \"OVERRIDE\"\n },\n \"postgresql\": {\n \"enabled\"\ + : false\n },\n \"waitForDatabase\": false\n }\n }\n }\n\ + ]" + capabilities: Basic Install + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.4 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.0.0 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: Openshift 4 Operator to deploy JFrog Artifactory Enterprise + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.4.3 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.4 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + version: 1.0.0 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml new file mode 100644 index 0000000..a836900 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml @@ -0,0 +1,274 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: "[\n {\n \"apiVersion\": \"charts.helm.k8s.io/v1alpha1\",\n\ + \ \"kind\": \"OpenshiftArtifactoryHa\",\n \"metadata\": {\n \"name\"\ + : \"openshiftartifactoryha\"\n },\n \"spec\": {\n \"artifactory-ha\"\ + : {\n \"artifactory\": {\n \"image\": {\n \"repository\"\ + : \"registry.connect.redhat.com/jfrog/artifactory-pro\",\n \"version\"\ + : \"7.4.3\"\n },\n \"joinKey\": \"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\"\ + ,\n \"masterKey\": \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"\ + ,\n \"node\": {\n \"replicaCount\": 2,\n \"waitForPrimaryStartup\"\ + : {\n \"enabled\": false\n }\n }\n },\n\ + \ \"database\": {\n \"driver\": \"OVERRIDE\",\n \"\ + password\": \"OVERRIDE\",\n \"type\": \"OVERRIDE\",\n \"url\"\ + : \"OVERRIDE\",\n \"user\": \"OVERRIDE\"\n },\n \"initContainerImage\"\ + : \"registry.redhat.io/ubi8-minimal\",\n \"nginx\": {\n \"http\"\ + : {\n \"externalPort\": 80,\n \"internalPort\": 8080\n\ + \ },\n \"https\": {\n \"externalPort\": 443,\n\ + \ \"internalPort\": 8443\n },\n \"image\": {\n\ + \ \"repository\": \"registry.redhat.io/rhel8/nginx-116\",\n \ + \ \"version\": \"latest\"\n },\n \"service\": {\n \ + \ \"ssloffload\": false\n },\n \"tlsSecretName\"\ + : \"OVERRIDE\"\n },\n \"postgresql\": {\n \"enabled\"\ + : false\n },\n \"waitForDatabase\": false\n }\n }\n }\n\ + ]" + capabilities: Basic Install + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.4 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.0.0 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: Openshift 4 Operator to deploy JFrog Artifactory Enterprise + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.4.3 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.4 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + version: 1.0.0 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/metadata/annotations.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.0/metadata/annotations.yaml new file mode 100644 index 0000000..43bba26 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.0/metadata/annotations.yaml @@ -0,0 +1,7 @@ +annotations: + operators.operatorframework.io.bundle.channel.default.v1: alpha + operators.operatorframework.io.bundle.channels.v1: alpha + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: openshiftartifactoryha-operator diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml new file mode 100644 index 0000000..b2a5fa6 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml @@ -0,0 +1,275 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: "[\n {\n \"apiVersion\": \"charts.helm.k8s.io/v1alpha1\",\n\ + \ \"kind\": \"OpenshiftArtifactoryHa\",\n \"metadata\": {\n \"name\"\ + : \"openshiftartifactoryha\"\n },\n \"spec\": {\n \"artifactory-ha\"\ + : {\n \"artifactory\": {\n \"image\": {\n \"repository\"\ + : \"registry.connect.redhat.com/jfrog/artifactory-pro\",\n \"version\"\ + : \"7.6.1\"\n },\n \"joinKey\": \"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\"\ + ,\n \"masterKey\": \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"\ + ,\n \"node\": {\n \"replicaCount\": 2,\n \"waitForPrimaryStartup\"\ + : {\n \"enabled\": false\n }\n }\n },\n\ + \ \"database\": {\n \"driver\": \"OVERRIDE\",\n \"\ + password\": \"OVERRIDE\",\n \"type\": \"OVERRIDE\",\n \"url\"\ + : \"OVERRIDE\",\n \"user\": \"OVERRIDE\"\n },\n \"initContainerImage\"\ + : \"registry.redhat.io/ubi8-minimal\",\n \"nginx\": {\n \"http\"\ + : {\n \"externalPort\": 80,\n \"internalPort\": 8080\n\ + \ },\n \"https\": {\n \"externalPort\": 443,\n\ + \ \"internalPort\": 8443\n },\n \"image\": {\n\ + \ \"repository\": \"registry.redhat.io/rhel8/nginx-116\",\n \ + \ \"version\": \"latest\"\n },\n \"service\": {\n \ + \ \"ssloffload\": false\n },\n \"tlsSecretName\"\ + : \"OVERRIDE\"\n },\n \"postgresql\": {\n \"enabled\"\ + : false\n },\n \"waitForDatabase\": false\n }\n }\n }\n\ + ]" + capabilities: Basic Install + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.6.1 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.0.1 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: Openshift 4 Operator to deploy JFrog Artifactory Enterprise + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.6.1 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.6.1 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.0 + version: 1.0.1 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml new file mode 100644 index 0000000..b2a5fa6 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml @@ -0,0 +1,275 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: "[\n {\n \"apiVersion\": \"charts.helm.k8s.io/v1alpha1\",\n\ + \ \"kind\": \"OpenshiftArtifactoryHa\",\n \"metadata\": {\n \"name\"\ + : \"openshiftartifactoryha\"\n },\n \"spec\": {\n \"artifactory-ha\"\ + : {\n \"artifactory\": {\n \"image\": {\n \"repository\"\ + : \"registry.connect.redhat.com/jfrog/artifactory-pro\",\n \"version\"\ + : \"7.6.1\"\n },\n \"joinKey\": \"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\"\ + ,\n \"masterKey\": \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"\ + ,\n \"node\": {\n \"replicaCount\": 2,\n \"waitForPrimaryStartup\"\ + : {\n \"enabled\": false\n }\n }\n },\n\ + \ \"database\": {\n \"driver\": \"OVERRIDE\",\n \"\ + password\": \"OVERRIDE\",\n \"type\": \"OVERRIDE\",\n \"url\"\ + : \"OVERRIDE\",\n \"user\": \"OVERRIDE\"\n },\n \"initContainerImage\"\ + : \"registry.redhat.io/ubi8-minimal\",\n \"nginx\": {\n \"http\"\ + : {\n \"externalPort\": 80,\n \"internalPort\": 8080\n\ + \ },\n \"https\": {\n \"externalPort\": 443,\n\ + \ \"internalPort\": 8443\n },\n \"image\": {\n\ + \ \"repository\": \"registry.redhat.io/rhel8/nginx-116\",\n \ + \ \"version\": \"latest\"\n },\n \"service\": {\n \ + \ \"ssloffload\": false\n },\n \"tlsSecretName\"\ + : \"OVERRIDE\"\n },\n \"postgresql\": {\n \"enabled\"\ + : false\n },\n \"waitForDatabase\": false\n }\n }\n }\n\ + ]" + capabilities: Basic Install + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.6.1 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.0.1 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: Openshift 4 Operator to deploy JFrog Artifactory Enterprise + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.6.1 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.6.1 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.0 + version: 1.0.1 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/metadata/annotations.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.1/metadata/annotations.yaml new file mode 100644 index 0000000..43bba26 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.1/metadata/annotations.yaml @@ -0,0 +1,7 @@ +annotations: + operators.operatorframework.io.bundle.channel.default.v1: alpha + operators.operatorframework.io.bundle.channels.v1: alpha + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: openshiftartifactoryha-operator diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.1/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.1/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml new file mode 100644 index 0000000..c03bcd1 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml @@ -0,0 +1,329 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: "[\n {\n \"apiVersion\": \"charts.helm.k8s.io/v1alpha1\",\n\ + \ \"kind\": \"OpenshiftArtifactoryHa\",\n \"metadata\": {\n \"name\"\ + : \"openshiftartifactoryha\"\n },\n \"spec\": {\n \"artifactory-ha\"\ + : {\n \"artifactory\": {\n \"image\": {\n \"repository\"\ + : \"registry.connect.redhat.com/jfrog/artifactory-pro\",\n \"version\"\ + : \"7.6.3\"\n },\n \"joinKey\": \"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\"\ + ,\n \"masterKey\": \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"\ + ,\n \"node\": {\n \"replicaCount\": 2,\n \"waitForPrimaryStartup\"\ + : {\n \"enabled\": false\n }\n }\n },\n\ + \ \"database\": {\n \"driver\": \"OVERRIDE\",\n \"\ + password\": \"OVERRIDE\",\n \"type\": \"OVERRIDE\",\n \"url\"\ + : \"OVERRIDE\",\n \"user\": \"OVERRIDE\"\n },\n \"initContainerImage\"\ + : \"registry.redhat.io/ubi8-minimal\",\n \"nginx\": {\n \"http\"\ + : {\n \"externalPort\": 80,\n \"internalPort\": 8080\n\ + \ },\n \"https\": {\n \"externalPort\": 443,\n\ + \ \"internalPort\": 8443\n },\n \"image\": {\n\ + \ \"repository\": \"registry.redhat.io/rhel8/nginx-116\",\n \ + \ \"version\": \"latest\"\n },\n \"service\": {\n \ + \ \"ssloffload\": false\n },\n \"tlsSecretName\"\ + : \"OVERRIDE\"\n },\n \"postgresql\": {\n \"enabled\"\ + : false\n },\n \"waitForDatabase\": false\n }\n }\n }\n\ + ]" + capabilities: Basic Install + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.6.3 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.0.2 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: '## Overview + + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift + cluster. + + + ## Usage + + + An external DB is required. The operator will not deploy a DB but will require + you to specify the configuration values to connect to it. + + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + + Go to the Installed Operators. + + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + + Open the Operator and click on the provided API: Artifactory HA. + + + Click Create New Instance and provide the following parameters for your DB configuration: + + + ``` + + DATABASE_TYPE + + DATABASE_DRIVER + + DATABASE_URL + + DATABASE_USER + + DATABASE_PASSWORD + + ``` + + + In addition to use TLS you will need to first create a k8s tls secret to store + your .crt and .key file into. + + + Then supply the value of this k8s secret into the TLS_SECRET field. + + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to + it on the external IP exposed by the load balancer. + + ' + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: iVBORw0KGgoAAAANSUhEUgAAAMkAAADCCAYAAADjAebGAAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAACAASURBVHic7V0HfBzF1Z83u3un5iLJGGzAdoyDgWDAgIxtSdd0xZiaxEASWiDARw9gei8hQCghhN5CJ4BDMHGMdbqiU7ExpgZCb4ZgTLFsg2Wr3O18792d7JN0ZfeaTvb9f7/T3u3N7oz25j/z3swrshCCEfg1nJvqG44F4HWMCQlPrwQmWgKt3oB6laqyIorYRiHTnzBBTI6ngLGjIqeBAUSOZpNjpdXrvDLg8DyuqqoYuqYWUcTQIEwSU73jtC0EGYSJjMOjZq/jQL6AH6POU0N5bF8RGaDe49pHkthM/G27u4W6eKmt6ZuhbtNwhIwdXzJX2y+hWSMFfmWqtv8Xj3/IQ7uKyBA4+58uS3BX32cj8A6LxzWz2d740VC2azhCrhtl3QcJsqOWwiiEzZ+1ZNYdy+Ys+yHXDUsEi98+Gxi/HlszDT/2oO60Aph6p9/W1DRUbSpIcDhnwJkq4OIsPJ49FM0pFNQ8UKNUTKk6hgl2NHZo7PusmwnxzKqelZd8MOeD7njXyAByhY46RpcYR/4Sj3/LSot1YrbPsb0RpCX4dkTfOdSdDsUecbDJ63S1NLg9Q9GuAsXYOOd2zXsrCgjYR+oqplQ+xOg5xApOAOeOM0wche9+F+86uWNd72tjqpW1+L5SS0VCCAsbIpIYGduXxRAkBpxzQJGRFUmyBV/ia1S/MwAdQ9OUoYfF7/qFxOEZFtXDBwIATqh1225od/o+Hvid/PY83wazx3UEl9jf8fOYVJXhzeKNUHlBD4j/GBgLsjj/KA4M+wxBkwoWgrHX8Jns2e+cUP89VO0ZSuy70DZ61EiFZpC4BIkCFFk6AI+DSUJ/AvZGr7nRvBdXjH9DFriSVym+zKC9GaHd6vnK6nNdhoy4kQ1caRCsqJDGAAmxAIAfv/kzY6+0tIaeYbahbNXQYNRI+Qg8jE5VTgj4Pt75zcwKuAJfo8xyoNlrPxP73014qjTefdQQPJp2a7MAv63xT1av8yVUTC/Ej7/Gl4Sv7pAQFw9luwoNAVvTIqvfebpgMA9//f91bgzOV6/yBYe6XUMD2FdDoVWre1c2x/ui3/QT3Sz8a73f7paF9CiO1QfEfi8EuwFnnfa025ol+Bvcb+PhWLPPcQMwOIKB+lJLg+eVoW5XocFvdd+Dh3uGuh0FgGRiVh/OT7i6Fe9kq9XzAb/GVmcyKSehTHMkztUGlbEHA7bGRzJpabaBo+W7eLhmqNtRRKFDvJtsHxBnhvuarY1PJ/o+IcOiU/O90VcRRQxbbOgMPl5RrvyekfVIf3QIIe5oaQ1ez6yJr9cyDRVRxLDGioN939csqtmjvLxqDgh1Jyagi4F47/uO1cvfnvd2T6rFjIxJYvU5rAz4efiW9JdynLw+wEb8vadjw1/b57VvyvT+abRnlgB+C74tYaq4trnBvTDfbSgUYMcoKy+tPETt7nK3zG1ZO9TtGUqsOHjFRjw8n861GZHE4nedA8BvY/0EPpiOn6YbqiuOq3XbDo+3OZMrWNyWnUExvgR9m2gcnrd4nUciUf6RrzYUEirKKp9iAIdJpSXN+DGJQFFEMqRNkmiH/BNLrBH9zCArfvMS876BOYHv0q1HD0Ax0LJw7C4zBw4PmBvNS2mJOx9tKBRYmiw/Adl4WOQTWCwe10+Lxo3pIW2SgCLTDreSvBDbiRuMZC5yXrr16AMcFudkJZKZxK+j89OGwgBwQ33sZ8HVvfGw1ZIExWz8f/kswVinYGpTwNb0YbbunTZJenrV9wyKRPsqyW3sAU6Y/Kjt0k+P93WlW5cWYB0lEycoO8dvAvwaH+KDfluTP5dtKCgA2z/2IwcYN1RNySXqmmx7KrJ8Dwt71EY6IzCuWn3O+wKtwbOzsYGaNklI17D6nY9gk05IUXT0xJ3kI/H4WLp1aUF5+XcqY+MTkRbwId6DRNon12QtGACri/2ID2b7oWpKrmD2Og9SZOU5Ntg6hOPIeJq5XtmA7y/MtJ6MFPeeNZ1nGKrKx2KDDkpakMP5fAF/MpdejbSUZ/W7yClszwRFpk7cWbkSj5fmqg2FAtQDt+PGkr1jz4FGn6HhAvK6lCWIR5AtAHZmzaKaq6MrW2kjI5LQEi+/xna42STfgC2azxKLXtPMlfb/w+PdWu9t8bsOZUJEXIoBnmy2Ni5OdY0Q6i0A/JGEBYBdYG5qWBhweJdrbcdwBFeMh9Ch/1kxZUgakwNQTAazyX4//qCJCRJBqaKMIKv1zzOpL+N9kqjMdwF26mUQ8TMZGbcghz9Y3JZ/NTubU1oRW/zOi3HkuyEajYLwa7PP8QtUxl5Idl2zrelRi8+1K16WaLaQuSw9Nr1p+r5vON7oTNWOYQsOxww+CT/Nf0NyA7PJQdbNNRqKdvR+8eNXmdaXtR13HOmfx478DgdOexLxRJ5KkI1PT1swzRbe5UyAaQtsFWOqlasHnAa8742c84WpIrY02xovQ7GL9mZuZ3EJC7uOlseSqc2xKf6lYYmIIqtY4ny1vbnRPG64L4XXLqgtNVRVXJs6JANB3LLi5BW9mdaZVbMUWnbDUXrmKGm7hwHgyEEFgNWOqR53J747JdE9FCXcpnhLy1NNbgeJDCmXMf3Wxr+hXL6IG42otAHVNZAsx+DM147E3urs0pAgpHfF7ULcoNCK17/y26LswlBdfiYedkpVTgjxfEtr8OZsbKFm3XaLxBgc8X9l8trfQJHpejZINoaTUSRaiSP+9fGuf/0w3zqLz/kEkuy4gd+pIDQr/tENzAv2XWi7ftQI5TzsNrTKYdzcCsbuMHmd77c0uJu13rPQYfY6XZzDEYlL8BlsGJOkrqlurCKXp1p4oXiLNyNBLsuW/0xODByjItGNOFr/Bzvjk2yAVxjqDNfhd+txJL8z3vW9HZ2nGqrKO7EgyZ5l+PqOCXYLduhP9baFSIeHK1EUfAFFtpfYlgAJisThHyiemNscvnf03rfQQDvsXDamcogjr9Mr8tGeXAAJcitL5mEo2PKgys5ptTe+nE0PzJxaAdOKFHbOAzjAv0gXiPmKVPI7rH5nt9/qfmDgdVHDyNP5NbazZ83qHrlszrK1mUaPRFHwdavPcThqNy1sy/9dpcjyEovHZR3OJhv4jPfgkpH811PshcB+FHFmOAapw//xcBzk4ixIhPERU8XlAYfnuVxEGc25qTzpKabFpplSacmz+CPZY75CnsB9OKNIiXSD6HTZwbIUidhva1qGxMTZKzYmFewIEgvgjOIcbjNK/Yv1I6SKsrOx85AIUqbhEm5g7GA8PpTjpmUV0Vny4ThfdQomru78eO1fwgp6jiJW58WfhMy0cVY40Fwv30E7oTFf0Yxyt8XvHN1sdd+Yj7Zs6AxeX1GuUHyl2NBE41DhbcWZ5sh8BLnDZyEfcADbQZFge8alEahHGCLfhIKqynsAxMZQKLRRVVmXJCk9QnQGQyEDQhoJwElp3RUl73p5RNlcfK8nbhqZbNCq3rAhSWS100ArpgNCXgkPsuKkNqtnZa7tm/PmdBWdFU7HmeNDJAbJln0KPdCeiNXnHB/o8Jyb61jD5IBj9btITzp1wFejURR7yepz/fH7jlV/SLZMrQcUEMzcZKcl8XoBrBb/2z3NJmU3/GwYXFpiUvipYFeWY9c7ylEeH1AUNK2BDgYwE4oue+EM/5/0bpA/0GBiMikUK2t6zOkeJtRLAq3e2/OV7SDvnokoWt2ORPkCf+InWKxJAcBZ5mrHJBQhjm49tPXHnDZCFQ8zDgNJQpCwE10xpnr8L3BWuQBnlZfSuX2tu7bKIJXPQVK4zF6HA0+FjQvT7NbZBu05Xc4odkEBg2JUm+rtj+IzmxtzejUOofMC9qZ2PYq5xes8Cv/pM1hYehBPBdZ4btMzGA+J+y5tPGInbMCf60XWPyDeIXJF2Ssmd8O8Fqf3v7mqHxW8V7Hzrsa3OyQo8jNs22KccV5DLfDBTZt6X1g+17c60f1IJKislPfnnFnwR3UalAraDZYLhBTxMM/scZkD9sZApjey+FyX4aS2d6Ch6ahsKc2RIO6OR/Dtb7acFe+K3p45AQ0WG7FAHfRkJMj9W87APuZqO1kfJNyrG4gh83EnJbreb6+TmdTIYh30ge0mKfIr+M9dHGjx3KVlSiVbntmzZ49pc7R9q6Vu+jGRAMvw7c9TFN0PO/p+ZaXK3diej4SA9/EckaULO0YZ6gU4Q8AuY6oVeuiSlroLBMAl9rBpsWn/dN16wyN9leM2fA7hANxmT8Nf8dCaacNoR91cZafIJbG+QS+HNnXN1dvWqPvEHwd/AyfXe1wPh5eKNWBIA0FQ6KJav73WwCQSa6bFfFWG/8gd5nrH0Ra//bxmq2dponvU+e0TsdyTSK59rV5nrb/B/YaWuoVg7+EPnIokfaCVOLIJ6x9wOl29oDAwWSoteXHfhbZDontJmmHxuHbHkf4+fLvZsUswTiuXGZEESVtpqK5YGHtfvPOyru4f5yybqz+TwYQJnILSxQ3diyqfEw+FTxIChS7FH8o0aqRMeyn9fCAoOB4wqR11GB/qEfd3MrZkRYN7PX1F5uBgNP6fwqSLsVx5pDzcjH/tgyqJD02zztYNqBs1QlmGA9EZOBD5UpXG0XemxMVpIAGJQf36Do4XWqIkJgQRTyotJYLEGGKKN9b/EJz7+mHppfro7la/KDFKcWNHo76o+fcfcpIQaCSrWVTjKi+v+ifJ9AO/x3M2VLRtFfi/oZhEBnqcG0to55wPKNhAbpwoyqUc0YCR/MxTFdv6geItDkReq8/1Pj4QIsq72OG/xffdQqhlHGBnLLQXnjfJEpuQZPlh70RfpILVbz8EJIkWcmJt7D7DBhw4cJajCDBlZaMPxV9ufEjA620OTyCRLrRsju9/Fp/jVABOLhpbVhMFe39NR+8TWttXECQhkGPM1CVTDx1vmPgMRfhIUIx+ofHJ7iOAX42HhpQVAmynu5FbM8JkYbtt+UiPSNcgsvMBi207JFvgGIjwEm+9cg2ARHGcYytbJ0LsoKX2/pYB5GhVUV5Fs80E+iwB2avZV6DIfUR4vyQOmm1ND9U12doVST5FAExFgrzTxdQ/UTYFre0sGJIQKBYrPrh5JpPyRJIcjklBsw7OJgemWr5FJXyv4a1SFB5KSpQ5eHhES9lZS2w7mU3KU6yf/hFGkAn1yGZ703uxJ8nMXzaU0G86YEUSalDk9tW6a2vane1x86+0OXy04JJ2MJKCIgmBNh2RKMfgA6Qp9Fdp3QT4zXwBdydaC5/eNL18tDy2GIcqy+AgKCLNI6nKWbzOX5YYFTJFGqRUC8HOaR5g9RBdEqYN4ERL9pMNcgXNRhn7s8dDwZGEECXKsUgU+pgOUX5mrrafjse/xvtytDRmoFlKEVkB2C1+19xErtazG22TjAblZuAwL/714vZmm/uugWfxtyTbtOSDGrBfsG2JJIQ+opjqZQMA/EL/HeA6nKIXDPTEoyVjBaRiJPocASXYp80+x+9a7d5/kEJNZjm1bsd+EmcnI0HIR6gk3nURJynP/IFUsPjtJmDSVRqqLs+89fFRsCQhEFGmLZj26zFV455PGZFlMEZxQ8lf2ADzC5lJtPuaMutREWljJAf+nNnr+M7qd63GI0VpqUp6hWDtvR2dxwzcOK5ZZBtTUabQHpiWjdpFGbQ5KQqaJAQyNJz8qG3exJ2VJfiwzDovPwJHtXkBW9OCvhNCqPcA8EHLzEVkHdtFX0lBaeo6hThoxYDg6lE9hGK1pXTVxbu0rf8heEG6DU2FgicJgQLK1Xidh1UA84cDcusAjmp31TXVtfSZrFDEFavPuTDJMvPWAlri/CdTBWUkfk8IWCe4OiJiai/2wN65O1kko3i0B0sgAuUB/u7uHw5fMWfwZqGp2k7u3QcmuZaWml/G/+/pQJtnQS4tgocFSQi00z7b5zjQyKANZxQ9MaTIL/oRlI0P6tt06gH1DAOTaHe/OgdN7cEOuEoA+wE74EbasQTayBJkih9encl1h9xErs7rf+y9LYG5yev4erHvw9QlU41j5UnTJYnNBCHqkDi0x5QHcVQ8sKp75VnxUrBZfI6jkcwXDb6EfYzP894QhF5otXo+2Xw+9a5YRhg2JCGQ26nF45oLEiNbrpTptGNACVPJG/HP9IFMYSx+1ynYeTNNyUCsexWY8KlCLBe0A9zm+V+yUS1iTqPszphEo/l0AOyYDPBzNizpRXNIZb/TEwsg2klfjr5upw2+ujp5JufsYGDhiDc/ybxd/bAORd4zm21NT8b70up11gDnA126V+GDvqy1temxfPmQxGJYkYRAvuj1HtchshQ2oUgVwS8GcAPqJwHydQ/fx9r4PBLlIeyZv9PbBiTGf5AYD27cFHxu0A5zilEtGsWFXi1958IKaqnsxDmHxAt66Z3haPa6ItDquSXTThR1jmujF86+l9Q3WmdwWT6JRczWtbgIJ8Pfe1jo/HabJ27AOEoPARKQAr75dxWC3b+mo3d+eId8iNJrDzuSEMjE2eJ1ngAcyKRa6whs5ABPT1tg26/PJGF98Nvfj5bHUiwqTXZHSA43Y6Hrm62eltSltYO8JfFAu89P1TxQo5ROrmyQOK3KhZe+RyW/WrwbCoaOa3F4X8t2J4qKpxQSdrlpselCqcR4AkqPp+kUd6mNb2Bvn58sqn+t2zbFoCikP/VFsyHHu+ObbY3/TLP5WcOwJAmhucH9jMXn3A0ArtZ+Few6plr5G46QR1IHoBhhdX77YQqTyLckSWoC8YYagnOz4aSUCtGIg0voVbOo5syK0sp5OMPQSE46VOyAsBpH2Vu+7ll5Z6LUytlE1JfjNn4Nv72+vuFQHHB+T8mBUlz2jirU61tbvc8mm+EsfvsMJAjZZPXtqK8O9QbntDi9b2Wp+Rlh2JKE0GL3XGv2OmgW0OoXQpiH+gmZMNxAH8gwzuRucEiK3MwG6zkbsSNe2tLhuTPXvvfxEI2GTsugj6GIOR5FTMpLWRFSxWebPl27PBshPPUi2tkpJvMLZHCICv8xEBEyaXaRcED5jJE1sRDPB+ze5vBslGCGI/3HbJLPAiaRY1TfgsY3SCwzEiRrSXgyxbAmCf0A9S/WHy+PKJ2Ko9oe2q+EP1h9jjf7jCDJVRjlYRNI4eiGu0QLvSpC7DeFEo8LRcxVjJZ0+5DjFR0twDa9iYc3ExZIMHfQLrypyX6o2aTQQLV7zFedoWDwIBQdC4YghGFNEgIFjcAOPg87+Aqm3TSBM+BP4nUH9JEAj+/VeJ37lQOE3T2/7vn8vHyIMdsSwnHCRpQdj7M/xfOdOqiAKk4J61YFhmFPEgJ1cIvPcUbS3CSDUYnE+vdMn2PWy7amNXQi6vV4Rk4auQ3D7HPsCoyfIY8o+y1LlJqDsSf8De6n8tgszdgqSEII5ybxu6woHx+v47KflgL/59QlUx3FWSP7QJ1lf4mLSzjww1lyN9B1Gzp7z81Xu/RiqyEJYX3w2zNGy2MpcvruKQtvQf04w8SHUU4+JhdxZLdFULginKUvlSVyxU69Qi+YuCm6DF6QGDYkodhWVVWSBUelyp7eDf+O54VGS7o4tR+DZWj3OHn67BgAwG/MHgdtcOXEHyEfCK9+cXaqAHYYROR9yuTlU4PBW/KV/s7kddolDldyaZC3YTKs7+7+UXOawKFAQZMkvBNdLv8cu/GhY6qVGajYXRPoaLov2XIs7ahb/M5rgcF1uioDSmnn/LbZ6r4l44bnEWR7Nc448RJZAiJ4acy4TblY5nFZ/qXV73qoq/uH+cviGBJmirC1bqX9l4LDfCTIDL3XC8GeyUW7somCIwntOJftMvownA2OryhXKJ+Ggk/y3109wf0o+oWWe7S0BG80mxTyP5mpp24k1p+wQ62hTFnptD3fQLGmdrxxEtk5JRMviTcnlRhH2nCkP76lwd2WjbopoY4sl51ornL8H9YwKV3DM6HmNnV5NlAwJKFIG6Wl8pkVU6pod7kvz8ZGnD3OCTg89+jRF8j+CMWu45FotIavw74r3KEesHidG2lHX8d1eQWJntVVyvUo1tBSqtaQJpNxpA/gIHA/KslXpKMDUDifivKqg3D0P0aRyynogyEzs0zxVavTszRXKROyhSEnicVt2ZkpxsvKShValYo1I/8ACXKEv8H9djoPkfKiWH2uP+CPGDftXBJIwOFx7EwGnFEe119zbmH1Oo9E0ZOC8E1I43Ii1Kk4Qx9t9TsfVYOhJ1qX+lckMhmhWb1icuWeDEQ9A25HgtAWZlnWoswI9uJwWCwZMpLsu9A2etRI+SpQjJSvxDjg6yUoQx+Vqay64ZOOm3FmokAS01IW7g9S+h+z+pxHdfcGz1zq8n2eSTuyASTHNMbhL/jKRpSXEThpnon6yplmk2O9xe+i4ORfAvmiYJ/AXluF7yfgs6OwroacxcMHNa2o/fnGkJAER+ljR40Mj4aD0peRaXRLa+8Z6lXLMk4KSbZN9R7XKbLE2lk64RoBDjIaFCsq9DevD35381DkfqcIIwZFvgJnNwqikIvfaxRSYHbsiTyFIwsGf+xuzk9VmSGvJKHVqvIy+b6E0U8oa6q96aJsTsFkVo+ixd00cqZ5izJU6K8aLW93ktnnunrjJx2P5sOwMBp+5yJ8ncjiJvwZ3sAf+PWc56HJEvJGElSk90VZ+HkWm2YhBvjQbm22NV6YCyUu+OOmS+WKssNxiNQQVCARYEcO7AEUQS5H0t20LvjdY7mYWUxepwXrOQvJQT74wymdgy4AEwkzBcQDJUbatMmo6o2Anw3khSQo8zo5cCJIXANEJMiTLQ1NF+RqlSNsBOl3nYFixMIs3A5JDnePlsfeYPG5HmUQwrb7VmQy+9U12XaTZflXOGP9SuIw2PBvK4RQtaU96ANtHuPzvg91s7cCbcH7s5WjXQtyThKz1+niHKhzDlTOIxBs+Rdf9p6kt5PRJpYeH49ma+OLSJRn0o0xHAejIglspLPNXsdKVPIX4//SJtSeZS1LW1YmWjGihEOzZlkmy7K0PzBOtmY2RVZ0evoNfwS5qoskhE1dvVeVlSofmE3KKSZ3w/H5csrKKUnwH9lbUuTnWCKCMLa2u7f3VxQySOs9w74IHsfZdSOtzfhR10MKBjvPVuRyWsbUE0RCCyaGswoDOw24kZlNjh4UyT7HGacDRwH634KCAeo2bDv8bmc2dCF8CgWrEkWBTwaKJ4DP9Q58rpeHs6H5XNcHWnv/mOtZJWckiW48kQ96wpi7OHecp2d5ddaSWSNx1KYoG+NwFPmL3jZR7C2Lz3EOANecmyJN0LJpNCsWxPwtIor2dC/sYeq9BiZRbGDayLzGZFIaDlhsO0pPyge9yBlJKsorL2FJzCVQtmpptTc9qlUPodWeEuNIiqTxM7xYS2zYuKBQNla/i/ZODk73HkVkBvztdSntsaBwUPj7UcQbCuBBg48JRbDlKLXMzVUy2pyQJGKYqCTNBxEKMc1LvSavc7LRoFCkjfAus8rU1zNpX1d372klRoUsVVNEIikiFxBCTZl6Lvn17HXUB/ePOTUBxa8AKvUOrTkz9SAnJCkvV45hSWM0ieZWu1uT4kaGdKhH0EPdbIYBIDLKd0iGkmaf6xwObFgYMm5l+LLV7k3L1KgPkd9/kABbzTg01rpts9udvo8zaeBA5IQkwMRByaVw0OQ/QLZD5VOqSPHvt7eiqjzjzbWArfERi89pBQjvZBeRJ+As8FzGm8UCjAm613YGRV44vWn6jGzuYeVIJ4H9kny5oWfNBk1h8it2qSK9xjTwPAdBpMnY5Lu3o/NUQ3XFz/BtsvYWkT2oIQjdn+lNBBMTIeEgDHuMlre7Ed+cpeVepOumWjzKOknClqNTqpIFXG5rHxBmPx7IOhgU48XxvsMHVIuHuLFk9YDaYW40H8KVkqXkE5Hp/YpIiWdbrZ4PMrkBbQGYPY7ZyUvBaajI36tFkceZ51azz/E4ZRtIVCZXq1sJZS0hhCZdBBQDKf7xfUEAfjFtwbRzKHdJes3bAsqEhXKsw6AoFJ0xaWbfIjLC+q7u3oxziJg9DXUazIskLkvkqZkyKAgAexcYf97qc5zvtzXdFq9M1klCxn/RXOtxw4biVJlyJIkmcDk6SZHtq6t2OBaPD6XZzH4gRQ+JYo7Goo1rW1ZERiAl5DitnqXJIBg/X8ueE+qa82oW1ZwWjYKZ+H5CvI9lUTjht1r9zkq/1X3FwDK5mklotogbelTLylTtaAf5fyTNkgTAr521ZNZz2fKPJqIcsNg2s6xUfh7vPisb9ywijF5VqCeiOPNi6qLJYfa4GrjEDtVYvKy8fBS5bydfbgYRk1MTLscZZe3AGSUnJBFC/Qd24vgkEZBSH5FATNWwRz2+xDiSMrUem0YT44J2bacumWodb5x4C9ZPQeqKG+WZ4dNgiB3dam/Sbac1EGQFbFAqdEkOoPLdWCqSMNbfJAr4zRav85PmBvdmY9ickOTrni8WYEe7iczLB34nQKT0ORcAIzT2zmOQ+W8kkiXTQTRI3Vlmr3MRB7i3qNCnBRRxxG0bOtfekErc0YLIYlAlxRzQJwoDVKQqIkJSKfR3SODA4cF6j2tFNP5ybkhCHc3ic1yGot4jg1sFSVIcRMCBrddcGTLf6nWu8ze4H9bVyBQINLgbaxfU7mGoqriAwg3hqZQPvAjK0xhObnRTtmypwntlu1Q+QTni9V5LKflSFuLquDhOq2Nkid2Lx7BolzPbrRa79zGzx37EwNTSSJzdUl6sivfDmQa1gWPZByw+V2WzrfHWNJqaENGl6mvNS8z3cKPxPGz96SxxLNttGR8IJIe6qeuhaB6TrICiwoyZEjaSTcvOTqV+lAIoLSTy3zkEpRQrJR7KGUloVxXlyOMMSvmyLRaxjOidUikOrPW8a652fMPi+MAnAP6v7BaLz7lH58a1Z2Vjiu/XnkgKt0vqX6z/o1xeeizWRmT5WTbrxdCg7wAAIABJREFUGIZAUUQ8iwroswG79+VsRz2h1HDV1QqlFt8rzVt0btq09hUN5RLGZhPAaZ8udyQhkDfZ7Eaby2gI70FEbK+A1VII/mT+zeRMZfU7cQSBc/TUh7PUiRXlVTNQnjw2mjsjq4i2mUxq7iZ3ZGTmsVjrL/HzztmuqwARQha8xgTzhFT2r/b2plc2O5Zl2aPU7HP9lkvsDpbEzUIDnk81WFI/lEeUJQzJirKMnTa1c+6ZSFv+WFEdKMbF+HFPfJVIFSUUCOLRZNd1dQdvLTEq8cINpcKeKE+SQ86NPR0bbtCyu58OoglKX+ecn1fvaZiOhDlIoNwMkZFpawjc0C3IqY28LZnaGgxubOkXf1m3hpAalibLT0Ay/JUPENHTgBrqDd6UqhBKBbQCm6x/caYYD8qLj3uzs/nLGq+zrgJ1B/x4BI74tLyalCS08YQd/Y/kWJNGlQpedwUq3cfiiH9Jq937TK6CoEXv+3r0dd30punlI/h2NZyzmcDgAOxk+2BbaFWmkJeT1+E/8S428D9hYrDQ6193f/lWvtJRhEf0irILQDaez/RF3IwPIe7S5FvC4bRURfCZHJC3aCnRBDlHWr3OU7Bxt1JwiGZrozvZNd93rLpxTPW4OWlv7gGbhFr90yav4wKs75qWhqZ/5TpiYNT6tDn6CmOmz1GNv/weKuNTeWQPiHzaJ7HIkmZlLtsTBZnvrMbe84UQ7Aus/3N8CJ9xpn6ysSv0Xi69+pIhrJhXy6ehyEOrh0k3j3Xgv993BC9NVcjit9uASRpiRYspeQ9O529w34/i10tMMfyOL+DeZMEcyDar1m8/wsAk8mRLJ6xnGDga7IuHhWav4y2cWW7p6Fj9bDbsvrQimkmrNfrqh9oFtaVihHF7hcP2IMvVQqhVAHw0/jgVqDmWYuPLcTZSAMIiXMzvJYjsNNJ34ZtuEIDyt7oBr1mngugQeBRc/U7t3fTdsjnL1hZSONHZPsf2BoDTxlQrFAtNb876ZPhOhNjP+1KQJwIF4zCbHCnFsQhg1JBEcCTxCw9XU2PZvORlyV2z3m93ykwiz8SUeywpsDcH/viY6vE3WXyuB4MQejidgATZRFRn+jz6yg0KJCC1CUVuicMpRuBHMv26Zip0qEKdE7A3pUwEa6p3kJi1f6pyUfQMacDsZLm9Y0Hm1eEHDNCII2s2wu+Mx5H5SoVJFGjOh53o8WDnpn8Ol4iCwwl1fvtERUhkrHosEiT1HllaEF/1BoNz2hy+d1KVxAF3qgySxlkk7I//zZBHldeKlgb3p7Xu2gMMSsXf8aMjS7fl4Z1czuwoF99r8TlfwsfyvNrVvTibm2LbGmiPAyRxuGAwDweiGpbYQypjUFAJ0dM9r80V+DpV2YgOpJCnq9YszVTBO8OGJARagkQ95kBzleMifOxXMx0p3zSgNBKjGH4hlZYGrT4Xhb1ZrDLV09rqfVPrrLctgsJHlZZWmjiAA9kwFyS2G8slMyIIoVZ2U+cnHVdric0cdb+g3XtdGQZUIXK7mZgLRBX9P9Z7XItlSdyPP0ZNDqqR8Rc249HMcZpBJW+N1e9qxVErEAqxtq7POt7KR9DsQoVpsakSjCUzUKOsw4+WivIq+g2yrWMkwztMqKc025qWMVvqwmFvRq/jQabfvGXNpk/XeocdSfpAO+o4OswyVTtOxhGL9lLG5rA6WoE5HOs5XJYYq5hS1YWkeRNHsleQOG+IYPCNtT98+14+V8zyhRqvc1Q5V/dmTNqXCTEd54cZONOSvdNQ7PusE0xcv2bN13dofdbhGcRrvwff/lZ3bYLdT4PhsCUJITqr3DtryaynSgwjz8efjcxYMjFl0AoKUzoTlf+Z4Z6iyGxM9fheq9/5Efadd5E8H4IQnwiufhwKSR+3O5u+LqQl2IGYtmCaoapqh0kAfAoIdYpgfBf838jebo8KDjuTh0+4YNZSXOnGJnym93Ru7L1BTxq7yY/aSswTHJST8Yg06lyv9nT9md4Ma5L0IeqdeGXNItsd5eXyOTja0RJfVZ6boVCkDjzuEe5L5BHKJEYzD071GyOxgckoEGhTbzWtmgghVjOVf43KzppQqHddryyvfa3N82M29B8yMZd2GT1SCoYqFYVXgYBqclMQnI2HsOEo7IDt2IF8fpDgtAcV8aoAXkimAT8gOR4MqezWPt8OraC9mAkTwqk+UgSNSAChXhk1bN06SNKH6Chz+fSm6TeM5tsdj+rEGdGOO9Qo6yNQ5GNEqSXXauqa5M0gS0pYqEf9R6AoR7v2P+J0H94sxMK0YdgDEV9xFfAXFNSb8TK6A55TQIRj45JJB71GokgYCcqt8L4qw6/+BCggOvTHJ/gv3r1BwENRSw1dQH11ppFzWsVKLx+NYN5Aq/fOPn1nqyJJH6KmIXejwnaP2dNgwQ51UjS71nCI5k49tyL8gv4ntxz7rxxBbIHhC9IxXkRyPIwdtDGd2ZT0D1OV42KcvSlWdHorn4J93hvq/E1s/VslSfoQ1QNop95PiUxHjFDmcRBHYY+i5JxbbRapYQTsiGIpDmLPiO6uZ/rEGy0rVgNBm4TmajuFrc0kiMd3QmVzKftA7MmtmiSxiKYRo2XABym+sCSVH8qBUco1MvoeDjPM1gKcMUQLEmNhd3fvC5mGGZq6ZKpxvGHSRTJIFO0zk99xdW+w19Hm8L038ItthiSxiI4UYcKQaftIaYyVA7hQsbWj2JIj04ltGIJ9LIB5hVCXqBu6vNky/zH7HIcjQW7O2FRJsPdFqBtnkObP4n29TZIkFlH9ZVH0xWr99h1lAVZgvB71aloZIWVbf3rrbRco4oqPRNhZC1pDEPK32bJrRGr1OVCk4jdw4OYs3O6Frp4fjk8Wv22bJ8lAkNUxHp6IvsK7y7y0tAZ/+Bk409QgcfZhEXfd4a8qZwerkBVv4vNZgY/klc7O3lf07GXogcVvnwFMuoIBz0YCpk6migsDDs89qfawiiRJgaihozv6CoOIw4wle3MOe+K4uTuAwNkGKKuX1sAVwxFrkAjvCQHv4vDwHvard6C3+63NynaOQO4U9fUNcwH4uUiQNFT6uHipu6f39HA0eQ1raEWSpIEocZpZjPchgXI6yvLIXTlXpwDAJGAwUUScxXaCSDBuMm8p1BmI/Ndpw44U6c+R/F8Kpq5kID5SN/V8lG+r6HDOzdLK35pN9t/3i7aTGT4QqrgoNjqjFhRJkkVE5dpXo69BoJWYathxnMHAxzImjUG5fSzOQmMgkpZuNMrwlfi+XESyhFUAHUV4xaYEqUV7jbRszWNeaswrNGDzcSMwsVGEPRbFBuxo64A8FhlbDyrrEBy+D4XYt5Lo/uaLVfxrPRmQc4moSHVCRXkV5bVMlsJDDz5F0eqmDZ+u/Vs6hqlFkuQR0cAKn7NceiEOQ9BiiUHAUahrnIgEyWY8s1eRHH8OtAWfDaexbkjvJkWSFDEkiBLjlwyAYhjMxtkvWyuIFGr1uWAI7m+1N0YCdadJjj4USVJEXkA+HRSfDHW1uSj6HWigSCXZIwaJikvw9eyGzo6F2Y7gWSRJETmDudE8jikGMwfuMnsdc/DUDlm8Pe29NKGO9VLox41NuYxPUCRJEVmD2efYlQuoE8BqgYGJG0qyEbSDEIwEzxPLVQFLhRAtFPMgS/dOibyThAK1QU9Ic5Q+Awt1J1qLr/fbd5EYmxgKSe/r9TcoIn2Q6FTXZP+JRGF5OJsuGOwLjO2HM0b1YHN8XehGfWIl3o/ysH8EqniXgXh7w8Z1b2VbhNKDvJOkhPGHwci1pvRCyJSKOm5QY0lIJwKwS8mxyepzfY6/zstCsJdDKlv+1Ve9bxbKsubWhp89aykXAkaGQPwgqew9JMo39NzZFhP/8rCfixB9OkcQdREK3LAJQFBn39C3FK2C+FZV+eqent7/rTi4+ZtC9ODcesStSEaqSUiaXxFpJk5Qei1+19v4Y71O8W3x2b8pOje9VYytlTmiERKzHrW/UILoDcTWQ5LBUKLhTUkUYBIlBRpRplr9rs9xRKMgZu8Ipr6HI9uHQ7GjXMTwwdZMknig6X8yzjaT8Xho3wqkVFrKkDzfMsE+Ekx8grPSZygKfIry8GchAV9907vyq3xFWC+i8LCtkSQZxiI5xgKD2vCnMH8gHCdkvHES+Z1/R+E08RwFcPgWiUY+KZ/6re57hrLRReQeRZJoA0lsY/EQju0Fm0PrkHk4K5JkK0eRJBlAMMjbWn0RQ4ciSTKBYJ8MdROKyD2KJMkIanEm2QZQJEkGAPJTKGKrx7ZGkjd7g73HZutmq1axj7N1ryIKF9sUSchbT0s2pCKKiMU2RZIiikgHRZIUsU2BghFGY61pRpEkRWwzoKB2o6Wxz1o8LmezvXFQONNEKJIkh4gE6ZbswPiOzbbGvyQrS342pQJcgrO9UHnaDgC4oFhXqlixZm3w36lyk8cD+X0csNiyo6LIu0kcxolwVBZRAirbKECsJ9u0zk71w1wFk9MKSvhZVSVNwH95JyHUkRx4Kf7fIRXERgDxbXe3+sXyuc1fpWtGT7laKqZUns+AU0Y0BSR2Hz4bs9b7FUmSRVDo/9rRjhpJEnMYA8eokcoMFnnGal2TrbHN4Xt/4DWRjLDydaXAT6OwQbFpFMIHDmxMtfJDvcfV0GpvjBuqaGAbTNUOF157hNnrcLJIvK8t96O/fEvyhopyiVn9zg8pJ4cA9e8tDb7WXPt0mJeYt+OK8RDBwYmtqMH/7yd9zQOIuqBwMj+NtLHEKFEipPUWv+stYKJFDUFzcN2Gpe3z2jclqydMjsmVR1TsUnUFfoyN8Vxf73H8jkXiQadEkSQZAjvveM6ZE39Tl7naQamzq+P45nFZUk7A40WxJ80+x77YQZ7Ft7ukqKa0C8RHyQpEO8TJ2IYL8eNEff8F7IpN3hWYdJrZ43jf7HPd1NrR9Hg03V7WYPHbTVjH+dxYciCLJCDSg1FY3sTILVhilxuqK7qQ3OTo1aYK8RoXsDIUCvVIMh/JBPxUANRWTKmirAFxo2ri73VTXVPdiwPTLMRDkSQZwOp3/VOWwukbUv7eAOznLIYkFq/zMJzyn2KRQHTJIVhLsoxPJGujOPFIViIdAtsNx/K/IdnOQRKfGLA1vZ7pLSl3iMz4nUgQe8bt24ISbKwFjxYOEZ9hiUe7szYX4ipZLr8Nj8ekKlgkSSYQ4rMYk+BU+Cnl8Vtqa/oGyfVr4EAJL7U9fxD/jneadA6Tx3EpiihXa76XduyNusFSq9d5tr/BfX+6N0ER6VSZSZSgs+BywOAPdzS277Fma6M7WbkiSTKAECyAFDlXa3kjY3uZvU4D10MQqicEiwaeC+seHvv9WP+JWu+TBowol9yHYs3OgQbPlXp0lUjudPttqPuck8P2ZQwQ7K7aBbV7JdNviiTJACEBK/Q8QMG4HfUXygys57IPmu2Ng/QRczXlJodcEiQGcDnqKkSQK7VegTPcjXgoaIKEAWyKUlV2HL67L1GRIkkyAIUxQtFpDYtEi08JHPUvYDoj7ohocqFY4Mh+Cd7mZD33yRjArkDR639aRC/Ut45CcfLCfDQrc4gHWlpDDyXL01gkSeagUV4TSVgaIalQwulHEpPXWSdxuFbvfbICDnegMv9qMmU+vLxrLLkrn81KE9/g61y/1f00syYvuK2RpKTWbUs7quBGWPv1QJMGHOlXYs+fmXnT4mJdW1uwrS/gczSJJmWYTed368LWvoE8/R4bXYV03Y/pV6aNqMw/he3YO1FgDG40Xsq0DxoDsQaf53/xef6ARwNElrJpxS6deHe0GjiC9U/l14n/+8sC2IL1wW8f12qesk2RhEIMGRQl6X5DMhhYNQXV+1e/k4J9lcO0PEvCKQOiQILMTyOJJiqk4rqu7h/vis0LWP9i/QhpRNnvsOm0Cz1Sx/2mjjNMOh+P1w/8osbrHFXB4RSd7aNnGFBVdlVre1PrwPzts5bYdjIalNNQVJ3Pwmsfmu/56sovew/ecUelShLdRhESG1rntn6fzkbpNkWSnADEdxkmrwpHRBdMtAshVnOAUvyBp1NKAiHUzaIWZdEqMY68QOe9NwgWcjVbPUsHfhEN0nc7ik9unB18TEcqO+ywF8/0Oe592da0JvZ8OYh5+G3qfZ9YCPHnQKvn/DA54uyiRFNYX1bvCe9JNeL7Km2NZA0TdpaOarY1Prr5XJrB74okyRAUqjPNBAI0oj3ULdTLae9k4JfTm6ZfIHfLm0e9EuOI/2P6Mz+dHo8gsUD94l3Uc45BPadJx30rShicySKz0GYAcJfO9vkDds98LaM7meRY/K4TcDjSnMoN23MVX8CfyNRyoEiSTMEhnbCpm4Qqjm1ucP8jUYFYeTmy5+A4VWcdrwYamp7QMnq2NLg9Vp+zkVEue40AgFOxA/5hQAfUp5sJmj+0iz/N1sYXrT7XcpwlDtB4yU9M1Q7S6JJuFqZCkSQZAn/hTp3CVjd2q0MCdrdX6wX1bgflk5+sqxZVPKCnAwrBHkAxSs9MsIO5qoEWTsMzEPlpjJbH7qTj+u8Cdm+bbhEIBA4soJUkyCdBdmJFkgwlsB/2hOMMawT22jsD9kbNBCFwKSzr62pXdzCoq2OsV79bMpqP7WG0PqERgvHDWZQk5XL1GKavke+ko0QLBm/p22iC6XrrGIgiSTJHMHWRGAimyysuAnDovGBlOEe5DpB4h6LMGzpEGRS5hKXvvSSgXA9FhBBpBSgHFa/TMShhm/TMbnFRJEmG4JyWLKWc3Z+MIo3A99B1kRBpBbugFBXY/TSTBHvg7qbFpspoRH5dgwXoWc6NASpARp1PW99qWxwUSVLgUATss9lDSiuAaXZNHYAPdZYHMJQSgdtZT89aZtSxNwkwSWddYXAQu+gUPZM6ZmlBkSQFDg6wdxqXfZFWZUL8j2m2/I+Cs93xb3vr8tY1ZpODslhpHbl3P2CxbYflc32r9VUITl3FBfta3/0HY1sjySeoKt6Y7sVC8Ley2RhNADFFr9KuChE3x2TK6xj7Rq/gyKPuwbSYa/G73sGWztB6aWmJchYeL9NaF5kUGRTll7oaCOxtXeXjYJsiCcrc3wRsjZr8mgsHoF/xVHlaJJEi9k66IPrt1As/tlcrSWjSOt/scfm0rPbVumurFKXiGaZTlxGq8OgpHw/bFEmGKcbpvUBl6aygMdYTCv5o4Iqua7CjV26uNxh6TpLli5KVHwADl9hii8/5R7Wr6454KfnId798cuUvDHIFSQCTdDWOsbWdm9a+pPOaQSiSpNAhwtlsdYFztSedqiRJ1n2dEGLzyN7i8L5m9bnasb21Om5hAICrpdLSS61+1+t4v3eReD8IwUbicULFlCqamfQYYMY0jt2bjdTWRZIUOkCU6tVJKGpIOlUJAfr2fNjgpVw1FJzPZbmd6V8Xp03MmUiYsGmL3vWDOPh6gxA3ZXwXViTJMADk7TeS1G6JSTq3LwD67ZoHHN7lKD5dR7NDFpumF2pIFScmizCjB0WSFD669F4gSZJm05JY9DJu1H2hEIOcr1rsnmvNHns1EuisdNqRKZC181sa3Euydb8iSQodgm3SrZOkuZstMdB9nQAYROKoTdbZVq/zfcbhZpaFXW+NCGGLzm22uv+azZsWSVLoALJx0qmTCP2dPVyVzHVfByyxDZa/wX23yetcJHEgv5Oj8aVv6UwfvhQs9Ntmq8eX7RsXSVLwgK90XwFCr3NW9Do+Ru81qOwn3TFHsYd2/0+Y7XNcbAQ4Dmu5BD9XJrtGJ9bjbHvH9x29f0onqLgWFElS8BD/0zuTgA5X3P5VqeMY6HOzBGCrUpWx+O2zDYyfgaUPZuku5/YHrcItQ5nuqe7uH56K9d3PBYokKXCoAv6rxzKcAABj06uN76D7EqEOipTfByTHDBDSbQBSrU6eEwleEELQUraM/89GrGidYLAShcn/dKr8tWytXGlBkSQFDi7EW3o3DVAESs+HAthPdF4huno2/DfeFxa/83Jg0tV4T337JUIs7A0FL46XpmKoUCRJgWNV78r/jDdO0mNdS4P21HTqAsH21DnifxhP1KEIk8DgOp3V031O8tvcz+m8LucokqTAQUHgrD5nq54gDdjR9+HXcD4whlUyhAPfGSftp6txQgxaSarz2ycqTLomXvGkt2LsiFTR3YcKRZIMA6As/hIO8HqCNIwy19nJD+UNrReMM04yM50RHYUIx8HqB1lIxyBJ9S71bmxZ06TL7z+fGAYkgZymJhsO2NTV+0xZqXIL05OugYeTC2kmCeI3OpvVsWbt14MsbFF92l/nfQhl5mq7B/WYRhBiI4vYkPV7qSB6APhGEWKdIdG7prubrc5XrsfCJ4lIN+7e1gPy3rP4XW6cTeZqvQZ1glNqFtX8SYsVrMVt2RkU41F62oQj19Nvz3t7kCElnq9KzzYRLHidhUH8NFV9+RNBovcKU+RwpjFa4XoPa21TQ7Cktb3Jr0fE1Iq8kwSYkPSs+wtgWc3bN1wBQr2FAddMEsS4ivLKOznnv0sWuod0F7PJcTfTJ2oF8Za3JfhOt61ZBhjFwgHxYCaX2Pn4f3xp9TluWdXzxX2JAnqng/zPJAC6lgSRVNv8TELw25r8Vr9zGT6RWdqvghNMHrtx34W2M14/zLdu4LfTFkwzmCIEOVhnc55oaXB/GrdGJj7U7YeePeyMA8lfxhsnnWpqajiW/FuycdOhELd0rpsXZ5I+oOR5DjAJiaI9+jAA/GbUSGUOimuP40cfqOJrVcBILokZY6rHU5rmVJl/B2Jdt1AvTthGlXmAszN13jPb2F2S5TYUx47zWxszXlLOO0lw3pd0yqy6HYG2VjRbPa9Yfc77sOefpvNS0hN+z+gVzo9OSE9zEEI9P16A7z50frp2ccUuVZ/j7SelVUH2QOLj02afQwRsTQsyudFQzCT6lhnT9NfeWtHT0TnfUF1Rh2+n5btu/C2ebLY1PZSszIqTV/TWe1y/liVGARjK89S0RJA48MesXucH/gZ32lFThkJxH61zFMuJZedwBWWJrffbfy4zqQ0/6re1ShtixZo1QU2R7VvtjS+b3A21KPLcpdPfPRcoFRwe5NfwWemufA3BTAL6zLghrdQGWzVarZ5PcLQ+MDpap5t6TQ/+q3Z3H/T2vIDmAavF6aUYZXWzG22TDAblYBwWaTefgldTpq68zjAUC8xUZ/85vk2Y6iIZ8kqSaJ4NbZmK+pCFCHxbI3C0ftPicc1CJXlxGiniNANFrBZ106bD44X70YJo4O47Y89R1i7ZWD5OiizhVqBUVMFUUQq0qMNBwvcKjv4GEGoZDpLbYTffkUXESwqpmpZrMnA4gw0Hkhyw2EL/rE6dRF2Zo+YMe1B+9xqvc/8KgNvx42+zfHsUTcSfOj9eeyXpGdm8cdQoUrcPSDglnjLiYCTSeSwyM+mBaabPUT0whZ0W5JUkBoO0j95ruIC4pthFRBD1qzjB7HE9waVwCNd0zEL6AWcPXyjELmq1u19Nlb45n4iS6ym+gD9jrrY/QPtAOi6nODC0x7QoZckByCtJgHG9eTY2BNZ63k14PyFW4k3btNcPaaUkSAY1KNZLstDcBuyC6QWzTgEKFYri7AyT12YFJp2Epw5i+rwAyQ7qBcFCD9BSs976UUfaR5JYnZayoIp2f4Nbj11ZP1AKutoFtWcYqsudUVFMEzgLp7AoXJJMftRWMnGCoss+CNGWLCkkPuj78XB/Zi3LDNFd3fqhbEMfouYnZL7u49fYZHO9VCOA74dTA0V+3wlHiQoQzIjHH4UQPwCwL1Co+iikhl5rW+p/IxO7J1liZKaiad4JZeF50Sqfxed6Ev+HC7Vegw9HM6FikTeSTJwg0waYLt9r/Kf+naPmbPWI5n9fFn2lht45PgYk65cCN2stv4llHumdgAR5U98VoiKdevJCEloGNBoUvY443aK765mcNKiIrMJAeQlBu6nMa23BTtaQeb1CFSroSg2XnttFzkkS9Xh7Gt+O0HMdigNPBuYE0kohUER+wUFsr2eDeEa9REu/uleZBgIAdK1wARNp7bnllCRkhm2qtz/M9Ob3JnPrUM8fctGmIrIP7Ky6IjSWCCAFf2EmdU5bYKsYU60cp+caIeB/6dSVM5JE/BTs9+Ij1OvxRm6hf2p2NH+Wi3YVkQuAPtMhDhfyBXxRskWZVBhTLd/BdOq4KkWeSQM5IUnNopoyc739MXx4+lJ3RfDamo5V12e9UUXkDqr4WE/aaCw521Rlv3/agmmnxfNuTIbIKikRRNceCaFr7drgyzqvCSPrJKn326dWlFeiDpJWkvnvRLD7CL0ProihxYZP175ZMaWKZhPNq0coop04pnrcTKvfdeP3a3r/mSpEKSUhLSuVfz5xgjKf6feBIfHk3+mGQc06SSQmkadbOgT5UQ0GDwkUxaxhBzJbwc7+T3x7rL4rgTb3HkPdosfid72PM8wHKGqTjVgXADMIIch2ayc8P6WsVNmZpesEwyiIOLs93WuzTpIeof7GCJzW5vVEA1wfUsXBLQ7v8my3p4j8INQbvFVS5GNYeh3ZgBfthce9YoNVQhbSXRGQeC+2NLh1WEX0R9ZJQl5rZp/jYA58KYtYeSaHYJ+rTD2spaHpP9luSxH5A5nGW3yuB7BfnzLUbRmAjl4InZ7JDXKiuAdsTe+aPa5fcolRXKZkgcr+tWFj74n5ip9URG6xpqN3PopO5GT1s6FuSxS9KKEc1d7g0Z2+IhY5WwImgzuzz3U6B/ZAnK87VEFWpk0PJQt3U8TwAinGFrflQFCMAaZP3M4FelShHo0SSmHncQ/YGh+0+J1TgEFfbu8elK/u7untvK7d2d5RDDu39aHZ2fxlrd9eb2ASbRbq9fnIFr4VLPTrgC07Wa9ybpbS0uK51GyyjxUCvuvu6f3rsjm+tHY9ixg+aLd6vpq6ZGrtOOPEa3CAPJdBy7cAAAAAtklEQVSl6U2YBkgqeULt7pqfTZOmnJMkan59Yq7rKaKwEI2geHG93/6AJKTzUKH/LctdglHynHwBxasbUR9+Pds3L/xYwEUMa1DQCjycYVpsuhxKSg9DHZUCeZNZfaZ5E38QgjWDEI3dIP6RLBZYpiiSpIi8IBpI4hF6UUCQek/D7sDYdGB8FwFsMp7fDgSrZkCRVISBcgGj8NSDn7tQhurAsqsEE1+ByshT9e1AW/DtqM9MzvH/uFCgxBI9EGYAAAAASUVORK5CYII= + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.6.3 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.6.3 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.1 + version: 1.0.2 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml new file mode 100644 index 0000000..c03bcd1 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml @@ -0,0 +1,329 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: "[\n {\n \"apiVersion\": \"charts.helm.k8s.io/v1alpha1\",\n\ + \ \"kind\": \"OpenshiftArtifactoryHa\",\n \"metadata\": {\n \"name\"\ + : \"openshiftartifactoryha\"\n },\n \"spec\": {\n \"artifactory-ha\"\ + : {\n \"artifactory\": {\n \"image\": {\n \"repository\"\ + : \"registry.connect.redhat.com/jfrog/artifactory-pro\",\n \"version\"\ + : \"7.6.3\"\n },\n \"joinKey\": \"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\"\ + ,\n \"masterKey\": \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"\ + ,\n \"node\": {\n \"replicaCount\": 2,\n \"waitForPrimaryStartup\"\ + : {\n \"enabled\": false\n }\n }\n },\n\ + \ \"database\": {\n \"driver\": \"OVERRIDE\",\n \"\ + password\": \"OVERRIDE\",\n \"type\": \"OVERRIDE\",\n \"url\"\ + : \"OVERRIDE\",\n \"user\": \"OVERRIDE\"\n },\n \"initContainerImage\"\ + : \"registry.redhat.io/ubi8-minimal\",\n \"nginx\": {\n \"http\"\ + : {\n \"externalPort\": 80,\n \"internalPort\": 8080\n\ + \ },\n \"https\": {\n \"externalPort\": 443,\n\ + \ \"internalPort\": 8443\n },\n \"image\": {\n\ + \ \"repository\": \"registry.redhat.io/rhel8/nginx-116\",\n \ + \ \"version\": \"latest\"\n },\n \"service\": {\n \ + \ \"ssloffload\": false\n },\n \"tlsSecretName\"\ + : \"OVERRIDE\"\n },\n \"postgresql\": {\n \"enabled\"\ + : false\n },\n \"waitForDatabase\": false\n }\n }\n }\n\ + ]" + capabilities: Basic Install + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.6.3 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.0.2 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: '## Overview + + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift + cluster. + + + ## Usage + + + An external DB is required. The operator will not deploy a DB but will require + you to specify the configuration values to connect to it. + + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + + Go to the Installed Operators. + + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + + Open the Operator and click on the provided API: Artifactory HA. + + + Click Create New Instance and provide the following parameters for your DB configuration: + + + ``` + + DATABASE_TYPE + + DATABASE_DRIVER + + DATABASE_URL + + DATABASE_USER + + DATABASE_PASSWORD + + ``` + + + In addition to use TLS you will need to first create a k8s tls secret to store + your .crt and .key file into. + + + Then supply the value of this k8s secret into the TLS_SECRET field. + + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to + it on the external IP exposed by the load balancer. + + ' + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.6.3 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.6.3 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.1 + version: 1.0.2 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/metadata/annotations.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.2/metadata/annotations.yaml new file mode 100644 index 0000000..43bba26 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.2/metadata/annotations.yaml @@ -0,0 +1,7 @@ +annotations: + operators.operatorframework.io.bundle.channel.default.v1: alpha + operators.operatorframework.io.bundle.channels.v1: alpha + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: openshiftartifactoryha-operator diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.2/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.2/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml new file mode 100644 index 0000000..5d64504 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml @@ -0,0 +1,329 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: "[\n {\n \"apiVersion\": \"charts.helm.k8s.io/v1alpha1\",\n\ + \ \"kind\": \"OpenshiftArtifactoryHa\",\n \"metadata\": {\n \"name\"\ + : \"openshiftartifactoryha\"\n },\n \"spec\": {\n \"artifactory-ha\"\ + : {\n \"artifactory\": {\n \"image\": {\n \"repository\"\ + : \"registry.connect.redhat.com/jfrog/artifactory-pro\",\n \"version\"\ + : \"7.7.3\"\n },\n \"joinKey\": \"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\"\ + ,\n \"masterKey\": \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"\ + ,\n \"node\": {\n \"replicaCount\": 2,\n \"waitForPrimaryStartup\"\ + : {\n \"enabled\": false\n }\n }\n },\n\ + \ \"database\": {\n \"driver\": \"OVERRIDE\",\n \"\ + password\": \"OVERRIDE\",\n \"type\": \"OVERRIDE\",\n \"url\"\ + : \"OVERRIDE\",\n \"user\": \"OVERRIDE\"\n },\n \"initContainerImage\"\ + : \"registry.redhat.io/ubi8-minimal\",\n \"nginx\": {\n \"http\"\ + : {\n \"externalPort\": 80,\n \"internalPort\": 8080\n\ + \ },\n \"https\": {\n \"externalPort\": 443,\n\ + \ \"internalPort\": 8443\n },\n \"image\": {\n\ + \ \"repository\": \"registry.redhat.io/rhel8/nginx-116\",\n \ + \ \"version\": \"latest\"\n },\n \"service\": {\n \ + \ \"ssloffload\": false\n },\n \"tlsSecretName\"\ + : \"OVERRIDE\"\n },\n \"postgresql\": {\n \"enabled\"\ + : false\n },\n \"waitForDatabase\": false\n }\n }\n }\n\ + ]" + capabilities: Basic Install + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.7.3 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.0.3 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: '## Overview + + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift + cluster. + + + ## Usage + + + An external DB is required. The operator will not deploy a DB but will require + you to specify the configuration values to connect to it. + + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + + Go to the Installed Operators. + + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + + Open the Operator and click on the provided API: Artifactory HA. + + + Click Create New Instance and provide the following parameters for your DB configuration: + + + ``` + + DATABASE_TYPE + + DATABASE_DRIVER + + DATABASE_URL + + DATABASE_USER + + DATABASE_PASSWORD + + ``` + + + In addition to use TLS you will need to first create a k8s tls secret to store + your .crt and .key file into. + + + Then supply the value of this k8s secret into the TLS_SECRET field. + + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to + it on the external IP exposed by the load balancer. + + ' + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: iVBORw0KGgoAAAANSUhEUgAAAMkAAADCCAYAAADjAebGAAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAACAASURBVHic7V0HfBzF1Z83u3un5iLJGGzAdoyDgWDAgIxtSdd0xZiaxEASWiDARw9gei8hQCghhN5CJ4BDMHGMdbqiU7ExpgZCb4ZgTLFsg2Wr3O18792d7JN0ZfeaTvb9f7/T3u3N7oz25j/z3swrshCCEfg1nJvqG44F4HWMCQlPrwQmWgKt3oB6laqyIorYRiHTnzBBTI6ngLGjIqeBAUSOZpNjpdXrvDLg8DyuqqoYuqYWUcTQIEwSU73jtC0EGYSJjMOjZq/jQL6AH6POU0N5bF8RGaDe49pHkthM/G27u4W6eKmt6ZuhbtNwhIwdXzJX2y+hWSMFfmWqtv8Xj3/IQ7uKyBA4+58uS3BX32cj8A6LxzWz2d740VC2azhCrhtl3QcJsqOWwiiEzZ+1ZNYdy+Ys+yHXDUsEi98+Gxi/HlszDT/2oO60Aph6p9/W1DRUbSpIcDhnwJkq4OIsPJ49FM0pFNQ8UKNUTKk6hgl2NHZo7PusmwnxzKqelZd8MOeD7njXyAByhY46RpcYR/4Sj3/LSot1YrbPsb0RpCX4dkTfOdSdDsUecbDJ63S1NLg9Q9GuAsXYOOd2zXsrCgjYR+oqplQ+xOg5xApOAOeOM0wche9+F+86uWNd72tjqpW1+L5SS0VCCAsbIpIYGduXxRAkBpxzQJGRFUmyBV/ia1S/MwAdQ9OUoYfF7/qFxOEZFtXDBwIATqh1225od/o+Hvid/PY83wazx3UEl9jf8fOYVJXhzeKNUHlBD4j/GBgLsjj/KA4M+wxBkwoWgrHX8Jns2e+cUP89VO0ZSuy70DZ61EiFZpC4BIkCFFk6AI+DSUJ/AvZGr7nRvBdXjH9DFriSVym+zKC9GaHd6vnK6nNdhoy4kQ1caRCsqJDGAAmxAIAfv/kzY6+0tIaeYbahbNXQYNRI+Qg8jE5VTgj4Pt75zcwKuAJfo8xyoNlrPxP73014qjTefdQQPJp2a7MAv63xT1av8yVUTC/Ej7/Gl4Sv7pAQFw9luwoNAVvTIqvfebpgMA9//f91bgzOV6/yBYe6XUMD2FdDoVWre1c2x/ui3/QT3Sz8a73f7paF9CiO1QfEfi8EuwFnnfa025ol+Bvcb+PhWLPPcQMwOIKB+lJLg+eVoW5XocFvdd+Dh3uGuh0FgGRiVh/OT7i6Fe9kq9XzAb/GVmcyKSehTHMkztUGlbEHA7bGRzJpabaBo+W7eLhmqNtRRKFDvJtsHxBnhvuarY1PJ/o+IcOiU/O90VcRRQxbbOgMPl5RrvyekfVIf3QIIe5oaQ1ez6yJr9cyDRVRxLDGioN939csqtmjvLxqDgh1Jyagi4F47/uO1cvfnvd2T6rFjIxJYvU5rAz4efiW9JdynLw+wEb8vadjw1/b57VvyvT+abRnlgB+C74tYaq4trnBvTDfbSgUYMcoKy+tPETt7nK3zG1ZO9TtGUqsOHjFRjw8n861GZHE4nedA8BvY/0EPpiOn6YbqiuOq3XbDo+3OZMrWNyWnUExvgR9m2gcnrd4nUciUf6RrzYUEirKKp9iAIdJpSXN+DGJQFFEMqRNkmiH/BNLrBH9zCArfvMS876BOYHv0q1HD0Ax0LJw7C4zBw4PmBvNS2mJOx9tKBRYmiw/Adl4WOQTWCwe10+Lxo3pIW2SgCLTDreSvBDbiRuMZC5yXrr16AMcFudkJZKZxK+j89OGwgBwQ33sZ8HVvfGw1ZIExWz8f/kswVinYGpTwNb0YbbunTZJenrV9wyKRPsqyW3sAU6Y/Kjt0k+P93WlW5cWYB0lEycoO8dvAvwaH+KDfluTP5dtKCgA2z/2IwcYN1RNySXqmmx7KrJ8Dwt71EY6IzCuWn3O+wKtwbOzsYGaNklI17D6nY9gk05IUXT0xJ3kI/H4WLp1aUF5+XcqY+MTkRbwId6DRNon12QtGACri/2ID2b7oWpKrmD2Og9SZOU5Ntg6hOPIeJq5XtmA7y/MtJ6MFPeeNZ1nGKrKx2KDDkpakMP5fAF/MpdejbSUZ/W7yClszwRFpk7cWbkSj5fmqg2FAtQDt+PGkr1jz4FGn6HhAvK6lCWIR5AtAHZmzaKaq6MrW2kjI5LQEi+/xna42STfgC2azxKLXtPMlfb/w+PdWu9t8bsOZUJEXIoBnmy2Ni5OdY0Q6i0A/JGEBYBdYG5qWBhweJdrbcdwBFeMh9Ch/1kxZUgakwNQTAazyX4//qCJCRJBqaKMIKv1zzOpL+N9kqjMdwF26mUQ8TMZGbcghz9Y3JZ/NTubU1oRW/zOi3HkuyEajYLwa7PP8QtUxl5Idl2zrelRi8+1K16WaLaQuSw9Nr1p+r5vON7oTNWOYQsOxww+CT/Nf0NyA7PJQdbNNRqKdvR+8eNXmdaXtR13HOmfx478DgdOexLxRJ5KkI1PT1swzRbe5UyAaQtsFWOqlasHnAa8742c84WpIrY02xovQ7GL9mZuZ3EJC7uOlseSqc2xKf6lYYmIIqtY4ny1vbnRPG64L4XXLqgtNVRVXJs6JANB3LLi5BW9mdaZVbMUWnbDUXrmKGm7hwHgyEEFgNWOqR53J747JdE9FCXcpnhLy1NNbgeJDCmXMf3Wxr+hXL6IG42otAHVNZAsx+DM147E3urs0pAgpHfF7ULcoNCK17/y26LswlBdfiYedkpVTgjxfEtr8OZsbKFm3XaLxBgc8X9l8trfQJHpejZINoaTUSRaiSP+9fGuf/0w3zqLz/kEkuy4gd+pIDQr/tENzAv2XWi7ftQI5TzsNrTKYdzcCsbuMHmd77c0uJu13rPQYfY6XZzDEYlL8BlsGJOkrqlurCKXp1p4oXiLNyNBLsuW/0xODByjItGNOFr/Bzvjk2yAVxjqDNfhd+txJL8z3vW9HZ2nGqrKO7EgyZ5l+PqOCXYLduhP9baFSIeHK1EUfAFFtpfYlgAJisThHyiemNscvnf03rfQQDvsXDamcogjr9Mr8tGeXAAJcitL5mEo2PKgys5ptTe+nE0PzJxaAdOKFHbOAzjAv0gXiPmKVPI7rH5nt9/qfmDgdVHDyNP5NbazZ83qHrlszrK1mUaPRFHwdavPcThqNy1sy/9dpcjyEovHZR3OJhv4jPfgkpH811PshcB+FHFmOAapw//xcBzk4ixIhPERU8XlAYfnuVxEGc25qTzpKabFpplSacmz+CPZY75CnsB9OKNIiXSD6HTZwbIUidhva1qGxMTZKzYmFewIEgvgjOIcbjNK/Yv1I6SKsrOx85AIUqbhEm5g7GA8PpTjpmUV0Vny4ThfdQomru78eO1fwgp6jiJW58WfhMy0cVY40Fwv30E7oTFf0Yxyt8XvHN1sdd+Yj7Zs6AxeX1GuUHyl2NBE41DhbcWZ5sh8BLnDZyEfcADbQZFge8alEahHGCLfhIKqynsAxMZQKLRRVVmXJCk9QnQGQyEDQhoJwElp3RUl73p5RNlcfK8nbhqZbNCq3rAhSWS100ArpgNCXgkPsuKkNqtnZa7tm/PmdBWdFU7HmeNDJAbJln0KPdCeiNXnHB/o8Jyb61jD5IBj9btITzp1wFejURR7yepz/fH7jlV/SLZMrQcUEMzcZKcl8XoBrBb/2z3NJmU3/GwYXFpiUvipYFeWY9c7ylEeH1AUNK2BDgYwE4oue+EM/5/0bpA/0GBiMikUK2t6zOkeJtRLAq3e2/OV7SDvnokoWt2ORPkCf+InWKxJAcBZ5mrHJBQhjm49tPXHnDZCFQ8zDgNJQpCwE10xpnr8L3BWuQBnlZfSuX2tu7bKIJXPQVK4zF6HA0+FjQvT7NbZBu05Xc4odkEBg2JUm+rtj+IzmxtzejUOofMC9qZ2PYq5xes8Cv/pM1hYehBPBdZ4btMzGA+J+y5tPGInbMCf60XWPyDeIXJF2Ssmd8O8Fqf3v7mqHxW8V7Hzrsa3OyQo8jNs22KccV5DLfDBTZt6X1g+17c60f1IJKislPfnnFnwR3UalAraDZYLhBTxMM/scZkD9sZApjey+FyX4aS2d6Ch6ahsKc2RIO6OR/Dtb7acFe+K3p45AQ0WG7FAHfRkJMj9W87APuZqO1kfJNyrG4gh83EnJbreb6+TmdTIYh30ge0mKfIr+M9dHGjx3KVlSiVbntmzZ49pc7R9q6Vu+jGRAMvw7c9TFN0PO/p+ZaXK3diej4SA9/EckaULO0YZ6gU4Q8AuY6oVeuiSlroLBMAl9rBpsWn/dN16wyN9leM2fA7hANxmT8Nf8dCaacNoR91cZafIJbG+QS+HNnXN1dvWqPvEHwd/AyfXe1wPh5eKNWBIA0FQ6KJav73WwCQSa6bFfFWG/8gd5nrH0Ra//bxmq2dponvU+e0TsdyTSK59rV5nrb/B/YaWuoVg7+EPnIokfaCVOLIJ6x9wOl29oDAwWSoteXHfhbZDontJmmHxuHbHkf4+fLvZsUswTiuXGZEESVtpqK5YGHtfvPOyru4f5yybqz+TwYQJnILSxQ3diyqfEw+FTxIChS7FH8o0aqRMeyn9fCAoOB4wqR11GB/qEfd3MrZkRYN7PX1F5uBgNP6fwqSLsVx5pDzcjH/tgyqJD02zztYNqBs1QlmGA9EZOBD5UpXG0XemxMVpIAGJQf36Do4XWqIkJgQRTyotJYLEGGKKN9b/EJz7+mHppfro7la/KDFKcWNHo76o+fcfcpIQaCSrWVTjKi+v+ifJ9AO/x3M2VLRtFfi/oZhEBnqcG0to55wPKNhAbpwoyqUc0YCR/MxTFdv6geItDkReq8/1Pj4QIsq72OG/xffdQqhlHGBnLLQXnjfJEpuQZPlh70RfpILVbz8EJIkWcmJt7D7DBhw4cJajCDBlZaMPxV9ufEjA620OTyCRLrRsju9/Fp/jVABOLhpbVhMFe39NR+8TWttXECQhkGPM1CVTDx1vmPgMRfhIUIx+ofHJ7iOAX42HhpQVAmynu5FbM8JkYbtt+UiPSNcgsvMBi207JFvgGIjwEm+9cg2ARHGcYytbJ0LsoKX2/pYB5GhVUV5Fs80E+iwB2avZV6DIfUR4vyQOmm1ND9U12doVST5FAExFgrzTxdQ/UTYFre0sGJIQKBYrPrh5JpPyRJIcjklBsw7OJgemWr5FJXyv4a1SFB5KSpQ5eHhES9lZS2w7mU3KU6yf/hFGkAn1yGZ703uxJ8nMXzaU0G86YEUSalDk9tW6a2vane1x86+0OXy04JJ2MJKCIgmBNh2RKMfgA6Qp9Fdp3QT4zXwBdydaC5/eNL18tDy2GIcqy+AgKCLNI6nKWbzOX5YYFTJFGqRUC8HOaR5g9RBdEqYN4ERL9pMNcgXNRhn7s8dDwZGEECXKsUgU+pgOUX5mrrafjse/xvtytDRmoFlKEVkB2C1+19xErtazG22TjAblZuAwL/714vZmm/uugWfxtyTbtOSDGrBfsG2JJIQ+opjqZQMA/EL/HeA6nKIXDPTEoyVjBaRiJPocASXYp80+x+9a7d5/kEJNZjm1bsd+EmcnI0HIR6gk3nURJynP/IFUsPjtJmDSVRqqLs+89fFRsCQhEFGmLZj26zFV455PGZFlMEZxQ8lf2ADzC5lJtPuaMutREWljJAf+nNnr+M7qd63GI0VpqUp6hWDtvR2dxwzcOK5ZZBtTUabQHpiWjdpFGbQ5KQqaJAQyNJz8qG3exJ2VJfiwzDovPwJHtXkBW9OCvhNCqPcA8EHLzEVkHdtFX0lBaeo6hThoxYDg6lE9hGK1pXTVxbu0rf8heEG6DU2FgicJgQLK1Xidh1UA84cDcusAjmp31TXVtfSZrFDEFavPuTDJMvPWAlri/CdTBWUkfk8IWCe4OiJiai/2wN65O1kko3i0B0sgAuUB/u7uHw5fMWfwZqGp2k7u3QcmuZaWml/G/+/pQJtnQS4tgocFSQi00z7b5zjQyKANZxQ9MaTIL/oRlI0P6tt06gH1DAOTaHe/OgdN7cEOuEoA+wE74EbasQTayBJkih9encl1h9xErs7rf+y9LYG5yev4erHvw9QlU41j5UnTJYnNBCHqkDi0x5QHcVQ8sKp75VnxUrBZfI6jkcwXDb6EfYzP894QhF5otXo+2Xw+9a5YRhg2JCGQ26nF45oLEiNbrpTptGNACVPJG/HP9IFMYSx+1ynYeTNNyUCsexWY8KlCLBe0A9zm+V+yUS1iTqPszphEo/l0AOyYDPBzNizpRXNIZb/TEwsg2klfjr5upw2+ujp5JufsYGDhiDc/ybxd/bAORd4zm21NT8b70up11gDnA126V+GDvqy1temxfPmQxGJYkYRAvuj1HtchshQ2oUgVwS8GcAPqJwHydQ/fx9r4PBLlIeyZv9PbBiTGf5AYD27cFHxu0A5zilEtGsWFXi1958IKaqnsxDmHxAt66Z3haPa6ItDquSXTThR1jmujF86+l9Q3WmdwWT6JRczWtbgIJ8Pfe1jo/HabJ27AOEoPARKQAr75dxWC3b+mo3d+eId8iNJrDzuSEMjE2eJ1ngAcyKRa6whs5ABPT1tg26/PJGF98Nvfj5bHUiwqTXZHSA43Y6Hrm62eltSltYO8JfFAu89P1TxQo5ROrmyQOK3KhZe+RyW/WrwbCoaOa3F4X8t2J4qKpxQSdrlpselCqcR4AkqPp+kUd6mNb2Bvn58sqn+t2zbFoCikP/VFsyHHu+ObbY3/TLP5WcOwJAmhucH9jMXn3A0ArtZ+Few6plr5G46QR1IHoBhhdX77YQqTyLckSWoC8YYagnOz4aSUCtGIg0voVbOo5syK0sp5OMPQSE46VOyAsBpH2Vu+7ll5Z6LUytlE1JfjNn4Nv72+vuFQHHB+T8mBUlz2jirU61tbvc8mm+EsfvsMJAjZZPXtqK8O9QbntDi9b2Wp+Rlh2JKE0GL3XGv2OmgW0OoXQpiH+gmZMNxAH8gwzuRucEiK3MwG6zkbsSNe2tLhuTPXvvfxEI2GTsugj6GIOR5FTMpLWRFSxWebPl27PBshPPUi2tkpJvMLZHCICv8xEBEyaXaRcED5jJE1sRDPB+ze5vBslGCGI/3HbJLPAiaRY1TfgsY3SCwzEiRrSXgyxbAmCf0A9S/WHy+PKJ2Ko9oe2q+EP1h9jjf7jCDJVRjlYRNI4eiGu0QLvSpC7DeFEo8LRcxVjJZ0+5DjFR0twDa9iYc3ExZIMHfQLrypyX6o2aTQQLV7zFedoWDwIBQdC4YghGFNEgIFjcAOPg87+Aqm3TSBM+BP4nUH9JEAj+/VeJ37lQOE3T2/7vn8vHyIMdsSwnHCRpQdj7M/xfOdOqiAKk4J61YFhmFPEgJ1cIvPcUbS3CSDUYnE+vdMn2PWy7amNXQi6vV4Rk4auQ3D7HPsCoyfIY8o+y1LlJqDsSf8De6n8tgszdgqSEII5ybxu6woHx+v47KflgL/59QlUx3FWSP7QJ1lf4mLSzjww1lyN9B1Gzp7z81Xu/RiqyEJYX3w2zNGy2MpcvruKQtvQf04w8SHUU4+JhdxZLdFULginKUvlSVyxU69Qi+YuCm6DF6QGDYkodhWVVWSBUelyp7eDf+O54VGS7o4tR+DZWj3OHn67BgAwG/MHgdtcOXEHyEfCK9+cXaqAHYYROR9yuTlU4PBW/KV/s7kddolDldyaZC3YTKs7+7+UXOawKFAQZMkvBNdLv8cu/GhY6qVGajYXRPoaLov2XIs7ahb/M5rgcF1uioDSmnn/LbZ6r4l44bnEWR7Nc448RJZAiJ4acy4TblY5nFZ/qXV73qoq/uH+cviGBJmirC1bqX9l4LDfCTIDL3XC8GeyUW7somCIwntOJftMvownA2OryhXKJ+Ggk/y3109wf0o+oWWe7S0BG80mxTyP5mpp24k1p+wQ62hTFnptD3fQLGmdrxxEtk5JRMviTcnlRhH2nCkP76lwd2WjbopoY4sl51ornL8H9YwKV3DM6HmNnV5NlAwJKFIG6Wl8pkVU6pod7kvz8ZGnD3OCTg89+jRF8j+CMWu45FotIavw74r3KEesHidG2lHX8d1eQWJntVVyvUo1tBSqtaQJpNxpA/gIHA/KslXpKMDUDifivKqg3D0P0aRyynogyEzs0zxVavTszRXKROyhSEnicVt2ZkpxsvKShValYo1I/8ACXKEv8H9djoPkfKiWH2uP+CPGDftXBJIwOFx7EwGnFEe119zbmH1Oo9E0ZOC8E1I43Ii1Kk4Qx9t9TsfVYOhJ1qX+lckMhmhWb1icuWeDEQ9A25HgtAWZlnWoswI9uJwWCwZMpLsu9A2etRI+SpQjJSvxDjg6yUoQx+Vqay64ZOOm3FmokAS01IW7g9S+h+z+pxHdfcGz1zq8n2eSTuyASTHNMbhL/jKRpSXEThpnon6yplmk2O9xe+i4ORfAvmiYJ/AXluF7yfgs6OwroacxcMHNa2o/fnGkJAER+ljR40Mj4aD0peRaXRLa+8Z6lXLMk4KSbZN9R7XKbLE2lk64RoBDjIaFCsq9DevD35381DkfqcIIwZFvgJnNwqikIvfaxRSYHbsiTyFIwsGf+xuzk9VmSGvJKHVqvIy+b6E0U8oa6q96aJsTsFkVo+ixd00cqZ5izJU6K8aLW93ktnnunrjJx2P5sOwMBp+5yJ8ncjiJvwZ3sAf+PWc56HJEvJGElSk90VZ+HkWm2YhBvjQbm22NV6YCyUu+OOmS+WKssNxiNQQVCARYEcO7AEUQS5H0t20LvjdY7mYWUxepwXrOQvJQT74wymdgy4AEwkzBcQDJUbatMmo6o2Anw3khSQo8zo5cCJIXANEJMiTLQ1NF+RqlSNsBOl3nYFixMIs3A5JDnePlsfeYPG5HmUQwrb7VmQy+9U12XaTZflXOGP9SuIw2PBvK4RQtaU96ANtHuPzvg91s7cCbcH7s5WjXQtyThKz1+niHKhzDlTOIxBs+Rdf9p6kt5PRJpYeH49ma+OLSJRn0o0xHAejIglspLPNXsdKVPIX4//SJtSeZS1LW1YmWjGihEOzZlkmy7K0PzBOtmY2RVZ0evoNfwS5qoskhE1dvVeVlSofmE3KKSZ3w/H5csrKKUnwH9lbUuTnWCKCMLa2u7f3VxQySOs9w74IHsfZdSOtzfhR10MKBjvPVuRyWsbUE0RCCyaGswoDOw24kZlNjh4UyT7HGacDRwH634KCAeo2bDv8bmc2dCF8CgWrEkWBTwaKJ4DP9Q58rpeHs6H5XNcHWnv/mOtZJWckiW48kQ96wpi7OHecp2d5ddaSWSNx1KYoG+NwFPmL3jZR7C2Lz3EOANecmyJN0LJpNCsWxPwtIor2dC/sYeq9BiZRbGDayLzGZFIaDlhsO0pPyge9yBlJKsorL2FJzCVQtmpptTc9qlUPodWeEuNIiqTxM7xYS2zYuKBQNla/i/ZODk73HkVkBvztdSntsaBwUPj7UcQbCuBBg48JRbDlKLXMzVUy2pyQJGKYqCTNBxEKMc1LvSavc7LRoFCkjfAus8rU1zNpX1d372klRoUsVVNEIikiFxBCTZl6Lvn17HXUB/ePOTUBxa8AKvUOrTkz9SAnJCkvV45hSWM0ieZWu1uT4kaGdKhH0EPdbIYBIDLKd0iGkmaf6xwObFgYMm5l+LLV7k3L1KgPkd9/kABbzTg01rpts9udvo8zaeBA5IQkwMRByaVw0OQ/QLZD5VOqSPHvt7eiqjzjzbWArfERi89pBQjvZBeRJ+As8FzGm8UCjAm613YGRV44vWn6jGzuYeVIJ4H9kny5oWfNBk1h8it2qSK9xjTwPAdBpMnY5Lu3o/NUQ3XFz/BtsvYWkT2oIQjdn+lNBBMTIeEgDHuMlre7Ed+cpeVepOumWjzKOknClqNTqpIFXG5rHxBmPx7IOhgU48XxvsMHVIuHuLFk9YDaYW40H8KVkqXkE5Hp/YpIiWdbrZ4PMrkBbQGYPY7ZyUvBaajI36tFkceZ51azz/E4ZRtIVCZXq1sJZS0hhCZdBBQDKf7xfUEAfjFtwbRzKHdJes3bAsqEhXKsw6AoFJ0xaWbfIjLC+q7u3oxziJg9DXUazIskLkvkqZkyKAgAexcYf97qc5zvtzXdFq9M1klCxn/RXOtxw4biVJlyJIkmcDk6SZHtq6t2OBaPD6XZzH4gRQ+JYo7Goo1rW1ZERiAl5DitnqXJIBg/X8ueE+qa82oW1ZwWjYKZ+H5CvI9lUTjht1r9zkq/1X3FwDK5mklotogbelTLylTtaAf5fyTNkgTAr521ZNZz2fKPJqIcsNg2s6xUfh7vPisb9ywijF5VqCeiOPNi6qLJYfa4GrjEDtVYvKy8fBS5bydfbgYRk1MTLscZZe3AGSUnJBFC/Qd24vgkEZBSH5FATNWwRz2+xDiSMrUem0YT44J2bacumWodb5x4C9ZPQeqKG+WZ4dNgiB3dam/Sbac1EGQFbFAqdEkOoPLdWCqSMNbfJAr4zRav85PmBvdmY9ickOTrni8WYEe7iczLB34nQKT0ORcAIzT2zmOQ+W8kkiXTQTRI3Vlmr3MRB7i3qNCnBRRxxG0bOtfekErc0YLIYlAlxRzQJwoDVKQqIkJSKfR3SODA4cF6j2tFNP5ybkhCHc3ic1yGot4jg1sFSVIcRMCBrddcGTLf6nWu8ze4H9bVyBQINLgbaxfU7mGoqriAwg3hqZQPvAjK0xhObnRTtmypwntlu1Q+QTni9V5LKflSFuLquDhOq2Nkid2Lx7BolzPbrRa79zGzx37EwNTSSJzdUl6sivfDmQa1gWPZByw+V2WzrfHWNJqaENGl6mvNS8z3cKPxPGz96SxxLNttGR8IJIe6qeuhaB6TrICiwoyZEjaSTcvOTqV+lAIoLSTy3zkEpRQrJR7KGUloVxXlyOMMSvmyLRaxjOidUikOrPW8a652fMPi+MAnAP6v7BaLz7lH58a1Z2Vjiu/XnkgKt0vqX6z/o1xeeizWRmT5WTbrxdCg7wAAIABJREFUGIZAUUQ8iwroswG79+VsRz2h1HDV1QqlFt8rzVt0btq09hUN5RLGZhPAaZ8udyQhkDfZ7Eaby2gI70FEbK+A1VII/mT+zeRMZfU7cQSBc/TUh7PUiRXlVTNQnjw2mjsjq4i2mUxq7iZ3ZGTmsVjrL/HzztmuqwARQha8xgTzhFT2r/b2plc2O5Zl2aPU7HP9lkvsDpbEzUIDnk81WFI/lEeUJQzJirKMnTa1c+6ZSFv+WFEdKMbF+HFPfJVIFSUUCOLRZNd1dQdvLTEq8cINpcKeKE+SQ86NPR0bbtCyu58OoglKX+ecn1fvaZiOhDlIoNwMkZFpawjc0C3IqY28LZnaGgxubOkXf1m3hpAalibLT0Ay/JUPENHTgBrqDd6UqhBKBbQCm6x/caYYD8qLj3uzs/nLGq+zrgJ1B/x4BI74tLyalCS08YQd/Y/kWJNGlQpedwUq3cfiiH9Jq937TK6CoEXv+3r0dd30punlI/h2NZyzmcDgAOxk+2BbaFWmkJeT1+E/8S428D9hYrDQ6193f/lWvtJRhEf0irILQDaez/RF3IwPIe7S5FvC4bRURfCZHJC3aCnRBDlHWr3OU7Bxt1JwiGZrozvZNd93rLpxTPW4OWlv7gGbhFr90yav4wKs75qWhqZ/5TpiYNT6tDn6CmOmz1GNv/weKuNTeWQPiHzaJ7HIkmZlLtsTBZnvrMbe84UQ7Aus/3N8CJ9xpn6ysSv0Xi69+pIhrJhXy6ehyEOrh0k3j3Xgv993BC9NVcjit9uASRpiRYspeQ9O529w34/i10tMMfyOL+DeZMEcyDar1m8/wsAk8mRLJ6xnGDga7IuHhWav4y2cWW7p6Fj9bDbsvrQimkmrNfrqh9oFtaVihHF7hcP2IMvVQqhVAHw0/jgVqDmWYuPLcTZSAMIiXMzvJYjsNNJ34ZtuEIDyt7oBr1mngugQeBRc/U7t3fTdsjnL1hZSONHZPsf2BoDTxlQrFAtNb876ZPhOhNjP+1KQJwIF4zCbHCnFsQhg1JBEcCTxCw9XU2PZvORlyV2z3m93ykwiz8SUeywpsDcH/viY6vE3WXyuB4MQejidgATZRFRn+jz6yg0KJCC1CUVuicMpRuBHMv26Zip0qEKdE7A3pUwEa6p3kJi1f6pyUfQMacDsZLm9Y0Hm1eEHDNCII2s2wu+Mx5H5SoVJFGjOh53o8WDnpn8Ol4iCwwl1fvtERUhkrHosEiT1HllaEF/1BoNz2hy+d1KVxAF3qgySxlkk7I//zZBHldeKlgb3p7Xu2gMMSsXf8aMjS7fl4Z1czuwoF99r8TlfwsfyvNrVvTibm2LbGmiPAyRxuGAwDweiGpbYQypjUFAJ0dM9r80V+DpV2YgOpJCnq9YszVTBO8OGJARagkQ95kBzleMifOxXMx0p3zSgNBKjGH4hlZYGrT4Xhb1ZrDLV09rqfVPrrLctgsJHlZZWmjiAA9kwFyS2G8slMyIIoVZ2U+cnHVdric0cdb+g3XtdGQZUIXK7mZgLRBX9P9Z7XItlSdyPP0ZNDqqR8Rc249HMcZpBJW+N1e9qxVErEAqxtq7POt7KR9DsQoVpsakSjCUzUKOsw4+WivIq+g2yrWMkwztMqKc025qWMVvqwmFvRq/jQabfvGXNpk/XeocdSfpAO+o4OswyVTtOxhGL9lLG5rA6WoE5HOs5XJYYq5hS1YWkeRNHsleQOG+IYPCNtT98+14+V8zyhRqvc1Q5V/dmTNqXCTEd54cZONOSvdNQ7PusE0xcv2bN13dofdbhGcRrvwff/lZ3bYLdT4PhsCUJITqr3DtryaynSgwjz8efjcxYMjFl0AoKUzoTlf+Z4Z6iyGxM9fheq9/5Efadd5E8H4IQnwiufhwKSR+3O5u+LqQl2IGYtmCaoapqh0kAfAoIdYpgfBf838jebo8KDjuTh0+4YNZSXOnGJnym93Ru7L1BTxq7yY/aSswTHJST8Yg06lyv9nT9md4Ma5L0IeqdeGXNItsd5eXyOTja0RJfVZ6boVCkDjzuEe5L5BHKJEYzD071GyOxgckoEGhTbzWtmgghVjOVf43KzppQqHddryyvfa3N82M29B8yMZd2GT1SCoYqFYVXgYBqclMQnI2HsOEo7IDt2IF8fpDgtAcV8aoAXkimAT8gOR4MqezWPt8OraC9mAkTwqk+UgSNSAChXhk1bN06SNKH6Chz+fSm6TeM5tsdj+rEGdGOO9Qo6yNQ5GNEqSXXauqa5M0gS0pYqEf9R6AoR7v2P+J0H94sxMK0YdgDEV9xFfAXFNSb8TK6A55TQIRj45JJB71GokgYCcqt8L4qw6/+BCggOvTHJ/gv3r1BwENRSw1dQH11ppFzWsVKLx+NYN5Aq/fOPn1nqyJJH6KmIXejwnaP2dNgwQ51UjS71nCI5k49tyL8gv4ntxz7rxxBbIHhC9IxXkRyPIwdtDGd2ZT0D1OV42KcvSlWdHorn4J93hvq/E1s/VslSfoQ1QNop95PiUxHjFDmcRBHYY+i5JxbbRapYQTsiGIpDmLPiO6uZ/rEGy0rVgNBm4TmajuFrc0kiMd3QmVzKftA7MmtmiSxiKYRo2XABym+sCSVH8qBUco1MvoeDjPM1gKcMUQLEmNhd3fvC5mGGZq6ZKpxvGHSRTJIFO0zk99xdW+w19Hm8L038ItthiSxiI4UYcKQaftIaYyVA7hQsbWj2JIj04ltGIJ9LIB5hVCXqBu6vNky/zH7HIcjQW7O2FRJsPdFqBtnkObP4n29TZIkFlH9ZVH0xWr99h1lAVZgvB71aloZIWVbf3rrbRco4oqPRNhZC1pDEPK32bJrRGr1OVCk4jdw4OYs3O6Frp4fjk8Wv22bJ8lAkNUxHp6IvsK7y7y0tAZ/+Bk409QgcfZhEXfd4a8qZwerkBVv4vNZgY/klc7O3lf07GXogcVvnwFMuoIBz0YCpk6migsDDs89qfawiiRJgaihozv6CoOIw4wle3MOe+K4uTuAwNkGKKuX1sAVwxFrkAjvCQHv4vDwHvard6C3+63NynaOQO4U9fUNcwH4uUiQNFT6uHipu6f39HA0eQ1raEWSpIEocZpZjPchgXI6yvLIXTlXpwDAJGAwUUScxXaCSDBuMm8p1BmI/Ndpw44U6c+R/F8Kpq5kID5SN/V8lG+r6HDOzdLK35pN9t/3i7aTGT4QqrgoNjqjFhRJkkVE5dpXo69BoJWYathxnMHAxzImjUG5fSzOQmMgkpZuNMrwlfi+XESyhFUAHUV4xaYEqUV7jbRszWNeaswrNGDzcSMwsVGEPRbFBuxo64A8FhlbDyrrEBy+D4XYt5Lo/uaLVfxrPRmQc4moSHVCRXkV5bVMlsJDDz5F0eqmDZ+u/Vs6hqlFkuQR0cAKn7NceiEOQ9BiiUHAUahrnIgEyWY8s1eRHH8OtAWfDaexbkjvJkWSFDEkiBLjlwyAYhjMxtkvWyuIFGr1uWAI7m+1N0YCdadJjj4USVJEXkA+HRSfDHW1uSj6HWigSCXZIwaJikvw9eyGzo6F2Y7gWSRJETmDudE8jikGMwfuMnsdc/DUDlm8Pe29NKGO9VLox41NuYxPUCRJEVmD2efYlQuoE8BqgYGJG0qyEbSDEIwEzxPLVQFLhRAtFPMgS/dOibyThAK1QU9Ic5Q+Awt1J1qLr/fbd5EYmxgKSe/r9TcoIn2Q6FTXZP+JRGF5OJsuGOwLjO2HM0b1YHN8XehGfWIl3o/ysH8EqniXgXh7w8Z1b2VbhNKDvJOkhPGHwci1pvRCyJSKOm5QY0lIJwKwS8mxyepzfY6/zstCsJdDKlv+1Ve9bxbKsubWhp89aykXAkaGQPwgqew9JMo39NzZFhP/8rCfixB9OkcQdREK3LAJQFBn39C3FK2C+FZV+eqent7/rTi4+ZtC9ODcesStSEaqSUiaXxFpJk5Qei1+19v4Y71O8W3x2b8pOje9VYytlTmiERKzHrW/UILoDcTWQ5LBUKLhTUkUYBIlBRpRplr9rs9xRKMgZu8Ipr6HI9uHQ7GjXMTwwdZMknig6X8yzjaT8Xho3wqkVFrKkDzfMsE+Ekx8grPSZygKfIry8GchAV9907vyq3xFWC+i8LCtkSQZxiI5xgKD2vCnMH8gHCdkvHES+Z1/R+E08RwFcPgWiUY+KZ/6re57hrLRReQeRZJoA0lsY/EQju0Fm0PrkHk4K5JkK0eRJBlAMMjbWn0RQ4ciSTKBYJ8MdROKyD2KJMkIanEm2QZQJEkGAPJTKGKrx7ZGkjd7g73HZutmq1axj7N1ryIKF9sUSchbT0s2pCKKiMU2RZIiikgHRZIUsU2BghFGY61pRpEkRWwzoKB2o6Wxz1o8LmezvXFQONNEKJIkh4gE6ZbswPiOzbbGvyQrS342pQJcgrO9UHnaDgC4oFhXqlixZm3w36lyk8cD+X0csNiyo6LIu0kcxolwVBZRAirbKECsJ9u0zk71w1wFk9MKSvhZVSVNwH95JyHUkRx4Kf7fIRXERgDxbXe3+sXyuc1fpWtGT7laKqZUns+AU0Y0BSR2Hz4bs9b7FUmSRVDo/9rRjhpJEnMYA8eokcoMFnnGal2TrbHN4Xt/4DWRjLDydaXAT6OwQbFpFMIHDmxMtfJDvcfV0GpvjBuqaGAbTNUOF157hNnrcLJIvK8t96O/fEvyhopyiVn9zg8pJ4cA9e8tDb7WXPt0mJeYt+OK8RDBwYmtqMH/7yd9zQOIuqBwMj+NtLHEKFEipPUWv+stYKJFDUFzcN2Gpe3z2jclqydMjsmVR1TsUnUFfoyN8Vxf73H8jkXiQadEkSQZAjvveM6ZE39Tl7naQamzq+P45nFZUk7A40WxJ80+x77YQZ7Ft7ukqKa0C8RHyQpEO8TJ2IYL8eNEff8F7IpN3hWYdJrZ43jf7HPd1NrR9Hg03V7WYPHbTVjH+dxYciCLJCDSg1FY3sTILVhilxuqK7qQ3OTo1aYK8RoXsDIUCvVIMh/JBPxUANRWTKmirAFxo2ri73VTXVPdiwPTLMRDkSQZwOp3/VOWwukbUv7eAOznLIYkFq/zMJzyn2KRQHTJIVhLsoxPJGujOPFIViIdAtsNx/K/IdnOQRKfGLA1vZ7pLSl3iMz4nUgQe8bt24ISbKwFjxYOEZ9hiUe7szYX4ipZLr8Nj8ekKlgkSSYQ4rMYk+BU+Cnl8Vtqa/oGyfVr4EAJL7U9fxD/jneadA6Tx3EpiihXa76XduyNusFSq9d5tr/BfX+6N0ER6VSZSZSgs+BywOAPdzS277Fma6M7WbkiSTKAECyAFDlXa3kjY3uZvU4D10MQqicEiwaeC+seHvv9WP+JWu+TBowol9yHYs3OgQbPlXp0lUjudPttqPuck8P2ZQwQ7K7aBbV7JdNviiTJACEBK/Q8QMG4HfUXygys57IPmu2Ng/QRczXlJodcEiQGcDnqKkSQK7VegTPcjXgoaIKEAWyKUlV2HL67L1GRIkkyAIUxQtFpDYtEi08JHPUvYDoj7ohocqFY4Mh+Cd7mZD33yRjArkDR639aRC/Ut45CcfLCfDQrc4gHWlpDDyXL01gkSeagUV4TSVgaIalQwulHEpPXWSdxuFbvfbICDnegMv9qMmU+vLxrLLkrn81KE9/g61y/1f00syYvuK2RpKTWbUs7quBGWPv1QJMGHOlXYs+fmXnT4mJdW1uwrS/gczSJJmWYTed368LWvoE8/R4bXYV03Y/pV6aNqMw/he3YO1FgDG40Xsq0DxoDsQaf53/xef6ARwNElrJpxS6deHe0GjiC9U/l14n/+8sC2IL1wW8f12qesk2RhEIMGRQl6X5DMhhYNQXV+1e/k4J9lcO0PEvCKQOiQILMTyOJJiqk4rqu7h/vis0LWP9i/QhpRNnvsOm0Cz1Sx/2mjjNMOh+P1w/8osbrHFXB4RSd7aNnGFBVdlVre1PrwPzts5bYdjIalNNQVJ3Pwmsfmu/56sovew/ecUelShLdRhESG1rntn6fzkbpNkWSnADEdxkmrwpHRBdMtAshVnOAUvyBp1NKAiHUzaIWZdEqMY68QOe9NwgWcjVbPUsHfhEN0nc7ik9unB18TEcqO+ywF8/0Oe592da0JvZ8OYh5+G3qfZ9YCPHnQKvn/DA54uyiRFNYX1bvCe9JNeL7Km2NZA0TdpaOarY1Prr5XJrB74okyRAUqjPNBAI0oj3ULdTLae9k4JfTm6ZfIHfLm0e9EuOI/2P6Mz+dHo8gsUD94l3Uc45BPadJx30rShicySKz0GYAcJfO9vkDds98LaM7meRY/K4TcDjSnMoN23MVX8CfyNRyoEiSTMEhnbCpm4Qqjm1ucP8jUYFYeTmy5+A4VWcdrwYamp7QMnq2NLg9Vp+zkVEue40AgFOxA/5hQAfUp5sJmj+0iz/N1sYXrT7XcpwlDtB4yU9M1Q7S6JJuFqZCkSQZAn/hTp3CVjd2q0MCdrdX6wX1bgflk5+sqxZVPKCnAwrBHkAxSs9MsIO5qoEWTsMzEPlpjJbH7qTj+u8Cdm+bbhEIBA4soJUkyCdBdmJFkgwlsB/2hOMMawT22jsD9kbNBCFwKSzr62pXdzCoq2OsV79bMpqP7WG0PqERgvHDWZQk5XL1GKavke+ko0QLBm/p22iC6XrrGIgiSTJHMHWRGAimyysuAnDovGBlOEe5DpB4h6LMGzpEGRS5hKXvvSSgXA9FhBBpBSgHFa/TMShhm/TMbnFRJEmG4JyWLKWc3Z+MIo3A99B1kRBpBbugFBXY/TSTBHvg7qbFpspoRH5dgwXoWc6NASpARp1PW99qWxwUSVLgUATss9lDSiuAaXZNHYAPdZYHMJQSgdtZT89aZtSxNwkwSWddYXAQu+gUPZM6ZmlBkSQFDg6wdxqXfZFWZUL8j2m2/I+Cs93xb3vr8tY1ZpODslhpHbl3P2CxbYflc32r9VUITl3FBfta3/0HY1sjySeoKt6Y7sVC8Ley2RhNADFFr9KuChE3x2TK6xj7Rq/gyKPuwbSYa/G73sGWztB6aWmJchYeL9NaF5kUGRTll7oaCOxtXeXjYJsiCcrc3wRsjZr8mgsHoF/xVHlaJJEi9k66IPrt1As/tlcrSWjSOt/scfm0rPbVumurFKXiGaZTlxGq8OgpHw/bFEmGKcbpvUBl6aygMdYTCv5o4Iqua7CjV26uNxh6TpLli5KVHwADl9hii8/5R7Wr6454KfnId798cuUvDHIFSQCTdDWOsbWdm9a+pPOaQSiSpNAhwtlsdYFztSedqiRJ1n2dEGLzyN7i8L5m9bnasb21Om5hAICrpdLSS61+1+t4v3eReD8IwUbicULFlCqamfQYYMY0jt2bjdTWRZIUOkCU6tVJKGpIOlUJAfr2fNjgpVw1FJzPZbmd6V8Xp03MmUiYsGmL3vWDOPh6gxA3ZXwXViTJMADk7TeS1G6JSTq3LwD67ZoHHN7lKD5dR7NDFpumF2pIFScmizCjB0WSFD669F4gSZJm05JY9DJu1H2hEIOcr1rsnmvNHns1EuisdNqRKZC181sa3Euydb8iSQodgm3SrZOkuZstMdB9nQAYROKoTdbZVq/zfcbhZpaFXW+NCGGLzm22uv+azZsWSVLoALJx0qmTCP2dPVyVzHVfByyxDZa/wX23yetcJHEgv5Oj8aVv6UwfvhQs9Ntmq8eX7RsXSVLwgK90XwFCr3NW9Do+Ru81qOwn3TFHsYd2/0+Y7XNcbAQ4Dmu5BD9XJrtGJ9bjbHvH9x29f0onqLgWFElS8BD/0zuTgA5X3P5VqeMY6HOzBGCrUpWx+O2zDYyfgaUPZuku5/YHrcItQ5nuqe7uH56K9d3PBYokKXCoAv6rxzKcAABj06uN76D7EqEOipTfByTHDBDSbQBSrU6eEwleEELQUraM/89GrGidYLAShcn/dKr8tWytXGlBkSQFDi7EW3o3DVAESs+HAthPdF4huno2/DfeFxa/83Jg0tV4T337JUIs7A0FL46XpmKoUCRJgWNV78r/jDdO0mNdS4P21HTqAsH21DnifxhP1KEIk8DgOp3V031O8tvcz+m8LucokqTAQUHgrD5nq54gDdjR9+HXcD4whlUyhAPfGSftp6txQgxaSarz2ycqTLomXvGkt2LsiFTR3YcKRZIMA6As/hIO8HqCNIwy19nJD+UNrReMM04yM50RHYUIx8HqB1lIxyBJ9S71bmxZ06TL7z+fGAYkgZymJhsO2NTV+0xZqXIL05OugYeTC2kmCeI3OpvVsWbt14MsbFF92l/nfQhl5mq7B/WYRhBiI4vYkPV7qSB6APhGEWKdIdG7prubrc5XrsfCJ4lIN+7e1gPy3rP4XW6cTeZqvQZ1glNqFtX8SYsVrMVt2RkU41F62oQj19Nvz3t7kCElnq9KzzYRLHidhUH8NFV9+RNBovcKU+RwpjFa4XoPa21TQ7Cktb3Jr0fE1Iq8kwSYkPSs+wtgWc3bN1wBQr2FAddMEsS4ivLKOznnv0sWuod0F7PJcTfTJ2oF8Za3JfhOt61ZBhjFwgHxYCaX2Pn4f3xp9TluWdXzxX2JAnqng/zPJAC6lgSRVNv8TELw25r8Vr9zGT6RWdqvghNMHrtx34W2M14/zLdu4LfTFkwzmCIEOVhnc55oaXB/GrdGJj7U7YeePeyMA8lfxhsnnWpqajiW/FuycdOhELd0rpsXZ5I+oOR5DjAJiaI9+jAA/GbUSGUOimuP40cfqOJrVcBILokZY6rHU5rmVJl/B2Jdt1AvTthGlXmAszN13jPb2F2S5TYUx47zWxszXlLOO0lw3pd0yqy6HYG2VjRbPa9Yfc77sOefpvNS0hN+z+gVzo9OSE9zEEI9P16A7z50frp2ccUuVZ/j7SelVUH2QOLj02afQwRsTQsyudFQzCT6lhnT9NfeWtHT0TnfUF1Rh2+n5btu/C2ebLY1PZSszIqTV/TWe1y/liVGARjK89S0RJA48MesXucH/gZ32lFThkJxH61zFMuJZedwBWWJrffbfy4zqQ0/6re1ShtixZo1QU2R7VvtjS+b3A21KPLcpdPfPRcoFRwe5NfwWemufA3BTAL6zLghrdQGWzVarZ5PcLQ+MDpap5t6TQ/+q3Z3H/T2vIDmAavF6aUYZXWzG22TDAblYBwWaTefgldTpq68zjAUC8xUZ/85vk2Y6iIZ8kqSaJ4NbZmK+pCFCHxbI3C0ftPicc1CJXlxGiniNANFrBZ106bD44X70YJo4O47Y89R1i7ZWD5OiizhVqBUVMFUUQq0qMNBwvcKjv4GEGoZDpLbYTffkUXESwqpmpZrMnA4gw0Hkhyw2EL/rE6dRF2Zo+YMe1B+9xqvc/8KgNvx42+zfHsUTcSfOj9eeyXpGdm8cdQoUrcPSDglnjLiYCTSeSwyM+mBaabPUT0whZ0W5JUkBoO0j95ruIC4pthFRBD1qzjB7HE9waVwCNd0zEL6AWcPXyjELmq1u19Nlb45n4iS6ym+gD9jrrY/QPtAOi6nODC0x7QoZckByCtJgHG9eTY2BNZ63k14PyFW4k3btNcPaaUkSAY1KNZLstDcBuyC6QWzTgEKFYri7AyT12YFJp2Epw5i+rwAyQ7qBcFCD9BSs976UUfaR5JYnZayoIp2f4Nbj11ZP1AKutoFtWcYqsudUVFMEzgLp7AoXJJMftRWMnGCoss+CNGWLCkkPuj78XB/Zi3LDNFd3fqhbEMfouYnZL7u49fYZHO9VCOA74dTA0V+3wlHiQoQzIjHH4UQPwCwL1Co+iikhl5rW+p/IxO7J1liZKaiad4JZeF50Sqfxed6Ev+HC7Vegw9HM6FikTeSTJwg0waYLt9r/Kf+naPmbPWI5n9fFn2lht45PgYk65cCN2stv4llHumdgAR5U98VoiKdevJCEloGNBoUvY443aK765mcNKiIrMJAeQlBu6nMa23BTtaQeb1CFSroSg2XnttFzkkS9Xh7Gt+O0HMdigNPBuYE0kohUER+wUFsr2eDeEa9REu/uleZBgIAdK1wARNp7bnllCRkhm2qtz/M9Ob3JnPrUM8fctGmIrIP7Ky6IjSWCCAFf2EmdU5bYKsYU60cp+caIeB/6dSVM5JE/BTs9+Ij1OvxRm6hf2p2NH+Wi3YVkQuAPtMhDhfyBXxRskWZVBhTLd/BdOq4KkWeSQM5IUnNopoyc739MXx4+lJ3RfDamo5V12e9UUXkDqr4WE/aaCw521Rlv3/agmmnxfNuTIbIKikRRNceCaFr7drgyzqvCSPrJKn326dWlFeiDpJWkvnvRLD7CL0ProihxYZP175ZMaWKZhPNq0coop04pnrcTKvfdeP3a3r/mSpEKSUhLSuVfz5xgjKf6feBIfHk3+mGQc06SSQmkadbOgT5UQ0GDwkUxaxhBzJbwc7+T3x7rL4rgTb3HkPdosfid72PM8wHKGqTjVgXADMIIch2ayc8P6WsVNmZpesEwyiIOLs93WuzTpIeof7GCJzW5vVEA1wfUsXBLQ7v8my3p4j8INQbvFVS5GNYeh3ZgBfthce9YoNVQhbSXRGQeC+2NLh1WEX0R9ZJQl5rZp/jYA58KYtYeSaHYJ+rTD2spaHpP9luSxH5A5nGW3yuB7BfnzLUbRmAjl4InZ7JDXKiuAdsTe+aPa5fcolRXKZkgcr+tWFj74n5ip9URG6xpqN3PopO5GT1s6FuSxS9KKEc1d7g0Z2+IhY5WwImgzuzz3U6B/ZAnK87VEFWpk0PJQt3U8TwAinGFrflQFCMAaZP3M4FelShHo0SSmHncQ/YGh+0+J1TgEFfbu8elK/u7untvK7d2d5RDDu39aHZ2fxlrd9eb2ASbRbq9fnIFr4VLPTrgC07Wa9ybpbS0uK51GyyjxUCvuvu6f3rsjm+tHY9ixg+aLd6vpq6ZGrtOOPEa3CAPJdBy7cAAAAAtklEQVSl6U2YBkgqeULt7pqfTZOmnJMkan59Yq7rKaKwEI2geHG93/6AJKTzUKH/LctdglHynHwBxasbUR9+Pds3L/xYwEUMa1DQCjycYVpsuhxKSg9DHZUCeZNZfaZ5E38QgjWDEI3dIP6RLBZYpiiSpIi8IBpI4hF6UUCQek/D7sDYdGB8FwFsMp7fDgSrZkCRVISBcgGj8NSDn7tQhurAsqsEE1+ByshT9e1AW/DtqM9MzvH/uFCgxBI9EGYAAAAASUVORK5CYII= + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.7.3 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.7.3 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.2 + version: 1.0.3 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml new file mode 100644 index 0000000..5d64504 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml @@ -0,0 +1,329 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: "[\n {\n \"apiVersion\": \"charts.helm.k8s.io/v1alpha1\",\n\ + \ \"kind\": \"OpenshiftArtifactoryHa\",\n \"metadata\": {\n \"name\"\ + : \"openshiftartifactoryha\"\n },\n \"spec\": {\n \"artifactory-ha\"\ + : {\n \"artifactory\": {\n \"image\": {\n \"repository\"\ + : \"registry.connect.redhat.com/jfrog/artifactory-pro\",\n \"version\"\ + : \"7.7.3\"\n },\n \"joinKey\": \"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\"\ + ,\n \"masterKey\": \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"\ + ,\n \"node\": {\n \"replicaCount\": 2,\n \"waitForPrimaryStartup\"\ + : {\n \"enabled\": false\n }\n }\n },\n\ + \ \"database\": {\n \"driver\": \"OVERRIDE\",\n \"\ + password\": \"OVERRIDE\",\n \"type\": \"OVERRIDE\",\n \"url\"\ + : \"OVERRIDE\",\n \"user\": \"OVERRIDE\"\n },\n \"initContainerImage\"\ + : \"registry.redhat.io/ubi8-minimal\",\n \"nginx\": {\n \"http\"\ + : {\n \"externalPort\": 80,\n \"internalPort\": 8080\n\ + \ },\n \"https\": {\n \"externalPort\": 443,\n\ + \ \"internalPort\": 8443\n },\n \"image\": {\n\ + \ \"repository\": \"registry.redhat.io/rhel8/nginx-116\",\n \ + \ \"version\": \"latest\"\n },\n \"service\": {\n \ + \ \"ssloffload\": false\n },\n \"tlsSecretName\"\ + : \"OVERRIDE\"\n },\n \"postgresql\": {\n \"enabled\"\ + : false\n },\n \"waitForDatabase\": false\n }\n }\n }\n\ + ]" + capabilities: Basic Install + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.7.3 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.0.3 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: '## Overview + + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift + cluster. + + + ## Usage + + + An external DB is required. The operator will not deploy a DB but will require + you to specify the configuration values to connect to it. + + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + + Go to the Installed Operators. + + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + + Open the Operator and click on the provided API: Artifactory HA. + + + Click Create New Instance and provide the following parameters for your DB configuration: + + + ``` + + DATABASE_TYPE + + DATABASE_DRIVER + + DATABASE_URL + + DATABASE_USER + + DATABASE_PASSWORD + + ``` + + + In addition to use TLS you will need to first create a k8s tls secret to store + your .crt and .key file into. + + + Then supply the value of this k8s secret into the TLS_SECRET field. + + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to + it on the external IP exposed by the load balancer. + + ' + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.7.3 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.7.3 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.2 + version: 1.0.3 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/metadata/annotations.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.3/metadata/annotations.yaml new file mode 100644 index 0000000..43bba26 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.3/metadata/annotations.yaml @@ -0,0 +1,7 @@ +annotations: + operators.operatorframework.io.bundle.channel.default.v1: alpha + operators.operatorframework.io.bundle.channels.v1: alpha + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: openshiftartifactoryha-operator diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.0.3/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.0.3/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml new file mode 100644 index 0000000..54370c8 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml @@ -0,0 +1,374 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "charts.helm.k8s.io/v1alpha1", + "kind": "OpenshiftArtifactoryHa", + "metadata": { + "name": "openshiftartifactoryha" + }, + "spec": { + "artifactory-ha": { + "artifactory": { + "image": { + "registry": "registry.connect.redhat.com", + "repository": "jfrog/artifactory-pro", + "tag": "7.9.0" + }, + "joinKey": "OVERRIDE", + "masterKey": "OVERRIDE", + "uid": "1000721030", + "node": { + "replicaCount": 2, + "waitForPrimaryStartup": { + "enabled": false + } + } + }, + "database": { + "driver": "OVERRIDE", + "password": "OVERRIDE", + "type": "OVERRIDE", + "url": "OVERRIDE", + "user": "OVERRIDE" + }, + "initContainerImage": "registry.connect.redhat.com/jfrog/init:1.0.1", + "nginx": { + "uid": "1000720104", + "gid": "1000720107", + "http": { + "externalPort": 80, + "internalPort": 8080 + }, + "https": { + "externalPort": 443, + "internalPort": 8443 + }, + "image": { + "registry": "registry.redhat.io", + "repository": "rhel8/nginx-116", + "tag": "latest" + }, + "service": { + "ssloffload": false + }, + "tlsSecretName": "OVERRIDE" + }, + "postgresql": { + "enabled": false + }, + "waitForDatabase": true + } + } + } + ] + capabilities: Seamless Upgrades + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.1.0 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: '## Overview + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift + cluster. + + + ## Usage + + + An external DB is required. The operator will not deploy a DB but will require + you to specify the configuration values to connect to it. + + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + + Go to the Installed Operators. + + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + + Open the Operator and click on the provided API: Artifactory HA. + + + Click Create New Instance and provide the following parameters for your DB configuration: + + + ``` + + DATABASE_TYPE + + DATABASE_DRIVER + + DATABASE_URL + + DATABASE_USER + + DATABASE_PASSWORD + + ``` + + Master key and Join key must be supplied. To generate a new key for each run the command below: + + ``` + # Create a key + export JOIN_KEY=$(openssl rand -hex 32) + echo ${JOIN_KEY} + ``` + + To use TLS you will need to first create a k8s tls secret to store + your .crt and .key file into. + + Then supply the value of this k8s secret into the TLS_SECRET field. + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to + it on the external IP exposed by the load balancer. + + ' + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.9.0 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.3 + version: 1.1.0 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml new file mode 100644 index 0000000..0acb529 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml @@ -0,0 +1,376 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "charts.helm.k8s.io/v1alpha1", + "kind": "OpenshiftArtifactoryHa", + "metadata": { + "name": "openshiftartifactoryha" + }, + "spec": { + "artifactory-ha": { + "artifactory": { + "image": { + "registry": "registry.connect.redhat.com", + "repository": "jfrog/artifactory-pro", + "tag": "7.9.0" + }, + "joinKey": "OVERRIDE", + "masterKey": "OVERRIDE", + "uid": "1000721030", + "node": { + "replicaCount": 2, + "waitForPrimaryStartup": { + "enabled": false + } + } + }, + "database": { + "driver": "OVERRIDE", + "password": "OVERRIDE", + "type": "OVERRIDE", + "url": "OVERRIDE", + "user": "OVERRIDE" + }, + "initContainerImage": "registry.connect.redhat.com/jfrog/init:1.0.1", + "nginx": { + "uid": "1000720104", + "gid": "1000720107", + "http": { + "externalPort": 80, + "internalPort": 8080 + }, + "https": { + "externalPort": 443, + "internalPort": 8443 + }, + "image": { + "registry": "registry.redhat.io", + "repository": "rhel8/nginx-116", + "tag": "latest" + }, + "service": { + "ssloffload": false + }, + "tlsSecretName": "OVERRIDE" + }, + "postgresql": { + "enabled": false + }, + "waitForDatabase": true + } + } + } + ] + capabilities: Seamless Upgrades + operators.operatorframework.io/builder: operator-sdk-v1.0.1 + operators.operatorframework.io/project_layout: helm.sdk.operatorframework.io/v1 + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.1.0 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: '## Overview + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift + cluster. + + + ## Usage + + + An external DB is required. The operator will not deploy a DB but will require + you to specify the configuration values to connect to it. + + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + + Go to the Installed Operators. + + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + + Open the Operator and click on the provided API: Artifactory HA. + + + Click Create New Instance and provide the following parameters for your DB configuration: + + + ``` + + DATABASE_TYPE + + DATABASE_DRIVER + + DATABASE_URL + + DATABASE_USER + + DATABASE_PASSWORD + + ``` + + Master key and Join key must be supplied. To generate a new key for each run the command below: + + ``` + # Create a key + export JOIN_KEY=$(openssl rand -hex 32) + echo ${JOIN_KEY} + ``` + + To use TLS you will need to first create a k8s tls secret to store + your .crt and .key file into. + + Then supply the value of this k8s secret into the TLS_SECRET field. + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to + it on the external IP exposed by the load balancer. + + ' + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.9.0 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.3 + version: 1.1.0 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/metadata/annotations.yaml b/Openshift4/artifactory-ha-operator/bundle/1.1.0/metadata/annotations.yaml new file mode 100644 index 0000000..8994ddd --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.1.0/metadata/annotations.yaml @@ -0,0 +1,12 @@ +annotations: + operators.operatorframework.io.bundle.channel.default.v1: alpha + operators.operatorframework.io.bundle.channels.v1: alpha + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: openshiftartifactoryha-operator + operators.operatorframework.io.metrics.builder: operator-sdk-v1.0.1 + operators.operatorframework.io.metrics.mediatype.v1: metrics+v1 + operators.operatorframework.io.metrics.project_layout: helm.sdk.operatorframework.io/v1 + operators.operatorframework.io.test.config.v1: tests/scorecard/ + operators.operatorframework.io.test.mediatype.v1: scorecard+v1 \ No newline at end of file diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/artifactory-ha-operator/bundle/1.1.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml new file mode 100644 index 0000000..f312d8c --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/1.1.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml @@ -0,0 +1,29 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true +status: + acceptedNames: + kind: '' + plural: '' + conditions: null + storedVersions: null diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.0.Dockerfile b/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.0.Dockerfile new file mode 100644 index 0000000..46bcaad --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.0.Dockerfile @@ -0,0 +1,13 @@ +FROM scratch + +LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 +LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ +LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ +LABEL operators.operatorframework.io.bundle.package.v1=openshiftartifactoryha-operator +LABEL operators.operatorframework.io.bundle.channels.v1=alpha +LABEL operators.operatorframework.io.bundle.channel.default.v1=alpha + +COPY 1.0.0/manifests /manifests/ +COPY 1.0.0/metadata /metadata/ +LABEL com.redhat.openshift.versions="v4.5,v4.6" +LABEL com.redhat.delivery.operator.bundle=true diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.1.Dockerfile b/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.1.Dockerfile new file mode 100644 index 0000000..1a4fd7f --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.1.Dockerfile @@ -0,0 +1,13 @@ +FROM scratch + +LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 +LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ +LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ +LABEL operators.operatorframework.io.bundle.package.v1=openshiftartifactoryha-operator +LABEL operators.operatorframework.io.bundle.channels.v1=alpha +LABEL operators.operatorframework.io.bundle.channel.default.v1=alpha + +COPY 1.0.1/manifests /manifests/ +COPY 1.0.1/metadata /metadata/ +LABEL com.redhat.openshift.versions="v4.5,v4.6" +LABEL com.redhat.delivery.operator.bundle=true diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.2.Dockerfile b/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.2.Dockerfile new file mode 100644 index 0000000..5e4ce3b --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.2.Dockerfile @@ -0,0 +1,13 @@ +FROM scratch + +LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 +LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ +LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ +LABEL operators.operatorframework.io.bundle.package.v1=openshiftartifactoryha-operator +LABEL operators.operatorframework.io.bundle.channels.v1=alpha +LABEL operators.operatorframework.io.bundle.channel.default.v1=alpha + +COPY 1.0.2/manifests /manifests/ +COPY 1.0.2/metadata /metadata/ +LABEL com.redhat.openshift.versions="v4.5,v4.6" +LABEL com.redhat.delivery.operator.bundle=true diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.3.Dockerfile b/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.3.Dockerfile new file mode 100644 index 0000000..4cd5a62 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.3.Dockerfile @@ -0,0 +1,14 @@ +FROM scratch + +LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 +LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ +LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ +LABEL operators.operatorframework.io.bundle.package.v1=openshiftartifactoryha-operator +LABEL operators.operatorframework.io.bundle.channels.v1=alpha +LABEL operators.operatorframework.io.bundle.channel.default.v1=alpha + +COPY 1.0.3/manifests /manifests/ +COPY 1.0.3/metadata /metadata/ +LABEL com.redhat.openshift.versions="v4.5,v4.6" +LABEL com.redhat.delivery.operator.bundle=true +LABEL com.redhat.delivery.backport=true diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile b/Openshift4/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile new file mode 100644 index 0000000..a8bc459 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile @@ -0,0 +1,26 @@ +FROM scratch + +LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 +LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ +LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ +LABEL operators.operatorframework.io.bundle.package.v1=openshiftartifactoryha-operator +LABEL operators.operatorframework.io.bundle.channels.v1=alpha +LABEL operators.operatorframework.io.bundle.channel.default.v1=alpha + +LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 +LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ +LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ +LABEL operators.operatorframework.io.bundle.package.v1=openshiftartifactoryha-operator +LABEL operators.operatorframework.io.bundle.channels.v1=alpha +LABEL operators.operatorframework.io.bundle.channel.default.v1=alpha +LABEL operators.operatorframework.io.metrics.builder=operator-sdk-v1.0.1 +LABEL operators.operatorframework.io.metrics.mediatype.v1=metrics+v1 +LABEL operators.operatorframework.io.metrics.project_layout=helm.sdk.operatorframework.io/v1 +LABEL operators.operatorframework.io.test.config.v1=tests/scorecard/ +LABEL operators.operatorframework.io.test.mediatype.v1=scorecard+v1 + +COPY 1.1.0/manifests /manifests/ +COPY 1.1.0/metadata /metadata/ +LABEL com.redhat.openshift.versions="v4.5,v4.6" +LABEL com.redhat.delivery.operator.bundle=true +LABEL com.redhat.delivery.backport=true diff --git a/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml b/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml index 7dc5339..397bc5c 100644 --- a/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml +++ b/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml @@ -1,4 +1,5 @@ -packageName: openshiftartifactoryha-operator channels: - - name: alpha - currentCSV: artifactory-ha-operator.v1.0.3 \ No newline at end of file +- currentCSV: artifactory-ha-operator.v1.1.1 + name: alpha +defaultChannel: '' +packageName: openshiftartifactoryha-operator diff --git a/Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml rename to Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml rename to Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml rename to Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml rename to Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.crd.yaml b/Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.crd.yaml rename to Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.package.yaml b/Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.package.yaml new file mode 100644 index 0000000..7dc5339 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.package.yaml @@ -0,0 +1,4 @@ +packageName: openshiftartifactoryha-operator +channels: + - name: alpha + currentCSV: artifactory-ha-operator.v1.0.3 \ No newline at end of file diff --git a/Openshift4/artifactory-ha-operator/config/default/kustomization.yaml b/Openshift4/artifactory-ha-operator/config/default/kustomization.yaml new file mode 100644 index 0000000..77f3634 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/default/kustomization.yaml @@ -0,0 +1,26 @@ +# Adds namespace to all resources. +namespace: artifactory-ha-operator-system + +# Value of this field is prepended to the +# names of all resources, e.g. a deployment named +# "wordpress" becomes "alices-wordpress". +# Note that it should also match with the prefix (text before '-') of the namespace +# field above. +namePrefix: artifactory-ha-operator- + +# Labels to add to all resources and selectors. +#commonLabels: +# someName: someValue + +bases: +- ../crd +- ../rbac +- ../manager +# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. +#- ../prometheus + +patchesStrategicMerge: + # Protect the /metrics endpoint by putting it behind auth. + # If you want your controller-manager to expose the /metrics + # endpoint w/o any authn/z, please comment the following line. +- manager_auth_proxy_patch.yaml diff --git a/Openshift4/artifactory-ha-operator/config/default/manager_auth_proxy_patch.yaml b/Openshift4/artifactory-ha-operator/config/default/manager_auth_proxy_patch.yaml new file mode 100644 index 0000000..71c3fbb --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/default/manager_auth_proxy_patch.yaml @@ -0,0 +1,26 @@ +# This patch inject a sidecar container which is a HTTP proxy for the +# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system +spec: + template: + spec: + containers: + - name: kube-rbac-proxy + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0 + args: + - "--secure-listen-address=0.0.0.0:8443" + - "--upstream=http://127.0.0.1:8080/" + - "--logtostderr=true" + - "--v=10" + ports: + - containerPort: 8443 + name: https + - name: manager + args: + - "--metrics-addr=127.0.0.1:8080" + - "--enable-leader-election" + - "--leader-election-id=artifactory-ha-operator" diff --git a/Openshift4/artifactory-ha-operator/config/manager/kustomization.yaml b/Openshift4/artifactory-ha-operator/config/manager/kustomization.yaml new file mode 100644 index 0000000..ad13e96 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/manager/kustomization.yaml @@ -0,0 +1,8 @@ +resources: +- manager.yaml +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +images: +- name: controller + newName: controller + newTag: latest diff --git a/Openshift4/artifactory-ha-operator/config/manager/manager.yaml b/Openshift4/artifactory-ha-operator/config/manager/manager.yaml new file mode 100644 index 0000000..09188c1 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/manager/manager.yaml @@ -0,0 +1,38 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + control-plane: controller-manager + name: system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system + labels: + control-plane: controller-manager +spec: + selector: + matchLabels: + control-plane: controller-manager + replicas: 1 + template: + metadata: + labels: + control-plane: controller-manager + spec: + containers: + - image: controller:latest + args: + - "--enable-leader-election" + - "--leader-election-id=artifactory-ha-operator" + name: manager + resources: + limits: + cpu: 100m + memory: 90Mi + requests: + cpu: 100m + memory: 60Mi + terminationGracePeriodSeconds: 10 diff --git a/Openshift4/artifactory-ha-operator/config/manifests/bases/artifactory-ha-operator.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/config/manifests/bases/artifactory-ha-operator.clusterserviceversion.yaml new file mode 100644 index 0000000..a910fd3 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/manifests/bases/artifactory-ha-operator.clusterserviceversion.yaml @@ -0,0 +1,340 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "charts.helm.k8s.io/v1alpha1", + "kind": "OpenshiftArtifactoryHa", + "metadata": { + "name": "openshiftartifactoryha" + }, + "spec": { + "artifactory-ha": { + "artifactory": { + "image": { + "registry": "registry.connect.redhat.com" + "repository": "jfrog/artifactory-pro", + "tag": "7.9.0" + }, + "joinKey": "OVERRIDE", + "masterKey": "OVERRIDE", + "uid": "1000721030", + "node": { + "replicaCount": 2, + "waitForPrimaryStartup": { + "enabled": false + } + } + }, + "database": { + "driver": "OVERRIDE", + "password": "OVERRIDE", + "type": "OVERRIDE", + "url": "OVERRIDE", + "user": "OVERRIDE" + }, + "initContainerImage": "registry.connect.redhat.com/jfrog/init:1.0.1", + "nginx": { + "uid": "1000720104", + "gid": "1000720107", + "http": { + "externalPort": 80, + "internalPort": 8080 + }, + "https": { + "externalPort": 443, + "internalPort": 8443 + }, + "image": { + "registry": "registry.redhat.io", + "repository": "rhel8/nginx-116", + "tag": "latest" + }, + "service": { + "ssloffload": false + }, + "tlsSecretName": "OVERRIDE" + }, + "postgresql": { + "enabled": false + }, + "waitForDatabase": true + } + } + } + ] + capabilities: Seamless Upgrades + categories: Developer Tools,Integration & Delivery + certified: "true" + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability environment across multiple pods + operators.operatorframework.io/builder: operator-sdk-v1.0.1 + operators.operatorframework.io/project_layout: helm.sdk.operatorframework.io/v1 + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + name: artifactory-ha-operator.v1.1.0 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: "" + version: v1 + - kind: Service + name: "" + version: v1 + - kind: ReplicaSet + name: "" + version: v1 + - kind: Pod + name: "" + version: v1 + - kind: Secret + name: "" + version: v1 + - kind: ConfigMap + name: "" + version: v1 + - kind: StatefulSet + name: "" + version: apps/v1 + version: v1alpha1 + description: | + ## Overview + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift cluster. + + ## Usage + + An external DB is required. The operator will not deploy a DB but will require you to specify the configuration values to connect to it. + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + Go to the Installed Operators. + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + Open the Operator and click on the provided API: Artifactory HA. + + Click Create New Instance and provide the following parameters for your DB configuration: + + ``` + DATABASE_TYPE + DATABASE_DRIVER + DATABASE_URL + DATABASE_USER + DATABASE_PASSWORD + ``` + Master key and Join key must be supplied. To generate a new key for each run the command below: + ``` # Create a key export JOIN_KEY=$(openssl rand -hex 32) echo ${JOIN_KEY} ``` + To use TLS you will need to first create a k8s tls secret to store your .crt and .key file into. + Then supply the value of this k8s secret into the TLS_SECRET field. + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to it on the external IP exposed by the load balancer. + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: iVBORw0KGgoAAAANSUhEUgAAAMkAAADCCAYAAADjAebGAAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAACxIAAAsSAdLdfvwAACAASURBVHic7V0HfBzF1Z83u3un5iLJGGzAdoyDgWDAgIxtSdd0xZiaxEASWiDARw9gei8hQCghhN5CJ4BDMHGMdbqiU7ExpgZCb4ZgTLFsg2Wr3O18792d7JN0ZfeaTvb9f7/T3u3N7oz25j/z3swrshCCEfg1nJvqG44F4HWMCQlPrwQmWgKt3oB6laqyIorYRiHTnzBBTI6ngLGjIqeBAUSOZpNjpdXrvDLg8DyuqqoYuqYWUcTQIEwSU73jtC0EGYSJjMOjZq/jQL6AH6POU0N5bF8RGaDe49pHkthM/G27u4W6eKmt6ZuhbtNwhIwdXzJX2y+hWSMFfmWqtv8Xj3/IQ7uKyBA4+58uS3BX32cj8A6LxzWz2d740VC2azhCrhtl3QcJsqOWwiiEzZ+1ZNYdy+Ys+yHXDUsEi98+Gxi/HlszDT/2oO60Aph6p9/W1DRUbSpIcDhnwJkq4OIsPJ49FM0pFNQ8UKNUTKk6hgl2NHZo7PusmwnxzKqelZd8MOeD7njXyAByhY46RpcYR/4Sj3/LSot1YrbPsb0RpCX4dkTfOdSdDsUecbDJ63S1NLg9Q9GuAsXYOOd2zXsrCgjYR+oqplQ+xOg5xApOAOeOM0wche9+F+86uWNd72tjqpW1+L5SS0VCCAsbIpIYGduXxRAkBpxzQJGRFUmyBV/ia1S/MwAdQ9OUoYfF7/qFxOEZFtXDBwIATqh1225od/o+Hvid/PY83wazx3UEl9jf8fOYVJXhzeKNUHlBD4j/GBgLsjj/KA4M+wxBkwoWgrHX8Jns2e+cUP89VO0ZSuy70DZ61EiFZpC4BIkCFFk6AI+DSUJ/AvZGr7nRvBdXjH9DFriSVym+zKC9GaHd6vnK6nNdhoy4kQ1caRCsqJDGAAmxAIAfv/kzY6+0tIaeYbahbNXQYNRI+Qg8jE5VTgj4Pt75zcwKuAJfo8xyoNlrPxP73014qjTefdQQPJp2a7MAv63xT1av8yVUTC/Ej7/Gl4Sv7pAQFw9luwoNAVvTIqvfebpgMA9//f91bgzOV6/yBYe6XUMD2FdDoVWre1c2x/ui3/QT3Sz8a73f7paF9CiO1QfEfi8EuwFnnfa025ol+Bvcb+PhWLPPcQMwOIKB+lJLg+eVoW5XocFvdd+Dh3uGuh0FgGRiVh/OT7i6Fe9kq9XzAb/GVmcyKSehTHMkztUGlbEHA7bGRzJpabaBo+W7eLhmqNtRRKFDvJtsHxBnhvuarY1PJ/o+IcOiU/O90VcRRQxbbOgMPl5RrvyekfVIf3QIIe5oaQ1ez6yJr9cyDRVRxLDGioN939csqtmjvLxqDgh1Jyagi4F47/uO1cvfnvd2T6rFjIxJYvU5rAz4efiW9JdynLw+wEb8vadjw1/b57VvyvT+abRnlgB+C74tYaq4trnBvTDfbSgUYMcoKy+tPETt7nK3zG1ZO9TtGUqsOHjFRjw8n861GZHE4nedA8BvY/0EPpiOn6YbqiuOq3XbDo+3OZMrWNyWnUExvgR9m2gcnrd4nUciUf6RrzYUEirKKp9iAIdJpSXN+DGJQFFEMqRNkmiH/BNLrBH9zCArfvMS876BOYHv0q1HD0Ax0LJw7C4zBw4PmBvNS2mJOx9tKBRYmiw/Adl4WOQTWCwe10+Lxo3pIW2SgCLTDreSvBDbiRuMZC5yXrr16AMcFudkJZKZxK+j89OGwgBwQ33sZ8HVvfGw1ZIExWz8f/kswVinYGpTwNb0YbbunTZJenrV9wyKRPsqyW3sAU6Y/Kjt0k+P93WlW5cWYB0lEycoO8dvAvwaH+KDfluTP5dtKCgA2z/2IwcYN1RNySXqmmx7KrJ8Dwt71EY6IzCuWn3O+wKtwbOzsYGaNklI17D6nY9gk05IUXT0xJ3kI/H4WLp1aUF5+XcqY+MTkRbwId6DRNon12QtGACri/2ID2b7oWpKrmD2Og9SZOU5Ntg6hOPIeJq5XtmA7y/MtJ6MFPeeNZ1nGKrKx2KDDkpakMP5fAF/MpdejbSUZ/W7yClszwRFpk7cWbkSj5fmqg2FAtQDt+PGkr1jz4FGn6HhAvK6lCWIR5AtAHZmzaKaq6MrW2kjI5LQEi+/xna42STfgC2azxKLXtPMlfb/w+PdWu9t8bsOZUJEXIoBnmy2Ni5OdY0Q6i0A/JGEBYBdYG5qWBhweJdrbcdwBFeMh9Ch/1kxZUgakwNQTAazyX4//qCJCRJBqaKMIKv1zzOpL+N9kqjMdwF26mUQ8TMZGbcghz9Y3JZ/NTubU1oRW/zOi3HkuyEajYLwa7PP8QtUxl5Idl2zrelRi8+1K16WaLaQuSw9Nr1p+r5vON7oTNWOYQsOxww+CT/Nf0NyA7PJQdbNNRqKdvR+8eNXmdaXtR13HOmfx478DgdOexLxRJ5KkI1PT1swzRbe5UyAaQtsFWOqlasHnAa8742c84WpIrY02xovQ7GL9mZuZ3EJC7uOlseSqc2xKf6lYYmIIqtY4ny1vbnRPG64L4XXLqgtNVRVXJs6JANB3LLi5BW9mdaZVbMUWnbDUXrmKGm7hwHgyEEFgNWOqR53J747JdE9FCXcpnhLy1NNbgeJDCmXMf3Wxr+hXL6IG42otAHVNZAsx+DM147E3urs0pAgpHfF7ULcoNCK17/y26LswlBdfiYedkpVTgjxfEtr8OZsbKFm3XaLxBgc8X9l8trfQJHpejZINoaTUSRaiSP+9fGuf/0w3zqLz/kEkuy4gd+pIDQr/tENzAv2XWi7ftQI5TzsNrTKYdzcCsbuMHmd77c0uJu13rPQYfY6XZzDEYlL8BlsGJOkrqlurCKXp1p4oXiLNyNBLsuW/0xODByjItGNOFr/Bzvjk2yAVxjqDNfhd+txJL8z3vW9HZ2nGqrKO7EgyZ5l+PqOCXYLduhP9baFSIeHK1EUfAFFtpfYlgAJisThHyiemNscvnf03rfQQDvsXDamcogjr9Mr8tGeXAAJcitL5mEo2PKgys5ptTe+nE0PzJxaAdOKFHbOAzjAv0gXiPmKVPI7rH5nt9/qfmDgdVHDyNP5NbazZ83qHrlszrK1mUaPRFHwdavPcThqNy1sy/9dpcjyEovHZR3OJhv4jPfgkpH811PshcB+FHFmOAapw//xcBzk4ixIhPERU8XlAYfnuVxEGc25qTzpKabFpplSacmz+CPZY75CnsB9OKNIiXSD6HTZwbIUidhva1qGxMTZKzYmFewIEgvgjOIcbjNK/Yv1I6SKsrOx85AIUqbhEm5g7GA8PpTjpmUV0Vny4ThfdQomru78eO1fwgp6jiJW58WfhMy0cVY40Fwv30E7oTFf0Yxyt8XvHN1sdd+Yj7Zs6AxeX1GuUHyl2NBE41DhbcWZ5sh8BLnDZyEfcADbQZFge8alEahHGCLfhIKqynsAxMZQKLRRVVmXJCk9QnQGQyEDQhoJwElp3RUl73p5RNlcfK8nbhqZbNCq3rAhSWS100ArpgNCXgkPsuKkNqtnZa7tm/PmdBWdFU7HmeNDJAbJln0KPdCeiNXnHB/o8Jyb61jD5IBj9btITzp1wFejURR7yepz/fH7jlV/SLZMrQcUEMzcZKcl8XoBrBb/2z3NJmU3/GwYXFpiUvipYFeWY9c7ylEeH1AUNK2BDgYwE4oue+EM/5/0bpA/0GBiMikUK2t6zOkeJtRLAq3e2/OV7SDvnokoWt2ORPkCf+InWKxJAcBZ5mrHJBQhjm49tPXHnDZCFQ8zDgNJQpCwE10xpnr8L3BWuQBnlZfSuX2tu7bKIJXPQVK4zF6HA0+FjQvT7NbZBu05Xc4odkEBg2JUm+rtj+IzmxtzejUOofMC9qZ2PYq5xes8Cv/pM1hYehBPBdZ4btMzGA+J+y5tPGInbMCf60XWPyDeIXJF2Ssmd8O8Fqf3v7mqHxW8V7Hzrsa3OyQo8jNs22KccV5DLfDBTZt6X1g+17c60f1IJKislPfnnFnwR3UalAraDZYLhBTxMM/scZkD9sZApjey+FyX4aS2d6Ch6ahsKc2RIO6OR/Dtb7acFe+K3p45AQ0WG7FAHfRkJMj9W87APuZqO1kfJNyrG4gh83EnJbreb6+TmdTIYh30ge0mKfIr+M9dHGjx3KVlSiVbntmzZ49pc7R9q6Vu+jGRAMvw7c9TFN0PO/p+ZaXK3diej4SA9/EckaULO0YZ6gU4Q8AuY6oVeuiSlroLBMAl9rBpsWn/dN16wyN9leM2fA7hANxmT8Nf8dCaacNoR91cZafIJbG+QS+HNnXN1dvWqPvEHwd/AyfXe1wPh5eKNWBIA0FQ6KJav73WwCQSa6bFfFWG/8gd5nrH0Ra//bxmq2dponvU+e0TsdyTSK59rV5nrb/B/YaWuoVg7+EPnIokfaCVOLIJ6x9wOl29oDAwWSoteXHfhbZDontJmmHxuHbHkf4+fLvZsUswTiuXGZEESVtpqK5YGHtfvPOyru4f5yybqz+TwYQJnILSxQ3diyqfEw+FTxIChS7FH8o0aqRMeyn9fCAoOB4wqR11GB/qEfd3MrZkRYN7PX1F5uBgNP6fwqSLsVx5pDzcjH/tgyqJD02zztYNqBs1QlmGA9EZOBD5UpXG0XemxMVpIAGJQf36Do4XWqIkJgQRTyotJYLEGGKKN9b/EJz7+mHppfro7la/KDFKcWNHo76o+fcfcpIQaCSrWVTjKi+v+ifJ9AO/x3M2VLRtFfi/oZhEBnqcG0to55wPKNhAbpwoyqUc0YCR/MxTFdv6geItDkReq8/1Pj4QIsq72OG/xffdQqhlHGBnLLQXnjfJEpuQZPlh70RfpILVbz8EJIkWcmJt7D7DBhw4cJajCDBlZaMPxV9ufEjA620OTyCRLrRsju9/Fp/jVABOLhpbVhMFe39NR+8TWttXECQhkGPM1CVTDx1vmPgMRfhIUIx+ofHJ7iOAX42HhpQVAmynu5FbM8JkYbtt+UiPSNcgsvMBi207JFvgGIjwEm+9cg2ARHGcYytbJ0LsoKX2/pYB5GhVUV5Fs80E+iwB2avZV6DIfUR4vyQOmm1ND9U12doVST5FAExFgrzTxdQ/UTYFre0sGJIQKBYrPrh5JpPyRJIcjklBsw7OJgemWr5FJXyv4a1SFB5KSpQ5eHhES9lZS2w7mU3KU6yf/hFGkAn1yGZ703uxJ8nMXzaU0G86YEUSalDk9tW6a2vane1x86+0OXy04JJ2MJKCIgmBNh2RKMfgA6Qp9Fdp3QT4zXwBdydaC5/eNL18tDy2GIcqy+AgKCLNI6nKWbzOX5YYFTJFGqRUC8HOaR5g9RBdEqYN4ERL9pMNcgXNRhn7s8dDwZGEECXKsUgU+pgOUX5mrrafjse/xvtytDRmoFlKEVkB2C1+19xErtazG22TjAblZuAwL/714vZmm/uugWfxtyTbtOSDGrBfsG2JJIQ+opjqZQMA/EL/HeA6nKIXDPTEoyVjBaRiJPocASXYp80+x+9a7d5/kEJNZjm1bsd+EmcnI0HIR6gk3nURJynP/IFUsPjtJmDSVRqqLs+89fFRsCQhEFGmLZj26zFV455PGZFlMEZxQ8lf2ADzC5lJtPuaMutREWljJAf+nNnr+M7qd63GI0VpqUp6hWDtvR2dxwzcOK5ZZBtTUabQHpiWjdpFGbQ5KQqaJAQyNJz8qG3exJ2VJfiwzDovPwJHtXkBW9OCvhNCqPcA8EHLzEVkHdtFX0lBaeo6hThoxYDg6lE9hGK1pXTVxbu0rf8heEG6DU2FgicJgQLK1Xidh1UA84cDcusAjmp31TXVtfSZrFDEFavPuTDJMvPWAlri/CdTBWUkfk8IWCe4OiJiai/2wN65O1kko3i0B0sgAuUB/u7uHw5fMWfwZqGp2k7u3QcmuZaWml/G/+/pQJtnQS4tgocFSQi00z7b5zjQyKANZxQ9MaTIL/oRlI0P6tt06gH1DAOTaHe/OgdN7cEOuEoA+wE74EbasQTayBJkih9encl1h9xErs7rf+y9LYG5yev4erHvw9QlU41j5UnTJYnNBCHqkDi0x5QHcVQ8sKp75VnxUrBZfI6jkcwXDb6EfYzP894QhF5otXo+2Xw+9a5YRhg2JCGQ26nF45oLEiNbrpTptGNACVPJG/HP9IFMYSx+1ynYeTNNyUCsexWY8KlCLBe0A9zm+V+yUS1iTqPszphEo/l0AOyYDPBzNizpRXNIZb/TEwsg2klfjr5upw2+ujp5JufsYGDhiDc/ybxd/bAORd4zm21NT8b70up11gDnA126V+GDvqy1temxfPmQxGJYkYRAvuj1HtchshQ2oUgVwS8GcAPqJwHydQ/fx9r4PBLlIeyZv9PbBiTGf5AYD27cFHxu0A5zilEtGsWFXi1958IKaqnsxDmHxAt66Z3haPa6ItDquSXTThR1jmujF86+l9Q3WmdwWT6JRczWtbgIJ8Pfe1jo/HabJ27AOEoPARKQAr75dxWC3b+mo3d+eId8iNJrDzuSEMjE2eJ1ngAcyKRa6whs5ABPT1tg26/PJGF98Nvfj5bHUiwqTXZHSA43Y6Hrm62eltSltYO8JfFAu89P1TxQo5ROrmyQOK3KhZe+RyW/WrwbCoaOa3F4X8t2J4qKpxQSdrlpselCqcR4AkqPp+kUd6mNb2Bvn58sqn+t2zbFoCikP/VFsyHHu+ObbY3/TLP5WcOwJAmhucH9jMXn3A0ArtZ+Few6plr5G46QR1IHoBhhdX77YQqTyLckSWoC8YYagnOz4aSUCtGIg0voVbOo5syK0sp5OMPQSE46VOyAsBpH2Vu+7ll5Z6LUytlE1JfjNn4Nv72+vuFQHHB+T8mBUlz2jirU61tbvc8mm+EsfvsMJAjZZPXtqK8O9QbntDi9b2Wp+Rlh2JKE0GL3XGv2OmgW0OoXQpiH+gmZMNxAH8gwzuRucEiK3MwG6zkbsSNe2tLhuTPXvvfxEI2GTsugj6GIOR5FTMpLWRFSxWebPl27PBshPPUi2tkpJvMLZHCICv8xEBEyaXaRcED5jJE1sRDPB+ze5vBslGCGI/3HbJLPAiaRY1TfgsY3SCwzEiRrSXgyxbAmCf0A9S/WHy+PKJ2Ko9oe2q+EP1h9jjf7jCDJVRjlYRNI4eiGu0QLvSpC7DeFEo8LRcxVjJZ0+5DjFR0twDa9iYc3ExZIMHfQLrypyX6o2aTQQLV7zFedoWDwIBQdC4YghGFNEgIFjcAOPg87+Aqm3TSBM+BP4nUH9JEAj+/VeJ37lQOE3T2/7vn8vHyIMdsSwnHCRpQdj7M/xfOdOqiAKk4J61YFhmFPEgJ1cIvPcUbS3CSDUYnE+vdMn2PWy7amNXQi6vV4Rk4auQ3D7HPsCoyfIY8o+y1LlJqDsSf8De6n8tgszdgqSEII5ybxu6woHx+v47KflgL/59QlUx3FWSP7QJ1lf4mLSzjww1lyN9B1Gzp7z81Xu/RiqyEJYX3w2zNGy2MpcvruKQtvQf04w8SHUU4+JhdxZLdFULginKUvlSVyxU69Qi+YuCm6DF6QGDYkodhWVVWSBUelyp7eDf+O54VGS7o4tR+DZWj3OHn67BgAwG/MHgdtcOXEHyEfCK9+cXaqAHYYROR9yuTlU4PBW/KV/s7kddolDldyaZC3YTKs7+7+UXOawKFAQZMkvBNdLv8cu/GhY6qVGajYXRPoaLov2XIs7ahb/M5rgcF1uioDSmnn/LbZ6r4l44bnEWR7Nc448RJZAiJ4acy4TblY5nFZ/qXV73qoq/uH+cviGBJmirC1bqX9l4LDfCTIDL3XC8GeyUW7somCIwntOJftMvownA2OryhXKJ+Ggk/y3109wf0o+oWWe7S0BG80mxTyP5mpp24k1p+wQ62hTFnptD3fQLGmdrxxEtk5JRMviTcnlRhH2nCkP76lwd2WjbopoY4sl51ornL8H9YwKV3DM6HmNnV5NlAwJKFIG6Wl8pkVU6pod7kvz8ZGnD3OCTg89+jRF8j+CMWu45FotIavw74r3KEesHidG2lHX8d1eQWJntVVyvUo1tBSqtaQJpNxpA/gIHA/KslXpKMDUDifivKqg3D0P0aRyynogyEzs0zxVavTszRXKROyhSEnicVt2ZkpxsvKShValYo1I/8ACXKEv8H9djoPkfKiWH2uP+CPGDftXBJIwOFx7EwGnFEe119zbmH1Oo9E0ZOC8E1I43Ii1Kk4Qx9t9TsfVYOhJ1qX+lckMhmhWb1icuWeDEQ9A25HgtAWZlnWoswI9uJwWCwZMpLsu9A2etRI+SpQjJSvxDjg6yUoQx+Vqay64ZOOm3FmokAS01IW7g9S+h+z+pxHdfcGz1zq8n2eSTuyASTHNMbhL/jKRpSXEThpnon6yplmk2O9xe+i4ORfAvmiYJ/AXluF7yfgs6OwroacxcMHNa2o/fnGkJAER+ljR40Mj4aD0peRaXRLa+8Z6lXLMk4KSbZN9R7XKbLE2lk64RoBDjIaFCsq9DevD35381DkfqcIIwZFvgJnNwqikIvfaxRSYHbsiTyFIwsGf+xuzk9VmSGvJKHVqvIy+b6E0U8oa6q96aJsTsFkVo+ixd00cqZ5izJU6K8aLW93ktnnunrjJx2P5sOwMBp+5yJ8ncjiJvwZ3sAf+PWc56HJEvJGElSk90VZ+HkWm2YhBvjQbm22NV6YCyUu+OOmS+WKssNxiNQQVCARYEcO7AEUQS5H0t20LvjdY7mYWUxepwXrOQvJQT74wymdgy4AEwkzBcQDJUbatMmo6o2Anw3khSQo8zo5cCJIXANEJMiTLQ1NF+RqlSNsBOl3nYFixMIs3A5JDnePlsfeYPG5HmUQwrb7VmQy+9U12XaTZflXOGP9SuIw2PBvK4RQtaU96ANtHuPzvg91s7cCbcH7s5WjXQtyThKz1+niHKhzDlTOIxBs+Rdf9p6kt5PRJpYeH49ma+OLSJRn0o0xHAejIglspLPNXsdKVPIX4//SJtSeZS1LW1YmWjGihEOzZlkmy7K0PzBOtmY2RVZ0evoNfwS5qoskhE1dvVeVlSofmE3KKSZ3w/H5csrKKUnwH9lbUuTnWCKCMLa2u7f3VxQySOs9w74IHsfZdSOtzfhR10MKBjvPVuRyWsbUE0RCCyaGswoDOw24kZlNjh4UyT7HGacDRwH634KCAeo2bDv8bmc2dCF8CgWrEkWBTwaKJ4DP9Q58rpeHs6H5XNcHWnv/mOtZJWckiW48kQ96wpi7OHecp2d5ddaSWSNx1KYoG+NwFPmL3jZR7C2Lz3EOANecmyJN0LJpNCsWxPwtIor2dC/sYeq9BiZRbGDayLzGZFIaDlhsO0pPyge9yBlJKsorL2FJzCVQtmpptTc9qlUPodWeEuNIiqTxM7xYS2zYuKBQNla/i/ZODk73HkVkBvztdSntsaBwUPj7UcQbCuBBg48JRbDlKLXMzVUy2pyQJGKYqCTNBxEKMc1LvSavc7LRoFCkjfAus8rU1zNpX1d372klRoUsVVNEIikiFxBCTZl6Lvn17HXUB/ePOTUBxa8AKvUOrTkz9SAnJCkvV45hSWM0ieZWu1uT4kaGdKhH0EPdbIYBIDLKd0iGkmaf6xwObFgYMm5l+LLV7k3L1KgPkd9/kABbzTg01rpts9udvo8zaeBA5IQkwMRByaVw0OQ/QLZD5VOqSPHvt7eiqjzjzbWArfERi89pBQjvZBeRJ+As8FzGm8UCjAm613YGRV44vWn6jGzuYeVIJ4H9kny5oWfNBk1h8it2qSK9xjTwPAdBpMnY5Lu3o/NUQ3XFz/BtsvYWkT2oIQjdn+lNBBMTIeEgDHuMlre7Ed+cpeVepOumWjzKOknClqNTqpIFXG5rHxBmPx7IOhgU48XxvsMHVIuHuLFk9YDaYW40H8KVkqXkE5Hp/YpIiWdbrZ4PMrkBbQGYPY7ZyUvBaajI36tFkceZ51azz/E4ZRtIVCZXq1sJZS0hhCZdBBQDKf7xfUEAfjFtwbRzKHdJes3bAsqEhXKsw6AoFJ0xaWbfIjLC+q7u3oxziJg9DXUazIskLkvkqZkyKAgAexcYf97qc5zvtzXdFq9M1klCxn/RXOtxw4biVJlyJIkmcDk6SZHtq6t2OBaPD6XZzH4gRQ+JYo7Goo1rW1ZERiAl5DitnqXJIBg/X8ueE+qa82oW1ZwWjYKZ+H5CvI9lUTjht1r9zkq/1X3FwDK5mklotogbelTLylTtaAf5fyTNkgTAr521ZNZz2fKPJqIcsNg2s6xUfh7vPisb9ywijF5VqCeiOPNi6qLJYfa4GrjEDtVYvKy8fBS5bydfbgYRk1MTLscZZe3AGSUnJBFC/Qd24vgkEZBSH5FATNWwRz2+xDiSMrUem0YT44J2bacumWodb5x4C9ZPQeqKG+WZ4dNgiB3dam/Sbac1EGQFbFAqdEkOoPLdWCqSMNbfJAr4zRav85PmBvdmY9ickOTrni8WYEe7iczLB34nQKT0ORcAIzT2zmOQ+W8kkiXTQTRI3Vlmr3MRB7i3qNCnBRRxxG0bOtfekErc0YLIYlAlxRzQJwoDVKQqIkJSKfR3SODA4cF6j2tFNP5ybkhCHc3ic1yGot4jg1sFSVIcRMCBrddcGTLf6nWu8ze4H9bVyBQINLgbaxfU7mGoqriAwg3hqZQPvAjK0xhObnRTtmypwntlu1Q+QTni9V5LKflSFuLquDhOq2Nkid2Lx7BolzPbrRa79zGzx37EwNTSSJzdUl6sivfDmQa1gWPZByw+V2WzrfHWNJqaENGl6mvNS8z3cKPxPGz96SxxLNttGR8IJIe6qeuhaB6TrICiwoyZEjaSTcvOTqV+lAIoLSTy3zkEpRQrJR7KGUloVxXlyOMMSvmyLRaxjOidUikOrPW8a652fMPi+MAnAP6v7BaLz7lH58a1Z2Vjiu/XnkgKt0vqX6z/o1xeeizWRmT5WTbrxdCg7wAAIABJREFUGIZAUUQ8iwroswG79+VsRz2h1HDV1QqlFt8rzVt0btq09hUN5RLGZhPAaZ8udyQhkDfZ7Eaby2gI70FEbK+A1VII/mT+zeRMZfU7cQSBc/TUh7PUiRXlVTNQnjw2mjsjq4i2mUxq7iZ3ZGTmsVjrL/HzztmuqwARQha8xgTzhFT2r/b2plc2O5Zl2aPU7HP9lkvsDpbEzUIDnk81WFI/lEeUJQzJirKMnTa1c+6ZSFv+WFEdKMbF+HFPfJVIFSUUCOLRZNd1dQdvLTEq8cINpcKeKE+SQ86NPR0bbtCyu58OoglKX+ecn1fvaZiOhDlIoNwMkZFpawjc0C3IqY28LZnaGgxubOkXf1m3hpAalibLT0Ay/JUPENHTgBrqDd6UqhBKBbQCm6x/caYYD8qLj3uzs/nLGq+zrgJ1B/x4BI74tLyalCS08YQd/Y/kWJNGlQpedwUq3cfiiH9Jq937TK6CoEXv+3r0dd30punlI/h2NZyzmcDgAOxk+2BbaFWmkJeT1+E/8S428D9hYrDQ6193f/lWvtJRhEf0irILQDaez/RF3IwPIe7S5FvC4bRURfCZHJC3aCnRBDlHWr3OU7Bxt1JwiGZrozvZNd93rLpxTPW4OWlv7gGbhFr90yav4wKs75qWhqZ/5TpiYNT6tDn6CmOmz1GNv/weKuNTeWQPiHzaJ7HIkmZlLtsTBZnvrMbe84UQ7Aus/3N8CJ9xpn6ysSv0Xi69+pIhrJhXy6ehyEOrh0k3j3Xgv993BC9NVcjit9uASRpiRYspeQ9O529w34/i10tMMfyOL+DeZMEcyDar1m8/wsAk8mRLJ6xnGDga7IuHhWav4y2cWW7p6Fj9bDbsvrQimkmrNfrqh9oFtaVihHF7hcP2IMvVQqhVAHw0/jgVqDmWYuPLcTZSAMIiXMzvJYjsNNJ34ZtuEIDyt7oBr1mngugQeBRc/U7t3fTdsjnL1hZSONHZPsf2BoDTxlQrFAtNb876ZPhOhNjP+1KQJwIF4zCbHCnFsQhg1JBEcCTxCw9XU2PZvORlyV2z3m93ykwiz8SUeywpsDcH/viY6vE3WXyuB4MQejidgATZRFRn+jz6yg0KJCC1CUVuicMpRuBHMv26Zip0qEKdE7A3pUwEa6p3kJi1f6pyUfQMacDsZLm9Y0Hm1eEHDNCII2s2wu+Mx5H5SoVJFGjOh53o8WDnpn8Ol4iCwwl1fvtERUhkrHosEiT1HllaEF/1BoNz2hy+d1KVxAF3qgySxlkk7I//zZBHldeKlgb3p7Xu2gMMSsXf8aMjS7fl4Z1czuwoF99r8TlfwsfyvNrVvTibm2LbGmiPAyRxuGAwDweiGpbYQypjUFAJ0dM9r80V+DpV2YgOpJCnq9YszVTBO8OGJARagkQ95kBzleMifOxXMx0p3zSgNBKjGH4hlZYGrT4Xhb1ZrDLV09rqfVPrrLctgsJHlZZWmjiAA9kwFyS2G8slMyIIoVZ2U+cnHVdric0cdb+g3XtdGQZUIXK7mZgLRBX9P9Z7XItlSdyPP0ZNDqqR8Rc249HMcZpBJW+N1e9qxVErEAqxtq7POt7KR9DsQoVpsakSjCUzUKOsw4+WivIq+g2yrWMkwztMqKc025qWMVvqwmFvRq/jQabfvGXNpk/XeocdSfpAO+o4OswyVTtOxhGL9lLG5rA6WoE5HOs5XJYYq5hS1YWkeRNHsleQOG+IYPCNtT98+14+V8zyhRqvc1Q5V/dmTNqXCTEd54cZONOSvdNQ7PusE0xcv2bN13dofdbhGcRrvwff/lZ3bYLdT4PhsCUJITqr3DtryaynSgwjz8efjcxYMjFl0AoKUzoTlf+Z4Z6iyGxM9fheq9/5Efadd5E8H4IQnwiufhwKSR+3O5u+LqQl2IGYtmCaoapqh0kAfAoIdYpgfBf838jebo8KDjuTh0+4YNZSXOnGJnym93Ru7L1BTxq7yY/aSswTHJST8Yg06lyv9nT9md4Ma5L0IeqdeGXNItsd5eXyOTja0RJfVZ6boVCkDjzuEe5L5BHKJEYzD071GyOxgckoEGhTbzWtmgghVjOVf43KzppQqHddryyvfa3N82M29B8yMZd2GT1SCoYqFYVXgYBqclMQnI2HsOEo7IDt2IF8fpDgtAcV8aoAXkimAT8gOR4MqezWPt8OraC9mAkTwqk+UgSNSAChXhk1bN06SNKH6Chz+fSm6TeM5tsdj+rEGdGOO9Qo6yNQ5GNEqSXXauqa5M0gS0pYqEf9R6AoR7v2P+J0H94sxMK0YdgDEV9xFfAXFNSb8TK6A55TQIRj45JJB71GokgYCcqt8L4qw6/+BCggOvTHJ/gv3r1BwENRSw1dQH11ppFzWsVKLx+NYN5Aq/fOPn1nqyJJH6KmIXejwnaP2dNgwQ51UjS71nCI5k49tyL8gv4ntxz7rxxBbIHhC9IxXkRyPIwdtDGd2ZT0D1OV42KcvSlWdHorn4J93hvq/E1s/VslSfoQ1QNop95PiUxHjFDmcRBHYY+i5JxbbRapYQTsiGIpDmLPiO6uZ/rEGy0rVgNBm4TmajuFrc0kiMd3QmVzKftA7MmtmiSxiKYRo2XABym+sCSVH8qBUco1MvoeDjPM1gKcMUQLEmNhd3fvC5mGGZq6ZKpxvGHSRTJIFO0zk99xdW+w19Hm8L038ItthiSxiI4UYcKQaftIaYyVA7hQsbWj2JIj04ltGIJ9LIB5hVCXqBu6vNky/zH7HIcjQW7O2FRJsPdFqBtnkObP4n29TZIkFlH9ZVH0xWr99h1lAVZgvB71aloZIWVbf3rrbRco4oqPRNhZC1pDEPK32bJrRGr1OVCk4jdw4OYs3O6Frp4fjk8Wv22bJ8lAkNUxHp6IvsK7y7y0tAZ/+Bk409QgcfZhEXfd4a8qZwerkBVv4vNZgY/klc7O3lf07GXogcVvnwFMuoIBz0YCpk6migsDDs89qfawiiRJgaihozv6CoOIw4wle3MOe+K4uTuAwNkGKKuX1sAVwxFrkAjvCQHv4vDwHvard6C3+63NynaOQO4U9fUNcwH4uUiQNFT6uHipu6f39HA0eQ1raEWSpIEocZpZjPchgXI6yvLIXTlXpwDAJGAwUUScxXaCSDBuMm8p1BmI/Ndpw44U6c+R/F8Kpq5kID5SN/V8lG+r6HDOzdLK35pN9t/3i7aTGT4QqrgoNjqjFhRJkkVE5dpXo69BoJWYathxnMHAxzImjUG5fSzOQmMgkpZuNMrwlfi+XESyhFUAHUV4xaYEqUV7jbRszWNeaswrNGDzcSMwsVGEPRbFBuxo64A8FhlbDyrrEBy+D4XYt5Lo/uaLVfxrPRmQc4moSHVCRXkV5bVMlsJDDz5F0eqmDZ+u/Vs6hqlFkuQR0cAKn7NceiEOQ9BiiUHAUahrnIgEyWY8s1eRHH8OtAWfDaexbkjvJkWSFDEkiBLjlwyAYhjMxtkvWyuIFGr1uWAI7m+1N0YCdadJjj4USVJEXkA+HRSfDHW1uSj6HWigSCXZIwaJikvw9eyGzo6F2Y7gWSRJETmDudE8jikGMwfuMnsdc/DUDlm8Pe29NKGO9VLox41NuYxPUCRJEVmD2efYlQuoE8BqgYGJG0qyEbSDEIwEzxPLVQFLhRAtFPMgS/dOibyThAK1QU9Ic5Q+Awt1J1qLr/fbd5EYmxgKSe/r9TcoIn2Q6FTXZP+JRGF5OJsuGOwLjO2HM0b1YHN8XehGfWIl3o/ysH8EqniXgXh7w8Z1b2VbhNKDvJOkhPGHwci1pvRCyJSKOm5QY0lIJwKwS8mxyepzfY6/zstCsJdDKlv+1Ve9bxbKsubWhp89aykXAkaGQPwgqew9JMo39NzZFhP/8rCfixB9OkcQdREK3LAJQFBn39C3FK2C+FZV+eqent7/rTi4+ZtC9ODcesStSEaqSUiaXxFpJk5Qei1+19v4Y71O8W3x2b8pOje9VYytlTmiERKzHrW/UILoDcTWQ5LBUKLhTUkUYBIlBRpRplr9rs9xRKMgZu8Ipr6HI9uHQ7GjXMTwwdZMknig6X8yzjaT8Xho3wqkVFrKkDzfMsE+Ekx8grPSZygKfIry8GchAV9907vyq3xFWC+i8LCtkSQZxiI5xgKD2vCnMH8gHCdkvHES+Z1/R+E08RwFcPgWiUY+KZ/6re57hrLRReQeRZJoA0lsY/EQju0Fm0PrkHk4K5JkK0eRJBlAMMjbWn0RQ4ciSTKBYJ8MdROKyD2KJMkIanEm2QZQJEkGAPJTKGKrx7ZGkjd7g73HZutmq1axj7N1ryIKF9sUSchbT0s2pCKKiMU2RZIiikgHRZIUsU2BghFGY61pRpEkRWwzoKB2o6Wxz1o8LmezvXFQONNEKJIkh4gE6ZbswPiOzbbGvyQrS342pQJcgrO9UHnaDgC4oFhXqlixZm3w36lyk8cD+X0csNiyo6LIu0kcxolwVBZRAirbKECsJ9u0zk71w1wFk9MKSvhZVSVNwH95JyHUkRx4Kf7fIRXERgDxbXe3+sXyuc1fpWtGT7laKqZUns+AU0Y0BSR2Hz4bs9b7FUmSRVDo/9rRjhpJEnMYA8eokcoMFnnGal2TrbHN4Xt/4DWRjLDydaXAT6OwQbFpFMIHDmxMtfJDvcfV0GpvjBuqaGAbTNUOF157hNnrcLJIvK8t96O/fEvyhopyiVn9zg8pJ4cA9e8tDb7WXPt0mJeYt+OK8RDBwYmtqMH/7yd9zQOIuqBwMj+NtLHEKFEipPUWv+stYKJFDUFzcN2Gpe3z2jclqydMjsmVR1TsUnUFfoyN8Vxf73H8jkXiQadEkSQZAjvveM6ZE39Tl7naQamzq+P45nFZUk7A40WxJ80+x77YQZ7Ft7ukqKa0C8RHyQpEO8TJ2IYL8eNEff8F7IpN3hWYdJrZ43jf7HPd1NrR9Hg03V7WYPHbTVjH+dxYciCLJCDSg1FY3sTILVhilxuqK7qQ3OTo1aYK8RoXsDIUCvVIMh/JBPxUANRWTKmirAFxo2ri73VTXVPdiwPTLMRDkSQZwOp3/VOWwukbUv7eAOznLIYkFq/zMJzyn2KRQHTJIVhLsoxPJGujOPFIViIdAtsNx/K/IdnOQRKfGLA1vZ7pLSl3iMz4nUgQe8bt24ISbKwFjxYOEZ9hiUe7szYX4ipZLr8Nj8ekKlgkSSYQ4rMYk+BU+Cnl8Vtqa/oGyfVr4EAJL7U9fxD/jneadA6Tx3EpiihXa76XduyNusFSq9d5tr/BfX+6N0ER6VSZSZSgs+BywOAPdzS277Fma6M7WbkiSTKAECyAFDlXa3kjY3uZvU4D10MQqicEiwaeC+seHvv9WP+JWu+TBowol9yHYs3OgQbPlXp0lUjudPttqPuck8P2ZQwQ7K7aBbV7JdNviiTJACEBK/Q8QMG4HfUXygys57IPmu2Ng/QRczXlJodcEiQGcDnqKkSQK7VegTPcjXgoaIKEAWyKUlV2HL67L1GRIkkyAIUxQtFpDYtEi08JHPUvYDoj7ohocqFY4Mh+Cd7mZD33yRjArkDR639aRC/Ut45CcfLCfDQrc4gHWlpDDyXL01gkSeagUV4TSVgaIalQwulHEpPXWSdxuFbvfbICDnegMv9qMmU+vLxrLLkrn81KE9/g61y/1f00syYvuK2RpKTWbUs7quBGWPv1QJMGHOlXYs+fmXnT4mJdW1uwrS/gczSJJmWYTed368LWvoE8/R4bXYV03Y/pV6aNqMw/he3YO1FgDG40Xsq0DxoDsQaf53/xef6ARwNElrJpxS6deHe0GjiC9U/l14n/+8sC2IL1wW8f12qesk2RhEIMGRQl6X5DMhhYNQXV+1e/k4J9lcO0PEvCKQOiQILMTyOJJiqk4rqu7h/vis0LWP9i/QhpRNnvsOm0Cz1Sx/2mjjNMOh+P1w/8osbrHFXB4RSd7aNnGFBVdlVre1PrwPzts5bYdjIalNNQVJ3Pwmsfmu/56sovew/ecUelShLdRhESG1rntn6fzkbpNkWSnADEdxkmrwpHRBdMtAshVnOAUvyBp1NKAiHUzaIWZdEqMY68QOe9NwgWcjVbPUsHfhEN0nc7ik9unB18TEcqO+ywF8/0Oe592da0JvZ8OYh5+G3qfZ9YCPHnQKvn/DA54uyiRFNYX1bvCe9JNeL7Km2NZA0TdpaOarY1Prr5XJrB74okyRAUqjPNBAI0oj3ULdTLae9k4JfTm6ZfIHfLm0e9EuOI/2P6Mz+dHo8gsUD94l3Uc45BPadJx30rShicySKz0GYAcJfO9vkDds98LaM7meRY/K4TcDjSnMoN23MVX8CfyNRyoEiSTMEhnbCpm4Qqjm1ucP8jUYFYeTmy5+A4VWcdrwYamp7QMnq2NLg9Vp+zkVEue40AgFOxA/5hQAfUp5sJmj+0iz/N1sYXrT7XcpwlDtB4yU9M1Q7S6JJuFqZCkSQZAn/hTp3CVjd2q0MCdrdX6wX1bgflk5+sqxZVPKCnAwrBHkAxSs9MsIO5qoEWTsMzEPlpjJbH7qTj+u8Cdm+bbhEIBA4soJUkyCdBdmJFkgwlsB/2hOMMawT22jsD9kbNBCFwKSzr62pXdzCoq2OsV79bMpqP7WG0PqERgvHDWZQk5XL1GKavke+ko0QLBm/p22iC6XrrGIgiSTJHMHWRGAimyysuAnDovGBlOEe5DpB4h6LMGzpEGRS5hKXvvSSgXA9FhBBpBSgHFa/TMShhm/TMbnFRJEmG4JyWLKWc3Z+MIo3A99B1kRBpBbugFBXY/TSTBHvg7qbFpspoRH5dgwXoWc6NASpARp1PW99qWxwUSVLgUATss9lDSiuAaXZNHYAPdZYHMJQSgdtZT89aZtSxNwkwSWddYXAQu+gUPZM6ZmlBkSQFDg6wdxqXfZFWZUL8j2m2/I+Cs93xb3vr8tY1ZpODslhpHbl3P2CxbYflc32r9VUITl3FBfta3/0HY1sjySeoKt6Y7sVC8Ley2RhNADFFr9KuChE3x2TK6xj7Rq/gyKPuwbSYa/G73sGWztB6aWmJchYeL9NaF5kUGRTll7oaCOxtXeXjYJsiCcrc3wRsjZr8mgsHoF/xVHlaJJEi9k66IPrt1As/tlcrSWjSOt/scfm0rPbVumurFKXiGaZTlxGq8OgpHw/bFEmGKcbpvUBl6aygMdYTCv5o4Iqua7CjV26uNxh6TpLli5KVHwADl9hii8/5R7Wr6454KfnId798cuUvDHIFSQCTdDWOsbWdm9a+pPOaQSiSpNAhwtlsdYFztSedqiRJ1n2dEGLzyN7i8L5m9bnasb21Om5hAICrpdLSS61+1+t4v3eReD8IwUbicULFlCqamfQYYMY0jt2bjdTWRZIUOkCU6tVJKGpIOlUJAfr2fNjgpVw1FJzPZbmd6V8Xp03MmUiYsGmL3vWDOPh6gxA3ZXwXViTJMADk7TeS1G6JSTq3LwD67ZoHHN7lKD5dR7NDFpumF2pIFScmizCjB0WSFD669F4gSZJm05JY9DJu1H2hEIOcr1rsnmvNHns1EuisdNqRKZC181sa3Euydb8iSQodgm3SrZOkuZstMdB9nQAYROKoTdbZVq/zfcbhZpaFXW+NCGGLzm22uv+azZsWSVLoALJx0qmTCP2dPVyVzHVfByyxDZa/wX23yetcJHEgv5Oj8aVv6UwfvhQs9Ntmq8eX7RsXSVLwgK90XwFCr3NW9Do+Ru81qOwn3TFHsYd2/0+Y7XNcbAQ4Dmu5BD9XJrtGJ9bjbHvH9x29f0onqLgWFElS8BD/0zuTgA5X3P5VqeMY6HOzBGCrUpWx+O2zDYyfgaUPZuku5/YHrcItQ5nuqe7uH56K9d3PBYokKXCoAv6rxzKcAABj06uN76D7EqEOipTfByTHDBDSbQBSrU6eEwleEELQUraM/89GrGidYLAShcn/dKr8tWytXGlBkSQFDi7EW3o3DVAESs+HAthPdF4huno2/DfeFxa/83Jg0tV4T337JUIs7A0FL46XpmKoUCRJgWNV78r/jDdO0mNdS4P21HTqAsH21DnifxhP1KEIk8DgOp3V031O8tvcz+m8LucokqTAQUHgrD5nq54gDdjR9+HXcD4whlUyhAPfGSftp6txQgxaSarz2ycqTLomXvGkt2LsiFTR3YcKRZIMA6As/hIO8HqCNIwy19nJD+UNrReMM04yM50RHYUIx8HqB1lIxyBJ9S71bmxZ06TL7z+fGAYkgZymJhsO2NTV+0xZqXIL05OugYeTC2kmCeI3OpvVsWbt14MsbFF92l/nfQhl5mq7B/WYRhBiI4vYkPV7qSB6APhGEWKdIdG7prubrc5XrsfCJ4lIN+7e1gPy3rP4XW6cTeZqvQZ1glNqFtX8SYsVrMVt2RkU41F62oQj19Nvz3t7kCElnq9KzzYRLHidhUH8NFV9+RNBovcKU+RwpjFa4XoPa21TQ7Cktb3Jr0fE1Iq8kwSYkPSs+wtgWc3bN1wBQr2FAddMEsS4ivLKOznnv0sWuod0F7PJcTfTJ2oF8Za3JfhOt61ZBhjFwgHxYCaX2Pn4f3xp9TluWdXzxX2JAnqng/zPJAC6lgSRVNv8TELw25r8Vr9zGT6RWdqvghNMHrtx34W2M14/zLdu4LfTFkwzmCIEOVhnc55oaXB/GrdGJj7U7YeePeyMA8lfxhsnnWpqajiW/FuycdOhELd0rpsXZ5I+oOR5DjAJiaI9+jAA/GbUSGUOimuP40cfqOJrVcBILokZY6rHU5rmVJl/B2Jdt1AvTthGlXmAszN13jPb2F2S5TYUx47zWxszXlLOO0lw3pd0yqy6HYG2VjRbPa9Yfc77sOefpvNS0hN+z+gVzo9OSE9zEEI9P16A7z50frp2ccUuVZ/j7SelVUH2QOLj02afQwRsTQsyudFQzCT6lhnT9NfeWtHT0TnfUF1Rh2+n5btu/C2ebLY1PZSszIqTV/TWe1y/liVGARjK89S0RJA48MesXucH/gZ32lFThkJxH61zFMuJZedwBWWJrffbfy4zqQ0/6re1ShtixZo1QU2R7VvtjS+b3A21KPLcpdPfPRcoFRwe5NfwWemufA3BTAL6zLghrdQGWzVarZ5PcLQ+MDpap5t6TQ/+q3Z3H/T2vIDmAavF6aUYZXWzG22TDAblYBwWaTefgldTpq68zjAUC8xUZ/85vk2Y6iIZ8kqSaJ4NbZmK+pCFCHxbI3C0ftPicc1CJXlxGiniNANFrBZ106bD44X70YJo4O47Y89R1i7ZWD5OiizhVqBUVMFUUQq0qMNBwvcKjv4GEGoZDpLbYTffkUXESwqpmpZrMnA4gw0Hkhyw2EL/rE6dRF2Zo+YMe1B+9xqvc/8KgNvx42+zfHsUTcSfOj9eeyXpGdm8cdQoUrcPSDglnjLiYCTSeSwyM+mBaabPUT0whZ0W5JUkBoO0j95ruIC4pthFRBD1qzjB7HE9waVwCNd0zEL6AWcPXyjELmq1u19Nlb45n4iS6ym+gD9jrrY/QPtAOi6nODC0x7QoZckByCtJgHG9eTY2BNZ63k14PyFW4k3btNcPaaUkSAY1KNZLstDcBuyC6QWzTgEKFYri7AyT12YFJp2Epw5i+rwAyQ7qBcFCD9BSs976UUfaR5JYnZayoIp2f4Nbj11ZP1AKutoFtWcYqsudUVFMEzgLp7AoXJJMftRWMnGCoss+CNGWLCkkPuj78XB/Zi3LDNFd3fqhbEMfouYnZL7u49fYZHO9VCOA74dTA0V+3wlHiQoQzIjHH4UQPwCwL1Co+iikhl5rW+p/IxO7J1liZKaiad4JZeF50Sqfxed6Ev+HC7Vegw9HM6FikTeSTJwg0waYLt9r/Kf+naPmbPWI5n9fFn2lht45PgYk65cCN2stv4llHumdgAR5U98VoiKdevJCEloGNBoUvY443aK765mcNKiIrMJAeQlBu6nMa23BTtaQeb1CFSroSg2XnttFzkkS9Xh7Gt+O0HMdigNPBuYE0kohUER+wUFsr2eDeEa9REu/uleZBgIAdK1wARNp7bnllCRkhm2qtz/M9Ob3JnPrUM8fctGmIrIP7Ky6IjSWCCAFf2EmdU5bYKsYU60cp+caIeB/6dSVM5JE/BTs9+Ij1OvxRm6hf2p2NH+Wi3YVkQuAPtMhDhfyBXxRskWZVBhTLd/BdOq4KkWeSQM5IUnNopoyc739MXx4+lJ3RfDamo5V12e9UUXkDqr4WE/aaCw521Rlv3/agmmnxfNuTIbIKikRRNceCaFr7drgyzqvCSPrJKn326dWlFeiDpJWkvnvRLD7CL0ProihxYZP175ZMaWKZhPNq0coop04pnrcTKvfdeP3a3r/mSpEKSUhLSuVfz5xgjKf6feBIfHk3+mGQc06SSQmkadbOgT5UQ0GDwkUxaxhBzJbwc7+T3x7rL4rgTb3HkPdosfid72PM8wHKGqTjVgXADMIIch2ayc8P6WsVNmZpesEwyiIOLs93WuzTpIeof7GCJzW5vVEA1wfUsXBLQ7v8my3p4j8INQbvFVS5GNYeh3ZgBfthce9YoNVQhbSXRGQeC+2NLh1WEX0R9ZJQl5rZp/jYA58KYtYeSaHYJ+rTD2spaHpP9luSxH5A5nGW3yuB7BfnzLUbRmAjl4InZ7JDXKiuAdsTe+aPa5fcolRXKZkgcr+tWFj74n5ip9URG6xpqN3PopO5GT1s6FuSxS9KKEc1d7g0Z2+IhY5WwImgzuzz3U6B/ZAnK87VEFWpk0PJQt3U8TwAinGFrflQFCMAaZP3M4FelShHo0SSmHncQ/YGh+0+J1TgEFfbu8elK/u7untvK7d2d5RDDu39aHZ2fxlrd9eb2ASbRbq9fnIFr4VLPTrgC07Wa9ybpbS0uK51GyyjxUCvuvu6f3rsjm+tHY9ixg+aLd6vpq6ZGrtOOPEa3CAPJdBy7cAAAAAtklEQVSl6U2YBkgqeULt7pqfTZOmnJMkan59Yq7rKaKwEI2geHG93/6AJKTzUKH/LctdglHynHwBxasbUR9+Pds3L/xYwEUMa1DQCjycYVpsuhxKSg9DHZUCeZNZfaZ5E38QgjWDEI3dIP6RLBZYpiiSpIi8IBpI4hF6UUCQek/D7sDYdGB8FwFsMp7fDgSrZkCRVISBcgGj8NSDn7tQhurAsqsEE1+ByshT9e1AW/DtqM9MzvH/uFCgxBI9EGYAAAAASUVORK5CYII= + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.9.0 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - "" + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - apiGroups: + - "" + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - "" + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.3 + version: 1.1.0 diff --git a/Openshift4/artifactory-ha-operator/config/manifests/kustomization.yaml b/Openshift4/artifactory-ha-operator/config/manifests/kustomization.yaml new file mode 100644 index 0000000..63ca74d --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/manifests/kustomization.yaml @@ -0,0 +1,4 @@ +resources: +- ../default +- ../samples +- ../scorecard diff --git a/Openshift4/artifactory-ha-operator/config/prometheus/kustomization.yaml b/Openshift4/artifactory-ha-operator/config/prometheus/kustomization.yaml new file mode 100644 index 0000000..ed13716 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/prometheus/kustomization.yaml @@ -0,0 +1,2 @@ +resources: +- monitor.yaml diff --git a/Openshift4/artifactory-ha-operator/config/prometheus/monitor.yaml b/Openshift4/artifactory-ha-operator/config/prometheus/monitor.yaml new file mode 100644 index 0000000..9b8047b --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/prometheus/monitor.yaml @@ -0,0 +1,16 @@ + +# Prometheus Monitor Service (Metrics) +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + labels: + control-plane: controller-manager + name: controller-manager-metrics-monitor + namespace: system +spec: + endpoints: + - path: /metrics + port: https + selector: + matchLabels: + control-plane: controller-manager diff --git a/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_client_clusterrole.yaml b/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_client_clusterrole.yaml new file mode 100644 index 0000000..7d62534 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_client_clusterrole.yaml @@ -0,0 +1,7 @@ +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRole +metadata: + name: metrics-reader +rules: +- nonResourceURLs: ["/metrics"] + verbs: ["get"] diff --git a/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role.yaml b/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role.yaml new file mode 100644 index 0000000..618f5e4 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role.yaml @@ -0,0 +1,13 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: proxy-role +rules: +- apiGroups: ["authentication.k8s.io"] + resources: + - tokenreviews + verbs: ["create"] +- apiGroups: ["authorization.k8s.io"] + resources: + - subjectaccessreviews + verbs: ["create"] diff --git a/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role_binding.yaml b/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role_binding.yaml new file mode 100644 index 0000000..48ed1e4 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: proxy-role +subjects: +- kind: ServiceAccount + name: default + namespace: system diff --git a/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_service.yaml b/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_service.yaml new file mode 100644 index 0000000..6cf656b --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + control-plane: controller-manager + name: controller-manager-metrics-service + namespace: system +spec: + ports: + - name: https + port: 8443 + targetPort: https + selector: + control-plane: controller-manager diff --git a/Openshift4/artifactory-ha-operator/config/rbac/kustomization.yaml b/Openshift4/artifactory-ha-operator/config/rbac/kustomization.yaml new file mode 100644 index 0000000..66c2833 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/rbac/kustomization.yaml @@ -0,0 +1,12 @@ +resources: +- role.yaml +- role_binding.yaml +- leader_election_role.yaml +- leader_election_role_binding.yaml +# Comment the following 4 lines if you want to disable +# the auth proxy (https://github.com/brancz/kube-rbac-proxy) +# which protects your /metrics endpoint. +- auth_proxy_service.yaml +- auth_proxy_role.yaml +- auth_proxy_role_binding.yaml +- auth_proxy_client_clusterrole.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/leader_election_role.yaml b/Openshift4/artifactory-ha-operator/config/rbac/leader_election_role.yaml new file mode 100644 index 0000000..53e9749 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/rbac/leader_election_role.yaml @@ -0,0 +1,25 @@ +# permissions to do leader election. +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: leader-election-role +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch diff --git a/Openshift4/artifactory-ha-operator/config/rbac/leader_election_role_binding.yaml b/Openshift4/artifactory-ha-operator/config/rbac/leader_election_role_binding.yaml new file mode 100644 index 0000000..eed1690 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/rbac/leader_election_role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: leader-election-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: leader-election-role +subjects: +- kind: ServiceAccount + name: default + namespace: system diff --git a/Openshift4/artifactory-ha-operator/config/rbac/role.yaml b/Openshift4/artifactory-ha-operator/config/rbac/role.yaml new file mode 100644 index 0000000..61e7591 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/rbac/role.yaml @@ -0,0 +1,31 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: manager-role +rules: +## +## Base operator rules +## +# We need to get namespaces so the operator can read namespaces to ensure they exist +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get +# We need to manage Helm release secrets +- apiGroups: + - "" + resources: + - secrets + verbs: + - "*" +# We need to create events on CRs about things happening during reconciliation +- apiGroups: + - "" + resources: + - events + verbs: + - create + +# +kubebuilder:scaffold:rules diff --git a/Openshift4/artifactory-ha-operator/config/rbac/role_binding.yaml b/Openshift4/artifactory-ha-operator/config/rbac/role_binding.yaml new file mode 100644 index 0000000..8f26587 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/rbac/role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: manager-role +subjects: +- kind: ServiceAccount + name: default + namespace: system diff --git a/Openshift4/artifactory-ha-operator/config/scorecard/bases/config.yaml b/Openshift4/artifactory-ha-operator/config/scorecard/bases/config.yaml new file mode 100644 index 0000000..c770478 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/scorecard/bases/config.yaml @@ -0,0 +1,7 @@ +apiVersion: scorecard.operatorframework.io/v1alpha3 +kind: Configuration +metadata: + name: config +stages: +- parallel: true + tests: [] diff --git a/Openshift4/artifactory-ha-operator/config/scorecard/kustomization.yaml b/Openshift4/artifactory-ha-operator/config/scorecard/kustomization.yaml new file mode 100644 index 0000000..d73509e --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/scorecard/kustomization.yaml @@ -0,0 +1,16 @@ +resources: +- bases/config.yaml +patchesJson6902: +- path: patches/basic.config.yaml + target: + group: scorecard.operatorframework.io + version: v1alpha3 + kind: Configuration + name: config +- path: patches/olm.config.yaml + target: + group: scorecard.operatorframework.io + version: v1alpha3 + kind: Configuration + name: config +# +kubebuilder:scaffold:patchesJson6902 diff --git a/Openshift4/artifactory-ha-operator/config/scorecard/patches/basic.config.yaml b/Openshift4/artifactory-ha-operator/config/scorecard/patches/basic.config.yaml new file mode 100644 index 0000000..0016b65 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/scorecard/patches/basic.config.yaml @@ -0,0 +1,10 @@ +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - basic-check-spec + image: quay.io/operator-framework/scorecard-test:v1.0.1 + labels: + suite: basic + test: basic-check-spec-test diff --git a/Openshift4/artifactory-ha-operator/config/scorecard/patches/olm.config.yaml b/Openshift4/artifactory-ha-operator/config/scorecard/patches/olm.config.yaml new file mode 100644 index 0000000..a39bfc5 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/config/scorecard/patches/olm.config.yaml @@ -0,0 +1,50 @@ +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-bundle-validation + image: quay.io/operator-framework/scorecard-test:v1.0.1 + labels: + suite: olm + test: olm-bundle-validation-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-crds-have-validation + image: quay.io/operator-framework/scorecard-test:v1.0.1 + labels: + suite: olm + test: olm-crds-have-validation-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-crds-have-resources + image: quay.io/operator-framework/scorecard-test:v1.0.1 + labels: + suite: olm + test: olm-crds-have-resources-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-spec-descriptors + image: quay.io/operator-framework/scorecard-test:v1.0.1 + labels: + suite: olm + test: olm-spec-descriptors-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-status-descriptors + image: quay.io/operator-framework/scorecard-test:v1.0.1 + labels: + suite: olm + test: olm-status-descriptors-test diff --git a/Openshift4/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml b/Openshift4/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml index 64b9f6e..3d68c69 100644 --- a/Openshift4/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml +++ b/Openshift4/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml @@ -4,47 +4,47 @@ metadata: name: openshiftartifactoryha spec: artifactory-ha: + database: + type: "OVERRIDE" + driver: "OVERRIDE" + url: "OVERRIDE" + user: "OVERRIDE" + password: "OVERRIDE" + initContainerImage: registry.connect.redhat.com/jfrog/init:1.0.1 + waitForDatabase: true + installerInfo: '{ "productId": "Openshift_artifactory-ha/{{ .Chart.Version }}", "features": [ { "featureId": "ArtifactoryVersion/{{ default .Chart.AppVersion .Values.artifactory.image.version }}" }, { "featureId": "{{ if .Values.postgresql.enabled }}postgresql{{ else }}{{ .Values.database.type }}{{ end }}/0.0.0" }, { "featureId": "Platform/Openshift" }, { "featureId": "Partner/ACC-006983" }, { "featureId": "Channel/Openshift" } ] }' artifactory: - customInitContainersBegin: | - - name: "redhat-custom-setup" - image: {{ index .Values "initContainerImage" }} - imagePullPolicy: "{{ .Values.artifactory.image.pullPolicy }}" - command: - - 'sh' - - '-c' - - 'chown -R 1030:1030 {{ .Values.artifactory.persistence.mountPath }}' - securityContext: - runAsUser: 0 - volumeMounts: - - mountPath: "{{ .Values.artifactory.persistence.mountPath }}" - name: volume + uid: "1000721030" + ## Change to use RH UBI images image: - repository: registry.connect.redhat.com/jfrog/artifactory-pro - version: 7.6.1 - joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - masterKey: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + registry: registry.connect.redhat.com + repository: jfrog/artifactory-pro + tag: 7.9.0 node: replicaCount: 2 waitForPrimaryStartup: enabled: false - database: - driver: OVERRIDE - password: OVERRIDE - type: OVERRIDE - url: OVERRIDE - user: OVERRIDE - initContainerImage: registry.redhat.io/ubi8-minimal - installerInfo: '{ "productId": "Openshift_artifactory-ha/{{ .Chart.Version }}", "features": [ { "featureId": "ArtifactoryVersion/{{ default .Chart.AppVersion .Values.artifactory.image.version }}" }, { "featureId": "{{ if .Values.postgresql.enabled }}postgresql{{ else }}{{ .Values.database.type }}{{ end }}/0.0.0" }, { "featureId": "Platform/Openshift" }, { "featureId": "Partner/ACC-006983" }, { "featureId": "Channel/Openshift" } ] }' + masterKey: "OVERRIDE" + joinKey: "OVERRIDE" + postgresql: + enabled: false nginx: + uid: "1000720104" + gid: "1000720107" + image: + registry: registry.redhat.io + repository: rhel8/nginx-116 + tag: latest + ## K8S secret name for the TLS secret to be used for SSL + tlsSecretName: "OVERRIDE" + service: + ssloffload: false http: externalPort: 80 internalPort: 8080 https: externalPort: 443 internalPort: 8443 - image: - repository: registry.redhat.io/rhel8/nginx-116 - version: latest mainConf: | # Main Nginx configuration file worker_processes 4; @@ -95,10 +95,3 @@ spec: #gzip on; include {{ .Values.nginx.persistence.mountPath }}/conf.d/*.conf; } - tlsSecretName: OVERRIDE - service: - ssloffload: false - postgresql: - enabled: false - waitForDatabase: false - diff --git a/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml b/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml new file mode 100644 index 0000000..6373d62 --- /dev/null +++ b/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml @@ -0,0 +1,374 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "charts.helm.k8s.io/v1alpha1", + "kind": "OpenshiftArtifactoryHa", + "metadata": { + "name": "openshiftartifactoryha" + }, + "spec": { + "artifactory-ha": { + "artifactory": { + "image": { + "registry": "registry.connect.redhat.com" + "repository": "jfrog/artifactory-pro", + "tag": "7.9.0" + }, + "joinKey": "OVERRIDE", + "masterKey": "OVERRIDE", + "uid": "1000721030", + "node": { + "replicaCount": 2, + "waitForPrimaryStartup": { + "enabled": false + } + } + }, + "database": { + "driver": "OVERRIDE", + "password": "OVERRIDE", + "type": "OVERRIDE", + "url": "OVERRIDE", + "user": "OVERRIDE" + }, + "initContainerImage": "registry.connect.redhat.com/jfrog/init:1.0.1", + "nginx": { + "uid": "1000720104", + "gid": "1000720107", + "http": { + "externalPort": 80, + "internalPort": 8080 + }, + "https": { + "externalPort": 443, + "internalPort": 8443 + }, + "image": { + "registry": "registry.redhat.io", + "repository": "rhel8/nginx-116", + "tag": "latest" + }, + "service": { + "ssloffload": false + }, + "tlsSecretName": "OVERRIDE" + }, + "postgresql": { + "enabled": false + }, + "waitForDatabase": true + } + } + } + ] + capabilities: Seamless Upgrades + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.1.0 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: '## Overview + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift + cluster. + + + ## Usage + + + An external DB is required. The operator will not deploy a DB but will require + you to specify the configuration values to connect to it. + + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + + Go to the Installed Operators. + + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + + Open the Operator and click on the provided API: Artifactory HA. + + + Click Create New Instance and provide the following parameters for your DB configuration: + + + ``` + + DATABASE_TYPE + + DATABASE_DRIVER + + DATABASE_URL + + DATABASE_USER + + DATABASE_PASSWORD + + ``` + + Master key and Join key must be supplied. To generate a new key for each run the command below: + + ``` + # Create a key + export JOIN_KEY=$(openssl rand -hex 32) + echo ${JOIN_KEY} + ``` + + To use TLS you will need to first create a k8s tls secret to store + your .crt and .key file into. + + Then supply the value of this k8s secret into the TLS_SECRET field. + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to + it on the external IP exposed by the load balancer. + + ' + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.9.0 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.3 + version: 1.1.0 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/openshift-artifactory-ha/CHANGELOG.md b/Openshift4/openshift-artifactory-ha/CHANGELOG.md index fc38d3a..4fe4ae2 100755 --- a/Openshift4/openshift-artifactory-ha/CHANGELOG.md +++ b/Openshift4/openshift-artifactory-ha/CHANGELOG.md @@ -1,8 +1,11 @@ # JFrog Openshift Artifactory-ha Chart Changelog All changes to this chart will be documented in this file. +## [4.1.0] - Sept 30, 2020 +* Updating to latest jfrog/artifactory-ha helm chart version 4.1.0 artifactory version 7.9.0 + ## [3.1.0] - Aug 17, 2020 -* Updating to latest jfrog/artifactory-ha helm chart version 3.1.0 artifactory version 3.1.0 +* Updating to latest jfrog/artifactory-ha helm chart version 3.1.0 artifactory version 7.7.3 ## [3.0.5] - Jul 16, 2020 * Updating to latest jfrog/artifactory helm chart version 3.0.5 artifactory version 7.6.3 diff --git a/Openshift4/openshift-artifactory-ha/Chart.yaml b/Openshift4/openshift-artifactory-ha/Chart.yaml index 9350d53..8c0c988 100755 --- a/Openshift4/openshift-artifactory-ha/Chart.yaml +++ b/Openshift4/openshift-artifactory-ha/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 -appVersion: 7.7.3 +appVersion: 7.9.0 description: Openshift JFrog Artifactory HA subcharting Artifactory HA to work in Openshift environment home: https://www.jfrog.com/artifactory/ icon: https://raw.githubusercontent.com/jfrog/charts/master/stable/artifactory-ha/logo/artifactory-logo.png @@ -16,4 +16,4 @@ name: openshift-artifactory-ha sources: - https://bintray.com/jfrog/product/JFrog-Artifactory-Pro/view - https://github.com/jfrog/charts -version: 3.1.0 +version: 4.1.0 diff --git a/Openshift4/openshift-artifactory-ha/helminstall.sh b/Openshift4/openshift-artifactory-ha/helminstall.sh index 5b7feb8..09e060d 100755 --- a/Openshift4/openshift-artifactory-ha/helminstall.sh +++ b/Openshift4/openshift-artifactory-ha/helminstall.sh @@ -51,5 +51,7 @@ helm install artifactory-ha . \ --set artifactory-ha.database.driver=org.postgresql.Driver \ --set artifactory-ha.database.url=jdbc:postgresql://postgres-postgresql:5432/artifactory \ --set artifactory-ha.database.user=artifactory \ - --set artifactory-ha.database.password=password + --set artifactory-ha.database.password=password \ + --set artifactory-ha.artifactory.joinKey=EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE \ + --set artifactory-ha.artifactory.masterKey=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF diff --git a/Openshift4/openshift-artifactory-ha/requirements.lock b/Openshift4/openshift-artifactory-ha/requirements.lock index f05ba73..4030294 100644 --- a/Openshift4/openshift-artifactory-ha/requirements.lock +++ b/Openshift4/openshift-artifactory-ha/requirements.lock @@ -1,6 +1,6 @@ dependencies: - name: artifactory-ha repository: https://charts.jfrog.io/ - version: 3.1.0 -digest: sha256:8cbd890dcfbb9c90b239bbe9a2fa6aef0f6131ebb5efcd32319a5bba819e9aab -generated: "2020-08-17T14:21:11.261071-07:00" + version: 4.1.0 +digest: sha256:8df1fd70eeabbb7687da0dd534d2161a413389ec40f331d5eb8e95ae50119222 +generated: "2020-09-30T12:30:08.142288-07:00" diff --git a/Openshift4/openshift-artifactory-ha/requirements.yaml b/Openshift4/openshift-artifactory-ha/requirements.yaml index e52e870..1e23270 100644 --- a/Openshift4/openshift-artifactory-ha/requirements.yaml +++ b/Openshift4/openshift-artifactory-ha/requirements.yaml @@ -1,4 +1,4 @@ dependencies: - name: artifactory-ha - version: 3.1.0 + version: 4.1.0 repository: https://charts.jfrog.io/ diff --git a/Openshift4/openshift-artifactory-ha/values.yaml b/Openshift4/openshift-artifactory-ha/values.yaml index 5e06d6e..3354dc0 100755 --- a/Openshift4/openshift-artifactory-ha/values.yaml +++ b/Openshift4/openshift-artifactory-ha/values.yaml @@ -12,41 +12,31 @@ artifactory-ha: url: "OVERRIDE" user: "OVERRIDE" password: "OVERRIDE" - initContainerImage: registry.redhat.io/ubi8-minimal - waitForDatabase: false + initContainerImage: registry.connect.redhat.com/jfrog/init:1.0.1 + waitForDatabase: true installerInfo: '{ "productId": "Openshift_artifactory-ha/{{ .Chart.Version }}", "features": [ { "featureId": "ArtifactoryVersion/{{ default .Chart.AppVersion .Values.artifactory.image.version }}" }, { "featureId": "{{ if .Values.postgresql.enabled }}postgresql{{ else }}{{ .Values.database.type }}{{ end }}/0.0.0" }, { "featureId": "Platform/Openshift" }, { "featureId": "Partner/ACC-006983" }, { "featureId": "Channel/Openshift" } ] }' artifactory: - ## Add custom init containers execution before predefined init containers - customInitContainersBegin: | - - name: "redhat-custom-setup" - #image: "{{ .Values.initContainerImage }}" - image: {{ index .Values "initContainerImage" }} - imagePullPolicy: "{{ .Values.artifactory.image.pullPolicy }}" - command: - - 'sh' - - '-c' - - 'chown -R 1030:1030 {{ .Values.artifactory.persistence.mountPath }}' - securityContext: - runAsUser: 0 - volumeMounts: - - mountPath: "{{ .Values.artifactory.persistence.mountPath }}" - name: volume + uid: "1000721030" ## Change to use RH UBI images image: - repository: registry.connect.redhat.com/jfrog/artifactory-pro - version: 7.7.3 + registry: registry.connect.redhat.com + repository: jfrog/artifactory-pro + tag: 7.9.0 node: replicaCount: 2 waitForPrimaryStartup: enabled: false - masterKey: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE + masterKey: "OVERRIDE" + joinKey: "OVERRIDE" postgresql: enabled: false nginx: + uid: "1000720104" + gid: "1000720107" image: - repository: registry.redhat.io/rhel8/nginx-116 - version: latest + registry: registry.redhat.io + repository: rhel8/nginx-116 + tag: latest ## K8S secret name for the TLS secret to be used for SSL tlsSecretName: "OVERRIDE" service: From 2cc08a26b16beda1a51c2dd16e388763e28861f2 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Thu, 1 Oct 2020 17:20:12 -0700 Subject: [PATCH 23/28] Openshift Xray Helm and relocated to helm or operator folder --- .../openshift-artifactory-ha/CHANGELOG.md | 0 .../openshift-artifactory-ha/Chart.yaml | 0 .../openshift-artifactory-ha/LICENSE | 0 .../openshift-artifactory-ha/README.md | 0 .../openshift-artifactory-ha/helminstall.sh | 0 .../requirements.lock | 0 .../requirements.yaml | 0 .../openshift-artifactory-ha/values.yaml | 0 .../openshift-pipelines/CHANGELOG.md | 0 .../{ => helm}/openshift-pipelines/Chart.yaml | 0 .../{ => helm}/openshift-pipelines/LICENSE | 0 .../{ => helm}/openshift-pipelines/README.md | 0 .../openshift-pipelines/helminstall.sh | 0 .../openshift-pipelines/requirements.lock | 0 .../openshift-pipelines/requirements.yaml | 0 .../openshift-pipelines/values.yaml | 13 +-- .../openshift-xray/CHANGELOG.md | 3 + .../{ => helm}/openshift-xray/Chart.yaml | 4 +- Openshift4/{ => helm}/openshift-xray/LICENSE | 0 .../{ => helm}/openshift-xray/README.md | 0 .../openshift-xray/helminstall.sh | 9 +- .../openshift-xray/rabbitmq.yaml | 4 +- .../openshift-xray/rabbitmqservice.yaml | 8 +- .../helm/openshift-xray/requirements.lock | 6 ++ .../openshift-xray/requirements.yaml | 2 +- Openshift4/helm/openshift-xray/values.yaml | 101 ++++++++++++++++++ Openshift4/openshift-xray/values.yaml | 78 -------------- .../artifactory-ha-operator/.gitignore | 0 .../.osdk-scorecard.yaml | 0 .../artifactory-ha-operator/CHANGELOG.md | 0 .../artifactory-ha-operator/CONTRIBUTING.md | 0 .../artifactory-ha-operator/Dockerfile | 0 .../artifactory-ha-operator/Makefile | 0 .../artifactory-ha-operator/PROJECT | 0 .../artifactory-ha-operator/README.md | 0 .../artifactory-ha-operator/build/Dockerfile | 0 ...operator.v1.0.0.clusterserviceversion.yaml | 0 ...operator.v1.0.0.clusterserviceversion.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 .../bundle/1.0.0/metadata/annotations.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 ...operator.v1.0.1.clusterserviceversion.yaml | 0 ...operator.v1.0.1.clusterserviceversion.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 .../bundle/1.0.1/metadata/annotations.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 ...operator.v1.0.2.clusterserviceversion.yaml | 0 ...operator.v1.0.2.clusterserviceversion.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 .../bundle/1.0.2/metadata/annotations.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 ...operator.v1.0.3.clusterserviceversion.yaml | 0 ...operator.v1.0.3.clusterserviceversion.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 .../bundle/1.0.3/metadata/annotations.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 ...operator.v1.1.0.clusterserviceversion.yaml | 0 ...operator.v1.1.0.clusterserviceversion.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 .../bundle/1.1.0/metadata/annotations.yaml | 0 ...artifactoryhas.charts.helm.k8s.io.crd.yaml | 0 .../bundle/bundle-1.0.0.Dockerfile | 0 .../bundle/bundle-1.0.1.Dockerfile | 0 .../bundle/bundle-1.0.2.Dockerfile | 0 .../bundle/bundle-1.0.3.Dockerfile | 0 .../bundle/bundle-1.1.0.Dockerfile | 0 ...enshiftartifactoryha-operator.package.yaml | 0 ...operator.v1.0.0.clusterserviceversion.yaml | 0 ...operator.v1.0.1.clusterserviceversion.yaml | 0 ...operator.v1.0.2.clusterserviceversion.yaml | 0 ...operator.v1.0.3.clusterserviceversion.yaml | 0 .../openshiftartifactoryha-operator.crd.yaml | 0 ...enshiftartifactoryha-operator.package.yaml | 0 .../config/default/kustomization.yaml | 0 .../default/manager_auth_proxy_patch.yaml | 0 .../config/manager/kustomization.yaml | 0 .../config/manager/manager.yaml | 0 ...ory-ha-operator.clusterserviceversion.yaml | 0 .../config/manifests/kustomization.yaml | 0 .../config/prometheus/kustomization.yaml | 0 .../config/prometheus/monitor.yaml | 0 .../rbac/auth_proxy_client_clusterrole.yaml | 0 .../config/rbac/auth_proxy_role.yaml | 0 .../config/rbac/auth_proxy_role_binding.yaml | 0 .../config/rbac/auth_proxy_service.yaml | 0 .../config/rbac/kustomization.yaml | 0 .../config/rbac/leader_election_role.yaml | 0 .../rbac/leader_election_role_binding.yaml | 0 .../config/rbac/role.yaml | 0 .../config/rbac/role_binding.yaml | 0 .../config/scorecard/bases/config.yaml | 0 .../config/scorecard/kustomization.yaml | 0 .../scorecard/patches/basic.config.yaml | 0 .../config/scorecard/patches/olm.config.yaml | 0 .../deploy/catalogsourceconfig.yaml | 0 ...lm.k8s.io_openshiftartifactoryhas_crd.yaml | 0 ...io_v1alpha1_openshiftartifactoryha_cr.yaml | 0 .../deploy/namespace.yaml | 0 ...operator.v1.0.0.clusterserviceversion.yaml | 0 ...operator.v1.0.1.clusterserviceversion.yaml | 0 ...operator.v1.0.2.clusterserviceversion.yaml | 0 ...operator.v1.0.3.clusterserviceversion.yaml | 0 ...operator.v1.1.0.clusterserviceversion.yaml | 0 .../artifactory-ha-operator.package.yaml | 0 .../deploy/operator.yaml | 0 .../deploy/operatorgroup.yaml | 0 .../deploy/project.yaml | 0 .../artifactory-ha-operator/deploy/role.yaml | 0 .../deploy/role_binding.yaml | 0 .../deploy/service_account.yaml | 0 .../deploy/subscription.yaml | 0 .../helm-charts/README.md | 0 .../artifactory-ha-operator/licenses/LICENSE | 0 .../artifactory-ha-operator/watches.yaml | 0 .../{ => operator}/xray-operator/CHANGELOG.md | 0 .../xray-operator/CONTRIBUTING.md | 0 .../{ => operator}/xray-operator/README.md | 0 .../xray-operator/build/Dockerfile | 0 .../bundle/openshiftxray-operator.crd.yaml | 0 .../openshiftxray-operator.package.yaml | 0 ...operator.v1.0.0.clusterserviceversion.yaml | 0 ...operator.v1.0.1.clusterserviceversion.yaml | 0 ...operator.v1.0.2.clusterserviceversion.yaml | 0 ...operator.v1.0.3.clusterserviceversion.yaml | 0 ...charts.helm.k8s.io_openshiftxrays_crd.yaml | 0 ...helm.k8s.io_v1alpha1_openshiftxray_cr.yaml | 0 ...operator.v1.0.0.clusterserviceversion.yaml | 0 ...operator.v1.0.1.clusterserviceversion.yaml | 0 ...operator.v1.0.2.clusterserviceversion.yaml | 0 ...operator.v1.0.3.clusterserviceversion.yaml | 0 .../xray-operator/xray-operator.package.yaml | 0 .../xray-operator/deploy/operator.yaml | 0 .../xray-operator/deploy/role.yaml | 0 .../xray-operator/deploy/role_binding.yaml | 0 .../xray-operator/deploy/service_account.yaml | 0 .../xray-operator/deploy/subscription.yaml | 0 .../helm-charts}/openshift-xray/CHANGELOG.md | 0 .../helm-charts/openshift-xray/Chart.yaml | 0 .../helm-charts/openshift-xray/LICENSE | 0 .../helm-charts/openshift-xray/README.md | 0 .../openshift-xray/helminstall.sh | 0 .../helm-charts}/openshift-xray/rabbitmq.yaml | 0 .../openshift-xray/rabbitmqservice.yaml | 0 .../openshift-xray/requirements.lock | 0 .../openshift-xray/requirements.yaml | 0 .../helm-charts/openshift-xray/values.yaml | 0 .../xray-operator/licenses/LICENSE | 0 .../{ => operator}/xray-operator/watches.yaml | 0 .../openshift-xray/requirements.lock | 6 -- 149 files changed, 133 insertions(+), 101 deletions(-) rename Openshift4/{ => helm}/openshift-artifactory-ha/CHANGELOG.md (100%) rename Openshift4/{ => helm}/openshift-artifactory-ha/Chart.yaml (100%) rename Openshift4/{ => helm}/openshift-artifactory-ha/LICENSE (100%) rename Openshift4/{ => helm}/openshift-artifactory-ha/README.md (100%) rename Openshift4/{ => helm}/openshift-artifactory-ha/helminstall.sh (100%) rename Openshift4/{ => helm}/openshift-artifactory-ha/requirements.lock (100%) rename Openshift4/{ => helm}/openshift-artifactory-ha/requirements.yaml (100%) rename Openshift4/{ => helm}/openshift-artifactory-ha/values.yaml (100%) rename Openshift4/{ => helm}/openshift-pipelines/CHANGELOG.md (100%) rename Openshift4/{ => helm}/openshift-pipelines/Chart.yaml (100%) rename Openshift4/{ => helm}/openshift-pipelines/LICENSE (100%) rename Openshift4/{ => helm}/openshift-pipelines/README.md (100%) rename Openshift4/{ => helm}/openshift-pipelines/helminstall.sh (100%) rename Openshift4/{ => helm}/openshift-pipelines/requirements.lock (100%) rename Openshift4/{ => helm}/openshift-pipelines/requirements.yaml (100%) rename Openshift4/{ => helm}/openshift-pipelines/values.yaml (99%) rename Openshift4/{xray-operator/helm-charts => helm}/openshift-xray/CHANGELOG.md (80%) mode change 100644 => 100755 rename Openshift4/{ => helm}/openshift-xray/Chart.yaml (91%) rename Openshift4/{ => helm}/openshift-xray/LICENSE (100%) rename Openshift4/{ => helm}/openshift-xray/README.md (100%) rename Openshift4/{xray-operator/helm-charts => helm}/openshift-xray/helminstall.sh (82%) mode change 100644 => 100755 rename Openshift4/{xray-operator/helm-charts => helm}/openshift-xray/rabbitmq.yaml (79%) rename Openshift4/{xray-operator/helm-charts => helm}/openshift-xray/rabbitmqservice.yaml (81%) create mode 100644 Openshift4/helm/openshift-xray/requirements.lock rename Openshift4/{xray-operator/helm-charts => helm}/openshift-xray/requirements.yaml (78%) create mode 100755 Openshift4/helm/openshift-xray/values.yaml delete mode 100755 Openshift4/openshift-xray/values.yaml rename Openshift4/{ => operator}/artifactory-ha-operator/.gitignore (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/.osdk-scorecard.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/CHANGELOG.md (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/CONTRIBUTING.md (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/Dockerfile (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/Makefile (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/PROJECT (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/README.md (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/build/Dockerfile (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.0/manifests/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.0/metadata/annotations.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.1/manifests/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.1/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.1/metadata/annotations.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.1/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.2/manifests/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.2/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.2/metadata/annotations.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.2/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.3/manifests/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.3/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.3/metadata/annotations.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.0.3/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.1.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.1.0/metadata/annotations.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/1.1.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/bundle-1.0.0.Dockerfile (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/bundle-1.0.1.Dockerfile (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/bundle-1.0.2.Dockerfile (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/bundle-1.0.3.Dockerfile (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.package.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/default/kustomization.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/default/manager_auth_proxy_patch.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/manager/kustomization.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/manager/manager.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/manifests/bases/artifactory-ha-operator.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/manifests/kustomization.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/prometheus/kustomization.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/prometheus/monitor.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/rbac/auth_proxy_client_clusterrole.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/rbac/auth_proxy_role.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/rbac/auth_proxy_role_binding.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/rbac/auth_proxy_service.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/rbac/kustomization.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/rbac/leader_election_role.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/rbac/leader_election_role_binding.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/rbac/role.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/rbac/role_binding.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/scorecard/bases/config.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/scorecard/kustomization.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/scorecard/patches/basic.config.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/config/scorecard/patches/olm.config.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/catalogsourceconfig.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_openshiftartifactoryhas_crd.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/namespace.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/artifactory-ha-operator.package.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/operator.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/operatorgroup.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/project.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/role.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/role_binding.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/service_account.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/deploy/subscription.yaml (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/helm-charts/README.md (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/licenses/LICENSE (100%) rename Openshift4/{ => operator}/artifactory-ha-operator/watches.yaml (100%) rename Openshift4/{ => operator}/xray-operator/CHANGELOG.md (100%) rename Openshift4/{ => operator}/xray-operator/CONTRIBUTING.md (100%) rename Openshift4/{ => operator}/xray-operator/README.md (100%) rename Openshift4/{ => operator}/xray-operator/build/Dockerfile (100%) rename Openshift4/{ => operator}/xray-operator/bundle/openshiftxray-operator.crd.yaml (100%) rename Openshift4/{ => operator}/xray-operator/bundle/openshiftxray-operator.package.yaml (100%) rename Openshift4/{ => operator}/xray-operator/bundle/xray-operator.v1.0.0.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/xray-operator/bundle/xray-operator.v1.0.1.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/xray-operator/bundle/xray-operator.v1.0.2.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/xray-operator/bundle/xray-operator.v1.0.3.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/crds/charts.helm.k8s.io_openshiftxrays_crd.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftxray_cr.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/olm-catalog/xray-operator/1.0.0/xray-operator.v1.0.0.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/olm-catalog/xray-operator/1.0.1/xray-operator.v1.0.1.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/olm-catalog/xray-operator/1.0.2/xray-operator.v1.0.2.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/olm-catalog/xray-operator/1.0.3/xray-operator.v1.0.3.clusterserviceversion.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/olm-catalog/xray-operator/xray-operator.package.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/operator.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/role.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/role_binding.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/service_account.yaml (100%) rename Openshift4/{ => operator}/xray-operator/deploy/subscription.yaml (100%) rename Openshift4/{ => operator/xray-operator/helm-charts}/openshift-xray/CHANGELOG.md (100%) mode change 100755 => 100644 rename Openshift4/{ => operator}/xray-operator/helm-charts/openshift-xray/Chart.yaml (100%) rename Openshift4/{ => operator}/xray-operator/helm-charts/openshift-xray/LICENSE (100%) rename Openshift4/{ => operator}/xray-operator/helm-charts/openshift-xray/README.md (100%) rename Openshift4/{ => operator/xray-operator/helm-charts}/openshift-xray/helminstall.sh (100%) mode change 100755 => 100644 rename Openshift4/{ => operator/xray-operator/helm-charts}/openshift-xray/rabbitmq.yaml (100%) rename Openshift4/{ => operator/xray-operator/helm-charts}/openshift-xray/rabbitmqservice.yaml (100%) rename Openshift4/{ => operator/xray-operator/helm-charts}/openshift-xray/requirements.lock (100%) rename Openshift4/{ => operator/xray-operator/helm-charts}/openshift-xray/requirements.yaml (100%) rename Openshift4/{ => operator}/xray-operator/helm-charts/openshift-xray/values.yaml (100%) rename Openshift4/{ => operator}/xray-operator/licenses/LICENSE (100%) rename Openshift4/{ => operator}/xray-operator/watches.yaml (100%) delete mode 100644 Openshift4/xray-operator/helm-charts/openshift-xray/requirements.lock diff --git a/Openshift4/openshift-artifactory-ha/CHANGELOG.md b/Openshift4/helm/openshift-artifactory-ha/CHANGELOG.md similarity index 100% rename from Openshift4/openshift-artifactory-ha/CHANGELOG.md rename to Openshift4/helm/openshift-artifactory-ha/CHANGELOG.md diff --git a/Openshift4/openshift-artifactory-ha/Chart.yaml b/Openshift4/helm/openshift-artifactory-ha/Chart.yaml similarity index 100% rename from Openshift4/openshift-artifactory-ha/Chart.yaml rename to Openshift4/helm/openshift-artifactory-ha/Chart.yaml diff --git a/Openshift4/openshift-artifactory-ha/LICENSE b/Openshift4/helm/openshift-artifactory-ha/LICENSE similarity index 100% rename from Openshift4/openshift-artifactory-ha/LICENSE rename to Openshift4/helm/openshift-artifactory-ha/LICENSE diff --git a/Openshift4/openshift-artifactory-ha/README.md b/Openshift4/helm/openshift-artifactory-ha/README.md similarity index 100% rename from Openshift4/openshift-artifactory-ha/README.md rename to Openshift4/helm/openshift-artifactory-ha/README.md diff --git a/Openshift4/openshift-artifactory-ha/helminstall.sh b/Openshift4/helm/openshift-artifactory-ha/helminstall.sh similarity index 100% rename from Openshift4/openshift-artifactory-ha/helminstall.sh rename to Openshift4/helm/openshift-artifactory-ha/helminstall.sh diff --git a/Openshift4/openshift-artifactory-ha/requirements.lock b/Openshift4/helm/openshift-artifactory-ha/requirements.lock similarity index 100% rename from Openshift4/openshift-artifactory-ha/requirements.lock rename to Openshift4/helm/openshift-artifactory-ha/requirements.lock diff --git a/Openshift4/openshift-artifactory-ha/requirements.yaml b/Openshift4/helm/openshift-artifactory-ha/requirements.yaml similarity index 100% rename from Openshift4/openshift-artifactory-ha/requirements.yaml rename to Openshift4/helm/openshift-artifactory-ha/requirements.yaml diff --git a/Openshift4/openshift-artifactory-ha/values.yaml b/Openshift4/helm/openshift-artifactory-ha/values.yaml similarity index 100% rename from Openshift4/openshift-artifactory-ha/values.yaml rename to Openshift4/helm/openshift-artifactory-ha/values.yaml diff --git a/Openshift4/openshift-pipelines/CHANGELOG.md b/Openshift4/helm/openshift-pipelines/CHANGELOG.md similarity index 100% rename from Openshift4/openshift-pipelines/CHANGELOG.md rename to Openshift4/helm/openshift-pipelines/CHANGELOG.md diff --git a/Openshift4/openshift-pipelines/Chart.yaml b/Openshift4/helm/openshift-pipelines/Chart.yaml similarity index 100% rename from Openshift4/openshift-pipelines/Chart.yaml rename to Openshift4/helm/openshift-pipelines/Chart.yaml diff --git a/Openshift4/openshift-pipelines/LICENSE b/Openshift4/helm/openshift-pipelines/LICENSE similarity index 100% rename from Openshift4/openshift-pipelines/LICENSE rename to Openshift4/helm/openshift-pipelines/LICENSE diff --git a/Openshift4/openshift-pipelines/README.md b/Openshift4/helm/openshift-pipelines/README.md similarity index 100% rename from Openshift4/openshift-pipelines/README.md rename to Openshift4/helm/openshift-pipelines/README.md diff --git a/Openshift4/openshift-pipelines/helminstall.sh b/Openshift4/helm/openshift-pipelines/helminstall.sh similarity index 100% rename from Openshift4/openshift-pipelines/helminstall.sh rename to Openshift4/helm/openshift-pipelines/helminstall.sh diff --git a/Openshift4/openshift-pipelines/requirements.lock b/Openshift4/helm/openshift-pipelines/requirements.lock similarity index 100% rename from Openshift4/openshift-pipelines/requirements.lock rename to Openshift4/helm/openshift-pipelines/requirements.lock diff --git a/Openshift4/openshift-pipelines/requirements.yaml b/Openshift4/helm/openshift-pipelines/requirements.yaml similarity index 100% rename from Openshift4/openshift-pipelines/requirements.yaml rename to Openshift4/helm/openshift-pipelines/requirements.yaml diff --git a/Openshift4/openshift-pipelines/values.yaml b/Openshift4/helm/openshift-pipelines/values.yaml similarity index 99% rename from Openshift4/openshift-pipelines/values.yaml rename to Openshift4/helm/openshift-pipelines/values.yaml index 24800fc..320dd84 100755 --- a/Openshift4/openshift-pipelines/values.yaml +++ b/Openshift4/helm/openshift-pipelines/values.yaml @@ -871,14 +871,15 @@ pipelines: # registry: registry.connect.redhat.com # repository: jfrog/xray-rabbitmq # tag: 3.8.6 - #image: - # registry: quay.io - # repository: jfrog/rabbitmq - # tag: 3.8.3 + image: + registry: quay.io + repository: jfrog/rabbitmq + tag: 3.9.1 + # DO NOT CHANGE CUSTOM INIT USER rabbitmq: - username: admin - password: "" + username: user + password: bitnami ## Erlang cookie to determine whether different nodes are allowed to communicate with each other erlangCookie: PIPELINESRABBITMQCLUSTER diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/CHANGELOG.md b/Openshift4/helm/openshift-xray/CHANGELOG.md old mode 100644 new mode 100755 similarity index 80% rename from Openshift4/xray-operator/helm-charts/openshift-xray/CHANGELOG.md rename to Openshift4/helm/openshift-xray/CHANGELOG.md index 87f3b19..a4c6f3b --- a/Openshift4/xray-operator/helm-charts/openshift-xray/CHANGELOG.md +++ b/Openshift4/helm/openshift-xray/CHANGELOG.md @@ -1,6 +1,9 @@ # JFrog Openshift Artifactory-Xray Chart Changelog All changes to this chart will be documented in this file. +## [6.0.6] Oct 1st, 2020 +* Updating to Xray chart version 6.0.6 and Xray app version 3.8.8 + ## [4.2.0] Aug 17, 2020 * Updating to Xray chart version 4.2.0 and Xray app version 3.8.0 diff --git a/Openshift4/openshift-xray/Chart.yaml b/Openshift4/helm/openshift-xray/Chart.yaml similarity index 91% rename from Openshift4/openshift-xray/Chart.yaml rename to Openshift4/helm/openshift-xray/Chart.yaml index 5f3b194..aa8c6b6 100755 --- a/Openshift4/openshift-xray/Chart.yaml +++ b/Openshift4/helm/openshift-xray/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 -appVersion: 3.8.0 +appVersion: 3.8.8 description: Universal component scan for security and license inventory and impact analysis sources: - https://bintray.com/jfrog/product/xray/view @@ -13,4 +13,4 @@ maintainers: - email: johnp@jfrog.com name: John Peterson name: openshift-xray -version: 4.2.0 +version: 6.0.6 diff --git a/Openshift4/openshift-xray/LICENSE b/Openshift4/helm/openshift-xray/LICENSE similarity index 100% rename from Openshift4/openshift-xray/LICENSE rename to Openshift4/helm/openshift-xray/LICENSE diff --git a/Openshift4/openshift-xray/README.md b/Openshift4/helm/openshift-xray/README.md similarity index 100% rename from Openshift4/openshift-xray/README.md rename to Openshift4/helm/openshift-xray/README.md diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/helminstall.sh b/Openshift4/helm/openshift-xray/helminstall.sh old mode 100644 new mode 100755 similarity index 82% rename from Openshift4/xray-operator/helm-charts/openshift-xray/helminstall.sh rename to Openshift4/helm/openshift-xray/helminstall.sh index 2260da1..e19987c --- a/Openshift4/xray-operator/helm-charts/openshift-xray/helminstall.sh +++ b/Openshift4/helm/openshift-xray/helminstall.sh @@ -57,7 +57,10 @@ fi JFROGURL="" if [[ -z "$4" ]] then - JFROGURL="http://openshiftartifactoryha-nginx" + # HELM + JFROGURL="http://artifactory-ha-nginx" + # OPERATOR + # JFROGURL="http://openshiftartifactoryha-nginx" else JFROGURL=$4 fi @@ -68,4 +71,6 @@ helm install xray . \ --set xray.database.url=$DBURL \ --set xray.database.user=$DBUSER \ --set xray.database.password=$DBPASS \ - --set xray.xray.jfrogUrl=$JFROGURL + --set xray.xray.jfrogUrl=$JFROGURL \ + --set xray.xray.joinKey=EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE \ + --set xray.xray.masterKey=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/rabbitmq.yaml b/Openshift4/helm/openshift-xray/rabbitmq.yaml similarity index 79% rename from Openshift4/xray-operator/helm-charts/openshift-xray/rabbitmq.yaml rename to Openshift4/helm/openshift-xray/rabbitmq.yaml index 521df8e..df49bf6 100644 --- a/Openshift4/xray-operator/helm-charts/openshift-xray/rabbitmq.yaml +++ b/Openshift4/helm/openshift-xray/rabbitmq.yaml @@ -16,10 +16,10 @@ spec: app: rabbitmq spec: containers: - - image: quay.io/jfrog/xray-rabbitmq-rh:3.8.0 + - image: registry.connect.redhat.com/jfrog/xray-rabbitmq:3.8.9 imagePullPolicy: "Always" name: xray-rabbitmq ports: - containerPort: 4369 - containerPort: 5672 - - containerPort: 25672 + - containerPort: 15672 diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/rabbitmqservice.yaml b/Openshift4/helm/openshift-xray/rabbitmqservice.yaml similarity index 81% rename from Openshift4/xray-operator/helm-charts/openshift-xray/rabbitmqservice.yaml rename to Openshift4/helm/openshift-xray/rabbitmqservice.yaml index a8f108a..fb51fce 100644 --- a/Openshift4/xray-operator/helm-charts/openshift-xray/rabbitmqservice.yaml +++ b/Openshift4/helm/openshift-xray/rabbitmqservice.yaml @@ -8,17 +8,17 @@ spec: selector: app: rabbitmq ports: - - name: port1 + - name: epmd protocol: TCP port: 4369 targetPort: 4369 - - name: port3 + - name: ampq protocol: TCP port: 5672 targetPort: 5672 - - name: port4 + - name: management protocol: TCP - port: 25672 + port: 15672 targetPort: 25672 type: ClusterIP diff --git a/Openshift4/helm/openshift-xray/requirements.lock b/Openshift4/helm/openshift-xray/requirements.lock new file mode 100644 index 0000000..d53cf7c --- /dev/null +++ b/Openshift4/helm/openshift-xray/requirements.lock @@ -0,0 +1,6 @@ +dependencies: +- name: xray + repository: https://charts.jfrog.io/ + version: 6.0.6 +digest: sha256:339b5ec4e309ce2970ed34ebc700d6fe8f436d6cbe8dd5d352f0b080401752af +generated: "2020-10-01T15:04:29.008985-07:00" diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.yaml b/Openshift4/helm/openshift-xray/requirements.yaml similarity index 78% rename from Openshift4/xray-operator/helm-charts/openshift-xray/requirements.yaml rename to Openshift4/helm/openshift-xray/requirements.yaml index b0a88e0..f6311b7 100644 --- a/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.yaml +++ b/Openshift4/helm/openshift-xray/requirements.yaml @@ -1,4 +1,4 @@ dependencies: - name: xray - version: 4.2.0 + version: 6.0.6 repository: https://charts.jfrog.io/ diff --git a/Openshift4/helm/openshift-xray/values.yaml b/Openshift4/helm/openshift-xray/values.yaml new file mode 100755 index 0000000..b242f3d --- /dev/null +++ b/Openshift4/helm/openshift-xray/values.yaml @@ -0,0 +1,101 @@ +# Openshift Jfrog Xray +xray: + unifiedUpgradeAllowed: true + replicaCount: 1 + xray: + masterKey: "OVERRIDE" + joinKey: "OVERRIDE" + consoleLog: false + jfrogUrl: "OVERRIDE" + postgresql: + enabled: false + database: + url: "OVERRIDE" + user: "OVERRIDE" + password: "OVERRIDE" + common: + xrayUserId: "1000721035" + xrayGroupId: "1000721035" + analysis: + name: xray-analysis + image: + registry: registry.connect.redhat.com + repository: jfrog/xray-analysis + tag: 3.8.8 + updateStrategy: RollingUpdate + podManagementPolicy: Parallel + preStartCommand: + indexer: + name: xray-indexer + image: + registry: registry.connect.redhat.com + repository: jfrog/xray-indexer + tag: 3.8.8 + updateStrategy: RollingUpdate + podManagementPolicy: Parallel + persist: + name: xray-persist + image: + registry: registry.connect.redhat.com + repository: jfrog/xray-persist + tag: 3.8.8 + updateStrategy: RollingUpdate + podManagementPolicy: Parallel + persistence: + size: 10Gi + preStartCommand: + server: + name: xray-server + image: + registry: registry.connect.redhat.com + repository: jfrog/xray-server + tag: 3.8.8 + updateStrategy: RollingUpdate + podManagementPolicy: Parallel + replicaCount: 1 + router: + name: router + image: + registry: registry.connect.redhat.com + repository: jfrog/xray-router + tag: 1.4.3 + imagePullPolicy: IfNotPresent + rabbitmq-ha: + enabled: true + replicaCount: 1 + image: + repository: registry.connect.redhat.com/jfrog/xray-rabbitmq + tag: 3.8.9 + rabbitmqEpmdPort: 4369 + rabbitmqNodePort: 5672 + rabbitmqManagerPort: 15672 + rabbitmqUsername: guest + rabbitmqPassword: guest + managementUsername: management + managementPassword: management + initContainer: + enabled: false + securityContext: + fsGroup: 1000721035 + runAsUser: 1000721035 + runAsGroup: 1000721035 + livenessProbe: + initialDelaySeconds: 120 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + exec: + command: + - /bin/sh + - -c + - 'rabbitmqctl status' + readinessProbe: + initialDelaySeconds: 20 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 6 + exec: + command: + - /bin/sh + - -c + - 'rabbitmqctl status' diff --git a/Openshift4/openshift-xray/values.yaml b/Openshift4/openshift-xray/values.yaml deleted file mode 100755 index 3383f53..0000000 --- a/Openshift4/openshift-xray/values.yaml +++ /dev/null @@ -1,78 +0,0 @@ -# Openshift Jfrog Xray -xray: - unifiedUpgradeAllowed: true - replicaCount: 1 - xray: - masterKey: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - consoleLog: false - jfrogUrl: "OVERRIDE" - postgresql: - enabled: false - database: - url: "OVERRIDE" - user: "OVERRIDE" - password: "OVERRIDE" - rabbitmq-ha: - enabled: true - replicaCount: 1 - image: - tag: 3.7.21-alpine - rabbitmqUsername: guest - rabbitmqPassword: "" - persistentVolume: - enabled: true - size: 20Gi - rbac: - create: true - preStartCommand: - global: - postgresqlTlsSecret: - analysis: - name: xray-analysis - image: - repository: registry.connect.redhat.com/jfrog/xray-analysis - version: 3.6.2 - updateStrategy: RollingUpdate - podManagementPolicy: Parallel - preStartCommand: - indexer: - name: xray-indexer - image: - repository: registry.connect.redhat.com/jfrog/xray-indexer - version: 3.6.2 - updateStrategy: RollingUpdate - podManagementPolicy: Parallel - persist: - name: xray-persist - image: - repository: registry.connect.redhat.com/jfrog/xray-persist - version: 3.6.2 - updateStrategy: RollingUpdate - podManagementPolicy: Parallel - persistence: - size: 10Gi - preStartCommand: - server: - name: xray-server - image: - repository: registry.connect.redhat.com/jfrog/xray-server - version: 3.6.2 - updateStrategy: RollingUpdate - podManagementPolicy: Parallel - replicaCount: 1 - router: - name: router - image: - repository: registry.connect.redhat.com/jfrog/xray-router - version: 1.4.2 - imagePullPolicy: IfNotPresent - rabbitmq-ha: - enabled: true - replicaCount: 1 - image: - repository: registry.connect.redhat.com/jfrog/xray-rabbitmq - tag: 3.8.0 - rabbitmqEpmdPort: 4369 - rabbitmqNodePort: 5672 - rabbitmqManagerPort: 15672 \ No newline at end of file diff --git a/Openshift4/artifactory-ha-operator/.gitignore b/Openshift4/operator/artifactory-ha-operator/.gitignore similarity index 100% rename from Openshift4/artifactory-ha-operator/.gitignore rename to Openshift4/operator/artifactory-ha-operator/.gitignore diff --git a/Openshift4/artifactory-ha-operator/.osdk-scorecard.yaml b/Openshift4/operator/artifactory-ha-operator/.osdk-scorecard.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/.osdk-scorecard.yaml rename to Openshift4/operator/artifactory-ha-operator/.osdk-scorecard.yaml diff --git a/Openshift4/artifactory-ha-operator/CHANGELOG.md b/Openshift4/operator/artifactory-ha-operator/CHANGELOG.md similarity index 100% rename from Openshift4/artifactory-ha-operator/CHANGELOG.md rename to Openshift4/operator/artifactory-ha-operator/CHANGELOG.md diff --git a/Openshift4/artifactory-ha-operator/CONTRIBUTING.md b/Openshift4/operator/artifactory-ha-operator/CONTRIBUTING.md similarity index 100% rename from Openshift4/artifactory-ha-operator/CONTRIBUTING.md rename to Openshift4/operator/artifactory-ha-operator/CONTRIBUTING.md diff --git a/Openshift4/artifactory-ha-operator/Dockerfile b/Openshift4/operator/artifactory-ha-operator/Dockerfile similarity index 100% rename from Openshift4/artifactory-ha-operator/Dockerfile rename to Openshift4/operator/artifactory-ha-operator/Dockerfile diff --git a/Openshift4/artifactory-ha-operator/Makefile b/Openshift4/operator/artifactory-ha-operator/Makefile similarity index 100% rename from Openshift4/artifactory-ha-operator/Makefile rename to Openshift4/operator/artifactory-ha-operator/Makefile diff --git a/Openshift4/artifactory-ha-operator/PROJECT b/Openshift4/operator/artifactory-ha-operator/PROJECT similarity index 100% rename from Openshift4/artifactory-ha-operator/PROJECT rename to Openshift4/operator/artifactory-ha-operator/PROJECT diff --git a/Openshift4/artifactory-ha-operator/README.md b/Openshift4/operator/artifactory-ha-operator/README.md similarity index 100% rename from Openshift4/artifactory-ha-operator/README.md rename to Openshift4/operator/artifactory-ha-operator/README.md diff --git a/Openshift4/artifactory-ha-operator/build/Dockerfile b/Openshift4/operator/artifactory-ha-operator/build/Dockerfile similarity index 100% rename from Openshift4/artifactory-ha-operator/build/Dockerfile rename to Openshift4/operator/artifactory-ha-operator/build/Dockerfile diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/manifests/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/manifests/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/metadata/annotations.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/metadata/annotations.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.0/metadata/annotations.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/metadata/annotations.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/manifests/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/manifests/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.1/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/metadata/annotations.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/metadata/annotations.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.1/metadata/annotations.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/metadata/annotations.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.1/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.1/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.1/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/manifests/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/manifests/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.2/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/metadata/annotations.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/metadata/annotations.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.2/metadata/annotations.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/metadata/annotations.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.2/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.2/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.2/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/manifests/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/manifests/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.3/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/metadata/annotations.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/metadata/annotations.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.3/metadata/annotations.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/metadata/annotations.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.0.3/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.0.3/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.0.3/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.1.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/manifests/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/metadata/annotations.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/metadata/annotations.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.1.0/metadata/annotations.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/metadata/annotations.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/1.1.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/1.1.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/openshiftartifactoryhas.charts.helm.k8s.io.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.0.Dockerfile b/Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.0.0.Dockerfile similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/bundle-1.0.0.Dockerfile rename to Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.0.0.Dockerfile diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.1.Dockerfile b/Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.0.1.Dockerfile similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/bundle-1.0.1.Dockerfile rename to Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.0.1.Dockerfile diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.2.Dockerfile b/Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.0.2.Dockerfile similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/bundle-1.0.2.Dockerfile rename to Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.0.2.Dockerfile diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.0.3.Dockerfile b/Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.0.3.Dockerfile similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/bundle-1.0.3.Dockerfile rename to Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.0.3.Dockerfile diff --git a/Openshift4/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile b/Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile rename to Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile diff --git a/Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle/openshiftartifactoryha-operator.package.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle_old/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.crd.yaml b/Openshift4/operator/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.crd.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.crd.yaml diff --git a/Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.package.yaml b/Openshift4/operator/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.package.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.package.yaml rename to Openshift4/operator/artifactory-ha-operator/bundle_old/openshiftartifactoryha-operator.package.yaml diff --git a/Openshift4/artifactory-ha-operator/config/default/kustomization.yaml b/Openshift4/operator/artifactory-ha-operator/config/default/kustomization.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/default/kustomization.yaml rename to Openshift4/operator/artifactory-ha-operator/config/default/kustomization.yaml diff --git a/Openshift4/artifactory-ha-operator/config/default/manager_auth_proxy_patch.yaml b/Openshift4/operator/artifactory-ha-operator/config/default/manager_auth_proxy_patch.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/default/manager_auth_proxy_patch.yaml rename to Openshift4/operator/artifactory-ha-operator/config/default/manager_auth_proxy_patch.yaml diff --git a/Openshift4/artifactory-ha-operator/config/manager/kustomization.yaml b/Openshift4/operator/artifactory-ha-operator/config/manager/kustomization.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/manager/kustomization.yaml rename to Openshift4/operator/artifactory-ha-operator/config/manager/kustomization.yaml diff --git a/Openshift4/artifactory-ha-operator/config/manager/manager.yaml b/Openshift4/operator/artifactory-ha-operator/config/manager/manager.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/manager/manager.yaml rename to Openshift4/operator/artifactory-ha-operator/config/manager/manager.yaml diff --git a/Openshift4/artifactory-ha-operator/config/manifests/bases/artifactory-ha-operator.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/config/manifests/bases/artifactory-ha-operator.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/manifests/bases/artifactory-ha-operator.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/config/manifests/bases/artifactory-ha-operator.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/config/manifests/kustomization.yaml b/Openshift4/operator/artifactory-ha-operator/config/manifests/kustomization.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/manifests/kustomization.yaml rename to Openshift4/operator/artifactory-ha-operator/config/manifests/kustomization.yaml diff --git a/Openshift4/artifactory-ha-operator/config/prometheus/kustomization.yaml b/Openshift4/operator/artifactory-ha-operator/config/prometheus/kustomization.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/prometheus/kustomization.yaml rename to Openshift4/operator/artifactory-ha-operator/config/prometheus/kustomization.yaml diff --git a/Openshift4/artifactory-ha-operator/config/prometheus/monitor.yaml b/Openshift4/operator/artifactory-ha-operator/config/prometheus/monitor.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/prometheus/monitor.yaml rename to Openshift4/operator/artifactory-ha-operator/config/prometheus/monitor.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_client_clusterrole.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/auth_proxy_client_clusterrole.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_client_clusterrole.yaml rename to Openshift4/operator/artifactory-ha-operator/config/rbac/auth_proxy_client_clusterrole.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/auth_proxy_role.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role.yaml rename to Openshift4/operator/artifactory-ha-operator/config/rbac/auth_proxy_role.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role_binding.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/auth_proxy_role_binding.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_role_binding.yaml rename to Openshift4/operator/artifactory-ha-operator/config/rbac/auth_proxy_role_binding.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_service.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/auth_proxy_service.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/rbac/auth_proxy_service.yaml rename to Openshift4/operator/artifactory-ha-operator/config/rbac/auth_proxy_service.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/kustomization.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/kustomization.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/rbac/kustomization.yaml rename to Openshift4/operator/artifactory-ha-operator/config/rbac/kustomization.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/leader_election_role.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/leader_election_role.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/rbac/leader_election_role.yaml rename to Openshift4/operator/artifactory-ha-operator/config/rbac/leader_election_role.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/leader_election_role_binding.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/leader_election_role_binding.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/rbac/leader_election_role_binding.yaml rename to Openshift4/operator/artifactory-ha-operator/config/rbac/leader_election_role_binding.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/role.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/role.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/rbac/role.yaml rename to Openshift4/operator/artifactory-ha-operator/config/rbac/role.yaml diff --git a/Openshift4/artifactory-ha-operator/config/rbac/role_binding.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/role_binding.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/rbac/role_binding.yaml rename to Openshift4/operator/artifactory-ha-operator/config/rbac/role_binding.yaml diff --git a/Openshift4/artifactory-ha-operator/config/scorecard/bases/config.yaml b/Openshift4/operator/artifactory-ha-operator/config/scorecard/bases/config.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/scorecard/bases/config.yaml rename to Openshift4/operator/artifactory-ha-operator/config/scorecard/bases/config.yaml diff --git a/Openshift4/artifactory-ha-operator/config/scorecard/kustomization.yaml b/Openshift4/operator/artifactory-ha-operator/config/scorecard/kustomization.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/scorecard/kustomization.yaml rename to Openshift4/operator/artifactory-ha-operator/config/scorecard/kustomization.yaml diff --git a/Openshift4/artifactory-ha-operator/config/scorecard/patches/basic.config.yaml b/Openshift4/operator/artifactory-ha-operator/config/scorecard/patches/basic.config.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/scorecard/patches/basic.config.yaml rename to Openshift4/operator/artifactory-ha-operator/config/scorecard/patches/basic.config.yaml diff --git a/Openshift4/artifactory-ha-operator/config/scorecard/patches/olm.config.yaml b/Openshift4/operator/artifactory-ha-operator/config/scorecard/patches/olm.config.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/config/scorecard/patches/olm.config.yaml rename to Openshift4/operator/artifactory-ha-operator/config/scorecard/patches/olm.config.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/catalogsourceconfig.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/catalogsourceconfig.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/catalogsourceconfig.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/catalogsourceconfig.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_openshiftartifactoryhas_crd.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_openshiftartifactoryhas_crd.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_openshiftartifactoryhas_crd.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_openshiftartifactoryhas_crd.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/namespace.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/namespace.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/namespace.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/namespace.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.0/artifactory-ha-operator.v1.0.0.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.1/artifactory-ha-operator.v1.0.1.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.2/artifactory-ha-operator.v1.0.2.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.0.3/artifactory-ha-operator.v1.0.3.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/artifactory-ha-operator.package.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/artifactory-ha-operator.package.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/artifactory-ha-operator.package.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/olm-catalog/artifactory-ha-operator/artifactory-ha-operator.package.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/operator.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/operator.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/operator.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/operator.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/operatorgroup.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/operatorgroup.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/operatorgroup.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/operatorgroup.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/project.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/project.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/project.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/project.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/role.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/role.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/role.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/role.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/role_binding.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/role_binding.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/role_binding.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/role_binding.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/service_account.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/service_account.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/service_account.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/service_account.yaml diff --git a/Openshift4/artifactory-ha-operator/deploy/subscription.yaml b/Openshift4/operator/artifactory-ha-operator/deploy/subscription.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/deploy/subscription.yaml rename to Openshift4/operator/artifactory-ha-operator/deploy/subscription.yaml diff --git a/Openshift4/artifactory-ha-operator/helm-charts/README.md b/Openshift4/operator/artifactory-ha-operator/helm-charts/README.md similarity index 100% rename from Openshift4/artifactory-ha-operator/helm-charts/README.md rename to Openshift4/operator/artifactory-ha-operator/helm-charts/README.md diff --git a/Openshift4/artifactory-ha-operator/licenses/LICENSE b/Openshift4/operator/artifactory-ha-operator/licenses/LICENSE similarity index 100% rename from Openshift4/artifactory-ha-operator/licenses/LICENSE rename to Openshift4/operator/artifactory-ha-operator/licenses/LICENSE diff --git a/Openshift4/artifactory-ha-operator/watches.yaml b/Openshift4/operator/artifactory-ha-operator/watches.yaml similarity index 100% rename from Openshift4/artifactory-ha-operator/watches.yaml rename to Openshift4/operator/artifactory-ha-operator/watches.yaml diff --git a/Openshift4/xray-operator/CHANGELOG.md b/Openshift4/operator/xray-operator/CHANGELOG.md similarity index 100% rename from Openshift4/xray-operator/CHANGELOG.md rename to Openshift4/operator/xray-operator/CHANGELOG.md diff --git a/Openshift4/xray-operator/CONTRIBUTING.md b/Openshift4/operator/xray-operator/CONTRIBUTING.md similarity index 100% rename from Openshift4/xray-operator/CONTRIBUTING.md rename to Openshift4/operator/xray-operator/CONTRIBUTING.md diff --git a/Openshift4/xray-operator/README.md b/Openshift4/operator/xray-operator/README.md similarity index 100% rename from Openshift4/xray-operator/README.md rename to Openshift4/operator/xray-operator/README.md diff --git a/Openshift4/xray-operator/build/Dockerfile b/Openshift4/operator/xray-operator/build/Dockerfile similarity index 100% rename from Openshift4/xray-operator/build/Dockerfile rename to Openshift4/operator/xray-operator/build/Dockerfile diff --git a/Openshift4/xray-operator/bundle/openshiftxray-operator.crd.yaml b/Openshift4/operator/xray-operator/bundle/openshiftxray-operator.crd.yaml similarity index 100% rename from Openshift4/xray-operator/bundle/openshiftxray-operator.crd.yaml rename to Openshift4/operator/xray-operator/bundle/openshiftxray-operator.crd.yaml diff --git a/Openshift4/xray-operator/bundle/openshiftxray-operator.package.yaml b/Openshift4/operator/xray-operator/bundle/openshiftxray-operator.package.yaml similarity index 100% rename from Openshift4/xray-operator/bundle/openshiftxray-operator.package.yaml rename to Openshift4/operator/xray-operator/bundle/openshiftxray-operator.package.yaml diff --git a/Openshift4/xray-operator/bundle/xray-operator.v1.0.0.clusterserviceversion.yaml b/Openshift4/operator/xray-operator/bundle/xray-operator.v1.0.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/xray-operator/bundle/xray-operator.v1.0.0.clusterserviceversion.yaml rename to Openshift4/operator/xray-operator/bundle/xray-operator.v1.0.0.clusterserviceversion.yaml diff --git a/Openshift4/xray-operator/bundle/xray-operator.v1.0.1.clusterserviceversion.yaml b/Openshift4/operator/xray-operator/bundle/xray-operator.v1.0.1.clusterserviceversion.yaml similarity index 100% rename from Openshift4/xray-operator/bundle/xray-operator.v1.0.1.clusterserviceversion.yaml rename to Openshift4/operator/xray-operator/bundle/xray-operator.v1.0.1.clusterserviceversion.yaml diff --git a/Openshift4/xray-operator/bundle/xray-operator.v1.0.2.clusterserviceversion.yaml b/Openshift4/operator/xray-operator/bundle/xray-operator.v1.0.2.clusterserviceversion.yaml similarity index 100% rename from Openshift4/xray-operator/bundle/xray-operator.v1.0.2.clusterserviceversion.yaml rename to Openshift4/operator/xray-operator/bundle/xray-operator.v1.0.2.clusterserviceversion.yaml diff --git a/Openshift4/xray-operator/bundle/xray-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/operator/xray-operator/bundle/xray-operator.v1.0.3.clusterserviceversion.yaml similarity index 100% rename from Openshift4/xray-operator/bundle/xray-operator.v1.0.3.clusterserviceversion.yaml rename to Openshift4/operator/xray-operator/bundle/xray-operator.v1.0.3.clusterserviceversion.yaml diff --git a/Openshift4/xray-operator/deploy/crds/charts.helm.k8s.io_openshiftxrays_crd.yaml b/Openshift4/operator/xray-operator/deploy/crds/charts.helm.k8s.io_openshiftxrays_crd.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/crds/charts.helm.k8s.io_openshiftxrays_crd.yaml rename to Openshift4/operator/xray-operator/deploy/crds/charts.helm.k8s.io_openshiftxrays_crd.yaml diff --git a/Openshift4/xray-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftxray_cr.yaml b/Openshift4/operator/xray-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftxray_cr.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftxray_cr.yaml rename to Openshift4/operator/xray-operator/deploy/crds/charts.helm.k8s.io_v1alpha1_openshiftxray_cr.yaml diff --git a/Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.0/xray-operator.v1.0.0.clusterserviceversion.yaml b/Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/1.0.0/xray-operator.v1.0.0.clusterserviceversion.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.0/xray-operator.v1.0.0.clusterserviceversion.yaml rename to Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/1.0.0/xray-operator.v1.0.0.clusterserviceversion.yaml diff --git a/Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.1/xray-operator.v1.0.1.clusterserviceversion.yaml b/Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/1.0.1/xray-operator.v1.0.1.clusterserviceversion.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.1/xray-operator.v1.0.1.clusterserviceversion.yaml rename to Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/1.0.1/xray-operator.v1.0.1.clusterserviceversion.yaml diff --git a/Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.2/xray-operator.v1.0.2.clusterserviceversion.yaml b/Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/1.0.2/xray-operator.v1.0.2.clusterserviceversion.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.2/xray-operator.v1.0.2.clusterserviceversion.yaml rename to Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/1.0.2/xray-operator.v1.0.2.clusterserviceversion.yaml diff --git a/Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.3/xray-operator.v1.0.3.clusterserviceversion.yaml b/Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/1.0.3/xray-operator.v1.0.3.clusterserviceversion.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/olm-catalog/xray-operator/1.0.3/xray-operator.v1.0.3.clusterserviceversion.yaml rename to Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/1.0.3/xray-operator.v1.0.3.clusterserviceversion.yaml diff --git a/Openshift4/xray-operator/deploy/olm-catalog/xray-operator/xray-operator.package.yaml b/Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/xray-operator.package.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/olm-catalog/xray-operator/xray-operator.package.yaml rename to Openshift4/operator/xray-operator/deploy/olm-catalog/xray-operator/xray-operator.package.yaml diff --git a/Openshift4/xray-operator/deploy/operator.yaml b/Openshift4/operator/xray-operator/deploy/operator.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/operator.yaml rename to Openshift4/operator/xray-operator/deploy/operator.yaml diff --git a/Openshift4/xray-operator/deploy/role.yaml b/Openshift4/operator/xray-operator/deploy/role.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/role.yaml rename to Openshift4/operator/xray-operator/deploy/role.yaml diff --git a/Openshift4/xray-operator/deploy/role_binding.yaml b/Openshift4/operator/xray-operator/deploy/role_binding.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/role_binding.yaml rename to Openshift4/operator/xray-operator/deploy/role_binding.yaml diff --git a/Openshift4/xray-operator/deploy/service_account.yaml b/Openshift4/operator/xray-operator/deploy/service_account.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/service_account.yaml rename to Openshift4/operator/xray-operator/deploy/service_account.yaml diff --git a/Openshift4/xray-operator/deploy/subscription.yaml b/Openshift4/operator/xray-operator/deploy/subscription.yaml similarity index 100% rename from Openshift4/xray-operator/deploy/subscription.yaml rename to Openshift4/operator/xray-operator/deploy/subscription.yaml diff --git a/Openshift4/openshift-xray/CHANGELOG.md b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/CHANGELOG.md old mode 100755 new mode 100644 similarity index 100% rename from Openshift4/openshift-xray/CHANGELOG.md rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/CHANGELOG.md diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/Chart.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/Chart.yaml similarity index 100% rename from Openshift4/xray-operator/helm-charts/openshift-xray/Chart.yaml rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/Chart.yaml diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/LICENSE b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/LICENSE similarity index 100% rename from Openshift4/xray-operator/helm-charts/openshift-xray/LICENSE rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/LICENSE diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/README.md b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/README.md similarity index 100% rename from Openshift4/xray-operator/helm-charts/openshift-xray/README.md rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/README.md diff --git a/Openshift4/openshift-xray/helminstall.sh b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/helminstall.sh old mode 100755 new mode 100644 similarity index 100% rename from Openshift4/openshift-xray/helminstall.sh rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/helminstall.sh diff --git a/Openshift4/openshift-xray/rabbitmq.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmq.yaml similarity index 100% rename from Openshift4/openshift-xray/rabbitmq.yaml rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmq.yaml diff --git a/Openshift4/openshift-xray/rabbitmqservice.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmqservice.yaml similarity index 100% rename from Openshift4/openshift-xray/rabbitmqservice.yaml rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmqservice.yaml diff --git a/Openshift4/openshift-xray/requirements.lock b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.lock similarity index 100% rename from Openshift4/openshift-xray/requirements.lock rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.lock diff --git a/Openshift4/openshift-xray/requirements.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.yaml similarity index 100% rename from Openshift4/openshift-xray/requirements.yaml rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.yaml diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/values.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/values.yaml similarity index 100% rename from Openshift4/xray-operator/helm-charts/openshift-xray/values.yaml rename to Openshift4/operator/xray-operator/helm-charts/openshift-xray/values.yaml diff --git a/Openshift4/xray-operator/licenses/LICENSE b/Openshift4/operator/xray-operator/licenses/LICENSE similarity index 100% rename from Openshift4/xray-operator/licenses/LICENSE rename to Openshift4/operator/xray-operator/licenses/LICENSE diff --git a/Openshift4/xray-operator/watches.yaml b/Openshift4/operator/xray-operator/watches.yaml similarity index 100% rename from Openshift4/xray-operator/watches.yaml rename to Openshift4/operator/xray-operator/watches.yaml diff --git a/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.lock b/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.lock deleted file mode 100644 index 521af70..0000000 --- a/Openshift4/xray-operator/helm-charts/openshift-xray/requirements.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: xray - repository: https://charts.jfrog.io/ - version: 4.2.0 -digest: sha256:5e016b3e02e80668003980f2e0399f152f7d83e39957813db3aa3efa9651474f -generated: "2020-08-17T14:49:47.771127-07:00" From c49b58351098e508df76987e3d3e0940b136bd64 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Thu, 1 Oct 2020 17:30:12 -0700 Subject: [PATCH 24/28] Fixing changelog versions to be based off the operator version --- .../artifactory-ha-operator/CHANGELOG.md | 23 +- .../openshift-artifactory-ha/CHANGELOG.md | 29 + .../openshift-artifactory-ha/Chart.yaml | 19 + .../openshift-artifactory-ha/LICENSE | 201 +++ .../openshift-artifactory-ha/README.md | 1454 +++++++++++++++++ .../openshift-artifactory-ha/helminstall.sh | 57 + .../requirements.lock | 6 + .../requirements.yaml | 4 + .../openshift-artifactory-ha/values.yaml | 99 ++ .../operator/xray-operator/CHANGELOG.md | 11 +- .../helm-charts/openshift-xray/CHANGELOG.md | 3 + .../helm-charts/openshift-xray/Chart.yaml | 13 +- .../helm-charts/openshift-xray/LICENSE | 0 .../helm-charts/openshift-xray/README.md | 0 .../helm-charts/openshift-xray/helminstall.sh | 9 +- .../helm-charts/openshift-xray/rabbitmq.yaml | 4 +- .../openshift-xray/rabbitmqservice.yaml | 8 +- .../openshift-xray/requirements.lock | 6 +- .../openshift-xray/requirements.yaml | 2 +- .../helm-charts/openshift-xray/values.yaml | 147 +- 20 files changed, 2007 insertions(+), 88 deletions(-) create mode 100755 Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/CHANGELOG.md create mode 100755 Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/Chart.yaml create mode 100755 Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/LICENSE create mode 100755 Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/README.md create mode 100755 Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/helminstall.sh create mode 100644 Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/requirements.lock create mode 100644 Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/requirements.yaml create mode 100755 Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/values.yaml mode change 100644 => 100755 Openshift4/operator/xray-operator/helm-charts/openshift-xray/CHANGELOG.md mode change 100644 => 100755 Openshift4/operator/xray-operator/helm-charts/openshift-xray/Chart.yaml mode change 100644 => 100755 Openshift4/operator/xray-operator/helm-charts/openshift-xray/LICENSE mode change 100644 => 100755 Openshift4/operator/xray-operator/helm-charts/openshift-xray/README.md mode change 100644 => 100755 Openshift4/operator/xray-operator/helm-charts/openshift-xray/helminstall.sh mode change 100644 => 100755 Openshift4/operator/xray-operator/helm-charts/openshift-xray/values.yaml diff --git a/Openshift4/operator/artifactory-ha-operator/CHANGELOG.md b/Openshift4/operator/artifactory-ha-operator/CHANGELOG.md index 840b74f..0cc03df 100755 --- a/Openshift4/operator/artifactory-ha-operator/CHANGELOG.md +++ b/Openshift4/operator/artifactory-ha-operator/CHANGELOG.md @@ -1,26 +1,29 @@ # JFrog Openshift Artifactory-ha Chart Changelog All changes to this chart will be documented in this file. -## [3.1.0] - Aug 17, 2020 -* Updating to latest jfrog/artifactory-ha helm chart version 3.1.0 artifactory version 3.1.0 +## [1.1.0] - Sept 30, 2020 +* Updating Operator to latest jfrog/artifactory-ha helm chart version 4.1.0 artifactory version 7.9.0 -## [3.0.5] - July 16, 2020 -* Updating to latest jfrog/artifactory-ha helm chart version 3.0.5 artifactory version 7.6.3 +## [1.0.3] - Aug 17, 2020 +* Updating Operator to latest jfrog/artifactory-ha helm chart version 3.1.0 artifactory version 7.7.3 -## [2.6.0] - June 29, 2020 +## [1.0.2] - July 16, 2020 +* Updating Operator to latest jfrog/artifactory-ha helm chart version 3.0.5 artifactory version 7.6.3 + +## [1.0.1] - June 29, 2020 * Updating to latest jfrog/artifactory-ha helm chart version 2.6.0 artifactory version 7.6.1 -## [2.4.6] - May 12, 2020 +## [1.0.0] - May 12, 2020 * Updating to latest jfrog/artifactory-ha helm chart version 2.4.6 artifactory version 7.4.3 -## [2.3.0] - April 13, 2020 +## [0.4.0] - April 13, 2020 * Updating to latest jfrog/artifactory-ha helm chart version 2.3.0 -## [2.2.9] - April 11, 2020 +## [0.3.0] - April 11, 2020 * Fixed issues with master key -## [2.1.9] - March 17, 2020 +## [0.2.0] - March 17, 2020 * Updated Artifactory version to 7.3.2 -## [2.0.35] - March 09, 2020 +## [0.1.0] - March 09, 2020 * Updated Artifactory version to 7.2.1 diff --git a/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/CHANGELOG.md b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/CHANGELOG.md new file mode 100755 index 0000000..4fe4ae2 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/CHANGELOG.md @@ -0,0 +1,29 @@ +# JFrog Openshift Artifactory-ha Chart Changelog +All changes to this chart will be documented in this file. + +## [4.1.0] - Sept 30, 2020 +* Updating to latest jfrog/artifactory-ha helm chart version 4.1.0 artifactory version 7.9.0 + +## [3.1.0] - Aug 17, 2020 +* Updating to latest jfrog/artifactory-ha helm chart version 3.1.0 artifactory version 7.7.3 + +## [3.0.5] - Jul 16, 2020 +* Updating to latest jfrog/artifactory helm chart version 3.0.5 artifactory version 7.6.3 + +## [2.6.0] - June 29, 2020 +* Updating to latest jfrog/artifactory helm chart version 2.6.0 artifactory version 7.6.1 + +## [2.4.6] - May 12, 2020 +* Updating to latest jfrog/artifactory-ha helm chart version 2.4.6 artifactory version 7.4.3 + +## [2.3.0] - April 13, 2020 +* Updating to latest jfrog/artifactory-ha helm chart version 2.3.0 + +## [2.2.9] - April 11, 2020 +* Fixed issues with master key + +## [2.1.9] - March 17, 2020 +* Updated Artifactory version to 7.3.2 + +## [2.0.35] - March 09, 2020 +* Updated Artifactory version to 7.2.1 diff --git a/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/Chart.yaml b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/Chart.yaml new file mode 100755 index 0000000..8c0c988 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/Chart.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +appVersion: 7.9.0 +description: Openshift JFrog Artifactory HA subcharting Artifactory HA to work in Openshift environment +home: https://www.jfrog.com/artifactory/ +icon: https://raw.githubusercontent.com/jfrog/charts/master/stable/artifactory-ha/logo/artifactory-logo.png +keywords: +- artifactory +- jfrog +- devops +maintainers: +- email: vinaya@jfrog.com + name: Vinay Aggarwal +- email: johnp@jfrog.com + name: John Peterson +name: openshift-artifactory-ha +sources: +- https://bintray.com/jfrog/product/JFrog-Artifactory-Pro/view +- https://github.com/jfrog/charts +version: 4.1.0 diff --git a/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/LICENSE b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/LICENSE new file mode 100755 index 0000000..8dada3e --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/LICENSE @@ -0,0 +1,201 @@ + 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. diff --git a/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/README.md b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/README.md new file mode 100755 index 0000000..87da20a --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/README.md @@ -0,0 +1,1454 @@ +# JFrog Artifactory High Availability Helm Chart + +## Openshift +The Artifactory HA chart has been made a subchart of this chart. + +Note due to this change we now reference values through the subchart name as shown below: + +original: +``` +artifactory.node.replicaCount +``` + +now: +``` +artifactory-ha.artifactory.node.replicaCount +``` + +This is due to helm referencing them through the subchart artifactory-ha now. +## Prerequisites Details + +* Kubernetes 1.12+ +* Artifactory HA license + +## Chart Details +This chart will do the following: + +* Deploy Artifactory highly available cluster. 1 primary node and 2 member nodes. +* Deploy a PostgreSQL database +* Deploy an Nginx server + +## Artifactory HA architecture +The Artifactory HA cluster in this chart is made up of +- A single primary node +- Two member nodes, which can be resized at will + +Load balancing is done to the member nodes only. +This leaves the primary node free to handle jobs and tasks and not be interrupted by inbound traffic. +> This can be controlled by the parameter `artifactory.service.pool`. + +## Installing the Chart + +### Add JFrog Helm repository +Before installing JFrog helm charts, you need to add the [JFrog helm repository](https://charts.jfrog.io/) to your helm client +```bash +helm repo add jfrog https://charts.jfrog.io +``` + + +**NOTE:** Passing masterKey is mandatory for fresh install of chart (7.x Appversion) + +### Create a unique Master Key +Artifactory HA cluster requires a unique master key. + +**For production grade installations it is strongly recommended to use a custom master key. If you initially use the default master key it will be very hard to change the master key at a later stage** + +You should generate a unique one and pass it to the template at install/upgrade time. +```bash +# Create a key +export MASTER_KEY=$(openssl rand -hex 32) +echo ${MASTER_KEY} +``` + +### Install Chart +To install the chart with the release name `artifactory-ha`: + +```bash +helm upgrade --install artifactory-ha --set artifactory.masterKey=${MASTER_KEY} --namespace artifactory-ha jfrog/artifactory-ha +``` + +### System Configuration +Artifactory uses a common system configuration file - `system.yaml`. See [official documentation](https://www.jfrog.com/confluence/display/JFROG/System+YAML+Configuration+File) on its usage. +In order to override the default `system.yaml` configuration, do the following: +```bash +artifactory: + systemYaml: | + +``` + +### Deploying Artifactory for small/medium/large instllations +In the chart directory, we have added three values files, one for each installation type - small/medium/large. These values files are recommendations for setting resources requests and limits for your installation. The values are derived from the following [documentation](https://www.jfrog.com/confluence/display/EP/Installing+on+Kubernetes#InstallingonKubernetes-Systemrequirements). You can find them in the corresponding chart directory - values-small.yaml, values-medium.yaml and values-large.yaml + +### Accessing Artifactory +**NOTE:** It might take a few minutes for Artifactory's public IP to become available, and the nodes to complete initial setup. +Follow the instructions outputted by the install command to get the Artifactory IP and URL to access it. + +### Updating Artifactory +Once you have a new chart version, you can update your deployment with +```bash +helm upgrade artifactory-ha --namespace artifactory-ha jfrog/artifactory-ha +``` + +If artifactory was installed without providing a value to postgresql.postgresqlPassword (a password was autogenerated), follow these instructions: +1. Get the current password by running: +```bash +POSTGRES_PASSWORD=$(kubectl get secret -n -postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode) +``` +2. Upgrade the release by passing the previously auto-generated secret: +```bash +helm upgrade --namespace artifactory-ha jfrog/artifactory-ha --set postgresql.postgresqlPassword=${POSTGRES_PASSWORD} +``` + +This will apply any configuration changes on your existing deployment. + +### Special Upgrade Notes +#### Artifactory upgrade from 6.x to 7.x (App Version) +Arifactory 6.x to 7.x upgrade requires a one time migration process. This is done automatically on pod startup if needed. +It's possible to configure the migration timeout with the following configuration in extreme cases. The provided default should be more than enough for completion of the migration. +```yaml +artifactory: + # Migration support from 6.x to 7.x + migration: + timeoutSeconds: 3600 +``` + +### Artifactory memory and CPU resources +The Artifactory HA Helm chart comes with support for configured resource requests and limits to all pods. By default, these settings are commented out. +It is **highly** recommended to set these so you have full control of the allocated resources and limits. + +See more information on [setting resources for your Artifactory based on planned usage](https://www.jfrog.com/confluence/display/RTF/System+Requirements#SystemRequirements-RecommendedHardware). + +```bash +# Example of setting resource requests and limits to all pods (including passing java memory settings to Artifactory) +helm upgrade --install artifactory-ha \ + --set artifactory.primary.resources.requests.cpu="500m" \ + --set artifactory.primary.resources.limits.cpu="2" \ + --set artifactory.primary.resources.requests.memory="1Gi" \ + --set artifactory.primary.resources.limits.memory="4Gi" \ + --set artifactory.primary.javaOpts.xms="1g" \ + --set artifactory.primary.javaOpts.xmx="4g" \ + --set artifactory.node.resources.requests.cpu="500m" \ + --set artifactory.node.resources.limits.cpu="2" \ + --set artifactory.node.resources.requests.memory="1Gi" \ + --set artifactory.node.resources.limits.memory="4Gi" \ + --set artifactory.node.javaOpts.xms="1g" \ + --set artifactory.node.javaOpts.xmx="4g" \ + --set initContainers.resources.requests.cpu="10m" \ + --set initContainers.resources.limits.cpu="250m" \ + --set initContainers.resources.requests.memory="64Mi" \ + --set initContainers.resources.limits.memory="128Mi" \ + --set postgresql.resources.requests.cpu="200m" \ + --set postgresql.resources.limits.cpu="1" \ + --set postgresql.resources.requests.memory="500Mi" \ + --set postgresql.resources.limits.memory="1Gi" \ + --set nginx.resources.requests.cpu="100m" \ + --set nginx.resources.limits.cpu="250m" \ + --set nginx.resources.requests.memory="250Mi" \ + --set nginx.resources.limits.memory="500Mi" \ + --namespace artifactory-ha jfrog/artifactory-ha +``` +> Artifactory java memory parameters can (and should) also be set to match the allocated resources with `artifactory.[primary|node].javaOpts.xms` and `artifactory.[primary|node].javaOpts.xmx`. + +Get more details on configuring Artifactory in the [official documentation](https://www.jfrog.com/confluence/). + +Although it is possible to set resources limits and requests this way, it is recommended to use the pre-built values files +for small, medium and large installation and change them according to your needs (if necessary), as described [here](#Deploying-Artifactory-for-small/medium/large-installations) + +### Deploying Artifactory for small/medium/large installations +In the chart directory, we have added three values files, one for each installation type - small/medium/large. These values files are recommendations for setting resources requests and limits for your installation. The values are derived from the following [documentation](https://www.jfrog.com/confluence/display/EP/Installing+on+Kubernetes#InstallingonKubernetes-Systemrequirements). You can find them in the corresponding chart directory - values-small.yaml, values-medium.yaml and values-large.yaml + +### Artifactory storage +Artifactory HA support a wide range of storage back ends. You can see more details on [Artifactory HA storage options](https://www.jfrog.com/confluence/display/RTF/HA+Installation+and+Setup#HAInstallationandSetup-SettingUpYourStorageConfiguration) + +In this chart, you set the type of storage you want with `artifactory.persistence.type` and pass the required configuration settings. +The default storage in this chart is the `file-system` replication, where the data is replicated to all nodes. + +> **IMPORTANT:** All storage configurations (except NFS) come with a default `artifactory.persistence.redundancy` parameter. +This is used to set how many replicas of a binary should be stored in the cluster's nodes. +Once this value is set on initial deployment, you can not update it using helm. +It is recommended to set this to a number greater than half of your cluster's size, and never scale your cluster down to a size smaller than this number. + +#### Existing volume claim + +###### Primary node +In order to use an existing volume claim for the Artifactory primary storage, you need to: +- Create a persistent volume claim by the name `volume--artifactory-ha-primary-0` e.g `volume-myrelease-artifactory-ha-primary-0` +- Pass a parameter to `helm install` and `helm upgrade` +```bash +... +--set artifactory.primary.persistence.existingClaim=true +``` + +###### Member nodes +In order to use an existing volume claim for the Artifactory member nodes storage, you need to: +- Create persistent volume claims according to the number of replicas defined at `artifactory.node.replicaCount` by the names `volume--artifactory-ha-member-`, e.g `volume-myrelease-artifactory-ha-member-0` and `volume-myrelease-artifactory-ha-primary-1`. +- Pass a parameter to `helm install` and `helm upgrade` +```bash +... +--set artifactory.node.persistence.existingClaim=true +``` + +#### Existing shared volume claim + +In order to use an existing claim (for data and backup) that is to be shared across all nodes, you need to: + +- Create PVCs with ReadWriteMany that match the naming conventions: +``` + {{ template "artifactory-ha.fullname" . }}-data-pvc- + {{ template "artifactory-ha.fullname" . }}-backup-pvc- +``` +An example that shows 2 existing claims to be used: +``` + myexample-artifactory-ha-data-pvc-0 + myexample-artifactory-ha-backup-pvc-0 + myexample-artifactory-ha-data-pvc-1 + myexample-artifactory-ha-backup-pvc-1 +``` +- Set the artifactory.persistence.fileSystem.existingSharedClaim.enabled in values.yaml to true: +``` +-- set artifactory.persistence.fileSystem.existingSharedClaim.enabled=true +-- set artifactory.persistence.fileSystem.existingSharedClaim.numberOfExistingClaims=2 +``` + +#### NFS +To use an NFS server as your cluster's storage, you need to +- Setup an NFS server. Get its IP as `NFS_IP` +- Create a `data` and `backup` directories on the NFS exported directory with write permissions to all +- Pass NFS parameters to `helm install` and `helm upgrade` +```bash +... +--set artifactory.persistence.type=nfs \ +--set artifactory.persistence.nfs.ip=${NFS_IP} \ +... +``` + +#### Google Storage +To use a Google Storage bucket as the cluster's filestore. See [Google Storage Binary Provider](https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore#ConfiguringtheFilestore-GoogleStorageBinaryProvider) +- Pass Google Storage parameters to `helm install` and `helm upgrade` +```bash +... +--set artifactory.persistence.type=google-storage \ +--set artifactory.persistence.googleStorage.identity=${GCP_ID} \ +--set artifactory.persistence.googleStorage.credential=${GCP_KEY} \ +... +``` +``` +In order to use a GCP service account, Artifactory needs a gcp.credentials.json file in the same directory asa binaraystore.xml file. +This can be generated by running: +```bash +gcloud iam service-accounts keys create --iam-account +``` +Which will produce the following, which can be saved to a file or copied into your `values.yaml`. +```bash +{ + "type": "service_account", + "project_id": "", + "private_key_id": "?????", + "private_key": "-----BEGIN PRIVATE KEY-----\n????????==\n-----END PRIVATE KEY-----\n", + "client_email": "???@j.iam.gserviceaccount.com", + "client_id": "???????", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1....." +} +``` + +One option is to create your own [Secret](https://kubernetes.io/docs/concepts/configuration/secret/) and pass it to your `helm install` in a custom `values.yaml` +```bash +# Create the Kubernetes secret from the file you created earlier. +# IMPORTANT: The file must be called "gcp.credentials.json" because this is used later as the secret key! +kubectl create secret generic artifactory-gcp-creds --from-file=./gcp.credentials.json +``` +Set this secret in your custom `values.yaml` +```bash +artifactory: + persistence: + googleStorage + gcpServiceAccount: + enabled: true + customSecretName: artifactory-gcp-creds +``` + +Another option is to put your generated config directly in your custom `values.yaml` and the a secret will be created from it +``` +artifactory: + persistence: + googleStorage + gcpServiceAccount: + enabled: true + config: | + { + "type": "service_account", + "project_id": "", + "private_key_id": "?????", + "private_key": "-----BEGIN PRIVATE KEY-----\n????????==\n-----END PRIVATE KEY-----\n", + "client_email": "???@j.iam.gserviceaccount.com", + "client_id": "???????", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1....." + } +``` + +#### AWS S3 +**NOTE** Keep in mind that when using the `aws-s3` persistence type, you will not be able to provide an IAM on the pod level. +In order to grant permissions to Artifactory using an IAM role, you will have to attach the IAM role to the machine(s) on which Artifactory is running. +This is due to the fact that the `aws-s3` template uses the `JetS3t` library to interact with AWS. If you want to grant an IAM role at the pod level, see the `AWS S3 Vs` section. + +To use an AWS S3 bucket as the cluster's filestore. See [S3 Binary Provider](https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore#ConfiguringtheFilestore-S3BinaryProvider) +- Pass AWS S3 parameters to `helm install` and `helm upgrade` +```bash +... +# With explicit credentials: +--set artifactory.persistence.type=aws-s3 \ +--set artifactory.persistence.awsS3.endpoint=${AWS_S3_ENDPOINT} \ +--set artifactory.persistence.awsS3.region=${AWS_REGION} \ +--set artifactory.persistence.awsS3.identity=${AWS_ACCESS_KEY_ID} \ +--set artifactory.persistence.awsS3.credential=${AWS_SECRET_ACCESS_KEY} \ +... + +... +# With using existing IAM role +--set artifactory.persistence.type=aws-s3 \ +--set artifactory.persistence.awsS3.endpoint=${AWS_S3_ENDPOINT} \ +--set artifactory.persistence.awsS3.region=${AWS_REGION} \ +--set artifactory.persistence.awsS3.roleName=${AWS_ROLE_NAME} \ +... +``` +**NOTE:** Make sure S3 `endpoint` and `region` match. See [AWS documentation on endpoint](https://docs.aws.amazon.com/general/latest/gr/rande.html) + +#### AWS S3 V3 +To use an AWS S3 bucket as the cluster's filestore and access it with the official AWS SDK, See [S3 Official SDK Binary Provider](https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore#ConfiguringtheFilestore-AmazonS3OfficialSDKTemplate). +This filestore template uses the official AWS SDK, unlike the `aws-s3` implementation that uses the `JetS3t` library. +Use this template if you want to attach an IAM role to the Artifactory pod directly (as opposed to attaching it to the machine/s that Artifactory will run on). + +**NOTE** This will have to be combined with a k8s mechanism for attaching IAM roles to pods, like [kube2iam](https://github.com/helm/charts/tree/master/stable/kube2iam) or anything similar. + +- Pass AWS S3 V3 parameters and the annotation pointing to the IAM role (when using an IAM role. this is kube2iam specific and may vary depending on the implementation) to `helm install` and `helm upgrade` + +```bash +# With explicit credentials: +--set artifactory.persistence.type=aws-s3-v3 \ +--set artifactory.persistence.awsS3V3.region=${AWS_REGION} \ +--set artifactory.persistence.awsS3V3.bucketName=${AWS_S3_BUCKET_NAME} \ +--set artifactory.persistence.awsS3V3.identity=${AWS_ACCESS_KEY_ID} \ +--set artifactory.persistence.awsS3V3.credential=${AWS_SECRET_ACCESS_KEY} \ +... +``` + +```bash +# With using existing IAM role +--set artifactory.persistence.type=aws-s3-v3 \ +--set artifactory.persistence.awsS3V3.region=${AWS_REGION} \ +--set artifactory.persistence.awsS3V3.bucketName=${AWS_S3_BUCKET_NAME} \ +--set artifactory.annotations.'iam\.amazonaws\.com/role'=${AWS_IAM_ROLE_ARN} +... +``` + +#### Microsoft Azure Blob Storage +To use Azure Blob Storage as the cluster's filestore. See [Azure Blob Storage Binary Provider](https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore#ConfiguringtheFilestore-AzureBlobStorageClusterBinaryProvider) +- Pass Azure Blob Storage parameters to `helm install` and `helm upgrade` +```bash +... +--set artifactory.persistence.type=azure-blob \ +--set artifactory.persistence.azureBlob.accountName=${AZURE_ACCOUNT_NAME} \ +--set artifactory.persistence.azureBlob.accountKey=${AZURE_ACCOUNT_KEY} \ +--set artifactory.persistence.azureBlob.endpoint=${AZURE_ENDPOINT} \ +--set artifactory.persistence.azureBlob.containerName=${AZURE_CONTAINER_NAME} \ +... +``` + +#### Custom binarystore.xml +You have an option to provide a custom [binarystore.xml](https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore).
+There are two options for this + +1. Editing directly in [values.yaml](values.yaml) +```yaml +artifactory: + persistence: + binarystoreXml: | + + + + + +``` + +2. Create your own [Secret](https://kubernetes.io/docs/concepts/configuration/secret/) and pass it to your `helm install` command +```yaml +# Prepare your custom Secret file (custom-binarystore.yaml) +kind: Secret +apiVersion: v1 +metadata: + name: custom-binarystore + labels: + app: artifactory + chart: artifactory +stringData: + binarystore.xml: |- + + + + +``` + +```bash +# Create a secret from the file +kubectl apply -n artifactory -f ./custom-binarystore.yaml + +# Pass it to your helm install command: +helm upgrade --install artifactory-ha --set artifactory.persistence.customBinarystoreXmlSecret=custom-binarystore --namespace artifactory-ha jfrog/artifactory-ha +``` + +### Create a unique Master Key + +Alternatively, you can create a secret containing the master key manually and pass it to the template at install/upgrade time. +```bash +# Create a key +export MASTER_KEY=$(openssl rand -hex 32) +echo ${MASTER_KEY} + +# Create a secret containing the key. The key in the secret must be named master-key +kubectl create secret generic my-secret --from-literal=master-key=${MASTER_KEY} + +# Pass the created secret to helm +helm upgrade --install artifactory-ha --set artifactory.masterKeySecretName=my-secret --namespace artifactory-ha jfrog/artifactory-ha +``` +**NOTE:** In either case, make sure to pass the same master key on all future calls to `helm install` and `helm upgrade`! In the first case, this means always passing `--set artifactory.masterKey=${MASTER_KEY}`. In the second, this means always passing `--set artifactory.masterKeySecretName=my-secret` and ensuring the contents of the secret remain unchanged. + +### Special Upgrade Notes +### MasterKey during 6.x to 7.x Migration (App version) + +**NOTE:** 6.x only supports masterKey with 16 hex (32 characters) and if you have set masterKey using `openssl rand -hex 32` (64 characters) in 6.x, only the first 32 characters are used and rest are ignored. Hence, during 6.x to 7.x migration, we trim first 32 characters and set masterkey, which implies 7.x still uses the trimmed masterkey of 6.x. Hence, `artifactory.masterKey` should not be passed during migration from 6.x to 7.x. + +### Create a unique Join Key +Artifactory requires a unique join key. By default the chart has one set in values.yaml (`artifactory.joinKey`). + +**This key is for demo purpose and should not be used in a production environment!** + +You should generate a unique key and pass it to the template at install/upgrade time. +```bash +# Create a key +export JOIN_KEY=$(openssl rand -hex 32) +echo ${JOIN_KEY} + +# Pass the created join key to helm +helm upgrade --install artifactory-ha --set artifactory.joinKey=${JOIN_KEY} --namespace artifactory-ha jfrog/artifactory-ha +``` + +Alternatively, you can create a secret containing the join key manually and pass it to the template at install/upgrade time. +```bash +# Create a key +export JOIN_KEY=$(openssl rand -hex 32) +echo ${JOIN_KEY} + +# Create a secret containing the key. The key in the secret must be named join-key +kubectl create secret generic my-secret --from-literal=join-key=${JOIN_KEY} + +# Pass the created secret to helm +helm upgrade --install artifactory-ha --set artifactory.joinKeySecretName=my-secret --namespace artifactory-ha jfrog/artifactory-ha +``` +**NOTE:** In either case, make sure to pass the same join key on all future calls to `helm install` and `helm upgrade`! This means always passing `--set artifactory.joinKey=${JOIN_KEY}`. In the second, this means always passing `--set artifactory.joinKeySecretName=my-secret` and ensuring the contents of the secret remain unchanged.. + +### Install Artifactory HA license +For activating Artifactory HA, you must install an appropriate license. There are three ways to manage the license. **Artifactory UI**, **REST API**, or a **Kubernetes Secret**. + +The easier and recommended way is the **Artifactory UI**. Using the **Kubernetes Secret** or **REST API** is for advanced users and is better suited for automation. + +**IMPORTANT:** You should use only one of the following methods. Switching between them while a cluster is running might disable your Artifactory HA cluster! + +##### Artifactory UI +Once primary cluster is running, open Artifactory UI and insert the license(s) in the UI. See [HA installation and setup](https://www.jfrog.com/confluence/display/RTF/HA+Installation+and+Setup) for more details. **Note that you should enter all licenses at once, with each license is separated by a newline.** If you add the licenses one at a time, you may get redirected to a node without a license and the UI won't load for that node. + +##### REST API +You can add licenses via REST API (https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-InstallHAClusterLicenses). Note that the REST API expects "\n" for the newlines in the licenses. + +##### Kubernetes Secret +You can deploy the Artifactory license(s) as a [Kubernetes secret](https://kubernetes.io/docs/concepts/configuration/secret/). +Prepare a text file with the license(s) written in it. If writing multiple licenses (must be in the same file), it's important to put **two new lines between each license block**! +```bash +# Create the Kubernetes secret (assuming the local license file is 'art.lic') +kubectl create secret generic artifactory-cluster-license --from-file=./art.lic + +# Pass the license to helm +helm upgrade --install artifactory-ha --set artifactory.license.secret=artifactory-cluster-license,artifactory.license.dataKey=art.lic --namespace artifactory-ha jfrog/artifactory-ha +``` +**NOTE:** This method is relevant for initial deployment only! Once Artifactory is deployed, you should not keep passing these parameters as the license is already persisted into Artifactory's storage (they will be ignored). +Updating the license should be done via Artifactory UI or REST API. + +##### Create the secret as part of the helm release +values.yaml +```yaml +artifactory: + license: + licenseKey: |- + + + + + + + +``` + +```bash +helm upgrade --install artifactory-ha -f values.yaml --namespace artifactory-ha jfrog/artifactory-ha +``` +**NOTE:** This method is relevant for initial deployment only! Once Artifactory is deployed, you should not keep passing these parameters as the license is already persisted into Artifactory's storage (they will be ignored). +Updating the license should be done via Artifactory UI or REST API. +If you want to keep managing the artifactory license using the same method, you can use the copyOnEveryStartup example shown in the values.yaml file + + +### copyOnEveryStartup feature +Files stored in the `/artifactory-extra-conf` directory are only copied to the `ARTIFACTORY_HOME/etc` directory upon the first startup. +In some cases, you want your configuration files to be copied to the `ARTIFACTORY_HOME/etc` directory on every startup. +Two examples for that would be: + +1. the binarstore.xml file. If you use the default behaviour, your binarystore.xml configuration will only be copied on the first startup, +which means that changes you make over time to the `binaryStoreXml` configuration will not be applied. In order to make sure your changes are applied on every startup, do the following: +Create a values file with the following values: +```yaml +artifactory: + copyOnEveryStartup: + - source: /artifactory_bootstrap/binarystore.xml + target: etc/artifactory/ +``` + +Install the helm chart with the values file you created: +```bash +helm upgrade --install artifactory-ha --namespace artifactory-ha jfrog/artifactory-ha -f values.yaml +``` + +2. Any custom configuration file you have to configure artifactory, such as `logback.xml`: +Create a config map with your `logback.xml` configuration. + +Create a values file with the following values: +```yaml +artifactory: + ## Create a volume pointing to the config map with your configuration file + customVolumes: | + - name: logback-xml-configmap + configMap: + name: logback-xml-configmap + customVolumeMounts: | + - name: logback-xml-configmap + mountPath: /tmp/artifactory-logback/ + copyOnEveryStartup: + - source: /tmp/artifactory-logback/* + target: etc/ +``` + +Install the helm chart with the values file you created: +```bash +helm upgrade --install artifactory-ha --namespace artifactory-ha jfrog/artifactory-ha -f values.yaml +``` + +### Configure NetworkPolicy + +NetworkPolicy specifies what ingress and egress is allowed in this namespace. It is encouraged to be more specific whenever possible to increase security of the system. + +In the `networkpolicy` section of values.yaml you can specify a list of NetworkPolicy objects. + +For podSelector, ingress and egress, if nothing is provided then a default `- {}` is applied which is to allow everything. + +A full (but very wide open) example that results in 2 NetworkPolicy objects being created: +```yaml +networkpolicy: + # Allows all ingress and egress to/from artifactory primary and member pods. + - name: artifactory + podSelector: + matchLabels: + app: artifactory-ha + egress: + - {} + ingress: + - {} + # Allows connectivity from artifactory-ha pods to postgresql pods, but no traffic leaving postgresql pod. + - name: postgresql + podSelector: + matchLabels: + app: postgresql + ingress: + - from: + - podSelector: + matchLabels: + app: artifactory-ha +``` + +### Artifactory JMX Configuration +** You can see some information about the exposed MBeans here - https://www.jfrog.com/confluence/display/RTF/Artifactory+JMX+MBeans + +Enable JMX in your deployment: +```bash +helm upgrade --install artifactory \ + --set artifactory.primary.javaOpts.jmx.enabled=true \ + --set artifactory.node.javaOpts.jmx.enabled=true \ + --namespace artifactory-ha jfrog/artifactory-ha +``` +This will enable access to Artifactory with JMX on the default port (9010). +** You have the option to change the port by setting ```artifactory.primary.javaOpts.jmx.port``` and ```artifactory.node.javaOpts.jmx.port``` +to your choice of port + +In order to connect to Artifactory using JMX with jconsole (or any similar tool) installed on your computer, follow the following steps: +1. Enable JMX as described above and Change the Artifactory service to be of type LoadBalancer: +```bash +helm upgrade --install artifactory \ + --set artifactory.primary.javaOpts.jmx.enabled=true \ + --set artifactory.node.javaOpts.jmx.enabled=true \ + --set artifactory.service.type=LoadBalancer \ + --namespace artifactory-ha jfrog/artifactory-ha +``` +2. The default setting for java.rmi.server.hostname is the service name (this is also configurable with +```artifactory.primary.javaOpts.jmx.host``` and ```artifactory.node.javaOpts.jmx.host```), So in order to connect to Artifactory +with jconsole you should map the Artifactory kuberentes service IP to the service name using your hosts file as such: +``` + artifactory-ha--primary + +``` +3. Launch jconsole with the service address and port: +```bash +jconsole artifactory-ha--primary: +jconsole : +``` + +### Bootstrapping Artifactory admin password +You can bootstrap the `admin` user password as described in the [bootstrap Artifactory admin credentials](https://www.jfrog.com/confluence/display/JFROG/Users+and+Groups#UsersandGroups-RecreatingtheDefaultAdminUserrecreate) guide. + +1. Create `admin-creds-values.yaml` and provide the IP (By default 127.0.0.1) and password: +```yaml +artifactory: + admin: + ip: "" # Example: "*" to allow access from anywhere + username: "admin" + password: "" +``` + +2. Apply the `admin-creds-values.yaml` file: +```bash +helm upgrade --install artifactory --namespace artifactory-ha jfrog/artifactory-ha -f admin-creds-values.yaml +``` + +### Bootstrapping Artifactory configuration +**IMPORTANT:** Bootstrapping Artifactory needs license. Pass license as shown in above section. + +* User guide to [bootstrap Artifactory Global Configuration](https://www.jfrog.com/confluence/display/RTF/Configuration+Files#ConfigurationFiles-BootstrappingtheGlobalConfiguration) +* User guide to [bootstrap Artifactory Security Configuration](https://www.jfrog.com/confluence/display/RTF/Configuration+Files#ConfigurationFiles-BootstrappingtheSecurityConfiguration) + +1. Create `bootstrap-config.yaml` with artifactory.config.import.xml and security.import.xml as shown below: +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: my-release-bootstrap-config +data: + artifactory.config.import.xml: | + + security.import.xml: | + +``` + +2. Create configMap in Kubernetes: +```bash +kubectl apply -f bootstrap-config.yaml +``` +3. Pass the configMap to helm +```bash +helm upgrade --install artifactory-ha --set artifactory.license.secret=artifactory-cluster-license,artifactory.license.dataKey=art.lic,artifactory.configMapName=my-release-bootstrap-config --namespace artifactory-ha jfrog/artifactory-ha +``` + +### Use custom nginx.conf with Nginx + +Steps to create configMap with nginx.conf +* Create `nginx.conf` file. +```bash +kubectl create configmap nginx-config --from-file=nginx.conf +``` +* Pass configMap to helm install +```bash +helm upgrade --install artifactory-ha --set nginx.customConfigMap=nginx-config --namespace artifactory-ha jfrog/artifactory-ha +``` + +### Scaling your Artifactory cluster +A key feature in Artifactory HA is the ability to set an initial cluster size with `--set artifactory.node.replicaCount=${CLUSTER_SIZE}` and if needed, resize it. + +##### Before scaling +**IMPORTANT:** When scaling, you need to explicitly pass the database password if it's an auto generated one (this is the default with the enclosed PostgreSQL helm chart). + +Get the current database password +```bash +export DB_PASSWORD=$(kubectl get $(kubectl get secret -o name | grep postgresql) -o jsonpath="{.data.postgresql-password}" | base64 --decode) +``` +Use `--set postgresql.postgresqlPassword=${DB_PASSWORD}` with every scale action to prevent a miss configured cluster! + +##### Scale up +Let's assume you have a cluster with **2** member nodes, and you want to scale up to **3** member nodes (a total of 4 nodes). +```bash +# Scale to 4 nodes (1 primary and 3 member nodes) +helm upgrade --install artifactory-ha --set artifactory.node.replicaCount=3 --set postgresql.postgresqlPassword=${DB_PASSWORD} --namespace artifactory-ha jfrog/artifactory-ha +``` + +##### Scale down +Let's assume you have a cluster with **3** member nodes, and you want to scale down to **2** member node. + +```bash +# Scale down to 2 member nodes +helm upgrade --install artifactory-ha --set artifactory.node.replicaCount=2 --set postgresql.postgresqlPassword=${DB_PASSWORD} --namespace artifactory-ha jfrog/artifactory-ha +``` +- **NOTE:** Since Artifactory is running as a Kubernetes Stateful Set, the removal of the node will **not** remove the persistent volume. You need to explicitly remove it +```bash +# List PVCs +kubectl get pvc + +# Remove the PVC with highest ordinal! +# In this example, the highest node ordinal was 2, so need to remove its storage. +kubectl delete pvc volume-artifactory-node-2 +``` + +### Use an external Database + +**For production grade installations it is recommended to use an external PostgreSQL with a static password** + +#### PostgreSQL +There are cases where you will want to use external PostgreSQL with a different database name e.g. `my-artifactory-db`, then you need set a custom PostgreSQL connection URL, where `my-artifactory-db` is the database name. + +This can be done with the following parameters +```bash +... +--set postgresql.enabled=false \ +--set database.type=postgresql \ +--set database.driver=org.postgresql.Driver \ +--set database.url='jdbc:postgresql://${DB_HOST}:${DB_PORT}/my-artifactory-db' \ +--set database.user=${DB_USER} \ +--set database.password=${DB_PASSWORD} \ +... +``` +**NOTE:** You must set `postgresql.enabled=false` in order for the chart to use the `database.*` parameters. Without it, they will be ignored! + +#### Other DB type +There are cases where you will want to use a different database and not the enclosed **PostgreSQL**. +See more details on [configuring the database](https://www.jfrog.com/confluence/display/RTF/Configuring+the+Database) +> The official Artifactory Docker images include the PostgreSQL database driver. +> For other database types, you will have to add the relevant database driver to Artifactory's tomcat/lib + +This can be done with the following parameters +```bash +# Make sure your Artifactory Docker image has the MySQL database driver in it +... +--set postgresql.enabled=false \ +--set artifactory.preStartCommand="wget -O /opt/jfrog/artifactory/tomcat/lib/mysql-connector-java-5.1.41.jar https://jcenter.bintray.com/mysql/mysql-connector-java/5.1.41/mysql-connector-java-5.1.41.jar" \ +--set database.type=mysql \ +--set database.driver=com.mysql.jdbc.Driver \ +--set database.url=${DB_URL} \ +--set database.user=${DB_USER} \ +--set database.password=${DB_PASSWORD} \ +... +``` +**NOTE:** You must set `postgresql.enabled=false` in order for the chart to use the `database.*` parameters. Without it, they will be ignored! + +#### Using pre-existing Kubernetes Secret +If you store your database credentials in a pre-existing Kubernetes `Secret`, you can specify them via `database.secrets` instead of `database.user` and `database.password`: +```bash +# Create a secret containing the database credentials +kubectl create secret generic my-secret --from-literal=user=${DB_USER} --from-literal=password=${DB_PASSWORD} +... +--set postgresql.enabled=false \ +--set database.secrets.user.name=my-secret \ +--set database.secrets.user.key=user \ +--set database.secrets.password.name=my-secret \ +--set database.secrets.password.key=password \ +... +``` + +### Deleting Artifactory +To delete the Artifactory HA cluster + +On helm v2: +```bash +helm delete --purge artifactory-ha +``` + +On helm v3: +```bash +helm delete artifactory-ha --namespace artifactory-ha +``` + +This will completely delete your Artifactory HA cluster. +**NOTE:** Since Artifactory is running as Kubernetes Stateful Sets, the removal of the helm release will **not** remove the persistent volumes. You need to explicitly remove them +```bash +kubectl delete pvc -l release=artifactory-ha +``` +See more details in the official [Kubernetes Stateful Set removal page](https://kubernetes.io/docs/tasks/run-application/delete-stateful-set/) + +### Custom Docker registry for your images +If you need to pull your Docker images from a private registry (for example, when you have a custom image with a MySQL database driver), you need to create a +[Kubernetes Docker registry secret](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/) and pass it to helm +```bash +# Create a Docker registry secret called 'regsecret' +kubectl create secret docker-registry regsecret --docker-server=${DOCKER_REGISTRY} --docker-username=${DOCKER_USER} --docker-password=${DOCKER_PASS} --docker-email=${DOCKER_EMAIL} +``` +Once created, you pass it to `helm` +```bash +helm upgrade --install artifactory-ha --set imagePullSecrets=regsecret --namespace artifactory-ha jfrog/artifactory-ha +``` + +### Logger sidecars +This chart provides the option to add sidecars to tail various logs from Artifactory. See the available values in [values.yaml](values.yaml) + +Get list of containers in the pod +```bash +kubectl get pods -n -o jsonpath='{.spec.containers[*].name}' | tr ' ' '\n' +``` + +View specific log +```bash +kubectl logs -n -c +``` + + +### Custom init containers +There are cases where a special, unsupported init processes is needed like checking something on the file system or testing something before spinning up the main container. + +For this, there is a section for writing custom init containers before and after the predefined init containers in the [values.yaml](values.yaml) . By default it's commented out +```yaml +artifactory: + ## Add custom init containers executed before predefined init containers + customInitContainersBegin: | + ## Init containers template goes here ## + ## Add custom init containers executed after predefined init containers + customInitContainers: | + ## Init containers template goes here ## +``` + +### Custom sidecar containers +There are cases where an extra sidecar container is needed. For example monitoring agents or log collection. + +For this, there is a section for writing a custom sidecar container in the [values.yaml](values.yaml). By default it's commented out +```yaml +artifactory: + ## Add custom sidecar containers + customSidecarContainers: | + ## Sidecar containers template goes here ## +``` + +You can configure the sidecar to run as a custom user if needed by setting the following in the container template +```yaml + # Example of running container as root (id 0) + securityContext: + runAsUser: 0 + fsGroup: 0 +``` + +### Custom volumes +If you need to use a custom volume in a custom init or sidecar container, you can use this option. + +For this, there is a section for defining custom volumes in the [values.yaml](values.yaml). By default it's commented out +```yaml +artifactory: + ## Add custom volumes + customVolumes: | + ## Custom volume comes here ## +``` + +### Add Artifactory User Plugin during installation +If you need to add [Artifactory User Plugin](https://github.com/jfrog/artifactory-user-plugins), you can use this option. + +Create a secret with [Artifactory User Plugin](https://github.com/jfrog/artifactory-user-plugins) by following command: +```bash +# Secret with single user plugin +kubectl create secret generic archive-old-artifacts --from-file=archiveOldArtifacts.groovy --namespace=artifactory-ha + +# Secret with single user plugin with configuration file +kubectl create secret generic webhook --from-file=webhook.groovy --from-file=webhook.config.json.sample --namespace=artifactory-ha +``` + +Add plugin secret names to `plugins.yaml` as following: +```yaml +artifactory: + userPluginSecrets: + - archive-old-artifacts + - webhook +``` + +You can now pass the created `plugins.yaml` file to helm install command to deploy Artifactory with user plugins as follows: +```bash +helm upgrade --install artifactory-ha -f plugins.yaml --namespace artifactory-ha jfrog/artifactory-ha +``` + +Alternatively, you may be in a situation in which you would like to create a secret in a Helm chart that depends on this chart. In this scenario, the name of the secret is likely dynamically generated via template functions, so passing a statically named secret isn't possible. In this case, the chart supports evaluating strings as templates via the [`tpl`](https://helm.sh/docs/charts_tips_and_tricks/#using-the-tpl-function) function - simply pass the raw string containing the templating language used to name your secret as a value instead by adding the following to your chart's `values.yaml` file: +```yaml +artifactory-ha: # Name of the artifactory-ha dependency + artifactory: + userPluginSecrets: + - '{{ template "my-chart.fullname" . }}' +``` +NOTE: By defining userPluginSecrets, this overrides any pre-defined plugins from the container image that are stored in /tmp/plugins. At this time [artifactory-pro:6.9.0](https://bintray.com/jfrog/artifactory-pro) is distributed with `internalUser.groovy` plugin. If you need this plugin in addition to your user plugins, you should include these additional plugins as part of your userPluginSecrets. + +### Provide custom configMaps to Artifactory +If you want to mount a custom file to Artifactory, either an init shell script or a custom configuration file (such as `logback.xml`), you can use this option. + +Create a `configmaps.yaml` file with the following content: +```yaml +artifactory: + configMaps: | + logback.xml: | + + + + + %date [%-5level] \(%-20c{3}:%L\) %message%n + + + + + + + + + + + + + + + my-custom-post-start-hook.sh: | + echo "This is my custom post start hook" + + customVolumeMounts: | + - name: artifactory-configmaps + mountPath: /tmp/my-config-map + + postStartCommand: | + chmod +x /tmp/my-config-map/my-custom-post-start-hook.sh; + /tmp/my-config-map/my-custom-post-start-hook.sh; + + copyOnEveryStartup: + - source: /tmp/my-config-map/logback.xml + target: etc/ + +``` + +and use it with you helm install/upgrade: +```bash +helm upgrade --install artifactory-ha -f configmaps.yaml --namespace artifactory-ha jfrog/artifactory-ha +``` + +This will, in turn: +* create a configMap with the files you specified above +* create a volume pointing to the configMap with the name `artifactory-configmaps` +* Mount said configMap onto `/tmp/my-config-map` using a `customVolumeMounts` +* Set the shell script we mounted as the `postStartCommand` +* Copy the `logback.xml` file to its proper location in the `$ARTIFACTORY_HOME/etc` directory. + + +### Artifactory filebeat +If you want to collect logs from your Artifactory installation and send them to a central log collection solution like ELK, you can use this option. + +Create a `filebeat.yaml` values file with the following content: +```yaml +filebeat: + enabled: true + logstashUrl: + resources: + requests: + memory: "100Mi" + cpu: "100m" + limits: + memory: "100Mi" + cpu: "100m" +``` + +You can optionally customize the `filebeat.yaml` to send output to a different location like so: +```yaml +filebeat: + enabled: true + filebeatYml: | + +``` + +and use it with you helm install/upgrade: +```bash +helm upgrade --install artifactory-ha -f filebeat.yaml --namespace artifactory-ha jfrog/artifactory +``` + +This will start sending your Artifactory logs to the log aggregator of your choice, based on your configuration in the `filebeatYml` + +## Configuration +The following table lists the configurable parameters of the artifactory chart and their default values. + +| Parameter | Description | Default | +|------------------------------|-----------------------------------|-------------------------------------------------------| +| `imagePullSecrets` | Docker registry pull secret | | +| `serviceAccount.create` | Specifies whether a ServiceAccount should be created | `true` | +| `serviceAccount.name` | The name of the ServiceAccount to create | Generated using the fullname template | +| `serviceAccount.annotations` | Artifactory service account annotations | `` | +| `rbac.create` | Specifies whether RBAC resources should be created | `true` | +| `rbac.role.rules` | Rules to create | `[]` | +| `logger.image.repository` | repository for logger image | `busybox` | +| `logger.image.tag` | tag for logger image | `1.30` | +| `artifactory.name` | Artifactory name | `artifactory` | +| `artifactory.image.pullPolicy` | Container pull policy | `IfNotPresent` | +| `artifactory.image.repository` | Container image | `docker.bintray.io/jfrog/artifactory-pro` | +| `artifactory.image.version` | Container image tag | `.Chart.AppVersion` | +| `artifactory.priorityClass.create` | Create a PriorityClass object | `false` | +| `artifactory.priorityClass.value` | Priority Class value | `1000000000` | +| `artifactory.priorityClass.name` | Priority Class name | `{{ template "artifactory-ha.fullname" . }}` | +| `artifactory.priorityClass.existingPriorityClass` | Use existing priority class | `` | +| `artifactory.loggers` | Artifactory loggers (see values.yaml for possible values) | `[]` | +| `artifactory.loggersResources.requests.memory` | Artifactory loggers initial memory request | | +| `artifactory.loggersResources.requests.cpu` | Artifactory loggers initial cpu request | | +| `artifactory.loggersResources.limits.memory` | Artifactory loggers memory limit | | +| `artifactory.loggersResources.limits.cpu` | Artifactory loggers cpu limit | | +| `artifactory.catalinaLoggers` | Artifactory Tomcat loggers (see values.yaml for possible values) | `[]` | +| `artifactory.catalinaLoggersResources.requests.memory` | Artifactory Tomcat loggers initial memory request | | +| `artifactory.catalinaLoggersResources.requests.cpu` | Artifactory Tomcat loggers initial cpu request | | +| `artifactory.catalinaLoggersResources.limits.memory` | Artifactory Tomcat loggers memory limit | | +| `artifactory.catalinaLoggersResources.limits.cpu` | Artifactory Tomcat loggers cpu limit | | +| `artifactory.customInitContainersBegin`| Custom init containers to run before existing init containers | | +| `artifactory.customInitContainers`| Custom init containers to run after existing init containers | | +| `artifactory.customSidecarContainers`| Custom sidecar containers | | +| `artifactory.customVolumes` | Custom volumes | | +| `artifactory.customVolumeMounts` | Custom Artifactory volumeMounts | | +| `artifactory.customPersistentPodVolumeClaim` | Custom PVC spec to create and attach a unique PVC for each pod on startup with the volumeClaimTemplates feature in StatefulSet | | +| `artifactory.customPersistentVolumeClaim` | Custom PVC spec to be mounted to the all artifactory containers using a volume | | +| `artifactory.userPluginSecrets` | Array of secret names for Artifactory user plugins | | +| `artifactory.masterKey` | Artifactory master key. A 128-Bit key size (hexadecimal encoded) string (32 hex characters). Can be generated with `openssl rand -hex 32`. NOTE: This key can be generated only once and cannot be updated once created |``| +| `artifactory.masterKeySecretName` | Artifactory Master Key secret name | | +| `artifactory.joinKey` | Join Key to connect other services to Artifactory. Can be generated with `openssl rand -hex 32` | `` | +| `artifactory.joinKeySecretName` | Artifactory join Key secret name | | +| `artifactory.admin.ip` | Artifactory admin ip to be set upon startup, can use (*) for 0.0.0.0| `127.0.0.1` | +| `artifactory.admin.username` | Artifactory admin username to be set upon startup| `admin` | +| `artifactory.admin.password` | Artifactory admin password to be set upon startup| | +| `artifactory.admin.secret` | Artifactory admin secret name | | +| `artifactory.admin.dataKey` | Artifactory admin secret data key | | +| `artifactory.preStartCommand` | Command to run before entrypoint starts | | +| `artifactory.postStartCommand` | Command to run after container starts. Supports templating with `tpl` | | +| `artifactory.license.licenseKey` | Artifactory license key. Providing the license key as a parameter will cause a secret containing the license key to be created as part of the release. Use either this setting or the license.secret and license.dataKey. If you use both, the latter will be used. | | +| `artifactory.configMaps` | configMaps to be created as volume by the name `artifactory-configmaps`. In order to use these configMaps, you will need to add `customVolumeMounts` to point to the created volume and mount it onto a container | | +| `artifactory.license.secret` | Artifactory license secret name | | +| `artifactory.license.dataKey`| Artifactory license secret data key | | +| `artifactory.service.name` | Artifactory service name to be set in Nginx configuration | `artifactory` | +| `artifactory.service.type` | Artifactory service type | `ClusterIP` | +| `artifactory.service.clusterIP`| Specific cluster IP or `None` for headless services | `nil` | +| `artifactory.service.loadBalancerSourceRanges`| Artifactory service array of IP CIDR ranges to whitelist (only when service type is LoadBalancer) | | +| `artifactory.service.annotations` | Artifactory service annotations | `{}` | +| `artifactory.service.pool` | Artifactory instances to be in the load balancing pool. `members` or `all` | `members` | +| `artifactory.externalPort` | Artifactory service external port | `8082` | +| `artifactory.internalPort` | Artifactory service internal port (**DO NOT** use port lower than 1024) | `8082` | +| `artifactory.internalArtifactoryPort` | Artifactory service internal port (**DO NOT** use port lower than 1024) | `8081` | +| `artifactory.externalArtifactoryPort` | Artifactory service external port | `8081` | +| `artifactory.extraEnvironmentVariables` | Extra environment variables to pass to Artifactory. Supports evaluating strings as templates via the [`tpl`](https://helm.sh/docs/charts_tips_and_tricks/#using-the-tpl-function) function. See [documentation](https://www.jfrog.com/confluence/display/RTF/Installing+with+Docker#InstallingwithDocker-SupportedEnvironmentVariables) | | +| `artifactory.livenessProbe.enabled` | Enable liveness probe | `true` | +| `artifactory.livenessProbe.path` | liveness probe HTTP Get path | `/router/api/v1/system/health` | +| `artifactory.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | 180 | +| `artifactory.livenessProbe.periodSeconds` | How often to perform the probe | 10 | +| `artifactory.livenessProbe.timeoutSeconds` | When the probe times out | 10 | +| `artifactory.livenessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed. | 1 | +| `artifactory.livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 10 | +| `artifactory.readinessProbe.enabled` | would you like a readinessProbe to be enabled | `true` | +| `artifactory.readinessProbe.path` | readiness probe HTTP Get path | `/router/api/v1/system/health` | +| `artifactory.readinessProbe.initialDelaySeconds` | Delay before readiness probe is initiated | 60 | +| `artifactory.readinessProbe.periodSeconds` | How often to perform the probe | 10 | +| `artifactory.readinessProbe.timeoutSeconds` | When the probe times out | 10 | +| `artifactory.readinessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed. | 1 | +| `artifactory.readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 10 | +| `artifactory.copyOnEveryStartup` | List of files to copy on startup from source (which is absolute) to target (which is relative to ARTIFACTORY_HOME | | +| `artifactory.deleteDBPropertiesOnStartup` | Whether to delete the ARTIFACTORY_HOME/etc/db.properties file on startup. Disabling this will remove the ability for the db.properties to be updated with any DB-related environment variables change (e.g. DB_HOST, DB_URL) | `true` | +| `artifactory.database.maxOpenConnections` | Maximum amount of open connections from Artifactory to the DB | `80` | +| `artifactory.haDataDir.enabled` | Enable haDataDir for eventual storage in the HA cluster | `false` | +| `artifactory.haDataDir.path` | Path to the directory intended for use with NFS eventual configuration for HA | | +| `artifactory.haBackupDir.enabled` | Enable haBackupDir for eventual storage in the HA cluster | `false` | +| `artifactory.haBackupDir.path` | Path to the directory intended for use with NFS eventual configuration for HA | | +| `artifactory.haBackupDir.enabled` | Enable haBackupDir for eventual storage in the HA cluster | `false` | +| `artifactory.haBackupDir.path` | Path to the directory intended for use with NFS eventual configuration for HA | | +| `artifactory.migration.timeout` | Artifactory migration Maximum Time out in seconds| `3600` | +| `artifactory.migration.timeout` | Artifactory migration Maximum Time out in seconds| `3600` | +| `artifactory.persistence.mountPath` | Artifactory persistence volume mount path | `"/var/opt/jfrog/artifactory"` | +| `artifactory.persistence.enabled` | Artifactory persistence volume enabled | `true` | +| `artifactory.persistence.accessMode` | Artifactory persistence volume access mode | `ReadWriteOnce` | +| `artifactory.persistence.size` | Artifactory persistence or local volume size | `200Gi` | +| `artifactory.persistence.binarystore.enabled` | whether you want to mount the binarystore.xml file from a secret created by the chart. If `false` you will need need to get the binarystore.xml file into the file-system from either an `initContainer` or using a `preStartCommand` | `true` | +| `artifactory.persistence.binarystoreXml` | Artifactory binarystore.xml template | See `values.yaml` | +| `artifactory.persistence.customBinarystoreXmlSecret` | A custom Secret for binarystore.xml | `` | +| `artifactory.persistence.maxCacheSize` | Artifactory cache-fs provider maxCacheSize in bytes | `50000000000` | +| `artifactory.persistence.cacheProviderDir` | the root folder of binaries for the filestore cache. If the value specified starts with a forward slash ("/") it is considered the fully qualified path to the filestore folder. Otherwise, it is considered relative to the *baseDataDir*. | `cache` | +| `artifactory.persistence.type` | Artifactory HA storage type | `file-system` | +| `artifactory.persistence.redundancy` | Artifactory HA storage redundancy | `3` | +| `artifactory.persistence.nfs.ip` | NFS server IP | | +| `artifactory.persistence.nfs.haDataMount` | NFS data directory | `/data` | +| `artifactory.persistence.nfs.haBackupMount` | NFS backup directory | `/backup` | +| `artifactory.persistence.nfs.dataDir` | HA data directory | `/var/opt/jfrog/artifactory-ha` | +| `artifactory.persistence.nfs.backupDir` | HA backup directory | `/var/opt/jfrog/artifactory-backup` | +| `artifactory.persistence.nfs.capacity` | NFS PVC size | `200Gi` | +| `artifactory.persistence.nfs.mountOptions` | NFS mount options | `[]` | +| `artifactory.persistence.eventual.numberOfThreads` | Eventual number of threads | `10` | +| `artifactory.persistence.googleStorage.endpoint` | Google Storage API endpoint| `storage.googleapis.com` | +| `artifactory.persistence.googleStorage.httpsOnly` | Google Storage API has to be consumed https only| `false` | +| `artifactory.persistence.googleStorage.bucketName` | Google Storage bucket name | `artifactory-ha` | +| `artifactory.persistence.googleStorage.identity` | Google Storage service account id | | +| `artifactory.persistence.googleStorage.credential` | Google Storage service account key | | +| `artifactory.persistence.googleStorage.path` | Google Storage path in bucket | `artifactory-ha/filestore` | +| `artifactory.persistence.googleStorage.bucketExists`| Google Storage bucket exists therefore does not need to be created.| `false` | +| `artifactory.persistence.awsS3.bucketName` | AWS S3 bucket name | `artifactory-ha` | +| `artifactory.persistence.awsS3.endpoint` | AWS S3 bucket endpoint | See https://docs.aws.amazon.com/general/latest/gr/rande.html | +| `artifactory.persistence.awsS3.region` | AWS S3 bucket region | | +| `artifactory.persistence.awsS3.roleName` | AWS S3 IAM role name | | +| `artifactory.persistence.awsS3.identity` | AWS S3 AWS_ACCESS_KEY_ID | | +| `artifactory.persistence.awsS3.credential` | AWS S3 AWS_SECRET_ACCESS_KEY | | +| `artifactory.persistence.awsS3.properties` | AWS S3 additional properties | | +| `artifactory.persistence.awsS3.path` | AWS S3 path in bucket | `artifactory-ha/filestore` | +| `artifactory.persistence.awsS3.refreshCredentials` | AWS S3 renew credentials on expiration | `true` (When roleName is used, this parameter will be set to true) | +| `artifactory.persistence.awsS3.httpsOnly` | AWS S3 https access to the bucket only | `true` | +| `artifactory.persistence.awsS3.testConnection` | AWS S3 test connection on start up | `false` | +| `artifactory.persistence.awsS3.s3AwsVersion` | AWS S3 signature version | `AWS4-HMAC-SHA256` | +| `artifactory.persistence.awsS3V3.testConnection` | AWS S3 test connection on start up | `false` | +| `artifactory.persistence.awsS3V3.identity` | AWS S3 AWS_ACCESS_KEY_ID | | +| `artifactory.persistence.awsS3V3.credential` | AWS S3 AWS_SECRET_ACCESS_KEY | | +| `artifactory.persistence.awsS3V3.region` | AWS S3 bucket region | | +| `artifactory.persistence.awsS3V3.bucketName` | AWS S3 bucket name | `artifactory-aws` | +| `artifactory.persistence.awsS3V3.path` | AWS S3 path in bucket | `artifactory/filestore` | +| `artifactory.persistence.awsS3V3.endpoint` | AWS S3 bucket endpoint | See https://docs.aws.amazon.com/general/latest/gr/rande.html | +| `artifactory.persistence.awsS3V3.kmsServerSideEncryptionKeyId` | AWS S3 encryption key ID or alias | | +| `artifactory.persistence.awsS3V3.kmsKeyRegion` | AWS S3 KMS Key region | | +| `artifactory.persistence.awsS3V3.kmsCryptoMode` | AWS S3 KMS encryption mode | See https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore#ConfiguringtheFilestore-AmazonS3OfficialSDKTemplate | +| `artifactory.persistence.awsS3V3.useInstanceCredentials` | AWS S3 Use default authentication mechanism | See https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore#ConfiguringtheFilestore-authentication | +| `artifactory.persistence.awsS3V3.usePresigning` | AWS S3 Use URL signing | `false` | +| `artifactory.persistence.awsS3V3.signatureExpirySeconds` | AWS S3 Validity period in seconds for signed URLs | `300` | +| `artifactory.persistence.awsS3V3.cloudFrontDomainName` | AWS CloudFront domain name | See https://www.jfrog.com/confluence/display/RTF/Direct+Cloud+Storage+Download#DirectCloudStorageDownload-UsingCloudFront(Optional)| +| `artifactory.persistence.awsS3V3.cloudFrontKeyPairId` | AWS CloudFront key pair ID | See https://www.jfrog.com/confluence/display/RTF/Direct+Cloud+Storage+Download#DirectCloudStorageDownload-UsingCloudFront(Optional)| +| `artifactory.persistence.awsS3V3.cloudFrontPrivateKey` | AWS CloudFront private key | See https://www.jfrog.com/confluence/display/RTF/Direct+Cloud+Storage+Download#DirectCloudStorageDownload-UsingCloudFront(Optional)| +| `artifactory.persistence.azureBlob.accountName` | Azure Blob Storage account name | `` | +| `artifactory.persistence.azureBlob.accountKey` | Azure Blob Storage account key | `` | +| `artifactory.persistence.azureBlob.endpoint` | Azure Blob Storage endpoint | `` | +| `artifactory.persistence.azureBlob.containerName` | Azure Blob Storage container name | `` | +| `artifactory.persistence.azureBlob.testConnection` | Azure Blob Storage test connection | `false` | +| `artifactory.persistence.fileSystem.existingSharedClaim` | Enable using an existing shared pvc | `false` | +| `artifactory.persistence.fileStorage.dataDir` | HA data directory | `/var/opt/jfrog/artifactory/artifactory-data` | +| `artifactory.persistence.fileStorage.backupDir` | HA backup directory | `/var/opt/jfrog/artifactory-backup` | +| `artifactory.javaOpts.other` | Artifactory additional java options (for all nodes) | | +| `artifactory.ssh.enabled` | Enable Artifactory SSH access | | +| `artifactory.ssh.internalPort` | Artifactory SSH internal port | `1339` | +| `artifactory.ssh.externalPort` | Artifactory SSH external port | `1339` | +| `artifactory.primary.preStartCommand` | Artifactory primary node preStartCommand to be run after `artifactory.preStartCommand` | | +| `artifactory.primary.labels` | Artifactory primary node labels | `{}` | +| `artifactory.primary.resources.requests.memory` | Artifactory primary node initial memory request | | +| `artifactory.primary.resources.requests.cpu` | Artifactory primary node initial cpu request | | +| `artifactory.primary.resources.limits.memory` | Artifactory primary node memory limit | | +| `artifactory.primary.resources.limits.cpu` | Artifactory primary node cpu limit | | +| `artifactory.primary.javaOpts.xms` | Artifactory primary node java Xms size | | +| `artifactory.primary.javaOpts.xmx` | Artifactory primary node java Xms size | | +| `artifactory.primary.javaOpts.corePoolSize` | The number of async processes that can run in parallel in the primary node - https://jfrog.com/knowledge-base/how-do-i-tune-artifactory-for-heavy-loads/ | `16` | +| `artifactory.primary.javaOpts.jmx.enabled` | Enable JMX monitoring | `false` | +| `artifactory.primary.javaOpts.jmx.port` | JMX Port number | `9010` | +| `artifactory.primary.javaOpts.jmx.host` | JMX hostname (parsed as a helm template) | `{{ template "artifactory-ha.primary.name" $ }}` | +| `artifactory.primary.javaOpts.jmx.ssl` | Enable SSL | `false` | +| `artifactory.primary.javaOpts.jmx.authenticate` | Enable JMX authentication | `false` | +| `artifactory.primary.javaOpts.jmx.accessFile` | The path to the JMX access file, when JMX authentication is enabled | | +| `artifactory.primary.javaOpts.jmx.passwordFile` | The path to the JMX password file, when JMX authentication is enabled | | +| `artifactory.primary.javaOpts.other` | Artifactory primary node additional java options | | +| `artifactory.primary.persistence.existingClaim` | Whether to use an existing pvc for the primary node | `false` | +| `artifactory.node.preStartCommand` | Artifactory member node preStartCommand to be run after `artifactory.preStartCommand` | | +| `artifactory.node.labels` | Artifactory member node labels | `{}` | +| `artifactory.node.replicaCount` | Artifactory member node replica count | `2` | +| `artifactory.node.minAvailable` | Artifactory member node min available count | `1` | +| `artifactory.node.resources.requests.memory` | Artifactory member node initial memory request | | +| `artifactory.node.resources.requests.cpu` | Artifactory member node initial cpu request | | +| `artifactory.node.resources.limits.memory` | Artifactory member node memory limit | | +| `artifactory.node.resources.limits.cpu` | Artifactory member node cpu limit | | +| `artifactory.node.javaOpts.xms` | Artifactory member node java Xms size | | +| `artifactory.node.javaOpts.xmx` | Artifactory member node java Xms size | | +| `artifactory.node.javaOpts.corePoolSize` | The number of async processes that can run in parallel in the member nodes - https://jfrog.com/knowledge-base/how-do-i-tune-artifactory-for-heavy-loads/ | `16` | +| `artifactory.node.javaOpts.jmx.enabled` | Enable JMX monitoring | `false` | +| `artifactory.node.javaOpts.jmx.port` | JMX Port number | `9010` | +| `artifactory.node.javaOpts.jmx.host` | JMX hostname (parsed as a helm template) | `{{ template "artifactory-ha.fullname" $ }}` | +| `artifactory.node.javaOpts.jmx.ssl` | Enable SSL | `false` | +| `artifactory.node.javaOpts.jmx.authenticate` | Enable JMX authentication | `false` | +| `artifactory.node.javaOpts.jmx.accessFile` | The path to the JMX access file, when JMX authentication is enabled | | +| `artifactory.node.javaOpts.jmx.passwordFile` | The path to the JMX password file, when JMX authentication is enabled | | +| `artifactory.node.javaOpts.other` | Artifactory member node additional java options | | +| `artifactory.node.persistence.existingClaim` | Whether to use existing PVCs for the member nodes | `false` | +| `artifactory.terminationGracePeriodSeconds` | Termination grace period (seconds) | `30s` | +| `artifactory.node.waitForPrimaryStartup.enabled` | Whether to wait for the primary node to start before starting up the member nodes | `false` | +| `artifactory.node.waitForPrimaryStartup.time` | The amount of time to wait for the primary node to start before starting up the member nodes | `60` | +| `artifactory.systemYaml` | Artifactory system configuration (`system.yaml`) as described here - https://www.jfrog.com/confluence/display/JFROG/Artifactory+System+YAML | `see values.yaml` | +| `access.database.maxOpenConnections` | Maximum amount of open connections from Access to the DB | `80` | +| `initContainers.resources.requests.memory` | Init containers initial memory request | | +| `initContainers.resources.requests.cpu` | Init containers initial cpu request | | +| `initContainers.resources.limits.memory` | Init containers memory limit | | +| `initContainers.resources.limits.cpu` | Init containers cpu limit | | +| `ingress.enabled` | If true, Artifactory Ingress will be created | `false` | +| `ingress.annotations` | Artifactory Ingress annotations | `{}` | +| `ingress.labels` | Artifactory Ingress labels | `{}` | +| `ingress.hosts` | Artifactory Ingress hostnames | `[]` | +| `ingress.routerPath` | Router Ingress path | `/` | +| `ingress.artifactoryPath` | Artifactory Ingress path | `/artifactory` | +| `ingress.tls` | Artifactory Ingress TLS configuration (YAML) | `[]` | +| `ingress.defaultBackend.enabled` | If true, the default `backend` will be added using serviceName and servicePort | `true` | +| `ingress.annotations` | Ingress annotations, which are written out if annotations section exists in values. Everything inside of the annotations section will appear verbatim inside the resulting manifest. See `Ingress annotations` section below for examples of how to leverage the annotations, specifically for how to enable docker authentication. | | +| `ingress.additionalRules` | Ingress additional rules to be added to the Artifactory ingress. | `[]` | +| `metadata.database.maxOpenConnections` | Maximum amount of open connections from metadata to the DB | `80` | +| `nginx.enabled` | Deploy nginx server | `true` | +| `nginx.kind` | Nginx object kind, for example `DaemonSet`, `Deployment` or `StatefulSet` | `Deployment` | +| `nginx.name` | Nginx name | `nginx` | +| `nginx.replicaCount` | Nginx replica count | `1` | +| `nginx.uid` | Nginx User Id | `104` | +| `nginx.gid` | Nginx Group Id | `107` | +| `nginx.image.repository` | Container image | `docker.bintray.io/jfrog/nginx-artifactory-pro` | +| `nginx.image.version` | Container version | `.Chart.AppVersion` | +| `nginx.image.pullPolicy` | Container pull policy | `IfNotPresent` | +| `nginx.labels` | Nginx deployment labels | `{}` | +| `nginx.minAvailable` | Nginx node min available count | `0` | +| `nginx.loggers` | Nginx loggers (see values.yaml for possible values) | `[]` | +| `nginx.loggersResources.requests.memory` | Nginx logger initial memory request | | +| `nginx.loggersResources.requests.cpu` | Nginx logger initial cpu request | | +| `nginx.loggersResources.limits.memory` | Nginx logger memory limit | | +| `nginx.loggersResources.limits.cpu` | Nginx logger cpu limit | | +| `nginx.logs.stderr` | Send nginx logs to stderr | false | +| `nginx.logs.level` | Nginx log level: debug, info, notice, warn, error, crit, alert, or emerg | warn | +| `nginx.mainConf` | Content of the Artifactory nginx main nginx.conf config file | `see values.yaml` | +| `nginx.artifactoryConf` | Content of Artifactory nginx artifactory.conf config file | `see values.yaml` | +| `nginx.service.type` | Nginx service type | `LoadBalancer` | +| `nginx.service.clusterIP` | Specific cluster IP or `None` for headless services | `nil` | +| `nginx.service.loadBalancerSourceRanges`| Nginx service array of IP CIDR ranges to whitelist (only when service type is LoadBalancer) | | +| `nginx.service.labels` | Nginx service labels | `{}` | +| `nginx.service.annotations` | Nginx service annotations | `{}` | +| `nginx.service.ssloffload` | Nginx service SSL offload | false | +| `nginx.service.externalTrafficPolicy`| Nginx service desires to route external traffic to node-local or cluster-wide endpoints. | `Cluster` | +| `nginx.loadBalancerIP`| Provide Static IP to configure with Nginx | | +| `nginx.http.enabled` | Nginx http service enabled/disabled | true | +| `nginx.http.externalPort` | Nginx service external port | `80` | +| `nginx.http.internalPort` | Nginx service internal port | `80` | +| `nginx.https.enabled` | Nginx http service enabled/disabled | true | +| `nginx.https.externalPort` | Nginx service external port | `443` | +| `nginx.https.internalPort` | Nginx service internal port | `443` | +| `nginx.ssh.internalPort` | Nginx SSH internal port | `22` | +| `nginx.ssh.externalPort` | Nginx SSH external port | `22` | +| `nginx.externalPortHttp` | DEPRECATED: Nginx service external port | `80` | +| `nginx.internalPortHttp` | DEPRECATED: Nginx service internal port | `80` | +| `nginx.externalPortHttps` | DEPRECATED: Nginx service external port | `443` | +| `nginx.internalPortHttps` | DEPRECATED: Nginx service internal port | `443` | +| `nginx.livenessProbe.enabled` | would you like a liveness Probe to be enabled | `true` | +| `nginx.livenessProbe.path` | liveness probe HTTP Get path | `/router/api/v1/system/health` | +| `nginx.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | 100 | +| `nginx.livenessProbe.periodSeconds` | How often to perform the probe | 10 | +| `nginx.livenessProbe.timeoutSeconds` | When the probe times out | 10 | +| `nginx.livenessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed. | 1 | +| `nginx.livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 10 | +| `nginx.readinessProbe.enabled` | would you like a readinessProbe to be enabled | `true` | +| `nginx.readinessProbe.path` | Readiness probe HTTP Get path | `/router/api/v1/system/health` | +| `nginx.readinessProbe.initialDelaySeconds` | Delay before readiness probe is initiated | 60 | +| `nginx.readinessProbe.periodSeconds` | How often to perform the probe | 10 | +| `nginx.readinessProbe.timeoutSeconds` | When the probe times out | 10 | +| `nginx.readinessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed. | 1 | +| `nginx.readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 10 | +| `nginx.tlsSecretName` | SSL secret that will be used by the Nginx pod | | +| `nginx.customConfigMap` | Nginx CustomeConfigMap name for `nginx.conf` | ` ` | +| `nginx.customArtifactoryConfigMap`| Nginx CustomeConfigMap name for `artifactory-ha.conf` | ` ` | +| `nginx.resources.requests.memory` | Nginx initial memory request | `250Mi` | +| `nginx.resources.requests.cpu` | Nginx initial cpu request | `100m` | +| `nginx.resources.limits.memory` | Nginx memory limit | `250Mi` | +| `nginx.resources.limits.cpu` | Nginx cpu limit | `500m` | +| `nginx.persistence.mountPath` | Nginx persistence volume mount path | `"/var/opt/jfrog/nginx"` | +| `nginx.persistence.enabled` | Nginx persistence volume enabled. This is only available when the nginx.replicaCount is set to 1 | `false` | +| `nginx.persistence.accessMode` | Nginx persistence volume access mode | `ReadWriteOnce` | +| `nginx.persistence.size` | Nginx persistence volume size | `5Gi` | +| `waitForDatabase` | Wait for database (using wait-for-db init container) | `true` | +| `postgresql.enabled` | Use enclosed PostgreSQL as database | `true` | +| `postgresql.imageTag` | PostgreSQL version | `9.6.11` | +| `postgresql.postgresqlDatabase` | PostgreSQL database name | `artifactory` | +| `postgresql.postgresqlUsername` | PostgreSQL database user | `artifactory` | +| `postgresql.postgresqlPassword` | PostgreSQL database password | | +| `postgresql.postgresqlExtendedConf.listenAddresses` | PostgreSQL listen address | `"'*'"` | +| `postgresql.postgresqlExtendedConf.maxConnections` | PostgreSQL max_connections parameter | `1500` | +| `postgresql.persistence.enabled` | PostgreSQL use persistent storage | `true` | +| `postgresql.persistence.size` | PostgreSQL persistent storage size | `50Gi` | +| `postgresql.service.port` | PostgreSQL database port | `5432` | +| `postgresql.resources.requests.memory` | PostgreSQL initial memory request | | +| `postgresql.resources.requests.cpu` | PostgreSQL initial cpu request | | +| `postgresql.resources.limits.memory` | PostgreSQL memory limit | | +| `postgresql.resources.limits.cpu` | PostgreSQL cpu limit | | +| `database.type` | External database type (`postgresql`, `mysql`, `oracle` or `mssql`) | | +| `database.driver` | External database driver e.g. `org.postgresql.Driver` | | +| `database.url` | External database connection URL | | +| `database.user` | External database username | | +| `database.password` | External database password | | +| `database.secrets.user.name` | External database username `Secret` name | | +| `database.secrets.user.key` | External database username `Secret` key | | +| `database.secrets.password.name` | External database password `Secret` name | | +| `database.secrets.password.key` | External database password `Secret` key | | +| `database.secrets.url.name ` | External database url `Secret` name | | +| `database.secrets.url.key` | External database url `Secret` key | | +| `networkpolicy.name` | Becomes part of the NetworkPolicy object name | `artifactory` | +| `networkpolicy.podselector` | Contains the YAML that specifies how to match pods. Usually using matchLabels. | | +| `networkpolicy.ingress` | YAML snippet containing to & from rules applied to incoming traffic | `- {}` (open to all inbound traffic) | +| `networkpolicy.egress` | YAML snippet containing to & from rules applied to outgoing traffic | `- {}` (open to all outbound traffic) | +| `filebeat.enabled` | Enable a filebeat container to send your logs to a log management solution like ELK | `false` | +| `filebeat.name` | filebeat container name | `artifactory-filebeat` | +| `filebeat.image.repository` | filebeat Docker image repository | `docker.elastic.co/beats/filebeat` | +| `filebeat.image.version` | filebeat Docker image version | `7.5.1` | +| `filebeat.logstashUrl` | The URL to the central Logstash service, if you have one | `logstash:5044` | +| `filebeat.livenessProbe.exec.command` | liveness probe exec command | see [values.yaml](stable/artifactory-ha/values.yaml) | +| `filebeat.livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 10 | +| `filebeat.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | 180 | +| `filebeat.livenessProbe.periodSeconds` | How often to perform the probe | 10 | +| `filebeat.readinessProbe.exec.command` | readiness probe exec command | see [values.yaml](stable/artifactory-ha/values.yaml) | +| `filebeat.readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 10 | +| `filebeat.readinessProbe.initialDelaySeconds` | Delay before readiness probe is initiated | 180 | +| `filebeat.readinessProbe.periodSeconds` | How often to perform the probe | 10 | +| `filebeat.resources.requests.memory` | Filebeat initial memory request | | +| `filebeat.resources.requests.cpu` | Filebeat initial cpu request | | +| `filebeat.resources.limits.memory` | Filebeat memory limit | | +| `filebeat.resources.limits.cpu` | Filebeat cpu limit | | +| `filebeat.filebeatYml` | Filebeat yaml configuration file | see [values.yaml](stable/artifactory-ha/values.yaml) | + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. + +### Install Artifactory HA with Nginx and Terminate SSL in Nginx Service(LoadBalancer). +To install the helm chart with performing SSL offload in the LoadBalancer layer of Nginx. +For Ex: Using AWS ACM certificates to do SSL offload in the loadbalancer layer. + +```bash +helm upgrade --install artifactory-ha \ + --set nginx.service.ssloffload=true \ + --set nginx.https.enabled=false \ + --set nginx.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-ssl-cert"="arn:aws:acm:xx-xxxx:xxxxxxxx:certificate/xxxxxxxxxxxxx" \ + --set nginx.service.annotations."service\.beta\.kubernetes\.io"/aws-load-balancer-backend-protocol=http \ + --set nginx.service.annotations."service\.beta\.kubernetes\.io"/aws-load-balancer-ssl-ports=https \ + --namespace artifactory-ha jfrog/artifactory-ha +``` + +### Ingress and TLS +To get Helm to create an ingress object with a hostname, add these two lines to your Helm command: +```bash +helm upgrade --install artifactory-ha \ + --set ingress.enabled=true \ + --set ingress.hosts[0]="artifactory.company.com" \ + --set artifactory.service.type=NodePort \ + --set nginx.enabled=false \ + --namespace artifactory-ha jfrog/artifactory-ha +``` + +If your cluster allows automatic creation/retrieval of TLS certificates (e.g. [cert-manager](https://github.com/jetstack/cert-manager)), please refer to the documentation for that mechanism. + +To manually configure TLS, first create/retrieve a key & certificate pair for the address(es) you wish to protect. Then create a TLS secret in the namespace: + +```bash +kubectl create secret tls artifactory-tls --cert=path/to/tls.cert --key=path/to/tls.key +``` + +Include the secret's name, along with the desired hostnames, in the Artifactory Ingress TLS section of your custom `values.yaml` file: + +```yaml + ingress: + ## If true, Artifactory Ingress will be created + ## + enabled: true + + ## Artifactory Ingress hostnames + ## Must be provided if Ingress is enabled + ## + hosts: + - artifactory.domain.com + annotations: + kubernetes.io/tls-acme: "true" + ## Artifactory Ingress TLS configuration + ## Secrets must be manually created in the namespace + ## + tls: + - secretName: artifactory-tls + hosts: + - artifactory.domain.com +``` + +### Ingress annotations + +This example specifically enables Artifactory to work as a Docker Registry using the Repository Path method. See [Artifactory as Docker Registry](https://www.jfrog.com/confluence/display/RTF/Getting+Started+with+Artifactory+as+a+Docker+Registry) documentation for more information about this setup. + +```yaml +ingress: + enabled: true + defaultBackend: + enabled: false + hosts: + - myhost.example.com + annotations: + ingress.kubernetes.io/force-ssl-redirect: "true" + ingress.kubernetes.io/proxy-body-size: "0" + ingress.kubernetes.io/proxy-read-timeout: "600" + ingress.kubernetes.io/proxy-send-timeout: "600" + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/configuration-snippet: | + rewrite ^/(v2)/token /artifactory/api/docker/null/v2/token; + rewrite ^/(v2)/([^\/]*)/(.*) /artifactory/api/docker/$2/$1/$3; + nginx.ingress.kubernetes.io/proxy-body-size: "0" + tls: + - hosts: + - "myhost.example.com" +``` + +### Ingress additional rules + +You have the option to add additional ingress rules to the Artifactory ingress. An example for this use case can be routing the /xray path to Xray. +In order to do that, simply add the following to a `artifactory-ha-values.yaml` file: +```yaml +ingress: + enabled: true + + defaultBackend: + enabled: false + + annotations: + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/configuration-snippet: | + rewrite "(?i)/xray(/|$)(.*)" /$2 break; + + additionalRules: | + - host: + http: + paths: + - path: / + backend: + serviceName: + servicePort: + - path: /xray + backend: + serviceName: + servicePort: + - path: /artifactory + backend: + serviceName: {{ template "artifactory.nginx.fullname" . }} + servicePort: {{ .Values.nginx.externalPortHttp }} +``` + +and running: +```bash +helm upgrade --install artifactory-ha --namespace artifactory-ha jfrog/artifactory-ha -f artifactory-ha-values.yaml +``` + +### Ingress behind another load balancer +If you are running a load balancer, that is used to offload the TLS, in front of Nginx Ingress Controller, or if you are setting **X-Forwarded-*** headers, you might want to enable **'use-forwarded-headers=true'** option. Otherwise nginx will be filling those headers with the request information it receives from the external load balancer. + +To enable it with `helm install` +```bash +helm upgrade --install nginx-ingress --namespace nginx-ingress stable/nginx-ingress --set-string controller.config.use-forwarded-headers=true +``` +or `helm upgrade` +```bash +helm upgrade nginx-ingress --set-string controller.config.use-forwarded-headers=true stable/nginx-ingress +``` +or create a values.yaml file with the following content: +```bash +controller: + config: + use-forwarded-headers: "true" +``` +Then install nginx-ingress with the values file you created: +```bash +helm upgrade --install nginx-ingress --namespace nginx-ingress stable/nginx-ingress -f values.yaml +``` + +## Useful links +- https://www.jfrog.com/confluence/display/EP/Getting+Started +- https://www.jfrog.com/confluence/display/RTF/Installing+Artifactory +- https://www.jfrog.com/confluence/ diff --git a/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/helminstall.sh b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/helminstall.sh new file mode 100755 index 0000000..09e060d --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/helminstall.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +# PreReq'd: +# helm install postgres bitnami/postgresql +# follow artifactory postgresql db setup: +# https://www.jfrog.com/confluence/display/JFROG/PostgreSQL +POSTGRES=$(helm ls | grep postgres | wc -l) + +if [[ "$POSTGRES" =~ (0) ]] +then + echo "External DB is required to run Jfrog Openshift Artifactory Helm chart" + echo "" + echo "Postgresql helm chart must be installed prior to installing this helm installer script." + echo "" + echo "helm install postgres bitnami/postgresql" + echo "" + echo "follow artifactory postgresql db setup:" + echo "https://www.jfrog.com/confluence/display/JFROG/PostgreSQL" + exit 1 +else + if [[ -z "$1" ]] + then + echo "Installing Jfrog Artifactory Openshift Helm" + else + echo "Patching Environment for RunAsAnyUid" + # patch the restricted scc to allow the pods to run as anyuid + oc patch scc restricted --patch '{"fsGroup":{"type":"RunAsAny"},"runAsUser":{"type":"RunAsAny"},"seLinuxContext":{"type":"RunAsAny"}}' --type=merge + if [[ -f "artifactory.cluster.license" ]] + then + echo "Creating k8s secret for Artifactory cluster licenses from file: artifactory.cluster.license" + # create the license secret + oc create secret generic artifactory-license --from-file=artifactory.cluster.license + fi + + if [[ -f "tls.crt" ]] + then + echo "Creating k8s secret for TLS tls-ingress from files tls.crt & tls.key" + # create the tls secret + oc create secret tls tls-ingress --cert=tls.crt --key=tls.key + fi + fi +fi + +# install via helm with default postgresql configuration +helm install artifactory-ha . \ + --set artifactory-ha.nginx.service.ssloffload=true \ + --set artifactory-ha.nginx.tlsSecretName=tls-ingress \ + --set artifactory-ha.artifactory.node.replicaCount=1 \ + --set artifactory-ha.artifactory.license.secret=artifactory-license,artifactory-ha.artifactory.license.dataKey=artifactory.cluster.license \ + --set artifactory-ha.database.type=postgresql \ + --set artifactory-ha.database.driver=org.postgresql.Driver \ + --set artifactory-ha.database.url=jdbc:postgresql://postgres-postgresql:5432/artifactory \ + --set artifactory-ha.database.user=artifactory \ + --set artifactory-ha.database.password=password \ + --set artifactory-ha.artifactory.joinKey=EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE \ + --set artifactory-ha.artifactory.masterKey=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + diff --git a/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/requirements.lock b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/requirements.lock new file mode 100644 index 0000000..4030294 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/requirements.lock @@ -0,0 +1,6 @@ +dependencies: +- name: artifactory-ha + repository: https://charts.jfrog.io/ + version: 4.1.0 +digest: sha256:8df1fd70eeabbb7687da0dd534d2161a413389ec40f331d5eb8e95ae50119222 +generated: "2020-09-30T12:30:08.142288-07:00" diff --git a/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/requirements.yaml b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/requirements.yaml new file mode 100644 index 0000000..1e23270 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/requirements.yaml @@ -0,0 +1,4 @@ +dependencies: + - name: artifactory-ha + version: 4.1.0 + repository: https://charts.jfrog.io/ diff --git a/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/values.yaml b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/values.yaml new file mode 100755 index 0000000..3354dc0 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/helm-charts/openshift-artifactory-ha/values.yaml @@ -0,0 +1,99 @@ +# Openshift Artifactory HA +# This helm chart subcharts the latest jfrog/artifactory-ha chart +# and applies various things like initContainers, nginx mainConf, etc +# to enable the artifactory-ha helm chart to work in an openshift environment +artifactory-ha: + ################################### + # EDIT TO YOUR DB CONFIGURATION + ################################### + database: + type: "OVERRIDE" + driver: "OVERRIDE" + url: "OVERRIDE" + user: "OVERRIDE" + password: "OVERRIDE" + initContainerImage: registry.connect.redhat.com/jfrog/init:1.0.1 + waitForDatabase: true + installerInfo: '{ "productId": "Openshift_artifactory-ha/{{ .Chart.Version }}", "features": [ { "featureId": "ArtifactoryVersion/{{ default .Chart.AppVersion .Values.artifactory.image.version }}" }, { "featureId": "{{ if .Values.postgresql.enabled }}postgresql{{ else }}{{ .Values.database.type }}{{ end }}/0.0.0" }, { "featureId": "Platform/Openshift" }, { "featureId": "Partner/ACC-006983" }, { "featureId": "Channel/Openshift" } ] }' + artifactory: + uid: "1000721030" + ## Change to use RH UBI images + image: + registry: registry.connect.redhat.com + repository: jfrog/artifactory-pro + tag: 7.9.0 + node: + replicaCount: 2 + waitForPrimaryStartup: + enabled: false + masterKey: "OVERRIDE" + joinKey: "OVERRIDE" + postgresql: + enabled: false + nginx: + uid: "1000720104" + gid: "1000720107" + image: + registry: registry.redhat.io + repository: rhel8/nginx-116 + tag: latest + ## K8S secret name for the TLS secret to be used for SSL + tlsSecretName: "OVERRIDE" + service: + ssloffload: false + http: + externalPort: 80 + internalPort: 8080 + https: + externalPort: 443 + internalPort: 8443 + mainConf: | + # Main Nginx configuration file + worker_processes 4; + error_log {{ .Values.nginx.persistence.mountPath }}/logs//error.log warn; + pid /tmp/nginx.pid; + events { + worker_connections 1024; + } + http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + variables_hash_max_size 1024; + variables_hash_bucket_size 64; + server_names_hash_max_size 4096; + server_names_hash_bucket_size 128; + types_hash_max_size 2048; + types_hash_bucket_size 64; + proxy_read_timeout 2400s; + client_header_timeout 2400s; + client_body_timeout 2400s; + proxy_connect_timeout 75s; + proxy_send_timeout 2400s; + proxy_buffer_size 32k; + proxy_buffers 40 32k; + proxy_busy_buffers_size 64k; + proxy_temp_file_write_size 250m; + proxy_http_version 1.1; + client_body_buffer_size 128k; + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + log_format timing 'ip = $remote_addr ' + 'user = \"$remote_user\" ' + 'local_time = \"$time_local\" ' + 'host = $host ' + 'request = \"$request\" ' + 'status = $status ' + 'bytes = $body_bytes_sent ' + 'upstream = \"$upstream_addr\" ' + 'upstream_time = $upstream_response_time ' + 'request_time = $request_time ' + 'referer = \"$http_referer\" ' + 'UA = \"$http_user_agent\"'; + access_log {{ .Values.nginx.persistence.mountPath }}/logs/access.log timing; + sendfile on; + #tcp_nopush on; + keepalive_timeout 65; + #gzip on; + include {{ .Values.nginx.persistence.mountPath }}/conf.d/*.conf; + } diff --git a/Openshift4/operator/xray-operator/CHANGELOG.md b/Openshift4/operator/xray-operator/CHANGELOG.md index e4ff9e8..7d1fbfb 100755 --- a/Openshift4/operator/xray-operator/CHANGELOG.md +++ b/Openshift4/operator/xray-operator/CHANGELOG.md @@ -1,15 +1,18 @@ # JFrog Openshift Xray Chart Changelog All changes to this chart will be documented in this file. -## [3.8.0] Aug 17, 2020 +## [1.1.0] Oct 1, 2020 +* Deploying JFrog Xray 3.8.8 as an Operator into Openshift + +## [1.0.3] Aug 17, 2020 * Deploying JFrog Xray 3.8.0 as an Operator into Openshift -## [3.6.2] - July 28, 2020 +## [1.0.2] - July 28, 2020 * Deploying JFrog Xray 3.6.2 as an Operator into Openshift -## [3.5.2] - June 29, 2020 +## [1.0.1] - June 29, 2020 * Deploying JFrog Xray 3.5.2 as an Operator into Openshift -## [3.3.0] - May 22, 2020 +## [1.0.0] - May 22, 2020 * Deploying JFrog Xray 3.3.0 as an Operator initial version of Jfrog Xray supported diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/CHANGELOG.md b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/CHANGELOG.md old mode 100644 new mode 100755 index 87f3b19..a4c6f3b --- a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/CHANGELOG.md +++ b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/CHANGELOG.md @@ -1,6 +1,9 @@ # JFrog Openshift Artifactory-Xray Chart Changelog All changes to this chart will be documented in this file. +## [6.0.6] Oct 1st, 2020 +* Updating to Xray chart version 6.0.6 and Xray app version 3.8.8 + ## [4.2.0] Aug 17, 2020 * Updating to Xray chart version 4.2.0 and Xray app version 3.8.0 diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/Chart.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/Chart.yaml old mode 100644 new mode 100755 index d917f4d..aa8c6b6 --- a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/Chart.yaml +++ b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/Chart.yaml @@ -1,7 +1,9 @@ apiVersion: v1 -appVersion: 3.8.0 -description: Universal component scan for security and license inventory and impact - analysis +appVersion: 3.8.8 +description: Universal component scan for security and license inventory and impact analysis +sources: +- https://bintray.com/jfrog/product/xray/view +- https://github.com/jfrog/charts keywords: - xray - jfrog @@ -11,7 +13,4 @@ maintainers: - email: johnp@jfrog.com name: John Peterson name: openshift-xray -sources: -- https://bintray.com/jfrog/product/xray/view -- https://github.com/jfrog/charts -version: 4.2.0 +version: 6.0.6 diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/LICENSE b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/LICENSE old mode 100644 new mode 100755 diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/README.md b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/README.md old mode 100644 new mode 100755 diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/helminstall.sh b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/helminstall.sh old mode 100644 new mode 100755 index 2260da1..e19987c --- a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/helminstall.sh +++ b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/helminstall.sh @@ -57,7 +57,10 @@ fi JFROGURL="" if [[ -z "$4" ]] then - JFROGURL="http://openshiftartifactoryha-nginx" + # HELM + JFROGURL="http://artifactory-ha-nginx" + # OPERATOR + # JFROGURL="http://openshiftartifactoryha-nginx" else JFROGURL=$4 fi @@ -68,4 +71,6 @@ helm install xray . \ --set xray.database.url=$DBURL \ --set xray.database.user=$DBUSER \ --set xray.database.password=$DBPASS \ - --set xray.xray.jfrogUrl=$JFROGURL + --set xray.xray.jfrogUrl=$JFROGURL \ + --set xray.xray.joinKey=EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE \ + --set xray.xray.masterKey=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmq.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmq.yaml index 521df8e..df49bf6 100644 --- a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmq.yaml +++ b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmq.yaml @@ -16,10 +16,10 @@ spec: app: rabbitmq spec: containers: - - image: quay.io/jfrog/xray-rabbitmq-rh:3.8.0 + - image: registry.connect.redhat.com/jfrog/xray-rabbitmq:3.8.9 imagePullPolicy: "Always" name: xray-rabbitmq ports: - containerPort: 4369 - containerPort: 5672 - - containerPort: 25672 + - containerPort: 15672 diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmqservice.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmqservice.yaml index a8f108a..fb51fce 100644 --- a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmqservice.yaml +++ b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/rabbitmqservice.yaml @@ -8,17 +8,17 @@ spec: selector: app: rabbitmq ports: - - name: port1 + - name: epmd protocol: TCP port: 4369 targetPort: 4369 - - name: port3 + - name: ampq protocol: TCP port: 5672 targetPort: 5672 - - name: port4 + - name: management protocol: TCP - port: 25672 + port: 15672 targetPort: 25672 type: ClusterIP diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.lock b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.lock index 521af70..d53cf7c 100644 --- a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.lock +++ b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.lock @@ -1,6 +1,6 @@ dependencies: - name: xray repository: https://charts.jfrog.io/ - version: 4.2.0 -digest: sha256:5e016b3e02e80668003980f2e0399f152f7d83e39957813db3aa3efa9651474f -generated: "2020-08-17T14:49:47.771127-07:00" + version: 6.0.6 +digest: sha256:339b5ec4e309ce2970ed34ebc700d6fe8f436d6cbe8dd5d352f0b080401752af +generated: "2020-10-01T15:04:29.008985-07:00" diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.yaml index b0a88e0..f6311b7 100644 --- a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.yaml +++ b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/requirements.yaml @@ -1,4 +1,4 @@ dependencies: - name: xray - version: 4.2.0 + version: 6.0.6 repository: https://charts.jfrog.io/ diff --git a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/values.yaml b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/values.yaml old mode 100644 new mode 100755 index d4d3534..b242f3d --- a/Openshift4/operator/xray-operator/helm-charts/openshift-xray/values.yaml +++ b/Openshift4/operator/xray-operator/helm-charts/openshift-xray/values.yaml @@ -1,64 +1,101 @@ +# Openshift Jfrog Xray xray: - analysis: - image: - repository: registry.connect.redhat.com/jfrog/xray-analysis - version: 3.6.2 - name: xray-analysis - podManagementPolicy: Parallel - preStartCommand: null - updateStrategy: RollingUpdate - database: - password: OVERRIDE - url: OVERRIDE - user: OVERRIDE - global: - postgresqlTlsSecret: null - indexer: - image: - repository: registry.connect.redhat.com/jfrog/xray-indexer - version: 3.6.2 - name: xray-indexer - podManagementPolicy: Parallel - updateStrategy: RollingUpdate - persist: - image: - repository: registry.connect.redhat.com/jfrog/xray-persist - version: 3.6.2 - name: xray-persist - persistence: - size: 10Gi - podManagementPolicy: Parallel - preStartCommand: null - updateStrategy: RollingUpdate + unifiedUpgradeAllowed: true + replicaCount: 1 + xray: + masterKey: "OVERRIDE" + joinKey: "OVERRIDE" + consoleLog: false + jfrogUrl: "OVERRIDE" postgresql: enabled: false - rabbitmq-ha: - enabled: true + database: + url: "OVERRIDE" + user: "OVERRIDE" + password: "OVERRIDE" + common: + xrayUserId: "1000721035" + xrayGroupId: "1000721035" + analysis: + name: xray-analysis image: - repository: registry.connect.redhat.com/jfrog/xray-rabbitmq - tag: 3.8.0 - rabbitmqEpmdPort: 4369 - rabbitmqManagerPort: 15672 - rabbitmqNodePort: 5672 - replicaCount: 1 - replicaCount: 1 - router: + registry: registry.connect.redhat.com + repository: jfrog/xray-analysis + tag: 3.8.8 + updateStrategy: RollingUpdate + podManagementPolicy: Parallel + preStartCommand: + indexer: + name: xray-indexer image: - imagePullPolicy: IfNotPresent - repository: registry.connect.redhat.com/jfrog/xray-router - version: 1.4.2 - name: router + registry: registry.connect.redhat.com + repository: jfrog/xray-indexer + tag: 3.8.8 + updateStrategy: RollingUpdate + podManagementPolicy: Parallel + persist: + name: xray-persist + image: + registry: registry.connect.redhat.com + repository: jfrog/xray-persist + tag: 3.8.8 + updateStrategy: RollingUpdate + podManagementPolicy: Parallel + persistence: + size: 10Gi + preStartCommand: server: - image: - repository: registry.connect.redhat.com/jfrog/xray-server - version: 3.6.2 name: xray-server + image: + registry: registry.connect.redhat.com + repository: jfrog/xray-server + tag: 3.8.8 + updateStrategy: RollingUpdate podManagementPolicy: Parallel replicaCount: 1 - updateStrategy: RollingUpdate - unifiedUpgradeAllowed: true - xray: - consoleLog: false - jfrogUrl: OVERRIDE - joinKey: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - masterKey: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + router: + name: router + image: + registry: registry.connect.redhat.com + repository: jfrog/xray-router + tag: 1.4.3 + imagePullPolicy: IfNotPresent + rabbitmq-ha: + enabled: true + replicaCount: 1 + image: + repository: registry.connect.redhat.com/jfrog/xray-rabbitmq + tag: 3.8.9 + rabbitmqEpmdPort: 4369 + rabbitmqNodePort: 5672 + rabbitmqManagerPort: 15672 + rabbitmqUsername: guest + rabbitmqPassword: guest + managementUsername: management + managementPassword: management + initContainer: + enabled: false + securityContext: + fsGroup: 1000721035 + runAsUser: 1000721035 + runAsGroup: 1000721035 + livenessProbe: + initialDelaySeconds: 120 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + exec: + command: + - /bin/sh + - -c + - 'rabbitmqctl status' + readinessProbe: + initialDelaySeconds: 20 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 6 + exec: + command: + - /bin/sh + - -c + - 'rabbitmqctl status' From 2cdddcf59df26a27c186b5d7420433237e7406b8 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Fri, 2 Oct 2020 20:25:06 -0700 Subject: [PATCH 25/28] Artifactory Operator v1.1.0 published --- .../operator/artifactory-ha-operator/PROJECT | 4 + .../artifactory-ha-operator/README.md | 8 +- ...operator.v1.1.0.clusterserviceversion.yaml | 4 +- ...operator.v1.1.0.clusterserviceversion.yaml | 4 +- ...enshiftartifactoryha-operator.package.yaml | 5 + .../bundle/bundle-1.1.0.Dockerfile | 7 - ...che.jfrog.com_openshiftartifactoryhas.yaml | 388 ++++++ ...lm.k8s.io_openshiftartifactoryhas_crd.yaml | 23 + .../config/crd/kustomization.yaml | 6 + .../config/manager/manager.yaml | 50 +- .../config/rbac/namespace.yaml | 4 + .../openshiftartifactoryha_editor_role.yaml | 24 + .../openshiftartifactoryha_viewer_role.yaml | 20 + .../config/rbac/project.yaml | 89 ++ .../config/rbac/role.yaml | 126 +- .../config/rbac/role_binding.yaml | 15 +- .../config/rbac/service_account.yaml | 4 + ...cache_v1alpha1_openshiftartifactoryha.yaml | 1093 +++++++++++++++++ ...io_v1alpha1_openshiftartifactoryha_cr.yaml | 97 ++ .../config/samples/kustomization.yaml | 4 + .../artifactory-ha-operator/watches.yaml | 2 +- 21 files changed, 1912 insertions(+), 65 deletions(-) create mode 100644 Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/metadata/openshiftartifactoryha-operator.package.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/crd/bases/cache.jfrog.com_openshiftartifactoryhas.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/crd/bases/charts.helm.k8s.io_openshiftartifactoryhas_crd.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/crd/kustomization.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/rbac/namespace.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/rbac/openshiftartifactoryha_editor_role.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/rbac/openshiftartifactoryha_viewer_role.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/rbac/project.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/rbac/service_account.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/samples/cache_v1alpha1_openshiftartifactoryha.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/samples/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml create mode 100644 Openshift4/operator/artifactory-ha-operator/config/samples/kustomization.yaml diff --git a/Openshift4/operator/artifactory-ha-operator/PROJECT b/Openshift4/operator/artifactory-ha-operator/PROJECT index f6e99ea..e2ba05e 100644 --- a/Openshift4/operator/artifactory-ha-operator/PROJECT +++ b/Openshift4/operator/artifactory-ha-operator/PROJECT @@ -1,4 +1,8 @@ domain: jfrog.com layout: helm.sdk.operatorframework.io/v1 projectName: artifactory-ha-operator +resources: +- group: cache + kind: OpenshiftArtifactoryHa + version: v1alpha1 version: 3-alpha diff --git a/Openshift4/operator/artifactory-ha-operator/README.md b/Openshift4/operator/artifactory-ha-operator/README.md index 9a96d75..5e3ac52 100644 --- a/Openshift4/operator/artifactory-ha-operator/README.md +++ b/Openshift4/operator/artifactory-ha-operator/README.md @@ -4,6 +4,12 @@ This code base is intended to deploy Artifactory HA as an operator to an Openshi Openshift OperatorHub has the latest official supported Cluster Service Version (CSV) for the OLM catalog. +# Breaking Changes + +``` +v1.1.0 breaks existing upgrade path due to base helm chart breaking changes +``` + ## Getting Started These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. @@ -141,4 +147,4 @@ We use [SemVer](http://semver.org/) for versioning. For the versions available, ## Contact -Github Issues \ No newline at end of file +Github Issues diff --git a/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml index 54370c8..08e5515 100644 --- a/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml +++ b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml @@ -108,7 +108,9 @@ spec: name: '' version: apps/v1 version: v1alpha1 - description: '## Overview + description: '## [BREAKING] Upgrades from 1.0.0 to 1.1.x currently are not supported. New installations only. + + ## Overview Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift cluster. diff --git a/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml index 0acb529..73e213f 100644 --- a/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml +++ b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/manifests/artifactory-ha-operator.v1.1.0.clusterserviceversion.yaml @@ -110,7 +110,9 @@ spec: name: '' version: apps/v1 version: v1alpha1 - description: '## Overview + description: '## [BREAKING] Upgrades from 1.0.0 to 1.1.x currently are not supported. New installations only. + + ## Overview Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift cluster. diff --git a/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/metadata/openshiftartifactoryha-operator.package.yaml b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/metadata/openshiftartifactoryha-operator.package.yaml new file mode 100644 index 0000000..397bc5c --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/bundle/1.1.0/metadata/openshiftartifactoryha-operator.package.yaml @@ -0,0 +1,5 @@ +channels: +- currentCSV: artifactory-ha-operator.v1.1.1 + name: alpha +defaultChannel: '' +packageName: openshiftartifactoryha-operator diff --git a/Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile b/Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile index a8bc459..31268f3 100644 --- a/Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile +++ b/Openshift4/operator/artifactory-ha-operator/bundle/bundle-1.1.0.Dockerfile @@ -1,12 +1,5 @@ FROM scratch -LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 -LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ -LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ -LABEL operators.operatorframework.io.bundle.package.v1=openshiftartifactoryha-operator -LABEL operators.operatorframework.io.bundle.channels.v1=alpha -LABEL operators.operatorframework.io.bundle.channel.default.v1=alpha - LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ diff --git a/Openshift4/operator/artifactory-ha-operator/config/crd/bases/cache.jfrog.com_openshiftartifactoryhas.yaml b/Openshift4/operator/artifactory-ha-operator/config/crd/bases/cache.jfrog.com_openshiftartifactoryhas.yaml new file mode 100644 index 0000000..73b9b38 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/crd/bases/cache.jfrog.com_openshiftartifactoryhas.yaml @@ -0,0 +1,388 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: |- + [ + { + "apiVersion": "charts.helm.k8s.io/v1alpha1", + "kind": "OpenshiftArtifactoryHa", + "metadata": { + "name": "openshiftartifactoryha" + }, + "spec": { + "artifactory-ha": { + "artifactory": { + "image": { + "registry": "registry.connect.redhat.com", + "repository": "jfrog/artifactory-pro", + "tag": "7.9.0" + }, + "joinKey": "OVERRIDE", + "masterKey": "OVERRIDE", + "uid": "1000721030", + "node": { + "replicaCount": 2, + "waitForPrimaryStartup": { + "enabled": false + } + } + }, + "database": { + "driver": "OVERRIDE", + "password": "OVERRIDE", + "type": "OVERRIDE", + "url": "OVERRIDE", + "user": "OVERRIDE" + }, + "initContainerImage": "registry.connect.redhat.com/jfrog/init:1.0.1", + "nginx": { + "uid": "1000720104", + "gid": "1000720107", + "http": { + "externalPort": 80, + "internalPort": 8080 + }, + "https": { + "externalPort": 443, + "internalPort": 8443 + }, + "image": { + "registry": "registry.redhat.io", + "repository": "rhel8/nginx-116", + "tag": "latest" + }, + "service": { + "ssloffload": false + }, + "tlsSecretName": "OVERRIDE" + }, + "postgresql": { + "enabled": false + }, + "waitForDatabase": true + } + } + } + ] + capabilities: Seamless Upgrades + operators.operatorframework.io/builder: operator-sdk-v1.0.1 + operators.operatorframework.io/project_layout: helm.sdk.operatorframework.io/v1 + categories: Developer Tools,Integration & Delivery + certified: 'true' + containerImage: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + createdAt: 2020-03-25 00:00:00+00:00 + description: JFrog Artifactory Enterprise deploys Artifactory in a high availability + environment across multiple pods + repository: https://github.com/jfrog/JFrog-Cloud-Installers/tree/openshift4/Openshift4 + support: JFrog + creationTimestamp: null + name: artifactory-ha-operator.v1.1.0 + namespace: default +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - description: Represents Artifactory HA Instances + displayName: Artifactory HA + kind: OpenshiftArtifactoryHa + name: openshiftartifactoryhas.charts.helm.k8s.io + resources: + - kind: Deployment + name: '' + version: v1 + - kind: Service + name: '' + version: v1 + - kind: ReplicaSet + name: '' + version: v1 + - kind: Pod + name: '' + version: v1 + - kind: Secret + name: '' + version: v1 + - kind: ConfigMap + name: '' + version: v1 + - kind: StatefulSet + name: '' + version: apps/v1 + version: v1alpha1 + description: '## Overview + + Openshift Operator to deploy JFrog Artifactory Enterprise into your Openshift + cluster. + + + ## Usage + + + An external DB is required. The operator will not deploy a DB but will require + you to specify the configuration values to connect to it. + + + Search for JFrog and click JFrog Artifactory Enterprise Operator to install. + + + Go to the Installed Operators. + + + Wait for the JFrog Artifactory Enterprise Operator to complete the installation. + + + Open the Operator and click on the provided API: Artifactory HA. + + + Click Create New Instance and provide the following parameters for your DB configuration: + + + ``` + + DATABASE_TYPE + + DATABASE_DRIVER + + DATABASE_URL + + DATABASE_USER + + DATABASE_PASSWORD + + ``` + + Master key and Join key must be supplied. To generate a new key for each run the command below: + + ``` + # Create a key + export JOIN_KEY=$(openssl rand -hex 32) + echo ${JOIN_KEY} + ``` + + To use TLS you will need to first create a k8s tls secret to store + your .crt and .key file into. + + Then supply the value of this k8s secret into the TLS_SECRET field. + + Click Create for Artifactory Enterprise to deploy into OpenShift and connect to + it on the external IP exposed by the load balancer. + + ' + displayName: JFrog Artifactory Enterprise Operator + icon: + - base64data: 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 + mediatype: image/png + install: + spec: + deployments: + - name: artifactory-ha-operatorvi + spec: + replicas: 1 + selector: + matchLabels: + name: artifactory-ha-operator + strategy: {} + template: + metadata: + labels: + name: artifactory-ha-operator + spec: + containers: + - env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: artifactory-ha-operator + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: registry.connect.redhat.com/jfrog/artifactory-pro:7.9.0 + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: registry.redhat.io/rhel8/nginx-116:latest + image: registry.connect.redhat.com/jfrog/artifactory-operator:7.9.0 + imagePullPolicy: Always + name: artifactory-ha-operator + resources: {} + serviceAccountName: artifactory-ha-operator + permissions: + - rules: + - apiGroups: + - '' + resources: + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' + - apiGroups: + - '' + resources: + - events + verbs: + - create + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get + - apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - charts.helm.k8s.io/v1alpha1 + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - policy + resources: + - '*' + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - '*' + verbs: + - '*' + serviceAccountName: artifactory-ha-operator + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - DevOps + - CI/CD + - Developers + - Software + - Productivity + - Artifact Repository + - Repository Manager + - Docker + - Maven + - Git + - Helm + - npm + - go + - golang + - kubernetes + - k8s + - rpm + - yum + links: + - name: JFrog + url: https://www.jfrog.com + - name: JFrog Artifact Repository + url: https://jfrog.com/artifactory/ + - name: Artifactory Video + url: https://www.youtube.com/watch?v=r2_A5CPo43U + maintainers: + - email: partner-support@jfrog.com + name: JFrog + maturity: alpha + provider: + name: JFrog + replaces: artifactory-ha-operator.v1.0.3 + version: 1.1.0 +status: + certsLastUpdated: null + certsRotateAt: null + lastTransitionTime: null + lastUpdateTime: null diff --git a/Openshift4/operator/artifactory-ha-operator/config/crd/bases/charts.helm.k8s.io_openshiftartifactoryhas_crd.yaml b/Openshift4/operator/artifactory-ha-operator/config/crd/bases/charts.helm.k8s.io_openshiftartifactoryhas_crd.yaml new file mode 100644 index 0000000..17df5a1 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/crd/bases/charts.helm.k8s.io_openshiftartifactoryhas_crd.yaml @@ -0,0 +1,23 @@ +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + name: openshiftartifactoryhas.charts.helm.k8s.io +spec: + group: charts.helm.k8s.io + names: + kind: OpenshiftArtifactoryHa + listKind: OpenshiftArtifactoryHaList + plural: openshiftartifactoryhas + singular: openshiftartifactoryha + scope: Namespaced + subresources: + status: {} + validation: + openAPIV3Schema: + type: object + x-kubernetes-preserve-unknown-fields: true + version: v1alpha1 + versions: + - name: v1alpha1 + served: true + storage: true diff --git a/Openshift4/operator/artifactory-ha-operator/config/crd/kustomization.yaml b/Openshift4/operator/artifactory-ha-operator/config/crd/kustomization.yaml new file mode 100644 index 0000000..1b3363b --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/crd/kustomization.yaml @@ -0,0 +1,6 @@ +# This kustomization.yaml is not intended to be run by itself, +# since it depends on service name and namespace that are out of this kustomize package. +# It should be run by config/default +resources: +- bases/cache.jfrog.com_openshiftartifactoryhas.yaml +# +kubebuilder:scaffold:crdkustomizeresource diff --git a/Openshift4/operator/artifactory-ha-operator/config/manager/manager.yaml b/Openshift4/operator/artifactory-ha-operator/config/manager/manager.yaml index 09188c1..4d16016 100644 --- a/Openshift4/operator/artifactory-ha-operator/config/manager/manager.yaml +++ b/Openshift4/operator/artifactory-ha-operator/config/manager/manager.yaml @@ -1,38 +1,34 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - control-plane: controller-manager - name: system ---- apiVersion: apps/v1 kind: Deployment metadata: - name: controller-manager - namespace: system - labels: - control-plane: controller-manager + name: artifactory-ha-operator spec: + replicas: 1 selector: matchLabels: - control-plane: controller-manager - replicas: 1 + name: artifactory-ha-operator template: metadata: labels: - control-plane: controller-manager + name: artifactory-ha-operator spec: + serviceAccountName: artifactory-ha-operator containers: - - image: controller:latest - args: - - "--enable-leader-election" - - "--leader-election-id=artifactory-ha-operator" - name: manager - resources: - limits: - cpu: 100m - memory: 90Mi - requests: - cpu: 100m - memory: 60Mi - terminationGracePeriodSeconds: 10 + - name: artifactory-ha-operator + image: registry.connect.redhat.com/jfrog/artifactory-operator + imagePullPolicy: Always + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: OPERATOR_NAME + value: "artifactory-ha-operator" + - name: RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY + value: "registry.connect.redhat.com/jfrog/artifactory-pro" + - name: RELATED_IMAGE_NGINX_IMAGE_REPOSITORY + value: "registry.redhat.io/rhel8/nginx-116" \ No newline at end of file diff --git a/Openshift4/operator/artifactory-ha-operator/config/rbac/namespace.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/namespace.yaml new file mode 100644 index 0000000..b94caf4 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/rbac/namespace.yaml @@ -0,0 +1,4 @@ +kind: Namespace +apiVersion: v1 +metadata: + name: jfrog-artifactory diff --git a/Openshift4/operator/artifactory-ha-operator/config/rbac/openshiftartifactoryha_editor_role.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/openshiftartifactoryha_editor_role.yaml new file mode 100644 index 0000000..3ab4d99 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/rbac/openshiftartifactoryha_editor_role.yaml @@ -0,0 +1,24 @@ +# permissions for end users to edit openshiftartifactoryhas. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: openshiftartifactoryha-editor-role +rules: +- apiGroups: + - cache.jfrog.com + resources: + - openshiftartifactoryhas + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cache.jfrog.com + resources: + - openshiftartifactoryhas/status + verbs: + - get diff --git a/Openshift4/operator/artifactory-ha-operator/config/rbac/openshiftartifactoryha_viewer_role.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/openshiftartifactoryha_viewer_role.yaml new file mode 100644 index 0000000..26bf705 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/rbac/openshiftartifactoryha_viewer_role.yaml @@ -0,0 +1,20 @@ +# permissions for end users to view openshiftartifactoryhas. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: openshiftartifactoryha-viewer-role +rules: +- apiGroups: + - cache.jfrog.com + resources: + - openshiftartifactoryhas + verbs: + - get + - list + - watch +- apiGroups: + - cache.jfrog.com + resources: + - openshiftartifactoryhas/status + verbs: + - get diff --git a/Openshift4/operator/artifactory-ha-operator/config/rbac/project.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/project.yaml new file mode 100644 index 0000000..c290689 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/rbac/project.yaml @@ -0,0 +1,89 @@ +apiVersion: template.openshift.io/v1 +kind: Template +metadata: + creationTimestamp: null + name: project-request +objects: +- apiVersion: project.openshift.io/v1 + kind: Project + metadata: + annotations: + openshift.io/description: JFrog Artifactory + openshift.io/display-name: jfrog-artifactory + openshift.io/requester: integrations@jfrog.com + creationTimestamp: null + name: jfrog-artifactory + spec: {} + status: {} +- apiVersion: rbac.authorization.k8s.io/v1 + kind: RoleBinding + metadata: + annotations: + openshift.io/description: Allows all pods in this namespace to pull images from + this namespace. It is auto-managed by a controller; remove subjects to disable. + creationTimestamp: null + name: system:image-pullers + namespace: jfrog-artifactory + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:image-puller + subjects: + - apiGroup: rbac.authorization.k8s.io + kind: Group + name: system:serviceaccounts:jfrog-artifactory +- apiVersion: rbac.authorization.k8s.io/v1 + kind: RoleBinding + metadata: + annotations: + openshift.io/description: Allows builds in this namespace to push images to + this namespace. It is auto-managed by a controller; remove subjects to disable. + creationTimestamp: null + name: system:image-builders + namespace: jfrog-artifactory + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:image-builder + subjects: + - kind: ServiceAccount + name: builder + namespace: jfrog-artifactory +- apiVersion: rbac.authorization.k8s.io/v1 + kind: RoleBinding + metadata: + annotations: + openshift.io/description: Allows deploymentconfigs in this namespace to rollout + pods in this namespace. It is auto-managed by a controller; remove subjects + to disable. + creationTimestamp: null + name: system:deployers + namespace: jfrog-artifactory + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:deployer + subjects: + - kind: ServiceAccount + name: deployer + namespace: jfrog-artifactory +- apiVersion: rbac.authorization.k8s.io/v1 + kind: RoleBinding + metadata: + creationTimestamp: null + name: admin + namespace: jfrog-artifactory + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: admin + subjects: + - apiGroup: rbac.authorization.k8s.io + kind: User + name: kubeadmin +parameters: +- name: PROJECT_NAME +- name: PROJECT_DISPLAYNAME +- name: PROJECT_DESCRIPTION +- name: PROJECT_ADMIN_USER +- name: PROJECT_REQUESTING_USER diff --git a/Openshift4/operator/artifactory-ha-operator/config/rbac/role.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/role.yaml index 61e7591..0cdfc5b 100644 --- a/Openshift4/operator/artifactory-ha-operator/config/rbac/role.yaml +++ b/Openshift4/operator/artifactory-ha-operator/config/rbac/role.yaml @@ -1,31 +1,119 @@ apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole +kind: Role metadata: - name: manager-role + creationTimestamp: null + name: artifactory-ha-operator rules: -## -## Base operator rules -## -# We need to get namespaces so the operator can read namespaces to ensure they exist - apiGroups: - - "" + - "" resources: - - namespaces + - pods + - services + - services/finalizers + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + - serviceaccounts verbs: - - get -# We need to manage Helm release secrets + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - - "" + - apps resources: - - secrets + - deployments + - daemonsets + - replicasets + - statefulsets verbs: - - "*" -# We need to create events on CRs about things happening during reconciliation + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - - "" + - "" resources: - - events + - namespaces verbs: - - create - -# +kubebuilder:scaffold:rules + - get +- apiGroups: + - "" + resourceNames: + - artifactory-ha-operator + resources: + - '*' + verbs: + - '*' +- apiGroups: + - "" + resources: + - events + verbs: + - create +- apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create +- apiGroups: + - apps + resourceNames: + - artifactory-ha-operator + resources: + - deployments/finalizers + verbs: + - update +- apiGroups: + - "" + resources: + - pods + verbs: + - get +- apiGroups: + - apps + resources: + - replicasets + - deployments + verbs: + - get +- apiGroups: + - charts.helm.k8s.io + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - networking.k8s.io + resources: + - '*' + verbs: + - '*' +- apiGroups: + - policy + resources: + - '*' + verbs: + - '*' +- apiGroups: + - 'rbac.authorization.k8s.io' + resources: + - '*' + verbs: + - '*' diff --git a/Openshift4/operator/artifactory-ha-operator/config/rbac/role_binding.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/role_binding.yaml index 8f26587..5e1093e 100644 --- a/Openshift4/operator/artifactory-ha-operator/config/rbac/role_binding.yaml +++ b/Openshift4/operator/artifactory-ha-operator/config/rbac/role_binding.yaml @@ -1,12 +1,11 @@ +kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding metadata: - name: manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: manager-role + name: artifactory-ha-operator subjects: - kind: ServiceAccount - name: default - namespace: system + name: artifactory-ha-operator +roleRef: + kind: Role + name: artifactory-ha-operator + apiGroup: rbac.authorization.k8s.io diff --git a/Openshift4/operator/artifactory-ha-operator/config/rbac/service_account.yaml b/Openshift4/operator/artifactory-ha-operator/config/rbac/service_account.yaml new file mode 100644 index 0000000..37ccebe --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/rbac/service_account.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: artifactory-ha-operator diff --git a/Openshift4/operator/artifactory-ha-operator/config/samples/cache_v1alpha1_openshiftartifactoryha.yaml b/Openshift4/operator/artifactory-ha-operator/config/samples/cache_v1alpha1_openshiftartifactoryha.yaml new file mode 100644 index 0000000..bd7bf63 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/samples/cache_v1alpha1_openshiftartifactoryha.yaml @@ -0,0 +1,1093 @@ +apiVersion: cache.jfrog.com/v1alpha1 +kind: OpenshiftArtifactoryHa +metadata: + name: openshiftartifactoryha-sample +spec: + # Default values copied from /helm-charts/openshift-artifactory-ha/values.yaml + artifactory-ha: + access: + accessConfig: + security: + tls: false + database: + maxOpenConnections: 80 + tomcat: + connector: + extraConfig: acceptCount="100" + maxThreads: 50 + artifactory: + admin: + ip: 127.0.0.1 + username: admin + annotations: {} + binarystore: + enabled: true + catalinaLoggers: [] + catalinaLoggersResources: {} + configMapName: null + configMaps: "" + consoleLog: false + copyOnEveryStartup: null + customInitContainers: "" + customInitContainersBegin: "" + customPersistentPodVolumeClaim: {} + customPersistentVolumeClaim: {} + customSecrets: null + customSidecarContainers: "" + customVolumeMounts: "" + customVolumes: "" + database: + maxOpenConnections: 80 + deleteDBPropertiesOnStartup: true + externalArtifactoryPort: 8081 + externalPort: 8082 + extraEnvironmentVariables: null + haBackupDir: + enabled: false + haDataDir: + enabled: false + image: + pullPolicy: IfNotPresent + registry: registry.connect.redhat.com + repository: jfrog/artifactory-pro + tag: 7.9.0 + internalArtifactoryPort: 8081 + internalPort: 8082 + javaOpts: {} + joinKey: OVERRIDE + license: {} + livenessProbe: + enabled: true + failureThreshold: 10 + initialDelaySeconds: 180 + path: /router/api/v1/system/health + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + loggers: [] + loggersResources: {} + masterKey: OVERRIDE + migration: + enabled: true + timeoutSeconds: 3600 + name: artifactory-ha + node: + affinity: {} + javaOpts: + corePoolSize: 16 + jmx: + authenticate: false + enabled: false + port: 9010 + ssl: false + labels: {} + minAvailable: 1 + name: artifactory-ha-member + nodeSelector: {} + persistence: + existingClaim: false + podAntiAffinity: + topologyKey: kubernetes.io/hostname + type: "" + replicaCount: 2 + resources: {} + tolerations: [] + waitForPrimaryStartup: + enabled: false + time: null + persistence: + accessMode: ReadWriteOnce + awsS3: + bucketName: artifactory-ha-aws + httpsOnly: true + path: artifactory-ha/filestore + properties: {} + refreshCredentials: true + s3AwsVersion: AWS4-HMAC-SHA256 + testConnection: false + awsS3V3: + bucketName: artifactory-aws + enableSignedUrlRedirect: false + maxConnections: 50 + path: artifactory/filestore + signatureExpirySeconds: 300 + testConnection: false + useInstanceCredentials: true + usePresigning: false + azureBlob: + testConnection: false + binarystoreXml: | + {{- if eq .Values.artifactory.persistence.type "file-system" }} + + {{- if .Values.artifactory.persistence.fileSystem.existingSharedClaim.enabled }} + + + + + + {{- range $sharedClaimNumber, $e := until (.Values.artifactory.persistence.fileSystem.existingSharedClaim.numberOfExistingClaims|int) -}} + + {{- end }} + + + + + + {{ .Values.artifactory.persistence.maxCacheSize }} + {{ .Values.artifactory.persistence.cacheProviderDir }} + + + // Specify the read and write strategy and redundancy for the sharding binary provider + + roundRobin + percentageFreeSpace + 2 + + + {{- range $sharedClaimNumber, $e := until (.Values.artifactory.persistence.fileSystem.existingSharedClaim.numberOfExistingClaims|int) -}} + //For each sub-provider (mount), specify the filestore location + + filestore{{ $sharedClaimNumber }} + + {{- end }} + + {{- else }} + + + + + crossNetworkStrategy + crossNetworkStrategy + {{ .Values.artifactory.persistence.redundancy }} + 2 + 2 + + + + + + + + + {{ .Values.artifactory.persistence.maxCacheSize }} + {{ .Values.artifactory.persistence.cacheProviderDir }} + + + + + shard-fs-1 + local + + + + + 30 + tester-remote1 + 10000 + remote + + + + {{- end }} + {{- end }} + {{- if eq .Values.artifactory.persistence.type "google-storage" }} + + + + + + crossNetworkStrategy + crossNetworkStrategy + {{ .Values.artifactory.persistence.redundancy }} + 2 + + + + + + + + + + + + + + {{ .Values.artifactory.persistence.maxCacheSize }} + {{ .Values.artifactory.persistence.cacheProviderDir }} + + + + local + + + + 30 + 10000 + remote + + + + {{ .Values.artifactory.persistence.mountPath }}/data/filestore + /tmp + + + + google-cloud-storage + {{ .Values.artifactory.persistence.googleStorage.endpoint }} + {{ .Values.artifactory.persistence.googleStorage.httpsOnly }} + {{ .Values.artifactory.persistence.googleStorage.bucketName }} + {{ .Values.artifactory.persistence.googleStorage.identity }} + {{ .Values.artifactory.persistence.googleStorage.credential }} + {{ .Values.artifactory.persistence.googleStorage.path }} + {{ .Values.artifactory.persistence.googleStorage.bucketExists }} + + + {{- end }} + {{- if eq .Values.artifactory.persistence.type "aws-s3-v3" }} + + + + + + + + + + + + + + + + + crossNetworkStrategy + crossNetworkStrategy + {{ .Values.artifactory.persistence.redundancy }} + + + + + remote + + + + local + + + + + {{ .Values.artifactory.persistence.maxCacheSize }} + {{ .Values.artifactory.persistence.cacheProviderDir }} + + + {{- with .Values.artifactory.persistence.awsS3V3 }} + + {{ .testConnection }} + {{- if .identity }} + {{ .identity }} + {{- end }} + {{- if .credential }} + {{ .credential }} + {{- end }} + {{ .region }} + {{ .bucketName }} + {{ .path }} + {{ .endpoint }} + {{- with .maxConnections }} + {{ . }} + {{- end }} + {{- with .kmsServerSideEncryptionKeyId }} + {{ . }} + {{- end }} + {{- with .kmsKeyRegion }} + {{ . }} + {{- end }} + {{- with .kmsCryptoMode }} + {{ . }} + {{- end }} + {{- if .useInstanceCredentials }} + true + {{- else }} + false + {{- end }} + {{ .usePresigning }} + {{ .signatureExpirySeconds }} + {{- with .cloudFrontDomainName }} + {{ . }} + {{- end }} + {{- with .cloudFrontKeyPairId }} + {{ .cloudFrontKeyPairId }} + {{- end }} + {{- with .cloudFrontPrivateKey }} + {{ . }} + {{- end }} + {{- with .enableSignedUrlRedirect }} + {{ . }} + {{- end }} + + {{- end }} + + {{- end }} + + {{- if eq .Values.artifactory.persistence.type "aws-s3" }} + + + + + + + + + + + + + + + + + + {{ .Values.artifactory.persistence.maxCacheSize }} + {{ .Values.artifactory.persistence.cacheProviderDir }} + + + + local + + + + 30 + 10000 + remote + + + + crossNetworkStrategy + crossNetworkStrategy + {{ .Values.artifactory.persistence.redundancy }} + + + + + {{ .Values.artifactory.persistence.awsS3.endpoint }} + {{- if .Values.artifactory.persistence.awsS3.roleName }} + {{ .Values.artifactory.persistence.awsS3.roleName }} + true + {{- else }} + {{ .Values.artifactory.persistence.awsS3.refreshCredentials }} + {{- end }} + {{ .Values.artifactory.persistence.awsS3.s3AwsVersion }} + {{ .Values.artifactory.persistence.awsS3.testConnection }} + {{ .Values.artifactory.persistence.awsS3.httpsOnly }} + {{ .Values.artifactory.persistence.awsS3.region }} + {{ .Values.artifactory.persistence.awsS3.bucketName }} + {{- if .Values.artifactory.persistence.awsS3.identity }} + {{ .Values.artifactory.persistence.awsS3.identity }} + {{- end }} + {{- if .Values.artifactory.persistence.awsS3.credential }} + {{ .Values.artifactory.persistence.awsS3.credential }} + {{- end }} + {{ .Values.artifactory.persistence.awsS3.path }} + {{- range $key, $value := .Values.artifactory.persistence.awsS3.properties }} + + {{- end }} + + + {{- end }} + {{- if eq .Values.artifactory.persistence.type "azure-blob" }} + + + + + + + + + + + + + + + + + + {{ .Values.artifactory.persistence.maxCacheSize }} + {{ .Values.artifactory.persistence.cacheProviderDir }} + + + + + crossNetworkStrategy + crossNetworkStrategy + 2 + 1 + + + + + remote + + + + local + + + + + {{ .Values.artifactory.persistence.azureBlob.accountName }} + {{ .Values.artifactory.persistence.azureBlob.accountKey }} + {{ .Values.artifactory.persistence.azureBlob.endpoint }} + {{ .Values.artifactory.persistence.azureBlob.containerName }} + {{ .Values.artifactory.persistence.azureBlob.testConnection }} + + + {{- end }} + cacheProviderDir: cache + enabled: true + eventual: + numberOfThreads: 10 + fileSystem: + existingSharedClaim: + backupDir: /var/opt/jfrog/artifactory-backup + dataDir: '{{ .Values.artifactory.persistence.mountPath }}/artifactory-data' + enabled: false + numberOfExistingClaims: 1 + googleStorage: + bucketExists: false + bucketName: artifactory-ha-gcp + endpoint: storage.googleapis.com + gcpServiceAccount: + enabled: false + httpsOnly: false + path: artifactory-ha/filestore + local: false + maxCacheSize: 50000000000 + mountPath: /var/opt/jfrog/artifactory + nfs: + backupDir: /var/opt/jfrog/artifactory-backup + capacity: 200Gi + dataDir: /var/opt/jfrog/artifactory-ha + haBackupMount: /backup + haDataMount: /data + mountOptions: [] + redundancy: 3 + size: 200Gi + type: file-system + primary: + affinity: {} + javaOpts: + corePoolSize: 16 + jmx: + authenticate: false + enabled: false + port: 9010 + ssl: false + labels: {} + name: artifactory-ha-primary + nodeSelector: {} + persistence: + existingClaim: false + podAntiAffinity: + topologyKey: kubernetes.io/hostname + type: "" + resources: {} + tolerations: [] + priorityClass: + create: false + value: 1000000000 + readinessProbe: + enabled: true + failureThreshold: 10 + initialDelaySeconds: 90 + path: /router/api/v1/system/health + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + replicator: + enabled: false + ingress: + annotations: {} + hosts: [] + tls: [] + service: + annotations: {} + loadBalancerSourceRanges: [] + name: artifactory + pool: members + type: ClusterIP + ssh: + enabled: false + externalPort: 1339 + internalPort: 1339 + systemYaml: | + shared: + logging: + consoleLog: + enabled: {{ .Values.artifactory.consoleLog }} + extraJavaOpts: > + -Dartifactory.access.client.max.connections={{ .Values.access.tomcat.connector.maxThreads }} + {{- with .Values.artifactory.primary.javaOpts }} + -Dartifactory.async.corePoolSize={{ .corePoolSize }} + {{- if .xms }} + -Xms{{ .xms }} + {{- end }} + {{- if .xmx }} + -Xmx{{ .xmx }} + {{- end }} + {{- if .jmx.enabled }} + -Dcom.sun.management.jmxremote + -Dcom.sun.management.jmxremote.port={{ .jmx.port }} + -Dcom.sun.management.jmxremote.rmi.port={{ .jmx.port }} + -Dcom.sun.management.jmxremote.ssl={{ .jmx.ssl }} + {{- if .jmx.host }} + -Djava.rmi.server.hostname={{ tpl .jmx.host $ }} + {{- else }} + -Djava.rmi.server.hostname={{ template "artifactory-ha.fullname" $ }} + {{- end }} + {{- if .jmx.authenticate }} + -Dcom.sun.management.jmxremote.authenticate=true + -Dcom.sun.management.jmxremote.access.file={{ .jmx.accessFile }} + -Dcom.sun.management.jmxremote.password.file={{ .jmx.passwordFile }} + {{- else }} + -Dcom.sun.management.jmxremote.authenticate=false + {{- end }} + {{- end }} + {{- if .other }} + {{ .other }} + {{- end }} + {{- end }} + database: + {{- if .Values.postgresql.enabled }} + type: postgresql + url: "jdbc:postgresql://{{ .Release.Name }}-postgresql:{{ .Values.postgresql.service.port }}/{{ .Values.postgresql.postgresqlDatabase }}" + host: "" + driver: org.postgresql.Driver + username: "{{ .Values.postgresql.postgresqlUsername }}" + {{ else }} + type: "{{ .Values.database.type }}" + driver: "{{ .Values.database.driver }}" + {{- end }} + artifactory: + {{- if or .Values.artifactory.haDataDir.enabled .Values.artifactory.haBackupDir.enabled }} + node: + {{- if .Values.artifactory.haDataDir.path }} + haDataDir: {{ .Values.artifactory.haDataDir.path }} + {{- end }} + {{- if .Values.artifactory.haBackupDir.path }} + haBackupDir: {{ .Values.artifactory.haBackupDir.path }} + {{- end }} + {{- end }} + database: + maxOpenConnections: {{ .Values.artifactory.database.maxOpenConnections }} + tomcat: + connector: + maxThreads: {{ .Values.artifactory.tomcat.connector.maxThreads }} + extraConfig: {{ .Values.artifactory.tomcat.connector.extraConfig }} + frontend: + session: + timeMinutes: {{ .Values.frontend.session.timeoutMinutes }} + access: + database: + maxOpenConnections: {{ .Values.access.database.maxOpenConnections }} + tomcat: + connector: + maxThreads: {{ .Values.access.tomcat.connector.maxThreads }} + extraConfig: {{ .Values.access.tomcat.connector.extraConfig }} + {{- if .Values.access.database.enabled }} + type: "{{ .Values.access.database.type }}" + url: "{{ .Values.access.database.url }}" + driver: "{{ .Values.access.database.driver }}" + username: "{{ .Values.access.database.user }}" + password: "{{ .Values.access.database.password }}" + {{- end }} + metadata: + database: + maxOpenConnections: {{ .Values.metadata.database.maxOpenConnections }} + {{- if .Values.artifactory.replicator.enabled }} + replicator: + enabled: true + {{- end }} + terminationGracePeriodSeconds: 30 + tomcat: + connector: + extraConfig: acceptCount="100" + maxThreads: 200 + uid: "1000721030" + userPluginSecrets: null + database: + driver: OVERRIDE + password: OVERRIDE + secrets: {} + type: OVERRIDE + url: OVERRIDE + user: OVERRIDE + filebeat: + enabled: false + filebeatYml: | + logging.level: info + path.data: {{ .Values.artifactory.persistence.mountPath }}/log/filebeat + name: artifactory-filebeat + queue.spool: ~ + filebeat.inputs: + - type: log + enabled: true + close_eof: ${CLOSE:false} + paths: + - {{ .Values.artifactory.persistence.mountPath }}/log/*.log + fields: + service: "jfrt" + log_type: "artifactory" + output: + logstash: + hosts: ["{{ .Values.filebeat.logstashUrl }}"] + image: + repository: docker.elastic.co/beats/filebeat + version: 7.9.2 + livenessProbe: + exec: + command: + - sh + - -c + - | + #!/usr/bin/env bash -e + curl --fail 127.0.0.1:5066 + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + logstashUrl: logstash:5044 + name: artifactory-filebeat + readinessProbe: + exec: + command: + - sh + - -c + - | + #!/usr/bin/env bash -e + filebeat test output + failureThreshold: 3 + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + resources: {} + terminationGracePeriod: 10 + frontend: + session: + timeoutMinutes: "30" + global: {} + ingress: + additionalRules: [] + annotations: {} + artifactoryPath: /artifactory/ + defaultBackend: + enabled: true + enabled: false + hosts: [] + labels: {} + routerPath: / + tls: [] + initContainerImage: registry.connect.redhat.com/jfrog/init:1.0.1 + initContainers: + resources: {} + installer: {} + installerInfo: '{ "productId": "Openshift_artifactory-ha/{{ .Chart.Version }}", "features": [ { "featureId": "ArtifactoryVersion/{{ default .Chart.AppVersion .Values.artifactory.image.version }}" }, { "featureId": "{{ if .Values.postgresql.enabled }}postgresql{{ else }}{{ .Values.database.type }}{{ end }}/0.0.0" }, { "featureId": "Platform/Openshift" }, { "featureId": "Partner/ACC-006983" }, { "featureId": "Channel/Openshift" } ] }' + logger: + image: + registry: docker.bintray.io + repository: busybox + tag: 1.31.1 + metadata: + database: + maxOpenConnections: 80 + networkpolicy: + - egress: + - {} + ingress: + - {} + name: artifactory + podSelector: + matchLabels: + app: artifactory-ha + nginx: + affinity: {} + artifactoryConf: | + {{- if .Values.nginx.https.enabled }} + ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; + ssl_certificate {{ .Values.nginx.persistence.mountPath }}/ssl/tls.crt; + ssl_certificate_key {{ .Values.nginx.persistence.mountPath }}/ssl/tls.key; + ssl_session_cache shared:SSL:1m; + ssl_prefer_server_ciphers on; + {{- end }} + ## server configuration + server { + {{- if .Values.nginx.internalPortHttps }} + listen {{ .Values.nginx.internalPortHttps }} ssl; + {{- else -}} + {{- if .Values.nginx.https.enabled }} + listen {{ .Values.nginx.https.internalPort }} ssl; + {{- end }} + {{- end }} + {{- if .Values.nginx.internalPortHttp }} + listen {{ .Values.nginx.internalPortHttp }}; + {{- else -}} + {{- if .Values.nginx.http.enabled }} + listen {{ .Values.nginx.http.internalPort }}; + {{- end }} + {{- end }} + server_name ~(?.+)\.{{ include "artifactory-ha.fullname" . }} {{ include "artifactory-ha.fullname" . }} + {{- range .Values.ingress.hosts -}} + {{- if contains "." . -}} + {{ "" | indent 0 }} ~(?.+)\.{{ . }} + {{- end -}} + {{- end -}}; + if ($http_x_forwarded_proto = '') { + set $http_x_forwarded_proto $scheme; + } + ## Application specific logs + ## access_log /var/log/nginx/artifactory-access.log timing; + ## error_log /var/log/nginx/artifactory-error.log; + rewrite ^/artifactory/?$ / redirect; + if ( $repo != "" ) { + rewrite ^/(v1|v2)/(.*) /artifactory/api/docker/$repo/$1/$2 break; + } + chunked_transfer_encoding on; + client_max_body_size 0; + + location / { + proxy_read_timeout 900; + proxy_pass_header Server; + proxy_cookie_path ~*^/.* /; + proxy_pass {{ include "artifactory-ha.scheme" . }}://{{ include "artifactory-ha.fullname" . }}:{{ .Values.artifactory.externalPort }}/; + {{- if .Values.nginx.service.ssloffload}} + proxy_set_header X-JFrog-Override-Base-Url $http_x_forwarded_proto://$host; + {{- else }} + proxy_set_header X-JFrog-Override-Base-Url $http_x_forwarded_proto://$host:$server_port; + proxy_set_header X-Forwarded-Port $server_port; + {{- end }} + proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + location /artifactory/ { + if ( $request_uri ~ ^/artifactory/(.*)$ ) { + proxy_pass {{ include "artifactory-ha.scheme" . }}://{{ include "artifactory-ha.fullname" . }}:{{ .Values.artifactory.externalArtifactoryPort }}/artifactory/$1; + } + proxy_pass {{ include "artifactory-ha.scheme" . }}://{{ include "artifactory-ha.fullname" . }}:{{ .Values.artifactory.externalArtifactoryPort }}/artifactory/; + } + } + } + customArtifactoryConfigMap: null + customConfigMap: null + enabled: true + gid: "1000720107" + http: + enabled: true + externalPort: 80 + internalPort: 8080 + https: + enabled: true + externalPort: 443 + internalPort: 8443 + image: + pullPolicy: IfNotPresent + registry: registry.redhat.io + repository: rhel8/nginx-116 + tag: latest + kind: Deployment + labels: {} + livenessProbe: + enabled: true + failureThreshold: 10 + initialDelaySeconds: 180 + path: /router/api/v1/system/health + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + loggers: [] + loggersResources: {} + logs: + level: warn + stderr: false + mainConf: | + # Main Nginx configuration file + worker_processes 4; + error_log {{ .Values.nginx.persistence.mountPath }}/logs//error.log warn; + pid /tmp/nginx.pid; + events { + worker_connections 1024; + } + http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + variables_hash_max_size 1024; + variables_hash_bucket_size 64; + server_names_hash_max_size 4096; + server_names_hash_bucket_size 128; + types_hash_max_size 2048; + types_hash_bucket_size 64; + proxy_read_timeout 2400s; + client_header_timeout 2400s; + client_body_timeout 2400s; + proxy_connect_timeout 75s; + proxy_send_timeout 2400s; + proxy_buffer_size 32k; + proxy_buffers 40 32k; + proxy_busy_buffers_size 64k; + proxy_temp_file_write_size 250m; + proxy_http_version 1.1; + client_body_buffer_size 128k; + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + log_format timing 'ip = $remote_addr ' + 'user = \"$remote_user\" ' + 'local_time = \"$time_local\" ' + 'host = $host ' + 'request = \"$request\" ' + 'status = $status ' + 'bytes = $body_bytes_sent ' + 'upstream = \"$upstream_addr\" ' + 'upstream_time = $upstream_response_time ' + 'request_time = $request_time ' + 'referer = \"$http_referer\" ' + 'UA = \"$http_user_agent\"'; + access_log {{ .Values.nginx.persistence.mountPath }}/logs/access.log timing; + sendfile on; + #tcp_nopush on; + keepalive_timeout 65; + #gzip on; + include {{ .Values.nginx.persistence.mountPath }}/conf.d/*.conf; + } + minAvailable: 0 + name: nginx + nodeSelector: {} + persistence: + accessMode: ReadWriteOnce + enabled: false + mountPath: /var/opt/jfrog/nginx + size: 5Gi + readinessProbe: + enabled: true + failureThreshold: 10 + initialDelaySeconds: 120 + path: /router/api/v1/system/health + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + replicaCount: 1 + resources: {} + service: + externalTrafficPolicy: Cluster + labels: {} + loadBalancerIP: null + loadBalancerSourceRanges: [] + ssloffload: false + type: LoadBalancer + ssh: + externalPort: 1339 + internalPort: 1339 + tlsSecretName: OVERRIDE + tolerations: [] + uid: "1000720104" + postgresql: + common: + exampleValue: common-chart + global: + postgresql: {} + commonAnnotations: {} + enabled: false + extraEnv: [] + global: + postgresql: {} + image: + debug: false + pullPolicy: IfNotPresent + registry: docker.bintray.io + repository: bitnami/postgresql + tag: 12.3.0-debian-10-r71 + ldap: + baseDN: "" + bindDN: "" + enabled: false + port: "" + prefix: "" + scheme: "" + search_attr: "" + search_filter: "" + server: "" + suffix: "" + tls: false + url: "" + livenessProbe: + enabled: true + failureThreshold: 6 + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + master: + affinity: {} + annotations: {} + extraInitContainers: [] + extraVolumeMounts: [] + extraVolumes: [] + labels: {} + nodeSelector: {} + podAnnotations: {} + podLabels: {} + priorityClassName: "" + service: {} + sidecars: [] + tolerations: [] + metrics: + enabled: false + extraEnvVars: {} + image: + pullPolicy: IfNotPresent + registry: docker.io + repository: bitnami/postgres-exporter + tag: 0.8.0-debian-10-r188 + livenessProbe: + enabled: true + failureThreshold: 6 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + prometheusRule: + additionalLabels: {} + enabled: false + namespace: "" + rules: [] + readinessProbe: + enabled: true + failureThreshold: 6 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + securityContext: + enabled: false + runAsUser: 1001 + service: + annotations: + prometheus.io/port: "9187" + prometheus.io/scrape: "true" + type: ClusterIP + serviceMonitor: + additionalLabels: {} + enabled: false + networkPolicy: + allowExternal: true + enabled: false + explicitNamespacesSelector: {} + persistence: + accessModes: + - ReadWriteOnce + annotations: {} + enabled: true + mountPath: /bitnami/postgresql + size: 50Gi + subPath: "" + postgresqlDataDir: /bitnami/postgresql/data + postgresqlDatabase: artifactory + postgresqlExtendedConf: + listenAddresses: '''*''' + maxConnections: "1500" + postgresqlPassword: "" + postgresqlUsername: artifactory + psp: + create: false + rbac: + create: false + readinessProbe: + enabled: true + failureThreshold: 6 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + replication: + applicationName: my_application + enabled: false + numSynchronousReplicas: 0 + password: repl_password + slaveReplicas: 1 + synchronousCommit: "off" + user: repl_user + resources: + requests: + cpu: 250m + memory: 256Mi + securityContext: + enabled: true + fsGroup: 1001 + runAsUser: 1001 + service: + annotations: {} + port: 5432 + type: ClusterIP + serviceAccount: + enabled: false + shmVolume: + chmod: + enabled: true + enabled: true + slave: + affinity: {} + annotations: {} + extraInitContainers: | + # - name: do-something + # image: busybox + # command: ['do', 'something'] + extraVolumeMounts: [] + extraVolumes: [] + labels: {} + nodeSelector: {} + persistence: + enabled: true + podAnnotations: {} + podLabels: {} + priorityClassName: "" + service: {} + sidecars: [] + tolerations: [] + tls: + certFilename: "" + certKeyFilename: "" + certificatesSecret: "" + enabled: false + preferServerCiphers: true + updateStrategy: + type: RollingUpdate + volumePermissions: + enabled: false + image: + pullPolicy: Always + registry: docker.io + repository: bitnami/minideb + tag: buster + securityContext: + runAsUser: 0 + rbac: + create: true + role: + rules: + - apiGroups: + - "" + resources: + - services + - endpoints + - pods + verbs: + - get + - watch + - list + serviceAccount: + annotations: {} + create: true + waitForDatabase: true + + diff --git a/Openshift4/operator/artifactory-ha-operator/config/samples/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml b/Openshift4/operator/artifactory-ha-operator/config/samples/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml new file mode 100644 index 0000000..3d68c69 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/samples/charts.helm.k8s.io_v1alpha1_openshiftartifactoryha_cr.yaml @@ -0,0 +1,97 @@ +apiVersion: charts.helm.k8s.io/v1alpha1 +kind: OpenshiftArtifactoryHa +metadata: + name: openshiftartifactoryha +spec: + artifactory-ha: + database: + type: "OVERRIDE" + driver: "OVERRIDE" + url: "OVERRIDE" + user: "OVERRIDE" + password: "OVERRIDE" + initContainerImage: registry.connect.redhat.com/jfrog/init:1.0.1 + waitForDatabase: true + installerInfo: '{ "productId": "Openshift_artifactory-ha/{{ .Chart.Version }}", "features": [ { "featureId": "ArtifactoryVersion/{{ default .Chart.AppVersion .Values.artifactory.image.version }}" }, { "featureId": "{{ if .Values.postgresql.enabled }}postgresql{{ else }}{{ .Values.database.type }}{{ end }}/0.0.0" }, { "featureId": "Platform/Openshift" }, { "featureId": "Partner/ACC-006983" }, { "featureId": "Channel/Openshift" } ] }' + artifactory: + uid: "1000721030" + ## Change to use RH UBI images + image: + registry: registry.connect.redhat.com + repository: jfrog/artifactory-pro + tag: 7.9.0 + node: + replicaCount: 2 + waitForPrimaryStartup: + enabled: false + masterKey: "OVERRIDE" + joinKey: "OVERRIDE" + postgresql: + enabled: false + nginx: + uid: "1000720104" + gid: "1000720107" + image: + registry: registry.redhat.io + repository: rhel8/nginx-116 + tag: latest + ## K8S secret name for the TLS secret to be used for SSL + tlsSecretName: "OVERRIDE" + service: + ssloffload: false + http: + externalPort: 80 + internalPort: 8080 + https: + externalPort: 443 + internalPort: 8443 + mainConf: | + # Main Nginx configuration file + worker_processes 4; + error_log {{ .Values.nginx.persistence.mountPath }}/logs//error.log warn; + pid /tmp/nginx.pid; + events { + worker_connections 1024; + } + http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + variables_hash_max_size 1024; + variables_hash_bucket_size 64; + server_names_hash_max_size 4096; + server_names_hash_bucket_size 128; + types_hash_max_size 2048; + types_hash_bucket_size 64; + proxy_read_timeout 2400s; + client_header_timeout 2400s; + client_body_timeout 2400s; + proxy_connect_timeout 75s; + proxy_send_timeout 2400s; + proxy_buffer_size 32k; + proxy_buffers 40 32k; + proxy_busy_buffers_size 64k; + proxy_temp_file_write_size 250m; + proxy_http_version 1.1; + client_body_buffer_size 128k; + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + log_format timing 'ip = $remote_addr ' + 'user = \"$remote_user\" ' + 'local_time = \"$time_local\" ' + 'host = $host ' + 'request = \"$request\" ' + 'status = $status ' + 'bytes = $body_bytes_sent ' + 'upstream = \"$upstream_addr\" ' + 'upstream_time = $upstream_response_time ' + 'request_time = $request_time ' + 'referer = \"$http_referer\" ' + 'UA = \"$http_user_agent\"'; + access_log {{ .Values.nginx.persistence.mountPath }}/logs/access.log timing; + sendfile on; + #tcp_nopush on; + keepalive_timeout 65; + #gzip on; + include {{ .Values.nginx.persistence.mountPath }}/conf.d/*.conf; + } diff --git a/Openshift4/operator/artifactory-ha-operator/config/samples/kustomization.yaml b/Openshift4/operator/artifactory-ha-operator/config/samples/kustomization.yaml new file mode 100644 index 0000000..94bc7e6 --- /dev/null +++ b/Openshift4/operator/artifactory-ha-operator/config/samples/kustomization.yaml @@ -0,0 +1,4 @@ +## Append samples you want in your CSV to this file as resources ## +resources: +- cache_v1alpha1_openshiftartifactoryha.yaml +# +kubebuilder:scaffold:manifestskustomizesamples diff --git a/Openshift4/operator/artifactory-ha-operator/watches.yaml b/Openshift4/operator/artifactory-ha-operator/watches.yaml index 5e71caa..d956392 100644 --- a/Openshift4/operator/artifactory-ha-operator/watches.yaml +++ b/Openshift4/operator/artifactory-ha-operator/watches.yaml @@ -5,4 +5,4 @@ chart: helm-charts/openshift-artifactory-ha overrideValues: artifactory-ha.artifactory.image.override: $RELATED_IMAGE_ARTIFACTORY_IMAGE_REPOSITORY - artifactory-ha.nginx.image.override: $RELATED_IMAGE_NGINX_IMAGE_REPOSITORY \ No newline at end of file + artifactory-ha.nginx.image.override: $RELATED_IMAGE_NGINX_IMAGE_REPOSITORY From e29879e8c959c3606b83bf14e90d2442840ea2b6 Mon Sep 17 00:00:00 2001 From: John Peterson Date: Fri, 2 Oct 2020 20:30:01 -0700 Subject: [PATCH 26/28] Openshift pipelines helm chart --- Openshift4/helm/openshift-pipelines/values.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Openshift4/helm/openshift-pipelines/values.yaml b/Openshift4/helm/openshift-pipelines/values.yaml index 320dd84..99d1e42 100755 --- a/Openshift4/helm/openshift-pipelines/values.yaml +++ b/Openshift4/helm/openshift-pipelines/values.yaml @@ -16,8 +16,7 @@ pipelines: ## Common initContainer: - #image: registry.connect.redhat.com/jfrog/init:1.0.0 - image: quay.io/jfrog/init:1.0.0 + image: registry.connect.redhat.com/jfrog/init:1.0.0 pullPolicy: IfNotPresent ## Available modes: devmode (enable it for debuging) and production From b4098a97c7028dcf0cd70c25a1d563df7df24f58 Mon Sep 17 00:00:00 2001 From: Robi Nino Date: Mon, 5 Oct 2020 18:08:50 +0300 Subject: [PATCH 27/28] Add CLA Assistant GitHub Action --- .github/workflows/cla.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/cla.yml diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml new file mode 100644 index 0000000..2b31807 --- /dev/null +++ b/.github/workflows/cla.yml @@ -0,0 +1,28 @@ +name: "CLA Assistant" +on: + issue_comment: + types: [created] + pull_request_target: + types: [opened,synchronize] + +jobs: + CLAssistant: + runs-on: ubuntu-latest + steps: + - name: "CLA Assistant" + if: (github.event.comment.body == 'recheckcla' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target' + # Alpha Release + uses: cla-assistant/github-action@v2.0.1-alpha + env: + # Generated and maintained by github + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # JFrog organization secret + PERSONAL_ACCESS_TOKEN : ${{ secrets.CLA_SIGN_TOKEN }} + with: + path-to-signatures: 'signed_clas.json' + path-to-cla-document: 'https://jfrog.com/privacy-policy/cla/' + remote-organization-name: 'jfrog' + remote-repository-name: 'jfrog-signed-clas' + # branch should not be protected + branch: 'master' + allowlist: bot* From b31e69bc779144ded51090080bc035eac94f97c5 Mon Sep 17 00:00:00 2001 From: robin Date: Tue, 6 Oct 2020 14:56:40 +0300 Subject: [PATCH 28/28] Update CLA Url --- .github/workflows/cla.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 2b31807..53eb0b8 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -20,9 +20,9 @@ jobs: PERSONAL_ACCESS_TOKEN : ${{ secrets.CLA_SIGN_TOKEN }} with: path-to-signatures: 'signed_clas.json' - path-to-cla-document: 'https://jfrog.com/privacy-policy/cla/' + path-to-cla-document: 'https://jfrog.com/cla/' remote-organization-name: 'jfrog' remote-repository-name: 'jfrog-signed-clas' # branch should not be protected branch: 'master' - allowlist: bot* + allowlist: bot* \ No newline at end of file