From c8bfeb19d75b6b6cc91844ac2914d64900bdf125 Mon Sep 17 00:00:00 2001 From: Sergiy Markin Date: Fri, 6 Sep 2024 20:13:36 +0000 Subject: [PATCH] Airflow 2.10.2 + ubuntu_jammy Change-Id: If19c66202b2b711a40dc515f8a8d189be17a9659 --- .zuul.yaml | 215 +++++++++++++----- Makefile | 11 +- doc/requirements.txt | 2 +- doc/source/images/architecture-pegleg.png | Bin 43061 -> 45469 bytes images/pegleg/Dockerfile.ubuntu_jammy | 78 +++++++ requirements-direct.txt | 6 +- requirements-frozen.txt | 139 ++++++----- tools/gate/playbooks/airship-run-scripts.yaml | 75 ++++++ tools/gate/playbooks/airskiff-validate.yaml | 78 ------- .../playbooks/checkout-treasuremap-ref.yaml | 31 +++ tools/gate/playbooks/deploy-env.yaml | 36 +++ tools/gate/playbooks/docker-image-build.yaml | 5 + tools/gate/playbooks/mount-volumes.yaml | 17 ++ .../playbooks/osh-infra-collect-logs.yaml | 43 ++++ tools/gate/playbooks/prepare-hosts.yaml | 21 ++ .../airship-run-script-set/defaults/main.yaml | 47 ++++ .../airship-run-script-set/tasks/main.yaml | 84 +++++++ .../airship-run-script/defaults/main.yaml | 43 ++++ .../roles/airship-run-script/tasks/main.yaml | 56 +++++ tox.ini | 6 +- vcs-requirements.env | 6 +- 21 files changed, 778 insertions(+), 221 deletions(-) create mode 100644 images/pegleg/Dockerfile.ubuntu_jammy create mode 100644 tools/gate/playbooks/airship-run-scripts.yaml create mode 100644 tools/gate/playbooks/checkout-treasuremap-ref.yaml create mode 100644 tools/gate/playbooks/deploy-env.yaml create mode 100644 tools/gate/playbooks/mount-volumes.yaml create mode 100644 tools/gate/playbooks/osh-infra-collect-logs.yaml create mode 100644 tools/gate/playbooks/prepare-hosts.yaml create mode 100644 tools/gate/roles/airship-run-script-set/defaults/main.yaml create mode 100644 tools/gate/roles/airship-run-script-set/tasks/main.yaml create mode 100644 tools/gate/roles/airship-run-script/defaults/main.yaml create mode 100644 tools/gate/roles/airship-run-script/tasks/main.yaml diff --git a/.zuul.yaml b/.zuul.yaml index 034e928b..4b86c2ab 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -13,10 +13,8 @@ - project: templates: # commented out because openstack-tox-docs fails on jammy zuul nodes - # - docs-on-readthedocs - - openstack-python38-jobs - # - openstack-cover-jobs - # - release-notes-jobs-python3 + - docs-on-readthedocs + - release-notes-jobs-python3 vars: rtd_webhook_id: '38574' rtd_project_name: 'airship-pegleg' @@ -27,33 +25,35 @@ docker_registry_login_url: "https://quay.io/api/v1/" deb_docker_repo: "{{ zuul_site_mirror_fqdn }}/deb-docker/{{ ansible_distribution_release }}" image_prefix: "airshipit" + base_image_jammy: "ubuntu:22.04" base_image_focal: "ubuntu:20.04" base_image_bionic: "ubuntu:18.04" base_image_opensuse: "opensuse/leap:15.1" base_image_xenial: "ubuntu:16.04" check: jobs: - - openstack-tox-pep8-focal - - openstack-tox-cover-focal - #- openstack-tox-docs-focal + - openstack-tox-py310 + - openstack-tox-pep8-jammy + - openstack-tox-cover-jammy + - openstack-tox-docs-jammy - pegleg-dependency-vulnerability-check - - airship-pegleg-validate-airskiff-manifests-focal - - airship-pegleg-docker-build-gate-ubuntu_focal + - airship-pegleg-validate-airskiff-manifests-jammy + - airship-pegleg-docker-build-gate-ubuntu_jammy - airship-pegleg-lint-yaml gate: jobs: - - openstack-tox-pep8-focal - - openstack-tox-cover-focal - #- openstack-tox-docs-focal + - openstack-tox-py310 + - openstack-tox-pep8-jammy + - openstack-tox-cover-jammy + - openstack-tox-docs-jammy - pegleg-dependency-vulnerability-check - - airship-pegleg-validate-airskiff-manifests-focal - - airship-pegleg-docker-build-gate-ubuntu_focal + - airship-pegleg-validate-airskiff-manifests-jammy + - airship-pegleg-docker-build-gate-ubuntu_jammy - airship-pegleg-lint-yaml post: jobs: - - airship-pegleg-docker-publish-ubuntu_focal - - airship-pegleg-docker-publish-ubuntu_bionic + - airship-pegleg-docker-publish-ubuntu_jammy - pegleg-upload-git-mirror - nodeset: @@ -63,25 +63,25 @@ label: ubuntu-bionic - nodeset: - name: airship-pegleg-single-node-focal + name: airship-pegleg-single-node-jammy nodes: - name: primary - label: ubuntu-focal + label: ubuntu-jammy - job: - name: openstack-tox-pep8-focal + name: openstack-tox-pep8-jammy parent: openstack-tox-pep8 - nodeset: openstack-single-node-focal - -#- job: -# name: openstack-tox-docs-focal -# parent: openstack-tox-docs -# nodeset: openstack-single-node-focal + nodeset: openstack-single-node-jammy - job: - name: openstack-tox-cover-focal + name: openstack-tox-docs-jammy + parent: openstack-tox-docs + nodeset: openstack-single-node-jammy + +- job: + name: openstack-tox-cover-jammy parent: openstack-tox-cover - nodeset: openstack-single-node-focal + nodeset: openstack-single-node-jammy - job: @@ -89,78 +89,173 @@ voting: true timeout: 600 run: tools/gate/playbooks/lint-yaml.yaml - nodeset: ubuntu-focal + nodeset: ubuntu-jammy irrelevant-files: - ^.*\.rst$ - ^doc/.*$ - job: name: pegleg-dependency-vulnerability-check - parent: tox-py38 + parent: tox-py310 voting: false timeout: 600 - nodeset: ubuntu-focal + nodeset: ubuntu-jammy vars: tox_envlist: safety - bindep_profile: test py38 + bindep_profile: test py310 -- job: - name: airship-pegleg-validate-airskiff-manifests-focal - nodeset: airship-pegleg-single-node-focal - description: | - Test pegleg Airskiff site manifest validation - timeout: 9600 - voting: true - pre-run: - - tools/gate/playbooks/airskiff-reduce-site.yaml - - tools/gate/playbooks/git-config.yaml - run: tools/gate/playbooks/airskiff-validate.yaml - post-run: tools/gate/playbooks/debug-report.yaml - required-projects: - - airship/treasuremap - vars: - CLONE_PEGLEG: false - HTK_COMMIT: d31027cfb4c686e23790ed50a024e8ee976549d7 - PEGLEG_IMAGE_DISTRO: ubuntu_focal - irrelevant-files: - - ^.*\.rst$ - - ^doc/.*$ - - ^releasenotes/.*$ +# - job: +# name: airship-pegleg-validate-airskiff-manifests-jammy +# nodeset: airship-pegleg-single-node-jammy +# description: | +# Test pegleg Airskiff site manifest validation +# timeout: 9600 +# voting: true +# pre-run: +# - tools/gate/playbooks/airskiff-reduce-site.yaml +# - tools/gate/playbooks/git-config.yaml +# run: tools/gate/playbooks/airskiff-validate.yaml +# post-run: tools/gate/playbooks/debug-report.yaml +# required-projects: +# - airship/treasuremap +# vars: +# CLONE_PEGLEG: false +# HTK_COMMIT: d31027cfb4c686e23790ed50a024e8ee976549d7 +# PEGLEG_IMAGE_DISTRO: ubuntu_jammy +# irrelevant-files: +# - ^.*\.rst$ +# - ^doc/.*$ +# - ^releasenotes/.*$ - job: - name: airship-pegleg-docker-build-gate-ubuntu_focal + name: airship-pegleg-docker-build-gate-ubuntu_jammy timeout: 7200 run: tools/gate/playbooks/docker-image-build.yaml - nodeset: airship-pegleg-single-node-focal + nodeset: airship-pegleg-single-node-jammy irrelevant-files: - '^doc/.*' vars: publish: false - distro: ubuntu_focal + distro: ubuntu_jammy tags: dynamic: patch_set: true - job: - name: airship-pegleg-docker-publish-ubuntu_focal + name: pegleg-base + abstract: true + roles: + - zuul: openstack/openstack-helm-infra + - zuul: zuul/zuul-jobs + required-projects: + - name: openstack/openstack-helm + - name: openstack/openstack-helm-infra + - name: openstack/openstack-helm-plugin + - name: airship/treasuremap + override-checkout: v1.9 + irrelevant-files: &irrelevant-files + - ^.*\.rst$ + - ^doc/.*$ + - ^etc/.*$ + - ^releasenotes/.*$ + - ^setup.cfg$ + - ^deckhand/tests/unit/.*$ + timeout: 10800 + pre-run: + - tools/gate/playbooks/checkout-treasuremap-ref.yaml + - tools/gate/playbooks/prepare-hosts.yaml + - tools/gate/playbooks/mount-volumes.yaml + - tools/gate/playbooks/deploy-env.yaml + run: + - tools/gate/playbooks/airship-run-scripts.yaml + post-run: + - tools/gate/playbooks/osh-infra-collect-logs.yaml + vars: + treasuremap_ref: refs/changes/43/927643/6 + extra_volume: + size: 80G + type: Linux + mount_point: /opt/ext_vol + docker: + root_path: "/opt/ext_vol/docker" + containerd: + root_path: "/opt/ext_vol/containerd" + kubeadm: + pod_network_cidr: "10.244.0.0/16" + service_cidr: "10.96.0.0/16" + osh_plugin_repo: "{{ zuul.project.src_dir }}/../../openstack/openstack-helm-plugin" + loopback_setup: true + loopback_device: /dev/loop100 + loopback_image: "/opt/ext_vol/openstack-helm/ceph-loop.img" + ceph_osd_data_device: /dev/loop100 + kube_version_repo: "v1.30" + kube_version: "1.30.3-1.1" + calico_setup: true + calico_version: "v3.27.4" + cilium_setup: false + cilium_version: "1.16.0" + flannel_setup: false + flannel_version: v0.25.4 + helm_version: "v3.15.4" + crictl_version: "v1.30.1" + zuul_osh_relative_path: ../../openstack/openstack-helm + zuul_osh_infra_relative_path: ../../openstack/openstack-helm-infra + zuul_treasuremap_relative_path: ../../airship/treasuremap + gate_scripts_relative_path: ../../openstack/openstack-helm-infra + run_helm_tests: "no" + +- job: + name: airship-pegleg-validate-airskiff-manifests-jammy + nodeset: treasuremap-airskiff-1node-ubuntu_jammy + description: | + Test pegleg Airskiff site manifest validation + parent: pegleg-base + run: + - tools/gate/playbooks/airship-run-scripts.yaml + - tools/gate/playbooks/airskiff-validate.yaml + vars: + site: airskiff + HELM_ARTIFACT_URL: https://get.helm.sh/helm-v3.15.4-linux-amd64.tar.gz + HTK_COMMIT: 43fd7143481b6ddda0dbd2f26bf6ec39a417b15b + OSH_INFRA_COMMIT: 43fd7143481b6ddda0dbd2f26bf6ec39a417b15b + OSH_COMMIT: 540df5cb0dbdaed63c202e2d6f2b7891062f8203 + TREASUREMAP_COMMIT: refs/changes/43/927643/6 + DISTRO: ubuntu_jammy + DOCKER_REGISTRY: localhost:5000 + MAKE_PEGLEG_IMAGES: true + CLONE_PEGLEG: false + gate_scripts_relative_path: ../../airship/treasuremap + gate_scripts: + - ./tools/deployment/airskiff/developer/000-prepare-k8s.sh + - ./tools/deployment/airskiff/developer/009-setup-apparmor.sh + - ./tools/deployment/airskiff/developer/000-clone-dependencies.sh + - ./tools/deployment/airskiff/developer/020-setup-client.sh + - ./tools/deployment/airskiff/developer/015-make-all-charts.sh + - ./tools/deployment/airskiff/developer/017-make-all-images.sh + - ./tools/deployment/airskiff/developer/025-start-artifactory.sh + - ./tools/deployment/airskiff/developer/026-reduce-site.sh + + +- job: + name: airship-pegleg-docker-publish-ubuntu_jammy timeout: 7200 run: tools/gate/playbooks/docker-image-build.yaml - nodeset: airship-pegleg-single-node-focal + nodeset: airship-pegleg-single-node-jammy secrets: - airship_pegleg_quay_creds irrelevant-files: - '^doc/.*' vars: publish: true - distro: ubuntu_focal + distro: ubuntu_jammy tags: dynamic: branch: true commit: true static: - latest - - airflow_2.8.2 + - airflow_2.10.2 - secret: name: airship_pegleg_quay_creds diff --git a/Makefile b/Makefile index b632090d..8fff5dd3 100644 --- a/Makefile +++ b/Makefile @@ -27,8 +27,10 @@ PUSH_IMAGE ?= false # use this variable for image labels added in internal build process LABEL ?= org.airshipit.build=community COMMIT ?= $(shell git rev-parse HEAD) -DISTRO ?= ubuntu_focal +DISTRO ?= ubuntu_jammy +DISTRO_ALIAS ?= ubuntu_focal IMAGE ?= $(DOCKER_REGISTRY)/$(IMAGE_PREFIX)/$(IMAGE_NAME):$(IMAGE_TAG)-${DISTRO} +IMAGE_ALIAS := ${DOCKER_REGISTRY}/${IMAGE_PREFIX}/${IMAGE_NAME}:${IMAGE_TAG}-${DISTRO_ALIAS} PYTHON_BASE_IMAGE ?= python:3.8 BASE_IMAGE ?= @@ -101,6 +103,13 @@ else --build-arg PROMENADE_VERSION=${PROMENADE_VERSION} \ --build-arg SHIPYARD_VERSION=${SHIPYARD_VERSION} endif +ifneq ($(DISTRO), $(DISTRO_ALIAS)) + docker tag $(IMAGE) $(IMAGE_ALIAS) +endif +ifeq ($(DOCKER_REGISTRY), localhost:5000) + docker push $(IMAGE) + docker push $(IMAGE_ALIAS) +endif ifeq ($(PUSH_IMAGE), true) docker push $(IMAGE) endif diff --git a/doc/requirements.txt b/doc/requirements.txt index 74124814..28291d17 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -11,7 +11,7 @@ docutils>=0.17 # UML image generation -plantuml>= +plantuml # Releasenotes reno>=4.0.0 # Apache-2.0 diff --git a/doc/source/images/architecture-pegleg.png b/doc/source/images/architecture-pegleg.png index 18ae9fd2ef8a2f4346a63239d4d6dbc98f7ca50f..8a27e8c0778420bfca110d60b5b941b4ba1e5370 100644 GIT binary patch literal 45469 zcma&O2{e`O`aZsqAt@=5DVl^blqs_)GGs17LK!m?l3|xL(u6W(o=K4*Gij2NIdhU( znL?)IckS(*&-eV!_y1q(ch+aE)?wT4`##V8-1l`~*LA>EU+Jm5K2$MO=7t%rw;yR@*d zi-U!e$3;g6p>xiTo}X*E2?UC1I|Cz+fB&37f$#BtGH!6fxl?g-dHwV4u6AxB_DQqK zoSP||#nu_va=ft(lzw@8iyVB3D@;siK_<6Zr)LB)OkMp$Q5L?-+ zODdg$Hu~L}!HsO1r}OsiTjtu`;ho0${#kx-?gvJdJkJO|b-_V`Vy-BQOkWX|TSE7G znX@c+76+N-w1jU=Hum_@n(sGd+46pwYcx4ffx=b%Q0M8;?A)&Le*35TDVH`@8ZSI) z4sK@mmH%ezbGH9SRd4=t+Aj~1yzeFPt|qduJ?u%3@DOBjb?C6zv+dxfAf_CxFFO{h z(yAkkC3mWF2>7a`x@1_LwcN|c!Qc|!a&hIj#I{!)-}_U912)dF2F3^IzKc|U7##PZ zR{Jko_EhY8|7o8Pi-w4ckHQY@X(>7Vwo|>2G3j$#$c4V`fq$KcC~LGF6tkLQLfK!t zGAhfT9|~L6IxN~zyLF$<9)|PN<235l~;$$0X-Z_G*lZFQK0HJfTsp1r>G&ajvumam?IE~1hu0_47|;L_FVGSY+F@u*)toMnfbf9)BaA&!#75|)@`)B zF#hI?k!9AIj8hFXJDIMvztk~EQrfz#<)?RH%hk=6cX)2{JosR#w#R?+^Gf98;SZWa zLZZc@Gd_R&T!){y*LO>~50njk{uHyznG{-t;B-0@(!T`r<8<-le+~Yh{+(J43JO|W zSXeOL*v?uNFK$-xwU@@qNfOJ;K}Kyq#+V; z(#$uzy1IV-`t|SMzf4R_nzadA1mX^!Q*m%`aB>nVwb^-uaB>%seFG&QZsQHU;E|w7 zq1#}sO?_-Gg(_9+GoxI~#>8XK&sJKO@-bL%Rb2GHr|y1solZabR_^PmsJxpUZB9x| z6gwBPsimp8S#aIHeqcU36$x+E@=vLX~n{n>8?CPB*fzc z=U36R|130ty5Z9&O^MG_!^6YxJsl6w#jCH=Id_B8ax5nu zg~2U?J+6Z=Y`S^x-r1KL*Eje(oO?>dckNQj8>sPZzWs9m`5L-pPcS4q1-r&Aev$9ldEdun_0^L&q8C8 z>VAXtsScYsamUVll@Ru~x3|sw{(VYv!=_E7IM2{aVV7`dk3SOlaIeOfEW>-AefE{h z6QwMI#_1dyloTz8$pMiZ_Ta%0wpl!_PX%j0Uv&_|I_S5h%pvLZ^~87Y-sx3z=boeW z5)~86H!iRb+kMW`vSc z>3iG?L+TG7J{;kBEPVEJ50>`~`Kh;j{P2Mk=p`3_w0q3RtDng-e4ctZrN2Av;Cj0F zt^2gP3mv1EhW;$hv_7UxH!ELCRtqh1w3qOnGG}FF^(iw|OVf(M4Xa*x=$2V{#l9u| z!Gte%w}kva4BxS#hydmq1W`m}WMph?Y^oB+aDCj_GVk1b_q6-`f85;3L+tG6sEZU; z^~=M72&CEgz0mG;W8;G^r|zPIDW680(@INAo9kLyT97{KV&$R>vrc8JADNk~T-8!j zyVO=!X?vb8daUBbHp=u-B~sjq#0LilpDFbe^yLn(>67!io=*|ByxlgD-to=5cN1MN z?|tVz86)o(RXw=+cV3}W-t(u?+*s?VHTKE$%$c_5XY0rP$6ELWlCSu*%~!_J_B?f4 zn6h}bj-th5C+P%LRVHtY?|!f7HPKys?)@eqFM0nzMMrOKLFR~&bT*4TWYv-;tFN!m zAH1}r}VOw5*8Nv@5y+KRE6^pqlCz@zJ47ot!SE5 zP)DI72hPz=#&|iOSshxPl(BR1q5HJ|PQT|a_WF7&G_)BjUg|NLxamQ#Zj#D2VKZ4N zsYQhMsZ*!0+M0pS&Xn#VMp3LK`o~0q`r>3-oWEYLLqq%(YeI^n`jZn;Vy6r2w;3L? zYf7e|qVfIpVP914$z~j{+bn{$XDTzWdKbr9bOVmW1`_OdkazRjSxU;0h3S4r2M1(H z(&Nb(pFV9z(}0uqT>x=4q^_i-q#iDCGWqy}oE(vqu{PD^*-`h|k;dfYJtb^ROh<0% zue7Gr)YKqi?_2VDow!_bCq11n2$|fT=6|k{ZSwNx&!11Tvo#(I^%Pua6FO63OQSP! zE`HnoQwEP^y{CvuW2)SKZ~O>iQc}f!%fI((JUVdd>GlPkKGYGmXktqq+)f$eoJFZJXPdRucZ0h~K07=6<745~MpbTI z$F4%hty{N>Pgc8Jqt+3{Vy~qmO1lm5xw*Mx4+lR!4w!mH%YNdocE!mkKeKY50;M4O z^2_u7&x2n5XR75?BB^ui4DO z5xtrvv1gsmUdnW2Yy>skQH$K;{zqwaf|Oi;4SZN#nG8TMefjc5)cTWo=XN^E^eq%E zM&w;umzdLzL}0>xH8AikZNrwm>IRtx8OTW}szxOqcAlOR&F>U9D~8j>zq?9a@B2(B zdz$}wOMK2o$U+zKiM2AW^EKxt!G7$YMT{@AXiTOWLFVZ=Y<oSdmb$nVdAujXF9y z<_n6vr@z~6WL6Y+euzqxvs^YaJF5RXw(2PPibNq(-{5=qhPU)dgcFIxpbe}`OG|&_ z521+0PKwzzz0pmnsDdN9iR6I z9G4rzlat!28aK-QmOXvw`uh52Z|;!yt&uknSu2wtQw#(qzm{u6Iw1c?OFE~9NnH9h zfV!mb<9_ktMPJrk7g{rqb&YoxB>h6(jNKIz7soAbR^co4SXEg`sb%;;s|_EuY3uPR zlc`&`Zgt0eEpk=%+mn!x(A_79+5a|6xGHAWm=!35)u;O`wde!+Su3# z%uY?k)3msuBH&p$SEkp=iUX6W=Lxz{hTy0 zG1<3oUx}3O!c<(q-^dq+Iy#%ZqC^fIYFco1->@m(QpbBxZ{bxS?MtT~^}wl*!j&#b zfB+ioiT16Tu1QCO06&?v8M&mHw{8t|5ZF!zXOT6ZJ|!FE2dw@@y7)8Otc?WW__b{D z@mYU6XXn*A$==}Y2dh7Ryf9cB-d!wr+w{3vxn(JzL(mq*4YR)nHG~qH8nTTGZhs&B z_A2nqnKS&+UouZ-UHtK7$BrG$nv%|6|I{n2ev9$*BX4s=@|!nr`rqH9rJ?ch@$sDe z+VkpFg3sI-Z~)t(^EE#^^7t8m&3h{ROs@0m(_W&{;R;h9Y|S!cS7)X_ z)|z>eKlU!Cl-q}gdkrqm4Anh(!s)5~@j4l3Q<{}|yH0<9dm>r_|BXjGS7e;bV%ht- z!f*NSuaCkUl1{S7)wqccKh66es2hCCfpmdyWITUPO;1lxP1!akQXgyjJ>IqYXQrM* z!lB5ek5VrBr#uS{IbYp3a6Lrj_Jyf*tnHf6a z?OhZXcXs%5%!MycJCalx0|Hi21+CAY&p9DT3|gn7g2u$wman|s1>J><%XU2OT`rlX zrlxjJ>vg0Di{H!_UJDF(k6pa>%a=mL0noOB`%ti*pGD2)1ENHG_2b9s=;_%HyO?9g zySuw7si=^QJ5*8`Nq=AEjq1SfwQ0Ku(QP=#;x)2e=);HYDl7~X2II)fs&_dTQIjvU zJ?jB%Le+|DrVU^s^%}u_pCUyO=n37UeSJ*q>`{@C9|{TU8vc-$wdxAhtXmLoJ<7(p zbLTo(c(u^Il7ZSvgY<;3F5u)~H1A|X@R&FvSEBjO}Z-cRev;a8`k znaRaH@Gv0AO{U!rj*bC;rr+c7@>=h6uWO*Rva$-ge!WQ}3NeCH9+@q{L{43LSlBw0 zI2i=Y)6;pq{>y@Laxsn+ojZwR{4z3^@mu;J%b)GJ+Hvw$Sytp_P-JIgW4m(Y%H6wn zaf0Q%r{aT5i}j7^;>*gsr>oz;fB*Tj5L(OZP)YJV9MQ9{l9mJ=u5d=OV3MeTl@uWsZ+fDXqkUyt% z-r9PXkNPGGgJ2|DF^Bes`g-lZ+^gig{B5`{TJp$|Be?BP5eIL^HYpLd@dFkBN+MhN zO@F6Gjv;@IEGOX9kLQ)1?(U*J`@hw&QKoyJK7Cr@&lEn$HSp(w4*CAeO^e-9@Yg~@ zLP*Q!ekksui`P5-;yej=q3pKPUm{S7sJ5-PofI6AOhrNA#Qjr!f@`$g~u|v^6k)YFEb}2NQ&w>1@#XGldjiQkPnx1mi zPC7yeH?_63O;QQjvSmyAZ6z{jsj985{WUX_mzURt9Ec{{WFrmm0v!&ti>K$KR$f4dRO~D%|TH^7e2=ny9gNGRph$cgdzxFo6ffLrCsw7PMSjy6RDaI_tw_bY!|g= z5PXe_VEH3{iigPl9t=mCW@Pmvb|%tu89l*yEU;~~1cnK^yoK%;Zu%}-ao!VAoHCxl z*=q$e=KwB-i=)6fP}iVIZUmA$m7s%Sm9q^?K~LbR#qmS>-+$`q0=3Z&oJuM8p>JZD z*D4eV;=7!kCsADUQr137pHh$dmY0(H+U?6Sn#7Ag+g)4Ib%o8!%zs=%YxO1K;5nL& z>~BsHbsmZC93+~_NJ&Y>9Cp2$Eh0;bIbEQqUqf{qg)JUNH9qy_T}8+Pg-T+#^TcS| z^)}Zk@h1Bsc=IpK3?X10g07Gj<7Q&9+1Ij5Gu<+}y1Msv$ko=>wc76QZpqN^>FH^E zcIM-$o7U@ptTr4&)Tio=hAftJ)0(Fkt9!bjE3_Z0rtv<_{I?<{HR(KZ_@`Py6RHHlOIcdqSh$kh5X z?p&{xuDm+HjDYU3}P;B0^_nKtRbTxR9PdV_DBpMpZcq3k&Px z6o%QgBSfxb6%-bx1|TYG3I^;W37JXzdsYUl9{un$Fkn75gZiAi?YhOIb4ErY5kZ51 zTB&Ug*ldR&3ldzo`B0MhNZ@2`Z*Ol~+e?er*G*YW3+!8yRPWtp71rvKmzQrjw0G~| zOua%{G+=jpG~*80Z@&_wqq}~zJr_Pxax})4MzszX&7xfX@bS-=WwcqBFE69?=WU}o z=YP)VCa#)}CJ1e&L&iUsv==bW9|8OD;>8OR%k(Vy-21zJCyQD}zJFJeA@##qCj<0L zK^`2-U#G)$W?MUBKkApbeT%uqi4L^z9AdVLAEL8G_MGQkj}2p5Ib!?e>1m*R6AJ=) z=?2gavo##M!{XTSVi4P8+6sJLY-^NfUH4o}N6|Oy_6bu*Z|}ox6{sswuXII;V`tnwyc6xE2so{DX9a&kgxbcoUAA>Z%_%_dI153P4Dk`mtLW2=OyhYt^# zR}m(bm5&*4GoIvQ24d*5k5dTviWsZC6X*9k^6_KC-U`2rkibAH!;hrJADtM^?ntQz z3BkxM-~IY^Kd_TSOzyv~U}mCd(`XOl->TFoDd@yeo%*({kkOYX1eqTo=jtX~zN0oUkMR`Tf3#$z#0{rAOkZdf> zDr{z&p||(8J~K;3{jN-5(POHrdE@knN!)m5=2982iJzmRcKQ2R?RU3w5?^lDymZ+0 z`%&;Q?RskDTiVs?b7^6!57{n^)V4P!;vw1g9;X40BqTAKb6>L$C1?)Ky; zswtL0evW6)o>^E}IAnN`y04=LZ_PFRX|e%wIR8+-H>!qHWZQPlNV-j%zN|3uJRpDM z!K#m)^{D9X-GNQR$afvLt9P$TnJbAz9C{EQezMYk1&|ooj>KVZ9^BB8rJHm;GDTZk zyS}^IwD8%K@0Cw`xENA>*R5Np87mtp7*2=6LF6+M4!N!or=P0%;N+6;9Vs4ud}PnQ zeOOzC-X8~hN-kbNy#1X7A$e83T}7JwxL4HMCW@}3zAu`YgU zzUgMJbsc-1@CUn1yy5!UOT5fN!otFi!}8*C0e^kbw*CBkY3;tJb|ye2h!VeGZDp0A z0h;tH&Q=-s(a>$5C=P-zKK0V+%te}$jJ)AGQmuc_>hsBh$H0c1f1Sz_@OO~}*E)p0 z-XN7&`sy3kKpEM}qBVTiV_M{5QR+D^7BFfSD?)p8tU2x8lBGqrd6Or)qm5o0dA?mh zL5b>>ZW83@x5LjISSQIRjk-@+38m_pK}Hkg3R}{$BbAU4EXN1NA>#393CF~P`2__j z-D(`Oljs9aCnyC`)+b(RB*B=F$j+3swB{_;!aMV8dpfl<98U;3LzfVP=9`oNB^|Ez36L4c+xCu*MssvSG1k>yy?*Zt1FQRg{P_4zGlmqU3>*5C1(1ii zq&?!N9eOLu0|Q@!aw`6XfKpXeb?z>jMuYiFcIRy=p0B7+>aP!jmr;+)Ptf7RGI19& zG4C*=2s6_p?c8>j>Kg_$j61qB^!KsXgE*k3rFCx4v1m$GI~%Zau`WtHU}(NqF{krEOccCau2w7I^h4z3MVB__iG&2nt`m3|LtbH`y2@ASpQy5~_7rIvyOw z>x-l%+SI4K1v{78ekAZT5M7GK;}@;Ju1oQRV;@gFH9E+{L(C?y6@kqUW)p2Mi=<7_ z{y*C5PK${(rm+=?t`D zWj}mQu6Dt;3kyF-qjX|MMlHYG;x&zW+|rZf0rFv}mh`1lzQVtA=aH4+9Y+&iCGWIS zJ+<#83-|x?mr$r8 zIA7V-yR75hLQZSGuWta~EdD}i9aJU>Y<$d?yxHIKZ4O^$Bx5$_iazD->l%Cye#~>y zJV*L{S*#zaAk=X8PVIzZ6(|!j3rI37r;)sol8;$vI`ouFrzq#E8`sEDu=XKkcMF!n zN4tqvAKZ$|zuFwzM<)+<5!iO&I-|vAMYe9K*XWyM=HGjP4rrqDII_j6L$Fg z{`rAraNp!MO;YcCbnPMQ9>-=KrlnvWAhzY5y-8u9{eRu8&h>?R%{%{puNAc+FQ*w8(dsgfw?hxpMuEvB>H+CETuVqLd*sSF%&d9$f9;*l2du>hrvG}<*OElDVz<4T zgOE|@Cwk6hT}r%sHqUyaiNI%Qap0deZ{NP1ot>S7BTFc4w?e?*GL_eqwbY^sgsA!4 zIF$M~x3&UFL=vItkS`xc%FUT>H^;K+7mY3Nn3? zxZ4?|RcYXFw^y2c#6$ObdVAwk9MB%JpLoMA?_2cprKE}d_E{HOEfA`@c`gm{M+`>B z#%gs02q4)Oj@{rWS|evYheh7|I*v<#H)a z(Ar#r&}Gd3{_TW^0dfY!R{l{7QlMDCTCm>BE9LVJF%oQj_3B7h*Za<^sfAdZgGBH_ zxds_}sGLnt>*hxn(CbvJ{=Hmh{qd3DGMXN{evpvN^P~JO9v++`=2gglRFsqg2I=PK z&Nb_k(0aGfe#2+U%LRFP=rVetSr;pXP19c#a!S3_<;um6NmU z2e9_23Sk!qWyh}I|7T@+zL-Y6Rp;s1N`JTk48&c&DW*KS{NVn7$M^$^FgMUD;zf?e zZO~>;sJWtu=%;B3o_;Y9DQc7cq!5p*@oLweJ;`VVnT=-7d@LA$R!Um{Q$*siJD;N^ z@9`TpvxpUhZ?HC|XzA#AxB>J`kPevE~4AilcIi) z5{+QJ@Z(E1C@YdU)l)DLXyHO3CL)pp4aao7T%Lzl6or9%tuCT}VQ0$u+g>et?q;Lu zO*Ty^+${Whdjte-7oyyfTEmQ}uAm*iz;xK1gXS3K%0Ih`07AE!vhV7Jc!Q0{pg51- zm2m7l8kjL|wr9_OWfT=?7cXBbc#JgsU0H@*N3 zUt{@Y_3@Ew5Cr4Yss~NnDuc8rYN_U0IzYjz5#D7(&*g&?6D`zt>_mm;||~1M%C{ACf$^dzzM1>l=wlz zlrjAr@bM&RO;=q_E#VnoOQu&}!;z+u7#Xj-rE1E$rJjyXd>*}b4E{Td($U4|hXGtn zLr!o2vkZl)SlbA|_0cH==M4zw;k)>c-NstBK&k&?AYd3k8<`Ika?<#jqgTq<^!nL=&T9`_p>8uU`sUDHHO3ha-K zs%O-yfi6k$_h0C{0m4ZCdOy1;McBuTmdcXz->R;3w_WGEXh$aQ(EWr_a|QDX5d}`3 zm1P&VXBHpwsgWc$1t&U*3sWlgxXq}mhU-6QHPMlG<6Wc~7Z*4#vpiR2 zsPprS6W!0~^5{nhKS<4c;zE8Cn#bBQ3&U>G_Oo+5#|LBo^g~R49&?=Kv`~ zW)sx!tw68=S9~(-)JYp1F6|q7bBi^=hmesDOG`&tHY=?Dc^%%YpL71hLu~b9e*Nq0 zI@yP`3Fvsl=02TtC1o#q3-yy@QHNa)k6FT@DwI`~#{U2oS-Tzl4wDlC~l* zFR!tQiSyU8$kND%5A}-O2ForK7xsix&&A(*vFW7TrC&$$bo}(Y9$eVZ`e}eNU2jfE z)JjJ^#B{7_+QX%+ynK9ooPUqFZ38h|f3GeCuv$&^R()Bwf#VljU*BNl&ja+28+!=) z1f8Q%h8&T_Tf}~hpl<)==_33ku4%(~?%DgJ$CZ?od&jf$b94KK!tV;C_=ld#SejsJ z)hkPVe@xN~H8D+#>vm`N@J6SvWv2&vZX8|j*ih$7l|FI#!R@D%d|V76jE)VJl$%I4 zBSkU<%z(?O?K$_}?Q?CrckSK{(0zgfXAJxUi6sk)hSdPtz5tHFIdUy(6!;4TyTG|O z_V>xmugqTyE<6ql3|u;-xsgLcHtouCRpMRMJ;D4mIymvDTM_RfIatWy5cw9zJRaLW zRzLLa%^RI}K7aod>xDg+6mHW0=%+6ySpcXIgk(){FEAbEiVs{;4o&tTz(JsVBe>W&K7F2S$Ntbb?X zR*g=d_QST0WyJ@im8ci<3Wbe$AFYnCCG1_le*G9jX8-87Ss0fzBM-F%m#R&VRIaWF zTRlYu(UnLUzIlix9PJ{A&#*-M2VQ4i!0;f^!!M_bG(A|cseUegHz`Iq!3tt+Ab^(u zPEfxB4H_|VX2#Ex>!gpCamv{DQ?u!-^OdWvl8`F2?#;th(|sZ!Ab?#cDp4$V^j1<& z0kuxg{I2zp>lz@3Ks-7WWS}&tnXrjWI*{P!)W&#fpM|NNRu3W~BErI$3$^BGe9(p$ zZ&g@qDlgT$w<9dmOCckaOundCC{g4qO2^(s;orn9|AaqzKz+RUqrm99f&rz>SP#x% zb6`t2fhv6$51Az7-QKxS#Wx)%clkH6hr==db-j1wfu+HD=G(Ul6dDB8W;_yXrTiyY zKTz44?bD7mg@P>zt#`!>%2@4VVeKD6UB~xL%WV&pf)0A7*v$%*0Xz&*k9i59r$#8k z{;Jl4g%NC3ENHndSjYHJhonLm4;Ld;+l*7$#t;M1lw|xJndI zS|>(^{Q78VR_DL;j!kQ=n2_3}2WxH8UhpEkX*ra9&z)IaJ$wys1^!QqwbolOs}lw< z`|U08ef}kxBoFh@ll!l=Uv5_*(ic^i@ecXSMg0@N=oraO;ci+Ti^|*&I;)oZNIsRd zL%;4{y#qJx-2A|Yt-yUyo(r$;8@sZU@HN8iKRP(_t-X(+@BqC+QZ_WG6a3R9Q#b$D zSJ|m)Xoy-9#Kr#kQ|NgEfASvj-uRzh`!`vD`u~1FLnB zpMnrXW`?7w0_PpbYQIV0PpGW$&xvv9T(aAU>c-ABu(pWT7z-d4!VvPW>q8czrKZkJ z;n4^aK4WTHG>%*0Lc;>khqIEj`s)(M$XeTtzg(W5WcBWR4OVF?JUo1^)$puctP+*f z$7o^5(15ve7sm`7H`1^5+0{2X!5=LODGgD$6QAeg}r;~ zq8Z5By;;5m@N_FXd+j4*!Y2x|#Kgp3sciT2e5q_9u|A23DIWLb7+Kr6YFhJ6Q{R95 z__42NGX5&lK;2_xgO@K}7{eM^NJCB5f~fnbL}I z-L~uHto8R;^NnnW2H*`KuX)3J(6eJ-va=Rj?Q+hOA1UI*!f{Q_vgbQxW&e2W0I}GW z4^K}x8evBrQP2A3v<&6CzoQfFyG2f0i_$XKqlTiV#7*n15%XD7(@S#~YCXZTB~}3- z9IU;HO*euU1V#XVol(?Lv{aX8NBYteb@(d0Zxj|QX`zF=Jao{h`|z_kU&MGZjF>dy z=jMNQgi5#kROl^DrAm6_ao_ZYN4v+=?BYq;E~h({eV^AbR9(po}#Na zV72bi)fDoczK!VHEh;K1By`tpJM{}tgrDJ9(lZ8TCizH5vtjat?{%+ZzHQ@GOU}pC zX(ysp*qqQzb*t4vpKh8!T#CQ3J8o#$77?+%(139)^tp$*hquT5?#3pI=2y+i@w7^e zH+C?~iTMy`MY0SslsKSAe&0cIu~Jb{!LXuL+Pt|@F?ZhL_`4@mykpb-@8LrETw80o zziMr6-HdjlZ+u+NqIw-WC;KjTK6W8?F?MNoMRpZ-O?Evh zYJKHT6ry>q{VGxU2)#8?_RS5(6g`q}8E{H7PQDy@1jj$^4@vDrpYl0M{0CZ28MlEN z+`OK?eutcuHT+#54IS)uCiEp9NlHkfNVZ4@DVcI5r7z`3YCy1Eu0JicWlccK7Yl z?W*kB?WRWgDm}s?x7Uo?r+v`VH zt=2R(uZ80p8XMNHXOnb#0_O$9y@18R$B;AGMnZ3rneXcAY8>Dh5Fh)QZ`(Deo+)y< z;uv;gLW%(Y56mk(CiIUsl8$7U?`zt@2-F~NZ}0Zb&ZbH@0)WRHcHe&q&HxDSFzQH2 z2@NgnkD{wSP|Oa4omqt>e9f}pYk_$M8{FgUg^=1XR z6_ObEq;j`Gdi@|m=4+@62wV9=<^wxO*L6YvkucRaF=2+o%qD7$IE{9+I0#?H(GSsr z;=(}CBxcRtrG4&mGdsiM0;B8{e)UV=}- z=HC$%S4H~|amdBh_14|HL+YCq3)XMi1jFHB6ME9@M^zgnpCP!oacCiN|Ak0S$NdCr zz`!ncQ&9XY>UvII-Ud3ln$Mr#aW+`v^dKlKH7H1#b{36AIX1=*_N&YbS z#{B%rs6D*Azkjq%b~#tR<*a$EmjT(PuBOI(KY{$GM|97@frfCLo0+-1G@D_)t(w*b z#1C4&-6r-F5>DO6-NDV>%+B#9kv50U)0xo6lj1O5!_Do*%a@Ri3;cY2f2}ylQ1aOz zLzMHOMM#~lXhqqQS(3j)d3H|CngpqNUcK>5Nn{IEn!v$X-o!n08Zw@C9ZWk zpJ7_S=C$j6RCMRrzyAWF6i7n)^6vvCjt}5LgClG7Y$2s0X$*oG9vV7>?f>%p>?+6} zzA4sVjA@{Vy=ecL5=(_v+mMeL%}d*Ko*K(8F)@#+Z?7Eqt7J%Ne{ww|qce^R{sSEO z^kop7xY%$N5+Rz8UI-?D5EsO952H~FSeaurp`Y4>2!Y-8{(TXo1{BMg5*KjzBJMnr zlBCDS26w@WXcZlY3!`#0<@C{WOm zFREVlqj#19Ls!VGNQJ8yp#**|aO&yo={eJWId$EkfOc4KwTCRf&8Uk*Rn+~ zkO(vw+OZK76wHb$z(Iq3eY%)A5Uw)MJeA!E!VJ**W#$H}%RW8=%(qES8tv;}D;l=Q zSGkQuP$8HxVuU1^+$QA^6IuJ|)0^c<9Uj~=8{i!qVhwlQLBApCoD}Oly}xjnjQ{+J zrPgi?rA)60Z;Dslz?)Dd<${VA z%-{U5Wrs+l0O<0Zlt-#@gQhtsW zPUD&V;V28u<$qx9ba*S{BQ)%rl9B?}79N>frDi1t^Se$eq&`EoJxrB(uc}HhNXgbyAdT9QY;4uOL$%sR$AH{NGZ0D zG%gD3&7ErkV+`Ww%_Cz53ioe_>)EqiumOGwuqnO-fpMkM|MyQe6N>w2#E8N0qd=P& zcKTZEo(3)5lm<43J0%@gsAz%xNCpAaP!N45XXF}CJLWJa18oZDcWI(@5*CZE72F5y z3L*}>?%HcS$GW?v0NKmFId!ApeHf0%KH5TgeN|T%GJ*8=40#)Binf|sU#34K*fATd z;Nrw_4rIvG*GQm9oD$XqKRDx%s}TekCo5379fI=J)VIYq}G`T zK47Ij@h4=0YoBIBRk)FfNps~k0RukEFhU755$P77w4uun)zWii$a4GxR)6lYCs zZIqbZmX&%`FeVe5t0O5tv9j%Y#6JMaH8&>+>U; z{OTX~5~*|V7%rYf4Tq~XU4oZ)=-1#!=ia?GuDXU?ay|y`^DieKCc<^X)HCAxd=(AF(m(&c*cU%p($G|F{G z?$15cUT^KVWYC?6&^E&auxpW8N3Ch!TT>iCZ2gOEmu@m{k_q4Z$erfJqBuE*mn0rf`05oa;BA@HYbDtgBa7STUU0nT-y-c z+pbHL=?k-w(b1)dcQ}o%-MEo=aq+<(v9j=ISTeo3D+>$Wm`hMlP$*RT4ReF?T5K3=+*N;LNgRM4sTw8we=t`d`m(;_=ooyEAnT9__CjG6@y+RS@(%UPno4Ag; z_xeVTrX;>!{)BCD^899(y}dogJLkw_LM(bgG~|`+<3vT7XiE8rm>NxCH`#Y?Hq&Tj z@Hl}qSWt7kf+Fm@F$U5={B~eVfRyaSR_E`iQqeGctN8x9z<`gryH$uZg>_$ds6P|B zNg!6Y!cT!;AYA=+pvMeGf$Ak*hB!hW|7=NsR%e=T%LJ^ll~hKyJF$gw zJQx)f7jLbra|9~0^nb0h_V+{m{g@|qL+ak{v58aOH{x&J6Oy6#{zjDc_I9IxUw^UM z5>8-cm!&e$1xR%^bx}ZrufI%B2OUi~f|A(@CNW@nT$1!nKAVmnJ=)&Y<=(qHEP7ufniB)&Wbfd#e{TaFy57y=bcDbw%LRodX7>F?~wKW z;5&_ENOmWl!LCWTJLyret=< zjHQEiz(41Oel3l)?yrj;s*7-kUD$J?8)Hl#b}3K^8d+L?hpt~V4itqTtT@XU&r1Hn zp+nXJIOFizbiqs4(qd4k#kux?cP8Q_=olFvueR>rdwxLbeq>|^z$Rpj#??)QpQm7+ z)`yP^U01Uw^tOn5ZxF}EGrU9z@`4XoY5wIKWY{iZj*X}Eznr1Cw&stpj<%(DDZ;g( z6bg!8co#<%HZ!vN7XDiLLCqO}w{6?EgC9T2G1glNYjlL9bL@m6FO2%6ZTw@U`5DbR zrZ*2+R9_>(#EW|O?ekN{-sh7XS?%plWG_ABhu~t1?u2?(ns`efOzM723`Q4hB_&@5 z2Qw6Yu7aA@3Q-%7N}5oj#^wQg7mi1%Yd=lbzfv)On3ZPi4h8>ixX-bxY!k~H*Y5ra ziPCsxx`?P7dx$5|`2Y*KnDOar)lnp*t*|nSOcS$bm3Z4}BfD7q4bAyd9A!uwk{7-N zJ3Yf(lp}3CtTV)5<}ZhMCDDU8gELPEIIX%C5ZF;YfWWcVEceN`likI67*+&7p{1>D z6CG7r9YZxMosIJbaOx2Bs;H!-$^8t_34j>_yCG{6^qxW{q81rO7k!M-1nCGHvMqWD zhoF|VIFUjk!p|0z=1Nb6T@lEvnNlBB(HU_!hZGNv1{PqLt+8#y9ftUf8P9P0 zo_q7I#>QWb{FMdkP;n7P z=g(=*B%(q1E93!o`K9%gWPHQxSpOaq$~c3RfhY;wR#BYLk_&|QGKBsYM)&3t~Gv5J+n9W^#=qAxJ91=50S z2fx0DoF;Fv%X+(jRKbM7uD<8VQJkmiu6+AujwYbt#Lun zW{R%Y>Hzv-#N*6~$mh?WXJ?P&*tXNl+iq@Ac%P_Hk(3=m^v5U_`tbG}7E#tH6c`1B z*|e})OgGj#PEd|6g6evq*Q6QH2U@$lZCe(XCo4O45y*+?THB%DxHyS}MygZa`Zz4? z4a@Y=Kt<(O^Q!5WLJBweF0bFP0WeHvdAlZ?6;ol&`9}TMe~OCbVe;!gjPa%N@)e9@ zw$l^X$jfi`u^r)B$K$6Sbp0yLHLl$;-sEqYo|`*y;)E49p@vFMe0E)K{pln4h9oJU z+4Pv09=sr9NI-ITUP|RfJ88M0V}E$`*-!9$nMfv%R2Fa!M&MPK6yU zdvq|5As&MT6~4A4=bF7G??a%wMD3+dnEWsC7)5^%(3UF26Fe|5fRl>%6lqkeRI`zx=7X>M-(T%EtH}UQUxUi0qc8Fa(ika(UDWbO;X&@p%|1p%QtQ-h z<~bnAL%gbY`__3~3Nic-(=v;YmMti`8s8oAHtm@+Q*7L!h~T?HF*q^=^48dUF1vdv3)* z5e6~rVNN>Xw(~1x3lLuSnan=o3n6apvCyTM#Sm1{CO&3*QmMra?j#=CtaxM#uKNLQ z_Gyjd=Dwu7iU(9CSdp%KK#=&gkEb~9U?2m2^L9O^PvZY=X?*C}-ugb3Wyg-s65o|OUvGU!Ni~9ul&Tfu zGe2?0^MD5$*a{3;XlZTg;v$kW+gfvKxcG&_<&JXbVm}UgClZGk1@mWzA z=wTf$G*Ezaz<$tjor%EJ;{R_)Bc^pv6h8Qx%;hOvX!-VbcvC};g>oSiHyRaoNheMd zdsCL}ifY(LE1i}4Kv@2#;esY{nlh9P(4WZxx^7(qoNy+mPls^HNbvLD+J7q~WE?~o z=02A<&b5LHAWxeuJ&;(>Unfm0gf!B1_vX#`(xf(qNy)w=ofd7f5_uMp6tmf5vLkTy z7{cH5vqRKVM@(lN$qiEGUH3R1n*X^R2oy{u+RF5TtWu}nicvVA?o#jR#FFlhA4$T3 z35*Tk#iHOAs4MyfvnTyF0q}IQ2F3m>(gmjAP=G-2>K)9yq?el5h2C#EM9CK^Vo{B@ z?^y**3Z6b}=FZOA8MEj5cJV z0@2RlmiJ8cFTS`=Cxz<4C``l%mSd(25UX8s%*Ij(!J z&14t=O+YXCxQmO3NkYlPUQCwA+I;4ms{=g-4@pp|nlABb>QY%oR#ukuD-q{c`X8aJ zWtohTpN9F@&+%~(Dx?8IPL^*QzJb}6nTvd}K6)V+=nH8~-@$wUBIK!uz_^MiW;G11ea=_cDxtuTBq z6-4T=yhfX>Fr(}5?+@RV6o5S1`7G< zZBsvCRIc%rOV=eTzSd0Ve?N$N7~hfSk`;e`eFRt3_LS3X_ba5kY1({tir! zrh;$AlwcC+%}?o(hsC+(soN@Us?;uj~L_2;Bm z>SFNXflydA<`CM~5pdHQ9mJy*~sV-E}Jh({%*#|W*Vh4;O{Na4&3 z%B7%xw{>(Zzcgb#VXdxCFE_e&qj1Klb>;HUXwuB(H}+h*LSgXULIbi$6&;dsvg!pR z3{DE>G7Bxw{TTlCO$TQk<5W0p0z5qCAXjh-KtY`M>Mst)8;Lv&xcz2z!58n|y*oVf zUNZ!ZJDcuFV88;3e$fWaXC^Q2UhPM~7MJHAqfojBb^&khGJ!y=4k%~5g{x;5aZF9M zCaL3Owz2q}q05L}Px)m@%qDspJU3ezX-qs94+Y>H*x#8&hFW|o2*;`m2 zwj6Zy@GvtcoE(#NP{TRhPJvZ6!i$a2KYp*s`Y|!_Ooxxp36^wMOy&S&fU?^jBw1;8R4lMYSA`=`fks~UsiQnd?;{SPRx;B zcHzT@_qcuPA&qn*Dp!!xeuDk`YndMH3g-s6`fbe2`IrpIGJI}->h1gY@Qa_xTgM~3 zPKQX@(0kf=04G%f=6n!`*ugH$fA#eEK|DvZmuMRv9sO})H#43>lOV3a!l5`LjqC%q z8S$k-k%&n#s0G@XV&)j#Q$fqc&{^y~#IDG%4yR{YTADlQm0x;GhLT`Dl`zGCH=)@^ zSNp*iw7T58iqp}JH*aB2!S3k4?9Q{%#uzEu#_^F6(oh5Tr?ac8S;%x8%q|Q;Eg=-Y z0OzXkB8H87wS24;ASyz$GQ!hAVA{t`lk%2`7^n8dFbjM3s;_ z>yEs%Ax521HD5;Q?fLH0fJE|mBhs%yfP|uGa41i8lW2l!uvKn*0icESQyEq$k{#h^ z@+m(dTv?n6!LYgcjpOQMz$zSUQL>kQ;bTP)0TG0dmVpAgPXH%FMyaZFmOWGMBYybs z0%qnGVInGeLweg8ZZk$9z-&eJ3mu~RU&ykUMn?}v7t)kl7vA!DhPyRC*z z*(Q=pR12rJ@$qLi-Eo<_8wJUr3BH{|1Bi$t0GbC3!0mtnu>Smn#8856CE1v;nIt5C z^Cn&@a^8ev!#`kEq@Mt-HU~n3TNk8B=7RthaBzT_t#1O{rkrdtl`su zbOINB7jYJCV@TPPcYm*(7tP#1Wmtn%S+0@@fncB9>R1iKOf8c8rVT8 z1{b~cugIi;J&lGjuo#$*0be+p(+JQB;?-Y z7=e{mdM-)Up&Be7(kaGE_g0*dvF=Xn*mqB#J_W_WiNjD=eFvISOn>79PB0G4o9*JO-)YFGvVG{- zu2p5no(ST$l{ah{M*b@&>6S>paHI@*znj|-;%S?5&?%H|-0+NnCq)H}2|xgby%Q86 zfCDnN9dp}~|Lg?kiWMu;j1vxyIj?dSZEFx)_OapZS&wZ6ZgcqO$B*2V&tw4Q)UpS& zPo&qI?l4?6cb)Cb2sZ&|po^E#*rcVUh3f?PdUp^T3s?Yj%kUlF>>>OpV!5K7;L=4L zZcPO?H8&5BemBc1Vf{D92+ECBl$47|DF8~nudAzTX(_}}0QiZKkx?JVOot`i>OGZ` z^EnxVnpQY>aLLFSBhH_PZHw#pbsFL*@R^X$NWDlp2plxBv)z$A0P^MI}zkXsQG1LZ8Ppbvt+ENo8FJrn@~H*gTzHMA@I=Vvx{ zygGHYU)HfJ6u@7!mZ9O7fRJ^Azj9A}JYsA!_wh+?r{G#&7P}YWAqQx4`E#G2S}QSi z>Okz)1n1^E!n^IZv+5e9jjfdvW{ylIBR`W&uTf6O3j_@&$5C=vUl0ngk=O}bt|Vd~EPvhj%tx5jj` zwh!@8qB}M;A$#+?;~n!0Lb97Sku4qcuu*6MIqybdq{q|Z!<@&a^_S>_S z+u#6||1#-$0sEHHh=IrLu(xPKXQ-p_;O4`ho&cK~bx2-*Cy9pe0+pp13Bq}lzNW)> zf$L)zk_|zu$#IG82Ke!__xE>mxHw}wp$($6J-9#1OWog}AC}z;8B?I~Rge)9~=p@ar-A83pS&+WV zNmWD!v*m$EfKr`^siIHLSMi8s8xA0qQ4|6s}Ta{+- zQYqe^5|b)IYZRV>zq=5Jzq7;NaX){F9Bx|~eiI-)s2$tJ781Sb<2Op(YUyxo5s=!n z=@=Fz!Z#^lsd@6QKxrw#4P&1xUbs8BT9(7R5Av`*k56t4xUa?a`__Q%b)yjfk#QTq zUo_0MP{pGe@k2JJ2zftp-Vj@QB6=02OCBjLN!o!I(E0N8q;XXl;r0Z$>d%kA<^pm4e_BCMpg^9l13d-j8%YBN;_T4jWK7kLGclS|Tc zjHUNY1RK{RByylPWQmi($Ku@Py);3ew-YV*5oWS&it~U3Abo|{l#Tak2Q}A)oqfse zgQ-YWeXO`&1OT!qQXP#qp-jT)0q&444l# zd+}6+A`mbhZ>(12nRun2hlhFBt_}bAx?p<|XV}p*j(1KulDJFf`}e>Oo|At7W4=8n z@lo)AA3uH!t{7TkV{x+A91dO*jjwmBK~p>%@fAx4St6Y+9r5Y#Dhkhg$l)t0Dp1g% z6YT@eQrQ}}2z~X`_f0=qWh|q3*&jW6MCK{Dc0W!cNI;D^ZhX@3MtWREd|C9(X|ymM>D3Q5Z=1oFZIb8YHQzIM*kW?e!N74NV&@ zgjfdRDoYa+65gSRg8kdg^z=~&f>4GrRy;&MYjFErT_Bs$``yYEXi#LiMQi&kHVxHx z{TUK1;+3E#?AHaoOGM0x;@nh;HZR_>;f<|b=byfD;S4i7@X$tcEnnW;E?B(+sR4MUD_5*IcH+b@&|S$N=-fdR9`~F?Fh*y2h9v#V9#-^T z8#d0AP)p)<*y6|v{J*}H!b1l$(!Cup?ZUzWVuAOkCsbt&+-4utQ@4gVo>$k7MOk{~<*q@zL6X7|YQf5`!7>hl z?`LiM!y{>-p)b!YUp?w&$YY|y;zDElY$u3PYvr6};3S8WVGIv_RC$RJS9C(c+EuII zSjtBx%hELdMw?lJFM2Lt3^hv*~2L8x<1!C-RTr*?U*slDKh8X4 z?P!demJ!Y00o@GtK)VD}z69xGig7jr?wl%S*5v`E*REZ&;%qkFQmr61{0+p@XYjL< zlw`0qp(2ta28hAl-piR_*HDei;u|z?K5VU3a{AcN>qxLDmTc zl|v+L&t+U#P>@`;7Z2W~aSowp8-1lZa@VG~v8ClWf}&sWXOqJj4+L;mC~N0U)Q1Yv zJjdnr5IZBeHuEA^#ZQpi_2M&6qV{K?64><$3SRI8K@)G&0!IK?iVxIyNqH@5M6$jI z_KoO6=9;!U7yZFFyXjz0>~NGn`!7!XG#3{Qd_sPPxq~nwbw$7+yMG%yi&oC zQ|xKuuSCmjO*^KKZnH}jJw9w*x$**b6nO{yw)d#}fi0t`=obX1l4bR3fxRNq2s!Y5 zJ3p<9+Sy_N%O5t&$OPtRHFS(r%t+4D4{B4md_5^dpVEXRvX<{vKx~F@+jST+B?dG^ z3-R2TlPFCz`Tf&Too=(5Jzu`GVjH4EL%w*{Dy1M&Jc--1+bAI;Ls|mBpF5?*pufk{%U=w+6=GYm*CX+=X~Nr(+`u*BBUj99Zh1EI#xUqI+6A4SZ+F}SIkmYy}4 z+^shesGD!2R}gGFc^q~!U^I~8-x=z;{o0{l#&tZ(o0TbrgAG?`Hv8haPyE^sbij`a zZgl)#2%X^52Q-nCqkwxAhYhV5_;bD>2Vjp|70N+uh*A_MSiMNzKxWc|$>;o5zKk}o zx#1wt3L7CnNfic@j#tM3V&e2k8;$Zly{N8l^ZS2jnWhp zVREi{uE^U#|5;M@#u2PWPeUIBZ7>F!WM-G(P zp7B4=o;_=#xVpS0dOYUj>WUku-EeOJd0boX=~KmK*jIaz=%cl9ty?b&fYODj4uku9 z>rsbh)Ll@WJ$DGO$xlR%is36gJ@!RP4mS7Bf$`}m@fdi?kjrOSBOB=reSk!HD|>HE ztk|=+M`Tqab(9Pr>Wclso4YGMutC09;K&t))(jTAb*1i8OtyLU%kKowh95nQrP*Ip z>>&_c*0_ZzWHQS3k?T82x_53?(StG3*~GH_bi|X&-c=OHd7d`XsZ+-20U$ZnyhsVH zfW!6Hg>q2n?#FCY*i#;m$YKuHqyAxBY<`5Hc+Qe3sLhshH71~xL7O`pvieTwxaAweH zq&KxPN%4r9GoAdkj5;JE%MC@tmzOfLuvEl5ICMTda$4vGt{n>(ZdL<40_ZbL39es} z>`^+&UKr{nwM5hP89*S5+6vttEPGs!YI;6Ep;vKMxWvpyGW|jAhb}Bydnx;*WjABX z!Af0Mb5!u&MAY^_YsDmgAb1$5%RsP1tqvIv%pkOcdpO4m4LIqox<6Val9bas#3{{g zV?nHkx5r&iAR1Wx`yOB;)a`xbkn*y%b$1)d26KCcK-t)dTJ@*LW=l(eYV*Jn5)%_G zh3@k1vLBZUi~RR*v5MJehnCv` zU`Q5Fl6ln8P1eD*Mj$A9#ixpN^2qEXN@`?#(Hd*p6Skq(YbT6o6Cs$z#D6(u1{(6pmJZnCA!~a03l-6Ly6(T;p2cv_e+;;YG`Os6WcKm z^XSyiqcuEwQ=(}RR+E%N=X~do4Wow35WBd*O-B$d*b&-zxwvj76iG2smOwFexzx5E zc$$GtKh!${bx#hP=(-n>G;&y1WZ9IP>T(+Hnn&C_&>?tT2Qc;!s~%DxypG5Qr3c(!PyOre=@ zSCpSW84e3L%G`h_b!JqzyV6r{6LZQI zuEcT0IoI3RfH@`_A_JRrOFw1pQn|?0t@#e+LbB!oRJDQrY;b5=t+ccrZ*j_-M@Ng* z6E#-N4chd1PmtV;m{x2kcnmO^^>dp6t4!_1~W21CoC&3h~^3*=B}WpcWujA zH@z+$_XfR`B4_!rK^$jp61n)&ufTCvn;^C0S9 z3surV03B}&I1u6_1cf1M!A&XS5nxW0uak~z7|!DCR^`I4fj?W-1MebdFXbY!i zCIWK-leOjUflU$}vBrAYKKz@r9$=ekul&*$%1lL2HWkw+za~v1E<&!WJU7CB{&Wp^ z4CqS7EEF$!7p}1F#4vZuGdAtCX04~^@2x7Hw;)3DajxfW&Pen^ zBSIaJ>0@yRJ!!GaOptL6rVGIc-fVXM$FYEXn;QLi@eh}}b6*WZ8|@VFJT2|P#8n5! zYSCn@%QWy^2fs;|&8T$;(!wr_nUl(ldiwR%4@UhH)6;xPN7LW)i#`n~F$={T{29AZ zGuwxvrlFw$lQ#;jhF z<#=X<67ZyrTV~gy&`T!=pYZdOdK|BJ_!cHgB5~WA?sN(sH?mrm05|PA&ugmr&DUhf zKk{{%0@(?czF^AM4!_gQry{slQfD0{IgD_Rt&+}YU8j;+Cpmc&Va56N)HSlIg!v;T ztdL83g?o8BK}1!%fg_WFVEITt$#PJglg#=eH~Rwk2N;8(V^_X^UCx*z4WTHLPZevs zWIe72KnxbMA65TlD^m@e;*R;X0l>!5BuDE)|7XFOS_LlRN!Pld>M7vNGe3Ud4S>_ii-SXR6mBoCbxHcQi_*g}`Y4JIE(hVoH^y=I~TuuK{>MYA4r|uUJX1zsu4g}!SrjaMcpO=G(+ymUf=AYmH$Z^*s@_My<@ESW?3hK4ed zz{5$YwEO;i9WoAUfIdT<(CwGvON)C4tpJ^4F+2=G7d|EQ93l|ND(iRKNB#Y^Qm{)> z1`8v&6E!)C|2> z)!-ivKm+zz7*6!!{u2Jwx3R`|c-;Xt*FdF)A`s44Ai$+}Agp}eZPJ2+RBMkM#2{Xq zH*C0vW)46#@2Lw6eP{hA@r(uVjMs^aSGTstE2rS_!Mc3Ape5Z#Te!He?MTb2PbjgC zXVbaRXAchx>)LH{;psk@h~L8uCc|wDu{F|G(T=vIjKn9cRTTX-ppYUG-&&1k#$1^e z__~!B_>x-h%bZd%SzMtC$p5#;oT`mNwNMDhA=@41KrPdGT7WTOOF+?q?sQ<3ZGm8I znGaU_CH|mss7Worz6JuZe32xK6@e%=i}uz`AyvfhcXky^BhRG~VHd>2@fU+&MUmFf z-_HGPj2&ve)r9SgCQPxRK-Ga0UL7Cj>gI3skjC#h%L}=mg{e5+e5y5u;o6WDn*k_yCEOvCQ{Fy z^Hh3^+vP$W@>evfe!zUWjG_X~fPGj#+*)E40U~|CB1Kc11lyyfHS=G7pd$`5+@`Gu zITJkW+Wcdli2x)H0b}Q|^?MqBOHf%kVWi|SCO?gJp7=NxNqo;L$!eMjcpY|1%q}|5 z=kAs{sBE{Bl28jd?>kpWzb9zBn zTe}#p3FT(y&Bo1p{8siw;zTo6)Y8%E=A!B|K4F|$^@s0Y ztx1&a6U|zhZ#eeXpR`bm2I>>vWA{k1En{Tton|cFvFGLVO~GQ*N^aW8eN&vVZ^UTv z;)vVuC!==Y(4_?x=-CL@(a=XxBl_A$5$)**pAKyjO*Ey)x*^PhiQDxkV0QGZ^59DC zKX5DP4NaDi9p;6p=vGSXZ20SUml%cE^W=%+`#gCmQk=lNzEvr&GVhB$h1Wrt^9NN| z-pCw4BYn*BiVe@h#Sd~(r1<8rF(&2SlT0#Bt`3!0w zreyXgX6mdsNxu85)Q{Q-U~n{OV|&dW*}$p}Xjwq?omoJqGX1$V@aJbfHYh@U?RSDJ5QpD(RGWL;)^bo*a- zkxglTVM3L-)JPZ5Er-KDxA*&hSYq^I73JIcynnuSSMtz-TkzLEuq=5>{qME3#7M%( zE7y#mGDE|8F4fIItlym=j4*76O|-;993wB*P-poY|MLKv>B&U|CIkajbD8M1zn6n6 zZS{sYdj24B%s8-(t^Ko_atsIAmogEH~Kzr)Gf2XKh`ZQHCR*9@BL{org6+Pc6!*k3bkwg8zdjVxy$&s;g6PFWIOezl0ZO~4t{8>k#i4bzutHG0ZS6b`_!05L5`zv?m`<|q8XzQ z^u{_d)(2!eh&a$4TQ4d3dS8Gv-RCISx6J|j@%Hw{38-gtL7aSZIf6kZFWEQPoWwcO z-AE#gejpkm)&B}ez@-YuA9RQt_I|-^o2y&BWlMOtxW0~zj9}2wz<|=eCqXz;2j?-J z4Be*Ek_Kcq&hmr%-`#=}GinOJ{=#NLDy!PL($@Ra8HF(g;yK~D{`TXGLHMps+LpA- zPQANW*m%c{sQACv=Ua$~HrOObbPo;rfi7HR56?|c?X>>y!0vs0!3%pAE0y`s62~Hb z0|dnjvA%85=>7w+6GGs=7X`33^-T4yn=Ps^o%6c3o|z35?J%gL8FvJH8=K$nwI~F& z2(uzy;*}t!NkEZ7dI^gbUMCkuHMQvR7Z=y@FE8D*?mh(E`+4P2XVP06)*BlVD^7^V(ruXOb1)&Rv`& z-m+HPoE(=&*HBk?A6E>h%CS(J;Y?L!&U$l2FCxSFq~VzgA&Kbz!-Mw9LZX(9cExC3 z)jtMHca;Q7o%}KRp2?G9e{Ht?g~XtsS_uY~bnTYK3CNOtc%t9<^w_&ykT8#B?swJ( z;2u)*1!XU2PHpa8salt^P;D+&%;sL*rE4NuOte_Mnqj2gHG7+$4EM1x>H0Bl>|qqN zN;>n(_?s;wkWK8iXav54JhhQgCsK`_B&Lcw8Qo3qfW#}!2Ym?%w~BMNr!rl2V?~*{ zxh3CcTjZ`+H}`6NPtlUokc#4=yvV<>?3vTOX9Ky*fY+0!--jHl`Il4DeIzKm-l z{#gLKRwN?@Qg$KPuppH@Qbi7ua9LPH1SR}ijJ5&c04$lEn>`feg%o*1ZhO+9jSo0Z=UR90>A$<-u~uVaurdJ>TlUX?I=vF*Wt%YT7J%_PChKWV!{Xcg zmb%gP$Pn=k1Vy{`avTEClMZV4^z z@)LmA4O)v~_;$KK^&wy(OB_-fR+kUAW?dzV5T#=vx7qg}sMK6vwu!q;m_P5-;2#I_m{Y+51ka1o0{!4!Z47 za~1VLQyR5b$KUU>wsdK;O=!O6k%_~`qAc6K)za1v$veyZb5OVKTvXUY2iJaF0{r=V z<{*UMJ$I;nPZ*(drUZ}~?9JDdNZGJr%4jt9AYb6Tu|+L^F~^P~o&lMlM#i}9V)8eX zj-4GQrzJgVc>lmbKS>qYccOAOQfR-c%tFSn)C}jR`&^IlVW*_Z(X(}Ui^SW~A|Hue zMgBXyj7J-h$jF~lo=3L|H;d68Y}Nt4elFmt_NWHA{_BFth%QZC`TRL%5Y$h)pq)V8Q$11r1x5kYsY(I)8kDVD( zx+8x5vX*CMKR1brW&s~0!=YJ1T-;mm7$L^<(W0nBgOwS)O0`jN<0_U&;}E;0^?*9K z*_e65v^^E|P1ZgI<)(gT8Z#*Uhlgph){VT>{rjN5Lu-_|8zUuk_M6Q+#NegRwU+-h zNB5BobG4qgVnFF-y9=ZPHhp3hvokYBjtA7c&vzq=0o(7H@KCvSjAg3{rLpHgrum zr$ALCXW4e1O)eoRU{*|`TA!%>`cGz7p-d&G8S8t%&MrjmYTB7IOUCAw>63o6TF-B| z*!2vnOZ`bOlv3pkJ5S=71A;mqZ#v7T;CAKY@*P!|-*S{$R&f_4yyp{;Xw_FmfS!*tmQB*aXkN_4H{*T7jv?(t>i4#WP@TdQXRs%U>#IryGvh}pcoDn5P;M5!}x zqJQSh8K}C){o~_hWn}@QR6d}2oi?0m@Of^d2>s0n?drkY*`YMY@8=5+R9!cDi%M*t z5`s7nr?MxhMEH?Gup9kGiR#_Z0am|2MYc5-yUf%Ulx(rIT`FsL0O_KztI*Y>or>Nd z#xsu75;}kIB4<<>uTozUIvN*vc_5>brZv*}_n#%w)dMRAAQWs%pB(!ezd8#*DM(V8 zF&WGSa!?(Bx*2Lh{ddv6Q4W=weS-@j1jyqP2bE~XBAgMK0`!dkd;pDTQ24(;2)?LM z@V~znN)qvZ-x8z(6x!ct%bEn#ih1DOXZ^>Wl`gFZNtSeru%+jZu`<00T^FwGOZ>a7 zg-o`(fA!4?qW;VW8fV!1fF0Ct@|=TsmGU;0ocU~E(D&!Fe|6|FYfN~8m!b{)i4^At zhy`)G>R&}Bh8d0HXutXeyPJL;E!@6R5m5X{UmpfrT9QpCxnLqeJw6pW%-?^)S*-zE zG4tDI-hAT`7+8goLX9Fs5Zk&SN7CjCq9mXaU`id;-)$&K` zzb?Q8Ej+L#tMLjozL;txg(ls&5zx{<+VyN{1hUEXkvO$vK01RSmS&ssOQciX>cOFJ zS0h2Un>$)R>&JHEhFShe%>vsL#%A8PGOp_miWgp$zY%qchlz(HFpD5ucMzBJP_2+u(em;=?T= zwL5LwnO!#>+{#0{h1<*7Gs5#)RD5`UTgd5D)s)*=fm!j+Cz|d2^07jwsLaBFEFL+M zQtn6fqn6zTKB!SN0 z+b~ESU#VX+x}j@eaI^V1MzWOc4c+llOH=2iuBQG=0~N{wrF6T$n#zua9i=<{)m1bW zG)gu7wN$hhw7(jCY!q&;YwqwXB?!3uDlKDRu)!3Ja@J4Bm6K$Pyk~&J>S<}63lC2~ zpo7h;GLTi2nP{>eAAWyz*x;Ii)Yh$AQSMQ{1AqoM?^q8tOygWV^&PMY>)BHmCWcYv!ax^&jCjM;>qIv*c&)bEgG zW4FW~twRD1x9%zrA|d%k=Fd#yve5=o5!O`x2WvJ*>m?iog8Wj=0fbw)AD1ht%wOWEgLXhLvAA0uLk+i7 zd@-9iU1^nXx`L1crF$``)iNb{opGW}{*V9tbkJb%D6dhiffP}{hT8cM)Ea**c>Jh> zhBG4;zclj`57)HV$v+>;VnAFXr%&Q}Oq18d;dN$&>bOi_*;2DVKP*nOV2v3X#9yDN zD-)P!iB7EUm0st-cLYf9vSe8d|9A*J;>nhkd1OEu8qGLy=Hsac`f>B@k0;L21TCl$ zm!04VLv{|!Sv?IGZ$G{;4M!M)meKIl|NSZ?$HyYvlpp`fUar!!c9M5;-K5~8$fWqB z)TGShrb&fKrOBgOHRQKHj1D0^lK5=3iEEPb?{-{_1YB4b}-8>Ew7tG&WR?}NRJdb8t%d@)g z^&1;6HI6kJH|3hHG}>n5VU%Q4XY|WR+Su0kf^oU=h%ujup-Et)a`S_N<>Xb`-q(w} zph&a{FER4Ifq{5{KZZQas1tubvhO~m10}XPfE*-Vrae~h`F?Q=tq$WJD1kFywP4Ny zy){@$CqKSw%0eXTjD!$b@!dIvtG{$0=IeoFvzrqCQBXJUw393rk2uZ(;qtMTJ7$?D zISMrQk2JHSm=7f{`zxq!kyF-qr2kS^-E*j7yK$0{dGoer-GVKH8_O(jSAS(*N*r8F zRIrB~L+`go9TiYfNpvVf^EJPKgN^M)>IZl^SiHH0K5UJ*pp48#b(Nc_P9#UeiXT4A znUB{kP_+%o6lszC!2E5uGfiQre1z4j1RZzB$jr2Tp#px?o$QZ2bOo3Qad->-S@rmt zCmQ>nQ*p!NAc!8JQ*Mi2t=AF-Y5}HCSCJP?3v3U=vv@2x+Yf=HA_@l#J6%`>Xeq|+$B}3uj8fpvW-9{ z1V9FFm)y^(&mtlt9lj!Wq})&=%=;0PkbHr}0!cyqU(Z(X)6q6OA`60tbPgSd>&S_( zZ)*|gAc=>a7TYfde~?}&6bg^Yd5za3&(>~MAIT}Y$G`uE-^y7-E^xIIiyAvO|TI4qOea8epROAN&A@1e|kzIj_1wNnNf~j zH!7g+`%`*4ItQ$c71`MxOO;K+Q&4qP?1A$1mB6y(YH)gPL70bVB(xZf$Te%hBw_P# z6oy2wjRdv$Nn;0|6zNq~aR7-pRw{(5695V8_e@RnAYxpPcpAH~s~!LadiaI|qbSlQ z+FGh+Zq!(7fWu8X72LUvu!q36C176hTZ5Q2Aq1vlMk9jC$H(6JMk#6q_9(tptemU-&C*E$McmU?+YBGJhR& za@bG^g$oq{wscy=rqL*%B|@Z0|0 z@LD~jNotao7YrW!<&}m>;EOTi6dZq%F19O3BA<34f#! zXG%`TK~+G`z4^_+QgG086`AYV;;U4KWD^vGY}<0xJH`9=Beh-zV(5AQ+XZfzL!N_J&_nQ~J zubLSc2N<0zeJHJ*j8d1Ht7aNbTFs!^I$c0<*Lm(F7A8A06FSc$Fa;TZ<1V z&zxv<%vkNMSZ5LrRwork?eQub3#LJtGCmmMjwjv;rqzDyad=8%(mB0^ec<;yO?O0` z3)BAu`+r@dB?H|KXnv7SV;JrmHsiZn?RI`WtbQHNEf~p=*MUeebnr@Byo$CjPH>2S zAh(>xysdlZ22(tJyPq#V=9}s6^6c0Amu&`>(g6qRUc6)N;66g+a8qZ^=GoFc=^F5> zcJ`V{_@?CxXAM!?GC#xsG0(>R%ADI)?ktY8mG)r3RFWxD=`gg7(_;_Q)^0*Ml(=1n z-gyACqH?MJRX9eR8#x+Uclq|K;5l!k)o5EmkFSN!{|Eo+Jvylg8FiAMMKXSFWVsPi z$o$tgs1EyEB`-w{j^6kdxJ@12?KcAsOGwFJqxCi#4Q^6QjRGq(hiQn1Kj;RFj+ z86U$?PsM(0g_~(!DAI~4n??P1A&i4L1eW#u?ZJlq+rD!DzG!jH)=uT)gOV0G{BU2W znQ8Jy*D%YfQ2h6oV3*!SL_k{u;-&sk*j4E5FMz^q-sg7XKVM>Hj~4-NS+K`ZtB_qW zB%hc{s88O@v3j(~be59Sk#&+h(*V3z7;fof_MghXv41fS%E};BUvNGc%mr2k7HYZ2 z^ZQGp43bVmb8fKmNt@D0clS87C!+_m^ph6uI{nUzZl6Mz6P3!1J!d%s7!P|s;_;li z=|mFq7I`JEP43&ivj2HAcF32y8LBx>r!{>`CeH{w3S<`ORtAEwWP4Ykb1MJPpQ~|& z;rOe)=QT$LF5XyLiVZx`FCi%zA^nQRXV}TV;`g(chXyAPUl^3u^ga1yW#!u}V}X$} zzrA{O3wI6wTwmU~bLRl^kLo^cz`}(_;EHYRX3r0G%4e9D9yS|XQjbQqz}vw^&dZ$nofT)8tHa(SW%W$~Vg#H8X4oD? z&YDCm#F5W+GQRu=tAh?4ol}yO9K!RT_ojPGp-K4^S#cD}-cSfVl_yBE^MPxL3>?EV zn_lz2N{~&y@;-nG6plKX9Nx7|0cVb`Kk=OE$zG(PsAQl0x<+LbZXoiLA%AJ!%?P{X zr({10QNR7*UC-0qFQm)o$DyYQFrR$&&B>K5@NDp8{ozr8*ww{Ic&AV(x~-tj`nCnK z2#CNjANT|~<%edRmrEsqrAA_lwaxqwl9(y(=%W*G4cYDw&JDw*9gpFaB83wNf>Tmi zjWhj4T4hQjCf<`Xlp(kHbSEd`eSijGo+y;hg=29EThQ>ew8ew5ewXQ;1No_Dpg|kfNdT5Omn1`B^S|2KRs=Q;)lGI&)4#)%#LTV}Xi`7p}jarp<<-h+2XCuj9yyT$zE?)}Fkx4|0g)5218W z{m*=gzX;njVkd;(MPRukL)f7kup$7Z#f;QR8B`EK=US)%BM%}m2e+;aVG5pQ-(S4l z_d+;vtM}0h#(H{sINeApn|#j|06b{LK9R1a!H{!QSAFqTcx?)pG$X32dV??92AMc( z$nG*_EQT-V&f$SY2YeQj3KvPRo*O% z$4QzR+xm^Y07>BoRSelWz?jSWA{+OSgXcVAxY=)X^*N>%_ujtP;W#$y{Z58_Rp%^3 zf=C_)P7|y)hZEo%=L5BE-EC|OnHZUe1`J5B=tqArVq>M?M1OM#o@&t6&(v=I_!#ps zz8>t|wbxdC$x-R!#leJYK7<4lh*Et&z3ahEHknP&o(Y%4hL`fA`}f1ZD<*dB4>i zHY;Ohi&6IWJncS(`Kb;MG1*7O#h4lU1?Q66{ta9)iHbqdkTRWq7jyCAlVPMymv=!P zyUu(LgaoiG%q^Pilg`~=k7|t^s|p-e)NQ@vJ$FxjAUmWv8dSdktu>a`#ARk=U`k>> z3Q_p-TNb%peXqOc5SCUR{?-o_8CtV!ytl7TAPvL0h@EdAINYRmbk6b+aar|QZ7s*? z*H>S~IVIWBeUIsUA1l|>+&3in)`^i+u|rlMPkGD%QX6&96MCvx#VuQ!0^7(WA0@60 z^Fob;N%||0VMzKa%F9x4(y_?Xdp+ApA`--80nl;JYD&&qXa2eZ2FKU7T!96rk2(8K z7q3N@YYK_=qmy@KA07F8_GBjAcYWF7bv&}>y1(?&($awcVT4lc-h|fE9orZiYG6yiPu$+Kt zl8f4f$I3tg+OZB#{|t$Z@(&@)XpC2;#Wp1eUcfqZK<-l+-vqjr=<*{=V_3dC<@oPI zq8Id^O*RM0UL}V0^~FD(w~ueznOZBXeb>-8r3AJuDZktb*7C5bqz3pOJiqwJl&L%+ zr$vY62<8i*gN-vXyHi`+Wgk@e2oN&Y>IqCynWB)bS`FOS3 zFrK}>S9^1-;Ep23MMNTbMb6;|aQQ%vFZ0TUA(T2RX4zyQio5b?<~^-0At-fprkC%T zDmv7uQ*~v7qhIbN&yFm*@Xm^0qfkE-cLkctqsWZ&L(p21-gWoNM1}#?5+mO+9HG_P zo~o}mC3x)AZAODd;6aiD?eF^)y%Hw;CEiGUm2k<^d0`fJ1#KVyce*4Y=j9#zAac9? z56sE2XVhPp7@Zz-NXB8=^h;niUh|hdS>;=;;o{PLfGSVfr7<0)mC0>#w$z$<#0w9NI&$jP60my?p#27t7Ric*@U=flKxOELFbg}oM)AeC6&{7Gc6A$< zov3Zu_bN^xW4XSpea9&9)q?ZT)aKVX?tP&v)Og1*^SC^4?{P1Atcik`Z zvwFqC4ge(a+YRg#hmPHU83F7L#H#-2%BV3kpRg*da`pv3Jvj!Q0^7H!JuydzR=b*G zhBt^=fgh-KQ7cto0xFOIP(zpm}b;`9awByx)OF%qW@Y_>5k0 ze=^E?p$~7>$P6S$jmQYBM~&eBHTyw7AKyYo=nO>Du-_7t_zxmW6>g~MBM_Cf5p`R< zzP^q8$%EF|tnIH^4&SBm3%H z<>BXiYT`&T_VD7cmWm}OU^5jXltL4YF;^)*ZEWi|`ya*F;S(RcouEchbEgg~x?1uM z?*`s!iT5sf%4Zx;w;eL2gRc=1_hKruZie_P(np``7d`wLD;JCtT7v!%$HOVkoej1WM#unv(^@y7YM7j|p|oe|aiLuqxAB-1-|OVg## z^&)>~`VeS+x+Sk_w@k3fojry)0ZCB|V~u~(6~PDYKm$O}h0NvC3NtdhyMaXlilzF_ zoo*i<|9}X{^@oMbx=em;ESU3`P7?5i-_pmU%pm2#&qx+i; zFDGGC{@ml(ZrCIe%kHvMsPtg!AQqd2Z$r{F0)Xr;Rw%;oN=8ODomPx;M^gm50TiWr zS27X^sSV(`1|Sqtg6yacrAZIQLJ_Or#^a6*R}APf#ujmMat;lHjsrSjXLs{Ei9 zz%VwDuMV%k9HaNJnf2nLY7WN`c^(&?Lmy;gPy8z}z6l}y3*goO8irg9p5m>FUfW<* zp!N8oq;*k598xmJbwO&R)je5%kXf@SXiS){t#LIEpgUfHHM*qMZvu?IAo2J0pOlBTW!t44&l{p)w$J_dsmdle}sEbHY%YDh%90`c<^5Beh6^8nGC#z}SgfBjkw2~UEk z0bSfrWC#$=k^`!Dk;UxOQ?zhhxq^O1`@bH9lwJ9p`asMfm`y2d*|LJ~q6n)VF86JQ zE{7Kf6)QZG|GtwgIIiDsGz&9UW(3b(NGQW%Dox?*t(E6~yDatN8c~ zz2)#~QCMV@qb3;YOk$v|-(4;}w+#<+wa(>B9d*l+706*=OT?GdBdA(V*F-+uUmvzJ zb9La^b{b35$};eYB$bp%XMQ<~-_-`R$FXVv>E~dBYEFLqfYB&lP+_5L9s9y*LBqI& zT)Ji;(D^6G?5CC$wK!+6PWe*5XZPXKad zG0LryfEM)tO- zZbm57*ZG_#fepMe@h7njbhDNoGTlTJJ=rq8BKr%*4yX)A>KP!bc`(f49P)#OAV}eoFCn zz=@B*o-xF-cI_;hQKSdW*Wk#%y7px&5qAUM9ogT=VH zS1(^;%B2EQ6?l?FhKDNys{^h32P0*5^Y`Xoa`bZSa_i+b$SKQd$eGCPm2;hkrwq++ zuMjj(!Pz2AM;$g64Im{(Y>)MY6PwC`=jVVoyal!gB?7kp%@T0$SHP+xDoPau;{QV` zgWggjjJrfB93VzqVd3O#zq4C9K&&ktizYTU7F8V(wnNC>{~>cg&jt)|Xm}WNHol`X z1J7Yk95e8(D=>guf^nm}8rAuq8_7y)C134LyL5q!&lzbq?J{|j1Cl=^tESvY`I)je zwJeo4Eg}FHm+gg@O%s(Tnm4c`@SB|wvn7c2pn9Psgnuz9 z=CY;p>PIk&eT3SR7Xjn>MZe%rIT%;)kT>&U4o(V;}E^#$QPtSJill}*Mu z&-RCEywrLyaPronC)+zb#1Z-LI-~TuL z`9weRU94ps(d{^0MwW~!D@*jhzk=R-qR9NMG`huG@+U{9!m$X#JbC+97Xh%sc}g<~sG&dTQb~rHw%36|; z5JAy|0dxaS7T`GJ+i9LKC|lz=-ubT&NTaN?B87fVb>qx5ltxHZpcPjCvNBLdZ1I^U zb71KKXZie$ma+j@de9rbpRp#3kDVe73>dvyRaHx(rveFY|9qFBSjOVzO{Ag?3rOB3 z=UiA=yL|yVhT)m*A9=;^^0z%YF7d#?OKI1gCjcYC4XKkZTv|O_&wXctCXzpK+q_uD z;@b_{tEi+jmb+f57{?#ZTeykt1WpRthb_!va8Pn99o_kuT1r~7yQ^#6?I#7?cg&L! zmLTQqiGOz%T|YgjOl)Vv^Hk+BaiYWVdcN_o=HjhoSgB)`?ECzhwjMxBeg~Sa3z$K7 z5IxQmHQFxUgy#}Hd!t&!_tj95HUw~Ins3}4JDHOGdwI4WWk`OF8>Z*jz|G2Pe~7jZ zDiUxp+ijbi@;qLcm%zY_-W^U;W8c4{X#9Al1-*30U`_$8YDRUJGWOQQMiS4_pz&^i@dFVWjX0=#zdTBn3bao#l5; zz+`UOL7nD{Za*on*>c}xZb-c`Jw45FKZ(Sz2!g&xHi$*Xm{q^c-6}X*KYE#ifYnd% z^G!pL;@)@v5$;(S8zUNF@+AD+xtXE-x(~pINDwN!3ExkSfyF8&1=ZO`=+=hsysO1c zDaTC4cj4Uv*%~#vagv;Td|019scGrqi!SY!h}Vnq0n>G^bY>&~neunFIC*jgS)q%5 zwFMx`nAg{ST`SN!IJt)t-TkxKY8yv3t7v_{R(Qres6FyfY7}@WJ-4%`kor6 z9*EZNVfs#q)Dr32r2Q;9O$TZQ4gm?&j9mNTE%T{&Ai#?`EWqmU&kE>MWc6Xs6eV$cp{nlRZ*$Ee&wm!IXtQBP1 znR?Fk&fd~T#fA||i;*+P#-NxfnRV`i_ZJ?oYrB%)7wMi+F%{KMeTO2>NEb#Rnm;B{ zeq?;=|NPmM9O}sAkc@0=#kF}@B;gv-+Sy2a3+l88l1J)VE{Z zVf!unYE;`D0n)$%vw+6369{iVl77vLyetYk*bn(Mu+_G2+%#E>SB?7h7AJhN;*H?$ zcW^^c!rkrN6v6N;h1=V+A_1jirRDXil7k}1(MCf>RcuG?k4o(NhE|N4REo^3$0g8q za*m7AFakAcvj?-iKz6P_devjtS?jI9d~bof7+T5?N{anw(`)E|F@X4GqH_-w`JEi5 z7D3U;K$H7&IZ{nb|-+6|!ot$Vv5{ZBWn_961$llmR zwkS8K9c(1YOw|%F!?M(x>gd%gWXB!^iq4zLV!l`f5r@!zEr+{6#fiP) zr*{KY6qDtJb@QQ64F2I|Q}t!#;F!K2xPbcq1At+6>xv%XAmJ~~3NbDh0A4-Bi$Y7} z=FpV|mDs*nqtptliTYekb#-GAqh16Xz+W*!E1%oI`xIB6^%_$sWmDUBgTsl}1Pf%r zhIonP63avxguZl}j=DL-w3z68ZO<2(yXkW~@+XXAW7v%8Qqy|}2X(A_>ynZbSY_`i zo`h2UOt)mV(Orv;)d>~f3twyU`S0|OpIX27N(~|2sc_821IeV>y23L|SI0AQnC$MY z6cSH&G}5zYB)L~8ffQkix+@kRKEmG@zIa$s91Lzk%8OUl4K5ZrSx#|;p0gj*1zE~# zn$mHg7%{eQ3p30;j>*vP)hzXjYOS&uha$86wr|klKDYCd_F{Izf2|6{N%=;@ie6D+ zVUQ!!p|aOxRAN%> z%(wNl=#!ad=&%hh4IXL$dCSkw54tc5w8N1p56k{+j$wlhXycD(NhUgryS_i9yu6%7 za8ph=wEoJ0Gp0Jf^QBUpxpzoUnK7>*o77`B(f9WJIhq-3vUuIfjeuOir*QmrgP%Co z?>6wUd|RT@e3d<5T)a6RZ}7d40if|+7ht`NvNll!sqyI8Sjwi*ZC54H*g{?=jfc*) zEx->q2KP-6F56BN)0}It-2SB!1WhtXVwk+L(@fJVpo#cWpFh1DSgWT4lKLKgZ5txY~7SQLCv;x8J3Y46)nLpgfB>6f;rW($Pq8H;2KS+ l=?RJs(ju+p|3@E^Z<5dvEoZx;gDWDm)eUyuQ`>jye*x=CeJ%h1 literal 43061 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 Z$ik#;Yd?@5DaGZJ6l7Ip@}*7B{V%*qzLfv~ diff --git a/images/pegleg/Dockerfile.ubuntu_jammy b/images/pegleg/Dockerfile.ubuntu_jammy new file mode 100644 index 00000000..e64672c6 --- /dev/null +++ b/images/pegleg/Dockerfile.ubuntu_jammy @@ -0,0 +1,78 @@ +ARG FROM=ubuntu:jammy +FROM ${FROM} +ARG CFSSLURL=https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 + +LABEL org.opencontainers.image.authors='airship-discuss@lists.airshipit.org, irc://#airshipit@freenode' +LABEL org.opencontainers.image.url='https://airshipit.org' +LABEL org.opencontainers.image.documentation='https://airship-pegleg.readthedocs.org' +LABEL org.opencontainers.image.source='https://opendev.org/airship/pegleg' +LABEL org.opencontainers.image.vendor='The Airship Authors' +LABEL org.opencontainers.image.licenses='Apache-2.0' + +ENV LANG=C.UTF-8 +ENV LC_ALL=C.UTF-8 +ARG DECKHAND_VERSION=branch/master +ARG SHIPYARD_VERSION=branch/master +ARG PROMENADE_VERSION=branch/master + +RUN set -ex \ + && apt update -qq \ + && apt upgrade -y \ + && apt install -y --no-install-recommends \ + automake \ + ca-certificates \ + curl \ + build-essential \ + gettext-base \ + git \ + gpg \ + gpg-agent \ + libpq-dev \ + libssl-dev \ + libtool \ + make \ + netbase \ + openssh-client \ + python3-dev \ + python3-pip \ + python3-setuptools \ + && python3 -m pip install -U pip \ + && apt autoremove -yqq --purge \ + && apt clean \ + && rm -rf \ + /tmp/* \ + /usr/share/doc \ + /usr/share/doc-base \ + /usr/share/man \ + /var/lib/apt/lists/* \ + /var/log/* \ + /var/tmp/* + +ENV LD_LIBRARY_PATH=/usr/local/lib + +ARG LIBYAML_VERSION=0.2.5 +RUN set -ex \ + && git clone https://github.com/yaml/libyaml.git \ + && cd libyaml \ + && git checkout $LIBYAML_VERSION \ + && ./bootstrap \ + && ./configure \ + && make \ + && make install \ + && cd .. \ + && rm -fr libyaml + +VOLUME /var/pegleg +WORKDIR /var/pegleg + +COPY requirements-frozen.txt /opt/pegleg/requirements.txt +RUN pip3 install -r https://opendev.org/airship/deckhand/raw/${DECKHAND_VERSION}/requirements-frozen.txt \ + && pip3 install -r https://opendev.org/airship/promenade/raw/${PROMENADE_VERSION}/requirements-frozen.txt \ + && pip3 install -r https://opendev.org/airship/shipyard/raw/${SHIPYARD_VERSION}/src/bin/shipyard_client/requirements-frozen.txt \ + && pip3 install --no-cache-dir -r /opt/pegleg/requirements.txt + +COPY tools/install-cfssl.sh /opt/pegleg/tools/install-cfssl.sh +RUN /opt/pegleg/tools/install-cfssl.sh ${CFSSLURL} + +COPY . /opt/pegleg +RUN pip3 install -e /opt/pegleg --use-pep517 diff --git a/requirements-direct.txt b/requirements-direct.txt index 848b6dfc..856d703f 100644 --- a/requirements-direct.txt +++ b/requirements-direct.txt @@ -10,9 +10,9 @@ zipp psycopg2-binary # Airship dependencies -deckhand @ git+https://opendev.org/airship/deckhand.git@32e9950db405b5d1eb74da0c4e8df344a8638eff#egg=deckhand -shipyard-client @ git+https://opendev.org/airship/shipyard.git@6c356a902d8d5e07cf87d8fe94e4030a066e7def#egg=shipyard-client&subdirectory=src/bin/shipyard_client -promenade @ git+https://opendev.org/airship/promenade.git@e4c9fdb8619517d6e8c88e74fc3c1bdcf343a2ce#egg=promenade +deckhand @ git+https://opendev.org/airship/deckhand.git@be9f97b846b1edc6b74777e5e639aa9edce8cfa6#egg=deckhand +shipyard-client @ git+https://opendev.org/airship/shipyard.git@e917c9dca721fcf3384c583c1c0d8fe9654a7987#egg=shipyard-client&subdirectory=src/bin/shipyard_client +promenade @ git+https://opendev.org/airship/promenade.git@ac573b9fb53fd543172c50bbbcdfac3656fb8e66#egg=promenade # Openstack Antelope 2023.1 diff --git a/requirements-frozen.txt b/requirements-frozen.txt index a7557f6c..13d70dc9 100644 --- a/requirements-frozen.txt +++ b/requirements-frozen.txt @@ -1,66 +1,63 @@ -alembic==1.13.1 +alembic==1.13.2 amqp==5.2.0 arrow==1.3.0 -attrs==23.2.0 +attrs==24.2.0 autopage==0.5.2 -backports.zoneinfo==0.2.1 barbican==16.0.0 -bcrypt==4.1.2 -Beaker==1.12.1 -cachetools==5.3.2 -castellan==4.4.0 -certifi==2024.2.2 -cffi==1.16.0 +bcrypt==4.2.0 +Beaker==1.13.0 +cachetools==5.5.0 +castellan==5.1.1 +certifi==2024.8.30 +cffi==1.17.1 charset-normalizer==3.3.2 click==8.1.7 click-default-group==1.2.4 -cliff==4.6.0 +cliff==4.7.0 cmd2==2.4.3 -cryptography==41.0.7 +cryptography==42.0.8 debtcollector==3.0.0 -Deckhand @ git+https://opendev.org/airship/deckhand.git@32e9950db405b5d1eb74da0c4e8df344a8638eff +Deckhand @ git+https://opendev.org/airship/deckhand.git@be9f97b846b1edc6b74777e5e639aa9edce8cfa6 decorator==5.1.1 -deepdiff==6.7.1 +deepdiff==8.0.1 dnspython==2.6.1 -docker==7.0.0 -dogpile.cache==1.3.2 -eventlet==0.35.2 +docker==7.1.0 +dogpile.cache==1.3.3 +eventlet==0.37.0 falcon==3.1.3 fasteners==0.19 fixtures==4.1.0 Flask==2.2.5 futurist==3.0.0 gitdb==4.0.11 -GitPython==3.1.42 -google-auth==2.28.1 -greenlet==3.0.3 +GitPython==3.1.43 +google-auth==2.34.0 +greenlet==3.1.0 html5lib==0.9999999 httpexceptor==1.4.0 -idna==3.6 -importlib-metadata==6.11.0 -importlib-resources==5.13.0 +idna==3.10 iso8601==2.1.0 -itsdangerous==2.1.2 -Jinja2==3.1.3 +itsdangerous==2.2.0 +Jinja2==3.1.4 jsonpath-ng==1.6.1 -jsonpickle==3.0.3 -jsonschema==4.21.1 +jsonpickle==3.3.0 +jsonschema==4.23.0 jsonschema-specifications==2023.12.1 keystoneauth1==5.1.2 keystonemiddleware==10.2.0 -kombu==5.3.5 -kubernetes==29.0.0 +kombu==5.4.1 +kubernetes==30.1.0 ldap3==2.9.1 logutils==0.3.5 -Mako==1.3.2 +Mako==1.3.5 MarkupSafe==2.1.5 -microversion-parse==1.0.1 -msgpack==1.0.7 -netaddr==1.2.1 +microversion-parse==2.0.0 +msgpack==1.1.0 +netaddr==1.3.0 netifaces==0.11.0 -networkx==3.1 +networkx==3.3 oauthlib==3.2.2 -ordered-set==4.1.0 +orderly-set==5.2.2 os-service-types==1.7.0 oslo.cache==3.3.1 oslo.concurrency==5.1.1 @@ -78,72 +75,70 @@ oslo.service==3.1.1 oslo.upgradecheck==2.1.1 oslo.utils==6.1.0 oslo.versionedobjects==3.1.0 -packaging==23.2 -Paste==3.7.1 +packaging==24.1 +Paste==3.10.1 PasteDeploy==3.1.0 -PasteScript==3.4.0 -pbr==6.0.0 +PasteScript==3.6.0 +pbr==6.1.0 pecan==1.5.1 -pip==23.2.1 -pkgutil_resolve_name==1.3.10 +pip==24.1 ply==3.11 -prettytable==3.10.0 -promenade @ git+https://opendev.org/airship/promenade.git@e4c9fdb8619517d6e8c88e74fc3c1bdcf343a2ce +prettytable==3.11.0 +promenade @ git+https://opendev.org/airship/promenade.git@ac573b9fb53fd543172c50bbbcdfac3656fb8e66 prometheus_client==0.20.0 psycopg2-binary==2.9.9 PTable==0.9.2 -pyasn1==0.5.1 -pyasn1-modules==0.3.0 +pyasn1==0.6.1 +pyasn1_modules==0.4.0 pycadf==3.1.1 -pycparser==2.21 +pycparser==2.22 pylibyaml==0.1.0 -pyOpenSSL==24.0.0 -pyparsing==3.1.1 -pyperclip==1.8.2 +pyOpenSSL==24.2.1 +pyparsing==3.1.4 +pyperclip==1.9.0 python-barbicanclient==5.5.0 -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 python-keystoneclient==5.1.0 python-memcached==1.62 -python-mimeparse==1.6.0 -pytz==2024.1 -PyYAML==6.0.1 -referencing==0.33.0 +python-mimeparse==2.0.0 +pytz==2024.2 +PyYAML==6.0.2 +referencing==0.35.1 repoze.lru==0.7 -requests==2.31.0 +requests==2.32.3 requests-oauthlib==1.3.1 resolver==0.2.1 -rfc3986==1.5.0 +rfc3986==2.0.0 Routes==2.5.1 -rpds-py==0.18.0 +rpds-py==0.20.0 rsa==4.9 selector==0.10.1 -setuptools==68.2.2 -shipyard-client @ git+https://opendev.org/airship/shipyard.git@6c356a902d8d5e07cf87d8fe94e4030a066e7def#subdirectory=src/bin/shipyard_client -simplejson==3.19.2 +setuptools==70.1.0 +shipyard_client @ git+https://opendev.org/airship/shipyard.git@e917c9dca721fcf3384c583c1c0d8fe9654a7987#subdirectory=src/bin/shipyard_client +simplejson==3.19.3 six==1.16.0 smmap==5.0.1 -SQLAlchemy==1.4.51 +SQLAlchemy==1.4.54 sqlalchemy-migrate==0.13.0 -sqlparse==0.4.4 +sqlparse==0.5.1 statsd==4.0.1 -stevedore==5.2.0 +stevedore==5.3.0 Tempita==0.5.2 testresources==2.0.1 testscenarios==0.5.0 -testtools==2.7.1 +testtools==2.7.2 tiddlyweb==2.4.3 -types-python-dateutil==2.8.19.20240106 -typing_extensions==4.9.0 -tzdata==2024.1 -urllib3==1.26.18 -uWSGI==2.0.24 +types-python-dateutil==2.9.0.20240906 +typing_extensions==4.12.2 +urllib3==2.2.2 +uWSGI==2.0.27 vine==5.1.0 wcwidth==0.2.13 -WebOb==1.8.7 -websocket-client==1.7.0 +WebOb==1.8.8 +websocket-client==1.8.0 Werkzeug==2.2.3 -wheel==0.41.2 +wheel==0.43.0 wrapt==1.16.0 xattr==0.10.1 yappi==1.6.0 -zipp==3.17.0 +zipp==3.20.2 diff --git a/tools/gate/playbooks/airship-run-scripts.yaml b/tools/gate/playbooks/airship-run-scripts.yaml new file mode 100644 index 00000000..6e29edc0 --- /dev/null +++ b/tools/gate/playbooks/airship-run-scripts.yaml @@ -0,0 +1,75 @@ +# 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. + +--- +- hosts: primary + tasks: + - name: Override images + when: buildset_registry is defined + vars: + work_dir: "{{ zuul.project.src_dir }}" + block: + - name: Buildset registry alias + include_role: + name: deploy-env + tasks_from: buildset_registry_alias + + - name: Print zuul + debug: + var: zuul + + - name: Override proposed images from artifacts + shell: > + find {{ override_paths | join(" ") }} -type f -exec sed -Ei + "s#['\"]?docker\.io/({{ repo }}):({{ tag }})['\"]?\$#{{ buildset_registry_alias }}:{{ buildset_registry.port }}/\1:\2#g" {} + + loop: "{{ zuul.artifacts | default([]) }}" + args: + chdir: "{{ work_dir }}" + loop_control: + loop_var: zj_zuul_artifact + when: "'metadata' in zj_zuul_artifact and zj_zuul_artifact.metadata.type | default('') == 'container_image'" + vars: + tag: "{{ zj_zuul_artifact.metadata.tag }}" + repo: "{{ zj_zuul_artifact.metadata.repository }}" + override_paths: + - ../openstack-helm*/*/values* + - ../openstack-helm-infra/tools/deployment/ + + - name: Diff + shell: | + set -ex; + for dir in openstack-helm openstack-helm-infra; do + path="{{ work_dir }}/../${dir}/" + if [ ! -d "${path}" ]; then continue; fi + echo "${dir} diff" + cd "${path}"; git diff; cd -; + done + + - name: "creating directory for run artifacts" + file: + path: "/tmp/artifacts" + state: directory + + - name: Run gate scripts + include_role: + name: "{{ ([item] | flatten | length == 1) | ternary('airship-run-script', 'airship-run-script-set') }}" + vars: + workload: "{{ [item] | flatten }}" + loop: "{{ gate_scripts }}" + + - name: "Downloads artifacts to executor" + synchronize: + src: "/tmp/artifacts" + dest: "{{ zuul.executor.log_root }}/{{ inventory_hostname }}" + mode: pull + ignore_errors: True +... diff --git a/tools/gate/playbooks/airskiff-validate.yaml b/tools/gate/playbooks/airskiff-validate.yaml index 799bc63a..e791605d 100644 --- a/tools/gate/playbooks/airskiff-validate.yaml +++ b/tools/gate/playbooks/airskiff-validate.yaml @@ -13,87 +13,9 @@ # limitations under the License. - hosts: primary - roles: - - clear-firewall - - bindep - - disable-systemd-resolved - - ensure-python - - ensure-pip - - ensure-docker tasks: - - name: Install Packaging python module for tools/airship - block: - - pip: - name: packaging - version: 23.1 - executable: pip3 - become: True - - - name: Clone Required Repositories - shell: | - export CLONE_PEGLEG={{ CLONE_PEGLEG }} - export OSH_INFRA_COMMIT={{ HTK_COMMIT }} - ./tools/deployment/airskiff/developer/000-clone-dependencies.sh - args: - chdir: "{{ zuul.projects['opendev.org/airship/treasuremap'].src_dir }}" - - - name: Setup Apparmor - shell: | - ./tools/deployment/airskiff/developer/009-setup-apparmor.sh - args: - chdir: "{{ zuul.projects['opendev.org/airship/treasuremap'].src_dir }}" - - - name: Deploy Kubernetes with Minikube - shell: | - ./tools/deployment/airskiff/developer/010-deploy-k8s.sh - args: - chdir: "{{ zuul.projects['opendev.org/airship/treasuremap'].src_dir }}" - - - - name: Build all charts locally - shell: | - set -ex - ./tools/deployment/airskiff/developer/015-make-all-charts.sh - args: - chdir: "{{ zuul.projects['opendev.org/airship/treasuremap'].src_dir }}" - become: yes - - - name: Build Pegleg with submitted changes - shell: | - set -ex - export DISTRO={{ PEGLEG_IMAGE_DISTRO }} - make images - args: - chdir: "{{ zuul.project.src_dir }}" - become: yes - - - - name: Use locally built images in manifests - shell: | - set -ex - docker rm registry --force || true - docker run -d -p 5000:5000 --restart=always --name registry registry:2 - docker tag quay.io/airshipit/pegleg:latest-ubuntu_focal localhost:5000/pegleg:latest-ubuntu_focal - docker push localhost:5000/pegleg:latest-ubuntu_focal - sed -i "s#quay.io/airshipit/pegleg:latest-ubuntu_focal#localhost:5000/pegleg:latest-ubuntu_focal#g" ./global/software/config/versions.yaml - args: - chdir: "{{ zuul.projects['opendev.org/airship/treasuremap'].src_dir }}" - become: yes - - - name: Start artifactory - shell: | - set -ex - # start http server with artifacts - docker rm artifacts --force || true - docker run --name artifacts -p 8282:80 -v $(pwd)/../artifacts:/usr/share/nginx/html -d nginx - sleep 10 - curl --verbose -I http://control-plane.minikube.internal:8282/memcached.tgz - args: - chdir: "{{ zuul.projects['opendev.org/airship/treasuremap'].src_dir }}" - become: yes - - name: List sites shell: | set -xe diff --git a/tools/gate/playbooks/checkout-treasuremap-ref.yaml b/tools/gate/playbooks/checkout-treasuremap-ref.yaml new file mode 100644 index 00000000..46a24051 --- /dev/null +++ b/tools/gate/playbooks/checkout-treasuremap-ref.yaml @@ -0,0 +1,31 @@ +# 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. + +--- +- hosts: all + + tasks: + - name: Checkout treasuremap ref + shell: | + set -xe; + + : "${TREASUREMAP_REF:=v1.9}" + + cd ../treasuremap + git fetch https://review.opendev.org/airship/treasuremap ${TREASUREMAP_REF} && git checkout FETCH_HEAD + + args: + chdir: "{{ zuul.project.src_dir }}" + environment: + TREASUREMAP_REF: "{{ treasuremap_ref }}" + +... \ No newline at end of file diff --git a/tools/gate/playbooks/deploy-env.yaml b/tools/gate/playbooks/deploy-env.yaml new file mode 100644 index 00000000..9fae635d --- /dev/null +++ b/tools/gate/playbooks/deploy-env.yaml @@ -0,0 +1,36 @@ +# 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. + +--- +- hosts: all + become: true + gather_facts: true + + roles: + - ensure-python + - ensure-pip + - clear-firewall + - deploy-apparmor + - deploy-selenium + - deploy-env + - ensure-tox + + tasks: + - name: Install Packaging python module for tools/airship + block: + - pip: + name: packaging + version: 23.1 + executable: pip3 + become: True + +... diff --git a/tools/gate/playbooks/docker-image-build.yaml b/tools/gate/playbooks/docker-image-build.yaml index 1cddbae7..fe15e99f 100644 --- a/tools/gate/playbooks/docker-image-build.yaml +++ b/tools/gate/playbooks/docker-image-build.yaml @@ -36,6 +36,11 @@ - debug: msg: "{{ tags | to_json }}" + - name: Set ubuntu jammy base image + set_fact: + base_image: "{{ base_image_jammy }}" + when: distro == 'ubuntu_jammy' + - name: Set ubuntu focal base image set_fact: base_image: "{{ base_image_focal }}" diff --git a/tools/gate/playbooks/mount-volumes.yaml b/tools/gate/playbooks/mount-volumes.yaml new file mode 100644 index 00000000..0049da19 --- /dev/null +++ b/tools/gate/playbooks/mount-volumes.yaml @@ -0,0 +1,17 @@ +# 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. + +--- +- hosts: all + roles: + - mount-extra-volume +... diff --git a/tools/gate/playbooks/osh-infra-collect-logs.yaml b/tools/gate/playbooks/osh-infra-collect-logs.yaml new file mode 100644 index 00000000..83e76887 --- /dev/null +++ b/tools/gate/playbooks/osh-infra-collect-logs.yaml @@ -0,0 +1,43 @@ +# 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. + +--- +- hosts: all + vars_files: + - vars.yaml + vars: + work_dir: "{{ zuul.project.src_dir }}/{{ zuul_osh_infra_relative_path | default('') }}" + logs_dir: "/tmp/logs" + roles: + - gather-host-logs + tags: + - gather-host-logs + +- hosts: primary + vars_files: + - vars.yaml + vars: + work_dir: "{{ zuul.project.src_dir }}/{{ zuul_osh_infra_relative_path | default('') }}" + logs_dir: "/tmp/logs" + roles: + - helm-release-status + - describe-kubernetes-objects + - gather-pod-logs + - gather-prom-metrics + - gather-selenium-data + tags: + - helm-release-status + - describe-kubernetes-objects + - gather-pod-logs + - gather-prom-metrics + - gather-selenium-data +... diff --git a/tools/gate/playbooks/prepare-hosts.yaml b/tools/gate/playbooks/prepare-hosts.yaml new file mode 100644 index 00000000..76087fde --- /dev/null +++ b/tools/gate/playbooks/prepare-hosts.yaml @@ -0,0 +1,21 @@ +# 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. + +--- +- hosts: all + roles: + - bindep + - start-zuul-console + - role: add-authorized-keys + public_keys: + - public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDA7eM8WFJrqQmki8rR0O3QBHyl8xq42jb1RduwuRwjWoGYJI5cX7Fx+7VR4A9ITCoiqxKS8DMfgKbt5jKC6SmvMALULZsnYlthB34KywurgxsW6fgp68DHWQ7J4CCBhoIpl0W3JW7s6b0vHLhab59r0E+AYemBVuWUqbFEy8nDAHcQv1S/2o1udhmljIN7c2ogO4KAJ7Lge0BoIP9ps4u6AVwyQZixp4anU9DHGNA/UQj4M5UyuALj5buEAuATBe9Vqj4sOvZjObPJAGPUrNRrGEWAFk+lSZHRzKXo0eeWtPqoh5UN9UDb5Pocg1krncMIZwjHKovlD1z/O1y91aY5LM1wxm/7aaIiX8eCihyVZaOuDCLF7WDT2SMs7ABcotX2MDtVQTrNNV3MmMAScFNDflzPKszd7cdjLl6PBq8bvPxmCkLmnitPTGOoh9d8i+JlbINvgx1pguYrpeciIyreCO1rjTW3MgB0tyoMEa31V+7HrauBMeNnE68YTqLTIB0= smarkin@mirantis.com +... diff --git a/tools/gate/roles/airship-run-script-set/defaults/main.yaml b/tools/gate/roles/airship-run-script-set/defaults/main.yaml new file mode 100644 index 00000000..7dc55afd --- /dev/null +++ b/tools/gate/roles/airship-run-script-set/defaults/main.yaml @@ -0,0 +1,47 @@ +# 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. + +--- +ceph_osd_data_device: "/dev/loop0" +kubeadm: + pod_network_cidr: "10.244.0.0/24" +osh_params: + container_distro_name: ubuntu + container_distro_version: focal + # feature_gates: +site: airskiff +HELM_ARTIFACT_URL: https://get.helm.sh/helm-v3.15.4-linux-amd64.tar.gz +HTK_COMMIT: cfff60ec10a6c386f38db79bb9f59a552c2b032f +OSH_INFRA_COMMIT: cfff60ec10a6c386f38db79bb9f59a552c2b032f +OSH_COMMIT: 2d9457e34ca4200ed631466bd87569b0214c92e7 +COREDNS_VERSION: v1.11.1 +DISTRO: ubuntu_focal +DOCKER_REGISTRY: quay.io +MAKE_ARMADA_IMAGES: false +MAKE_DECKHAND_IMAGES: false +MAKE_SHIPYARD_IMAGES: false +MAKE_PORTHOLE_IMAGES: false +MAKE_PROMENADE_IMAGES: false +CLONE_ARMADA: true +CLONE_DECKHAND: true +CLONE_SHIPYARD: true +CLONE_PORTHOLE: true +CLONE_PROMENADE: true +CLONE_MAAS: true +CLONE_OSH: true +MAKE_ARMADA_IMAGES: false +MAKE_DECKHAND_IMAGES: false +MAKE_SHIPYARD_IMAGES: false +MAKE_DECKHAND_IMAGES: false +MAKE_PORTHOLE_IMAGES: false +MAKE_PROMENADE_IMAGES: false +... diff --git a/tools/gate/roles/airship-run-script-set/tasks/main.yaml b/tools/gate/roles/airship-run-script-set/tasks/main.yaml new file mode 100644 index 00000000..0fe778cd --- /dev/null +++ b/tools/gate/roles/airship-run-script-set/tasks/main.yaml @@ -0,0 +1,84 @@ +# 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. + +--- +- block: + - name: "Run script set {{ workload }}" + shell: | + set -xe; + {{ gate_script_path }} + loop: "{{ workload }}" + loop_control: + loop_var: gate_script_path + pause: 5 + args: + chdir: "{{ zuul.project.src_dir }}/{{ gate_scripts_relative_path }}" + environment: + CEPH_OSD_DATA_DEVICE: "{{ ceph_osd_data_device }}" + POD_NETWORK_CIDR: "{{ kubeadm.pod_network_cidr }}" + zuul_site_mirror_fqdn: "{{ zuul_site_mirror_fqdn }}" + OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}" + OSH_PATH: "{{ zuul_osh_relative_path | default('../openstack-helm/') }}" + OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('../openstack-helm-infra/') }}" + OPENSTACK_RELEASE: "{{ osh_params.openstack_release | default('') }}" + CONTAINER_DISTRO_NAME: "{{ osh_params.container_distro_name | default('') }}" + CONTAINER_DISTRO_VERSION: "{{ osh_params.container_distro_version | default('') }}" + FEATURE_GATES: "{{ osh_params.feature_gates | default('') }}" + RUN_HELM_TESTS: "{{ run_helm_tests | default('yes') }}" + PL_SITE: "{{ site | default('airskiff') }}" + HELM_ARTIFACT_URL: "{{ HELM_ARTIFACT_URL | default('https://get.helm.sh/helm-v3.15.4-linux-amd64.tar.gz') }}" + HTK_COMMIT: "{{ HTK_COMMIT | default('cfff60ec10a6c386f38db79bb9f59a552c2b032f') }}" + OSH_INFRA_COMMIT: "{{ OSH_INFRA_COMMIT | default('cfff60ec10a6c386f38db79bb9f59a552c2b032f') }}" + OSH_COMMIT: "{{ OSH_COMMIT | default('2d9457e34ca4200ed631466bd87569b0214c92e7') }}" + COREDNS_VERSION: "{{ coredns_version | default('v1.11.1') }}" + DISTRO: "{{ DISTRO | default('ubuntu_focal') }}" + DOCKER_REGISTRY: "{{ DOCKER_REGISTRY | default('quay.io') }}" + MAKE_ARMADA_IMAGES: "{{ MAKE_ARMADA_IMAGES | default('false') }}" + MAKE_DECKHAND_IMAGES: "{{ MAKE_DECKHAND_IMAGES | default('false') }}" + MAKE_SHIPYARD_IMAGES: "{{ MAKE_SHIPYARD_IMAGES | default('false') }}" + MAKE_PORTHOLE_IMAGES: "{{ MAKE_PORTHOLE_IMAGES | default('false') }}" + MAKE_PROMENADE_IMAGES: "{{ MAKE_PROMENADE_IMAGES | default('false') }}" + CLONE_ARMADA: "{{ CLONE_ARMADA | default('true') }}" + CLONE_DECKHAND: "{{ CLONE_DECKHAND | default('true') }}" + CLONE_SHIPYARD: "{{ CLONE_SHIPYARD | default('true') }}" + CLONE_PORTHOLE: "{{ CLONE_PORTHOLE | default('true') }}" + CLONE_PROMENADE: "{{ CLONE_PROMENADE | default('true') }}" + CLONE_MAAS: "{{ CLONE_MAAS | default('true') }}" + CLONE_OSH: "{{ CLONE_OSH | default('true') }}" + MAKE_ARMADA_IMAGES: "{{ MAKE_ARMADA_IMAGES | default('false') }}" + MAKE_DECKHAND_IMAGES: "{{ MAKE_DECKHAND_IMAGES | default('false') }}" + MAKE_SHIPYARD_IMAGES: "{{ MAKE_SHIPYARD_IMAGES | default('false') }}" + MAKE_DECKHAND_IMAGES: "{{ MAKE_DECKHAND_IMAGES | default('false') }}" + MAKE_PORTHOLE_IMAGES: "{{ MAKE_PORTHOLE_IMAGES | default('false') }}" + MAKE_PROMENADE_IMAGES: "{{ MAKE_PROMENADE_IMAGES | default('false') }}" + # NOTE(aostapenko) using bigger than async_status timeout due to async_status issue with + # not recognizing timed out jobs: https://github.com/ansible/ansible/issues/25637 + async: 3600 + poll: 0 + register: async_results + + - name: Wait for script set to finish + async_status: + jid: '{{ item.ansible_job_id }}' + register: jobs + until: jobs.finished + delay: 5 + retries: 360 + loop: "{{ async_results.results }}" + + always: + - name: Print script set output + shell: | + # NOTE(aostapenko) safely retrieving items for the unlikely case if jobs timed out in async_status + echo 'STDOUT:\n{{ item.get("stdout") | regex_replace("\'", "") }}\nSTDERR:\n{{ item.get("stderr") | regex_replace("\'", "") }}' + loop: "{{ jobs.results }}" +... diff --git a/tools/gate/roles/airship-run-script/defaults/main.yaml b/tools/gate/roles/airship-run-script/defaults/main.yaml new file mode 100644 index 00000000..7ca82f1d --- /dev/null +++ b/tools/gate/roles/airship-run-script/defaults/main.yaml @@ -0,0 +1,43 @@ +# 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. + +--- +ceph_osd_data_device: "/dev/loop0" +kubeadm: + pod_network_cidr: "10.244.0.0/24" +osh_params: + container_distro_name: ubuntu + container_distro_version: focal + # feature_gates: +site: airskiff +HELM_ARTIFACT_URL: https://get.helm.sh/helm-v3.15.4-linux-amd64.tar.gz +HTK_COMMIT: cfff60ec10a6c386f38db79bb9f59a552c2b032f +OSH_INFRA_COMMIT: cfff60ec10a6c386f38db79bb9f59a552c2b032f +OSH_COMMIT: 2d9457e34ca4200ed631466bd87569b0214c92e7 +COREDNS_VERSION: v1.11.1 +DISTRO: ubuntu_jammy +DOCKER_REGISTRY: quay.io +MAKE_ARMADA_IMAGES: false +MAKE_DECKHAND_IMAGES: false +MAKE_SHIPYARD_IMAGES: false +MAKE_PORTHOLE_IMAGES: false +MAKE_PROMENADE_IMAGES: false +MAKE_PEGLEG_IMAGES: false +CLONE_ARMADA: true +CLONE_DECKHAND: true +CLONE_SHIPYARD: true +CLONE_PORTHOLE: true +CLONE_PROMENADE: true +CLONE_PEGLEG: true +CLONE_MAAS: true +CLONE_OSH: true +... diff --git a/tools/gate/roles/airship-run-script/tasks/main.yaml b/tools/gate/roles/airship-run-script/tasks/main.yaml new file mode 100644 index 00000000..59907e11 --- /dev/null +++ b/tools/gate/roles/airship-run-script/tasks/main.yaml @@ -0,0 +1,56 @@ +# 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. + +--- +- name: "Run script {{ workload[0] }}" + shell: | + set -xe; + {{ gate_script_path }} + vars: + gate_script_path: "{{ workload[0] }}" + args: + chdir: "{{ zuul.project.src_dir }}/{{ gate_scripts_relative_path }}" + environment: + CEPH_OSD_DATA_DEVICE: "{{ ceph_osd_data_device }}" + POD_NETWORK_CIDR: "{{ kubeadm.pod_network_cidr }}" + zuul_site_mirror_fqdn: "{{ zuul_site_mirror_fqdn }}" + OSH_EXTRA_HELM_ARGS: "{{ zuul_osh_extra_helm_args_relative_path | default('') }}" + OSH_PATH: "{{ zuul_osh_relative_path | default('../openstack-helm/') }}" + OSH_INFRA_PATH: "{{ zuul_osh_infra_relative_path | default('../openstack-helm-infra/') }}" + OPENSTACK_RELEASE: "{{ osh_params.openstack_release | default('') }}" + CONTAINER_DISTRO_NAME: "{{ osh_params.container_distro_name | default('') }}" + CONTAINER_DISTRO_VERSION: "{{ osh_params.container_distro_version | default('') }}" + FEATURE_GATES: "{{ osh_params.feature_gates | default('') }}" + RUN_HELM_TESTS: "{{ run_helm_tests | default('yes') }}" + PL_SITE: "{{ site | default('airskiff') }}" + HELM_ARTIFACT_URL: "{{ HELM_ARTIFACT_URL | default('https://get.helm.sh/helm-v3.15.4-linux-amd64.tar.gz') }}" + HTK_COMMIT: "{{ HTK_COMMIT | default('cfff60ec10a6c386f38db79bb9f59a552c2b032f') }}" + OSH_INFRA_COMMIT: "{{ OSH_INFRA_COMMIT | default('cfff60ec10a6c386f38db79bb9f59a552c2b032f') }}" + OSH_COMMIT: "{{ OSH_COMMIT | default('2d9457e34ca4200ed631466bd87569b0214c92e7') }}" + COREDNS_VERSION: "{{ coredns_version | default('v1.11.1') }}" + DISTRO: "{{ DISTRO | default('ubuntu_focal') }}" + DOCKER_REGISTRY: "{{ DOCKER_REGISTRY | default('quay.io') }}" + MAKE_ARMADA_IMAGES: "{{ MAKE_ARMADA_IMAGES | default('false') }}" + MAKE_DECKHAND_IMAGES: "{{ MAKE_DECKHAND_IMAGES | default('false') }}" + MAKE_SHIPYARD_IMAGES: "{{ MAKE_SHIPYARD_IMAGES | default('false') }}" + MAKE_PORTHOLE_IMAGES: "{{ MAKE_PORTHOLE_IMAGES | default('false') }}" + MAKE_PROMENADE_IMAGES: "{{ MAKE_PROMENADE_IMAGES | default('false') }}" + MAKE_PEGLEG_IMAGES: "{{ MAKE_PEGLEG_IMAGES | default('false') }}" + CLONE_ARMADA: "{{ CLONE_ARMADA | default('true') }}" + CLONE_DECKHAND: "{{ CLONE_DECKHAND | default('true') }}" + CLONE_SHIPYARD: "{{ CLONE_SHIPYARD | default('true') }}" + CLONE_PORTHOLE: "{{ CLONE_PORTHOLE | default('true') }}" + CLONE_PROMENADE: "{{ CLONE_PROMENADE | default('true') }}" + CLONE_PEGLEG: "{{ CLONE_PEGLEG | default('true') }}" + CLONE_MAAS: "{{ CLONE_MAAS | default('true') }}" + CLONE_OSH: "{{ CLONE_OSH | default('true') }}" +... diff --git a/tox.ini b/tox.ini index 009ebb85..2f0c6ac2 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py38,pep8,docs,cover +envlist = py310,pep8,docs,cover minversion = 2.38.0 skipsdist = True @@ -31,7 +31,7 @@ commands = bash -c "{toxinidir}/tools/gate/run-unit-tests.sh '{posargs}'" -[testenv:py38] +[testenv:py310] allowlist_externals = bash find @@ -100,7 +100,7 @@ allowlist_externals= sh deps= -r{toxinidir}/requirements-direct.txt - -c https://raw.githubusercontent.com/apache/airflow/constraints-2.8.2/constraints-3.8.txt + -c https://raw.githubusercontent.com/apache/airflow/constraints-2.10.2/constraints-3.10.txt commands= rm -f {toxinidir}/requirements-frozen.txt sh -c "pip freeze --all | grep -vE 'pegleg|pyinotify|pkg-resources' > requirements-frozen.txt" diff --git a/vcs-requirements.env b/vcs-requirements.env index 5eeb7088..f2dcc6c4 100644 --- a/vcs-requirements.env +++ b/vcs-requirements.env @@ -1,3 +1,3 @@ -DECKHAND_VERSION=commit/32e9950db405b5d1eb74da0c4e8df344a8638eff -SHIPYARD_VERSION=commit/6c356a902d8d5e07cf87d8fe94e4030a066e7def -PROMENADE_VERSION=commit/e4c9fdb8619517d6e8c88e74fc3c1bdcf343a2ce +DECKHAND_VERSION=commit/be9f97b846b1edc6b74777e5e639aa9edce8cfa6 +SHIPYARD_VERSION=commit/e917c9dca721fcf3384c583c1c0d8fe9654a7987 +PROMENADE_VERSION=commit/ac573b9fb53fd543172c50bbbcdfac3656fb8e66