Skip to content
Merged
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
13 changes: 13 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,16 @@ cpd-cli-workspace/*
/node_modules
package-lock.json
package.json

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# Distribution / packaging
dist
*.egg-info
pandoc-*-amd64.deb
pandoc-*-windows-x86_64.msi
pandoc-*-x86_64-macOS.pkg
README.rst
2 changes: 2 additions & 0 deletions ibm/mas_devops/common_vars/compatibility_matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -115,5 +115,7 @@ upgrade_path:
8.10.x: 8.11.x
8.9.x: 8.10.x

# The key is the current installed channel of AI Service
# and the value is the allowed upgrade versions.
aiservice_upgrade_path:
9.1.x: 9.2.x-feature
54 changes: 46 additions & 8 deletions ibm/mas_devops/plugins/filter/filters.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
# -----------------------------------------------------------
# Licensed Materials - Property of IBM
# 5737-M66, 5900-AAA
# (C) Copyright IBM Corp. 2021 All Rights Reserved.
# US Government Users Restricted Rights - Use, duplication, or disclosure
# restricted by GSA ADP Schedule Contract with IBM Corp.
# -----------------------------------------------------------
import yaml
import re

Expand Down Expand Up @@ -437,6 +430,49 @@ def get_ecr_repositories(image_mirror_output):
repositories.append(repo_to_add)
return repositories

def is_channel_upgrade_path_valid(current: str, target: str, valid_paths: dict) -> bool:
"""
Checks if a given current channel version can be upgraded to a target channel version.
:current: The current channel version.
:target: The target channel version to upgrade to.
:valid_paths: A dictionary of supported upgrade paths. See ibm/mas_devops/common_vars/compatibility_matrix.yml.
:return: True if the upgrade path is supported, False otherwise.
"""
valid = True
if current not in valid_paths.keys():
print(f'Current channel {current} is not supported for upgrade')
valid = False
elif target:
allowed_targets = valid_paths[current]
if isinstance(allowed_targets, str):
if target != allowed_targets:
print(f'Upgrading from channel {current} to {target} is not supported')
valid = False
elif isinstance(allowed_targets, list):
if target not in allowed_targets:
print(f'Upgrading from channel {current} to {target} is not supported')
valid = False
else:
print(f'Error: channel upgrade compatibility matrix is incorrectly defined')
valid = False
return valid

def get_default_upgrade_channel(current: str, valid_paths: dict) -> str:
"""
Gets the default target upgrade channel if the user has not supplied one.
:current: The current channel version.
:valid_paths: A dictionary of supported upgrade paths. See ibm/mas_devops/common_vars/compatibility_matrix.yml.
:return: The default target upgrade channel.
"""
default = None
allowed_targets = valid_paths[current]
if isinstance(allowed_targets, str):
default = allowed_targets
elif isinstance(allowed_targets, list):
default = allowed_targets[0]
else:
print(f'Error: channel upgrade compatibility matrix is incorrectly defined')
return default

class FilterModule(object):
def filters(self):
Expand All @@ -459,5 +495,7 @@ def filters(self):
'format_pre_version_without_buildid': format_pre_version_without_buildid,
'format_pre_version_with_buildid': format_pre_version_with_buildid,
'get_db2_instance_name': get_db2_instance_name,
'get_ecr_repositories': get_ecr_repositories
'get_ecr_repositories': get_ecr_repositories,
'is_channel_upgrade_path_valid': is_channel_upgrade_path_valid,
'get_default_upgrade_channel': get_default_upgrade_channel
}
62 changes: 62 additions & 0 deletions ibm/mas_devops/plugins/filter/test_filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
from filters import *
import pytest


##########################################################################


def test_is_channel_upgrade_path_valid_for_blank_target_channel():
paths = {'a': ['b', 'c']}
assert is_channel_upgrade_path_valid('a', '', paths)


def test_is_channel_upgrade_path_valid_for_invalid_target_channel():
paths = {'a': ['b', 'c']}
assert not is_channel_upgrade_path_valid('a', 'd', paths)


def test_is_channel_upgrade_path_valid_for_valid_target_channel():
paths = {'a': ['b', 'c']}
assert is_channel_upgrade_path_valid('a', 'c', paths)


def test_is_channel_upgrade_path_valid_for_invalid_current_channel():
paths = {'a': ['b', 'c']}
assert not is_channel_upgrade_path_valid('d', 'c', paths)


def test_is_channel_upgrade_path_valid_for_string_target_channel():
paths = {'a': 'b'}
assert is_channel_upgrade_path_valid('a', 'b', paths)


def test_is_channel_upgrade_path_valid_for_invalid_paths():
paths = {'a': 1}
assert not is_channel_upgrade_path_valid('a', 'b', paths)


##########################################################################


def test_get_default_upgrade_channel_for_valid_current_channel():
paths = {'a': ['b', 'c']}
assert 'b' == get_default_upgrade_channel('a', paths)


def test_get_default_upgrade_channel_for_string_target_channel():
paths = {'a': 'b'}
assert 'b' == get_default_upgrade_channel('a', paths)


def test_get_default_upgrade_channel_for_invalid_current_channel():
paths = {'a': ['b', 'c']}
with pytest.raises(KeyError):
get_default_upgrade_channel('b', paths)


def test_get_default_upgrade_channel_for_invalid_paths():
paths = {'a': 1}
assert None == get_default_upgrade_channel('a', paths)


##########################################################################
17 changes: 13 additions & 4 deletions ibm/mas_devops/roles/aiservice_upgrade/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,28 @@
- "operators.coreos.com/ibm-aiservice.{{ aiservice_namespace }}"
register: aiservice_sub_info

- name: "Set current subscription channel"
set_fact:
current_aiservice_channel: "{{ aiservice_sub_info.resources[0].spec.channel }}"

- name: Show current subscription info
ansible.builtin.debug:
msg:
- "Currently installed AI Service channel ............. {{ current_aiservice_channel }}"

- name: "Set default upgrade target based on installed version of AI Service"
when:
- aiservice_channel is not defined or aiservice_channel == ""
- aiservice_sub_info.resources[0].spec.channel in aiservice_upgrade_path
- current_aiservice_channel | ibm.mas_devops.is_channel_upgrade_path_valid('', aiservice_upgrade_path)
set_fact:
target_aiservice_channel: "{{ aiservice_upgrade_path[aiservice_sub_info.resources[0].spec.channel] }}"
target_aiservice_channel: "{{ current_aiservice_channel | get_default_upgrade_channel(aiservice_upgrade_path) }}"

- name: "Set upgrade target explicitly"
when:
- aiservice_channel is defined and aiservice_channel != ""
- aiservice_channel in aiservice_upgrade_path
- current_aiservice_channel | ibm.mas_devops.is_channel_upgrade_path_valid(aiservice_channel, aiservice_upgrade_path)
set_fact:
target_aiservice_channel: "{{ aiservice_upgrade_path[aiservice_channel] }}"
target_aiservice_channel: "{{ aiservice_channel }}"

- name: "Assert upgrade target is defined"
assert:
Expand Down
Loading