Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions ansible/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,12 @@ repository in detached HEAD state until a later branch-based run updates it.
Set `microshift_source_dir` to build a complete Git worktree that is already present on the managed host. The caller is responsible for staging and
updating the worktree, including its `.git` metadata. When set, the Git checkout task is skipped and the Git revision and refspec variables are ignored.

When repository management is enabled, source builds provision runtime dependencies from the stream's OpenShift repository when it is available. If
that repository is unavailable, or
`microshift_version` identifies a prerelease, dependencies are provided by the `dependencies/rpms/<major.minor>-el9-beta` mirror instead. Package-based
repository selection is unchanged. Repository probes verify that `cri-o` is present; installation of the built RPMs enforces version compatibility.
If the OpenShift repository becomes usable on a later run, the corresponding fallback mirror is removed.

### Inventory Configuration

The inventory configuration file is located at `inventory/inventory`.
Expand Down
14 changes: 11 additions & 3 deletions ansible/roles/manage-repos/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,21 @@

microshift_version: 4.20
microshift_version_clean: "{{ microshift_version | regex_replace('^latest-', '') }}"
ocp_version: "{{ microshift_version_clean.split('.')[0] }}.{{ microshift_version_clean.split('.')[1] }}"
ocp_major_version: "{{ microshift_version_clean.split('.')[0] }}"
ocp_version: "{{ ocp_major_version }}.{{ microshift_version_clean.split('.')[1] }}"
microshift_base_url: "{{ 'ocp-dev-preview' if 'ec' in microshift_version else 'ocp' }}"
repo_list:
microshift_mirror_repos:
- repo_name: 'microshift-{{ ocp_version }}-for-rhel-{{ ansible_facts.distribution_major_version }}-mirrorbeta-{{ ansible_facts.architecture }}-rpms'
repo_description: 'MicroShift {{ ocp_version }} RPMs for RHEL {{ ansible_facts.distribution_major_version }}'
repo_url: "https://mirror.openshift.com/pub/openshift-v4/{{ ansible_facts.architecture }}/microshift/{{ microshift_base_url }}/{{ microshift_version }}/el9/os/"
microshift_deps_repos:
- repo_name: 'microshift-{{ ocp_version }}-deps-for-rhel-{{ ansible_facts.distribution_major_version }}-mirrorbeta-{{ ansible_facts.architecture }}-rpms'
repo_url: "https://mirror.openshift.com/pub/openshift-v4/{{ ansible_facts.architecture }}/dependencies/rpms/{{ ocp_version }}-el9-beta/"
repo_description: 'MicroShift {{ ocp_version }} dependencies for RHEL {{ ansible_facts.distribution_major_version }}'
repo_url: >-
{{ 'https://mirror.openshift.com/pub/openshift-v' ~ ocp_major_version ~
'/' ~ ansible_facts.architecture ~ '/dependencies/rpms/' ~
ocp_version ~ '-el9-beta/' }}
repo_list: "{{ microshift_mirror_repos + microshift_deps_repos }}"
Comment thread
coderabbitai[bot] marked this conversation as resolved.

rhel_beta: ''
rhel_base_repos:
Expand Down
41 changes: 16 additions & 25 deletions ansible/roles/manage-repos/tasks/create-mirrors.yaml
Original file line number Diff line number Diff line change
@@ -1,26 +1,17 @@
- name: Create mirrors block
block:
- name: Check if microshift_version is valid for pre-release
ansible.builtin.uri:
url: "{{ item.repo_url }}"
method: GET
status_code: 200
timeout: 5
- name: Install repository mirror
ansible.builtin.template:
src: ocpbeta.repo.j2
dest: "/etc/yum.repos.d/{{ item.repo_name }}.repo"
mode: '0644'
register: microshift_mirror_repo

- name: Install microshift mirror repo for pre-releases
ansible.builtin.template:
src: ocpbeta.repo.j2
dest: "/etc/yum.repos.d/{{ item.repo_name }}.repo"
mode: '0644'
register: microshift_mirror_repo

- name: Clean stale metadata for updated pre-release repo
ansible.builtin.command:
argv:
- dnf
- clean
- metadata
- "--disablerepo=*"
- "--enablerepo={{ item.repo_name }}"
changed_when: true
when: microshift_mirror_repo.changed
- name: Clean stale metadata for updated repository
ansible.builtin.command:
argv:
- dnf
- clean
- metadata
- "--disablerepo=*"
- "--enablerepo={{ item.repo_name }}"
changed_when: true
when: microshift_mirror_repo.changed
132 changes: 131 additions & 1 deletion ansible/roles/manage-repos/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,138 @@
community.general.rhsm_repository:
name: "{{ rhel_base_repos }}"

- name: Provision dependency repos for source builds
when: build_microshift | bool
block:
- name: Enable OpenShift repo for source-build dependencies
community.general.rhsm_repository:
name: "{{ rhel_ocp_repos }}"
register: microshift_source_rhsm_repo
when: not (microshift_prerelease | bool)

- name: Check OpenShift repo provides source-build dependencies
# This matches scripts/get-latest-rhocp-repo.sh: repository routing
# checks package presence, while RPM installation enforces compatibility.
ansible.builtin.command:
argv:
- dnf
- --refresh
- repository-packages
- --showduplicates
- "--disablerepo=*"
- "--enablerepo={{ item }}"
- "{{ item }}"
- info
- cri-o
loop: "{{ rhel_ocp_repos }}"
register: microshift_source_rhsm_probe
changed_when: false
when: not (microshift_prerelease | bool)
rescue:
- name: Disable unusable OpenShift repo for source-build dependencies
community.general.rhsm_repository:
name: "{{ rhel_ocp_repos }}"
state: disabled
when:
- microshift_source_rhsm_repo is defined
- not ((microshift_source_rhsm_repo.failed | default(false)) | bool)

- name: Check fallback dependency mirror for source builds
block:
- name: Probe fallback dependency mirror for source builds
ansible.builtin.include_tasks: probe-mirror.yaml
loop: "{{ microshift_deps_repos }}"
loop_control:
label: "{{ item.repo_name }}"
vars:
repository_probe_package: cri-o
rescue:
- name: Report unavailable source-build dependency repositories
ansible.builtin.fail:
msg: >-
Neither the entitled OpenShift repositories
({{ rhel_ocp_repos | join(', ') }}) nor the dependency mirrors
({{ microshift_deps_repos | map(attribute='repo_url') | join(', ') }})
provide cri-o for MicroShift {{ ocp_version }}.

- name: Install fallback dependency mirror for source builds
ansible.builtin.include_tasks: create-mirrors.yaml
loop: "{{ microshift_deps_repos }}"
loop_control:
label: "{{ item.repo_name }}"

- name: Remove fallback dependency mirrors after OpenShift repo recovers
ansible.builtin.file:
path: "/etc/yum.repos.d/{{ item.repo_name }}.repo"
state: absent
loop: "{{ microshift_deps_repos }}"
loop_control:
label: "{{ item.repo_name }}"
register: microshift_removed_fallback_repos
when:
- build_microshift | bool
- not (microshift_prerelease | bool)
- microshift_source_rhsm_probe is defined
- not ((microshift_source_rhsm_probe.failed | default(true)) | bool)

- name: Clean metadata after removing fallback dependency mirrors
ansible.builtin.command:
argv:
- dnf
- clean
- metadata
changed_when: true
when:
- build_microshift | bool
- not (microshift_prerelease | bool)
- microshift_source_rhsm_probe is defined
- not ((microshift_source_rhsm_probe.failed | default(true)) | bool)
- microshift_removed_fallback_repos is defined
- (microshift_removed_fallback_repos.changed | default(false)) | bool

- name: Check dependency mirror for prerelease source builds
when:
- build_microshift | bool
- microshift_prerelease | bool
block:
- name: Probe dependency mirror for prerelease source builds
ansible.builtin.include_tasks: probe-mirror.yaml
loop: "{{ microshift_deps_repos }}"
loop_control:
label: "{{ item.repo_name }}"
vars:
repository_probe_package: cri-o
rescue:
- name: Report unavailable prerelease dependency mirrors
ansible.builtin.fail:
msg: >-
The dependency mirrors
({{ microshift_deps_repos | map(attribute='repo_url') | join(', ') }})
do not provide cri-o for MicroShift {{ ocp_version }}.

- name: Create dependency mirror for prerelease source builds
ansible.builtin.include_tasks: create-mirrors.yaml
loop: "{{ microshift_deps_repos }}"
loop_control:
label: "{{ item.repo_name }}"
when:
- build_microshift | bool
- microshift_prerelease | bool

- name: Check microshift prerelease mirrors
ansible.builtin.include_tasks: probe-mirror.yaml
loop: "{{ repo_list }}"
loop_control:
label: "{{ item.repo_name }}"
when:
- microshift_prerelease | bool
- not (build_microshift | bool)

- name: Create microshift prerelease mirrors
include_tasks: create-mirrors.yaml
ansible.builtin.include_tasks: create-mirrors.yaml
loop: "{{ repo_list }}"
loop_control:
label: "{{ item.repo_name }}"
when:
- microshift_prerelease | bool
- not (build_microshift | bool)
Expand All @@ -57,6 +186,7 @@
name: "{{ rhel_ocp_repos }}"
when:
- not (microshift_prerelease | bool)
- not (build_microshift | bool)

- name: Install EPEL repo
ansible.builtin.dnf:
Expand Down
22 changes: 22 additions & 0 deletions ansible/roles/manage-repos/tasks/probe-mirror.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
- name: Check repository mirror is available
ansible.builtin.uri:
url: "{{ item.repo_url }}"
Comment thread
coderabbitai[bot] marked this conversation as resolved.
method: GET
status_code: 200
timeout: 5

- name: Check repository mirror provides required package
ansible.builtin.command:
argv:
- dnf
- --refresh
- repository-packages
- --showduplicates
- "--disablerepo=*"
- --repofrompath
- "microshift-dependency-probe,{{ item.repo_url }}"
- microshift-dependency-probe
- info
- "{{ repository_probe_package }}"
changed_when: false
when: (repository_probe_package | default('') | length) > 0
2 changes: 1 addition & 1 deletion ansible/roles/manage-repos/templates/ocpbeta.repo.j2
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[{{ item.repo_name }}]
name=MicroShift {{ ocp_version }} RPMs for RHEL {{ ansible_facts.distribution_major_version }}
name={{ item.repo_description | default('MicroShift ' ~ ocp_version ~ ' RPMs for RHEL ' ~ ansible_facts.distribution_major_version) }}
baseurl={{ item.repo_url }}
enabled=1
gpgcheck=0
Expand Down