|
11 | 11 | import logging |
12 | 12 | from time import sleep |
13 | 13 | from os import path |
| 14 | +from re import search |
14 | 15 |
|
15 | 16 | from kubernetes.dynamic.exceptions import NotFoundError |
16 | 17 | from openshift.dynamic import DynamicClient |
@@ -152,6 +153,7 @@ def applySubscription(dynClient: DynamicClient, namespace: str, packageName: str |
152 | 153 | while installPlanPhase != "Complete": |
153 | 154 | installPlanResource = installPlanAPI.get(name=installPlanName, namespace=namespace) |
154 | 155 | installPlanPhase = installPlanResource.status.phase |
| 156 | + _deleteFailedCsv(dynClient, name=name, namespace=namespace) |
155 | 157 | sleep(30) |
156 | 158 |
|
157 | 159 | # Wait for Subscription to complete |
@@ -186,3 +188,17 @@ def _findAndDeleteResources(api, resourceType: str, labelSelector: str, namespac |
186 | 188 | for item in resources.items: |
187 | 189 | logger.info(f"Deleting {resourceType} {item.metadata.name}") |
188 | 190 | api.delete(name=item.metadata.name, namespace=namespace) |
| 191 | + |
| 192 | + |
| 193 | +def _deleteFailedCsv(dynClient: DynamicClient, name: str, namespace: str): |
| 194 | + subscriptionsAPI = dynClient.resources.get(api_version="operators.coreos.com/v1alpha1", kind="Subscription") |
| 195 | + subscriptionResource = subscriptionsAPI.get(name=name, namespace=namespace) |
| 196 | + |
| 197 | + conditionsSortedByTimestamp = sorted(subscriptionResource.status.conditions, key=lambda item: item['lastTransitionTime'], reverse=True) |
| 198 | + if conditionsSortedByTimestamp[0]['reason'] == 'ConstraintsNotSatisfiable': |
| 199 | + message=conditionsSortedByTimestamp[0]['message'] |
| 200 | + captureGroup=r"clusterserviceversion\s+([a-zA-Z0-9\-\.]+)" |
| 201 | + csvName=search(captureGroup, message) |
| 202 | + |
| 203 | + csvAPI = dynClient.resources.get(api_version="operators.coreos.com/v1alpha1", kind="ClusterServiceVersion") |
| 204 | + csvAPI.delete(name=csvName, namespace=namespace) |
0 commit comments