Skip to content

Commit ceaf846

Browse files
Merge branch 'stable' into update-250501
2 parents 774ee23 + dde1504 commit ceaf846

File tree

3 files changed

+278
-2
lines changed

3 files changed

+278
-2
lines changed

src/mas/devops/mas.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,20 @@ def listMasInstances(dynClient: DynamicClient) -> list:
133133
return suites
134134

135135

136+
def getWorkspaceId(dynClient: DynamicClient, instanceId: str) -> str:
137+
"""
138+
Get the MAS workspace ID for namespace "mas-{instanceId}-core"
139+
"""
140+
workspaceId = None
141+
workspacesAPI = dynClient.resources.get(api_version="core.mas.ibm.com/v1", kind="Workspace")
142+
workspaces = workspacesAPI.get(namespace=f"mas-{instanceId}-core")
143+
if len(workspaces["items"]) > 0:
144+
workspaceId = workspaces["items"][0]["metadata"]["labels"]["mas.ibm.com/workspaceId"]
145+
else:
146+
logger.info("There are no MAS workspaces for the provided instanceId on this cluster")
147+
return workspaceId
148+
149+
136150
def verifyMasInstance(dynClient: DynamicClient, instanceId: str) -> bool:
137151
"""
138152
Validate that the chosen MAS instance exists
@@ -151,6 +165,41 @@ def verifyMasInstance(dynClient: DynamicClient, instanceId: str) -> bool:
151165
return False
152166

153167

168+
def verifyAppInstance(dynClient: DynamicClient, instanceId: str, applicationId: str) -> bool:
169+
"""
170+
Validate that the chosen app instance exists
171+
"""
172+
try:
173+
# IoT has a different api version
174+
operatorApiVersions = dict(iot="iot.ibm.com/v1")
175+
apiVersion = operatorApiVersions[applicationId] if applicationId in operatorApiVersions else "apps.mas.ibm.com/v1"
176+
operatorKinds = dict(
177+
health="HealthApp",
178+
predict="PredictApp",
179+
monitor="MonitorApp",
180+
iot="IoT",
181+
visualinspection="VisualInspectionApp",
182+
assist="AssistApp",
183+
safety="SafetyApp",
184+
manage="ManageApp",
185+
hputilities="HPUtilitiesApp",
186+
mso="MSOApp",
187+
optimizer="OptimizerApp",
188+
facilities="FacilitiesApp",
189+
)
190+
appAPI = dynClient.resources.get(api_version=apiVersion, kind=operatorKinds[applicationId])
191+
appAPI.get(name=instanceId, namespace=f"mas-{instanceId}-{applicationId}")
192+
return True
193+
except NotFoundError:
194+
return False
195+
except ResourceNotFoundError:
196+
# The MAS App CRD has not even been installed in the cluster
197+
return False
198+
except UnauthorizedError:
199+
logger.error("Error: Unable to verify MAS app instance due to failed authorization: {e}")
200+
return False
201+
202+
154203
def getMasChannel(dynClient: DynamicClient, instanceId: str) -> str:
155204
"""
156205
Get the MAS channel from the subscription

src/mas/devops/tekton.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,8 @@ def testCLI() -> None:
286286
def launchUpgradePipeline(dynClient: DynamicClient,
287287
instanceId: str,
288288
skipPreCheck: bool = False,
289-
masChannel: str = "") -> str:
289+
masChannel: str = "",
290+
params: dict = {}) -> str:
290291
"""
291292
Create a PipelineRun to upgrade the chosen MAS instance
292293
"""
@@ -303,7 +304,8 @@ def launchUpgradePipeline(dynClient: DynamicClient,
303304
timestamp=timestamp,
304305
mas_instance_id=instanceId,
305306
skip_pre_check=skipPreCheck,
306-
mas_channel=masChannel
307+
mas_channel=masChannel,
308+
**params
307309
)
308310
logger.debug(renderedTemplate)
309311
pipelineRun = yaml.safe_load(renderedTemplate)

src/mas/devops/templates/pipelinerun-upgrade.yml.j2

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,234 @@ spec:
2121
- name: mas_channel
2222
value: "{{ mas_channel }}"
2323

24+
# IBM Entitlement Key
25+
# -------------------------------------------------------------------------
26+
- name: ibm_entitlement_key
27+
value: "{{ ibm_entitlement_key }}"
28+
2429
{%- if skip_pre_check is defined and skip_pre_check != "" %}
2530
# Skip pre-check
2631
# -------------------------------------------------------------------------
2732
- name: skip_pre_check
2833
value: "{{ skip_pre_check }}"
2934
{%- endif %}
35+
{%- if artifactory_username is defined and artifactory_username != "" %}
36+
37+
# Enable development catalogs
38+
# -------------------------------------------------------------------------
39+
- name: artifactory_username
40+
value: "{{ artifactory_username }}"
41+
- name: artifactory_token
42+
value: "{{ artifactory_token }}"
43+
{%- endif %}
44+
{%- if db2_action_system == "install" or db2_action_manage == "install" %}
45+
46+
# Dependencies - Db2 - Actions
47+
# -------------------------------------------------------------------------
48+
- name: db2_action_system
49+
value: "{{ db2_action_system }}"
50+
- name: db2_action_manage
51+
value: "{{ db2_action_manage }}"
52+
53+
# Dependencies - Db2u Operator
54+
# -------------------------------------------------------------------------
55+
- name: db2_namespace
56+
value: "{{ db2_namespace }}"
57+
- name: db2_channel
58+
value: "{{ db2_channel }}"
59+
- name: db2_type
60+
value: "{{ db2_type }}"
61+
- name: db2_timezone
62+
value: "{{ db2_timezone }}"
63+
{%- if db2_meta_storage_accessmode is defined and db2_meta_storage_accessmode != "" %}
64+
65+
# Dependencies - Db2 - Access Mode
66+
# -------------------------------------------------------------------------
67+
- name: db2_meta_storage_accessmode
68+
value: "{{ db2_meta_storage_accessmode }}"
69+
- name: db2_backup_storage_accessmode
70+
value: "{{ db2_backup_storage_accessmode }}"
71+
- name: db2_logs_storage_accessmode
72+
value: "{{ db2_logs_storage_accessmode }}"
73+
- name: db2_temp_storage_accessmode
74+
value: "{{ db2_temp_storage_accessmode }}"
75+
- name: db2_data_storage_accessmode
76+
value: "{{ db2_data_storage_accessmode }}"
77+
{%- endif %}
78+
{%- if db2_affinity_key is defined and db2_affinity_key != "" %}
79+
80+
# Dependencies - Db2 - Node Scheduling
81+
# -------------------------------------------------------------------------
82+
- name: db2_affinity_key
83+
value: "{{ db2_affinity_key }}"
84+
- name: db2_affinity_value
85+
value: "{{ db2_affinity_value }}"
86+
- name: db2_tolerate_key
87+
value: "{{ db2_tolerate_key }}"
88+
- name: db2_tolerate_value
89+
value: "{{ db2_tolerate_value }}"
90+
- name: db2_tolerate_effect
91+
value: "{{ db2_tolerate_effect }}"
92+
{%- endif %}
93+
{%- if db2_cpu_requests is defined and db2_cpu_requests != "" %}
94+
95+
# Dependencies - Db2 - Memory & CPU Resources
96+
# -------------------------------------------------------------------------
97+
- name: db2_cpu_requests
98+
value: "{{ db2_cpu_requests }}"
99+
- name: db2_cpu_limits
100+
value: "{{ db2_cpu_limits }}"
101+
- name: db2_memory_requests
102+
value: "{{ db2_memory_requests }}"
103+
- name: db2_memory_limits
104+
value: "{{ db2_memory_limits }}"
105+
{%- endif %}
106+
{%- if db2_meta_storage_size is defined and db2_meta_storage_size != "" %}
107+
108+
# Dependencies - Db2 - Storage Capacity
109+
# -------------------------------------------------------------------------
110+
- name: db2_meta_storage_size
111+
value: "{{ db2_meta_storage_size }}"
112+
- name: db2_backup_storage_size
113+
value: "{{ db2_backup_storage_size }}"
114+
- name: db2_logs_storage_size
115+
value: "{{ db2_logs_storage_size }}"
116+
- name: db2_temp_storage_size
117+
value: "{{ db2_temp_storage_size }}"
118+
- name: db2_data_storage_size
119+
value: "{{ db2_data_storage_size }}"
120+
{%- endif %}
121+
{%- endif %}
122+
{%- if mas_app_channel_manage is defined and mas_app_channel_manage != "" %}
123+
124+
# Manage Application
125+
# -------------------------------------------------------------------------
126+
- name: mas_app_channel_manage
127+
value: "{{ mas_app_channel_manage }}"
128+
- name: mas_appws_components
129+
value: "{{ mas_appws_components }}"
130+
{%- if mas_appws_bindings_health_wsl_flag is defined and mas_appws_bindings_health_wsl_flag != "" %}
131+
- name: mas_appws_bindings_health_wsl_flag
132+
value: "{{ mas_appws_bindings_health_wsl_flag }}"
133+
{%- endif %}
134+
{%- if mas_app_settings_aio_flag is defined and mas_app_settings_aio_flag != "" %}
135+
- name: mas_app_settings_aio_flag
136+
value: "{{ mas_app_settings_aio_flag }}"
137+
{%- endif %}
138+
{%- if mas_app_settings_demodata is defined and mas_app_settings_demodata != "" %}
139+
- name: mas_app_settings_demodata
140+
value: "{{ mas_app_settings_demodata }}"
141+
{%- endif %}
142+
{%- if mas_appws_bindings_jdbc_manage is defined and mas_appws_bindings_jdbc_manage != "" %}
143+
- name: mas_appws_bindings_jdbc_manage
144+
value: "{{ mas_appws_bindings_jdbc_manage }}"
145+
{%- endif %}
146+
{%- if mas_app_settings_persistent_volumes_flag is defined and mas_app_settings_persistent_volumes_flag != "" %}
147+
- name: mas_app_settings_persistent_volumes_flag
148+
value: "{{ mas_app_settings_persistent_volumes_flag }}"
149+
{%- endif %}
150+
{%- if mas_app_settings_jms_queue_pvc_storage_class is defined and mas_app_settings_jms_queue_pvc_storage_class != "" %}
151+
- name: mas_app_settings_jms_queue_pvc_storage_class
152+
value: "{{ mas_app_settings_jms_queue_pvc_storage_class }}"
153+
- name: mas_app_settings_jms_queue_pvc_accessmode
154+
value: "{{ mas_app_settings_jms_queue_pvc_accessmode }}"
155+
{%- endif %}
156+
{%- if mas_app_settings_bim_pvc_storage_class is defined and mas_app_settings_bim_pvc_storage_class != "" %}
157+
- name: mas_app_settings_bim_pvc_storage_class
158+
value: "{{ mas_app_settings_bim_pvc_storage_class }}"
159+
- name: mas_app_settings_bim_pvc_accessmode
160+
value: "{{ mas_app_settings_bim_pvc_accessmode }}"
161+
{%- endif %}
162+
{%- if mas_app_settings_doclinks_pvc_storage_class is defined or mas_app_settings_doclinks_pvc_storage_class != "" %}
163+
- name: mas_app_settings_doclinks_pvc_storage_class
164+
value: "{{ mas_app_settings_doclinks_pvc_storage_class }}"
165+
- name: mas_app_settings_doclinks_pvc_accessmode
166+
value: "{{ mas_app_settings_doclinks_pvc_accessmode }}"
167+
{%- endif %}
168+
{%- if mas_app_settings_server_bundles_size is defined and mas_app_settings_server_bundles_size != "" %}
169+
- name: mas_app_settings_server_bundles_size
170+
value: "{{ mas_app_settings_server_bundles_size }}"
171+
{%- endif %}
172+
{%- if is_full_manage is defined and is_full_manage != "" %}
173+
- name: is_full_manage
174+
value: "{{ is_full_manage }}"
175+
{%- endif %}
176+
{%- if mas_workspace_id is defined and mas_workspace_id != "" %}
177+
- name: mas_workspace_id
178+
value: "{{ mas_workspace_id }}"
179+
{%- endif %}
180+
{%- if should_install_manage_foundation is defined and should_install_manage_foundation != "" %}
181+
- name: should_install_manage_foundation
182+
value: "{{ should_install_manage_foundation }}"
183+
{%- endif %}
184+
{%- if mas_app_settings_base_lang is defined and mas_app_settings_base_lang != "" %}
185+
- name: mas_app_settings_base_lang
186+
value: "{{ mas_app_settings_base_lang }}"
187+
- name: mas_app_settings_secondary_langs
188+
value: "{{ mas_app_settings_secondary_langs }}"
189+
{%- endif %}
190+
{%- if mas_app_settings_server_timezone is defined and mas_app_settings_server_timezone != "" %}
191+
- name: mas_app_settings_server_timezone
192+
value: "{{ mas_app_settings_server_timezone }}"
193+
{%- endif %}
194+
{%- if mas_manage_attachments_provider is defined and mas_manage_attachments_provider != "" %}
195+
- name: mas_manage_attachments_provider
196+
value: "{{ mas_manage_attachments_provider }}"
197+
{%- endif %}
198+
{%- if mas_manage_attachment_configuration_mode is defined and mas_manage_attachment_configuration_mode != "" %}
199+
- name: mas_manage_attachment_configuration_mode
200+
value: "{{ mas_manage_attachment_configuration_mode }}"
201+
{%- endif %}
202+
{%- if mas_app_settings_tablespace is defined and mas_app_settings_tablespace != "" %}
203+
- name: mas_app_settings_tablespace
204+
value: "{{ mas_app_settings_tablespace }}"
205+
- name: mas_app_settings_indexspace
206+
value: "{{ mas_app_settings_indexspace }}"
207+
- name: mas_app_settings_db2_schema
208+
value: "{{ mas_app_settings_db2_schema }}"
209+
{%- endif %}
210+
{%- if mas_app_settings_customization_archive_url is defined and mas_app_settings_customization_archive_url != "" %}
211+
- name: mas_app_settings_customization_archive_url
212+
value: "{{ mas_app_settings_customization_archive_url }}"
213+
- name: mas_app_settings_customization_archive_name
214+
value: "{{ mas_app_settings_customization_archive_name }}"
215+
{%- if mas_app_settings_customization_archive_username is defined and mas_app_settings_customization_archive_username != "" %}
216+
- name: mas_app_settings_customization_archive_username
217+
value: "{{ mas_app_settings_customization_archive_username }}"
218+
- name: mas_app_settings_customization_archive_password
219+
value: "{{ mas_app_settings_customization_archive_password }}"
220+
{%- endif %}
221+
{%- endif %}
222+
{%- if mas_app_settings_crypto_key is defined and mas_app_settings_crypto_key != "" %}
223+
- name: mas_app_settings_crypto_key
224+
value: "{{ mas_app_settings_crypto_key }}"
225+
- name: mas_app_settings_cryptox_key
226+
value: "{{ mas_app_settings_cryptox_key }}"
227+
- name: mas_app_settings_old_crypto_key
228+
value: "{{ mas_app_settings_old_crypto_key }}"
229+
- name: mas_app_settings_old_cryptox_key
230+
value: "{{ mas_app_settings_old_cryptox_key }}"
231+
{%- endif %}
232+
{%- if mas_app_settings_override_encryption_secrets_flag is defined and mas_app_settings_override_encryption_secrets_flag != "" %}
233+
- name: mas_app_settings_override_encryption_secrets_flag
234+
value: "{{ mas_app_settings_override_encryption_secrets_flag }}"
235+
{%- endif %}
236+
{%- if mas_app_settings_default_jms is defined and mas_app_settings_default_jms != "" %}
237+
- name: mas_app_settings_default_jms
238+
value: "{{ mas_app_settings_default_jms }}"
239+
{%- endif %}
240+
{%- endif %}
241+
242+
243+
workspaces:
244+
# The generated configuration files
245+
# -------------------------------------------------------------------------
246+
- name: shared-configs
247+
persistentVolumeClaim:
248+
claimName: config-pvc
249+
250+
# PodTemplates configurations
251+
# -------------------------------------------------------------------------
252+
- name: shared-pod-templates
253+
secret:
254+
secretName: pipeline-pod-templates

0 commit comments

Comments
 (0)