Files
community.okd/plugins/modules/openshift_adm_migrate_template_instances.py
Mandar Kulkarni 620de63a26 Update old stable-5 branch to sync with current changes from main (#264)
* Update tests for newer version of openshift (#254)

* Update tests for newer version of openshift

More recent versions of ocp no longer automatically create tokens for
service accounts. This updates the tests to manually create the tokens.

* Update nginx template version

The old image was EOL and the deployment was failing to deploy.

* Fix nginx version for all tasks

* Add missing var

* Remove openshift inventory plugin (#252)

* Remove openshift inventory plugin

This removes the openshift inventory plugin which has been deprecated
since version 3.0.0. The tests have been updated to retain coverage of
the connection plugin, which is still supported.

* Update version in Makefile

* CI fixes

* Update version info in build scripts

* Set ansible remote directory

The security policy on the pod is preventing ansible from writing to /.
Set it to /tmp which should be writable.

* Bump the ansible-lint version to 25.1.2 (#255)

* Bump the ansible-lint version to 25.1.2

* Update changelogs/fragments/ansible-lint-update.yml

Co-authored-by: Bikouo Aubin <79859644+abikouo@users.noreply.github.com>

---------

Co-authored-by: Bikouo Aubin <79859644+abikouo@users.noreply.github.com>

* Add ansible-lint to tox linters (#258)

* Add ansible-lint to tox linters

* Bump black

* Black formatting

* fix linting

* prepare release 4.0.2 (#262) (#263)

(cherry picked from commit 55ccaf3394)

* Update k8s dependency upper bounds (#257)

---------

Co-authored-by: Mike Graves <mgraves@redhat.com>
Co-authored-by: GomathiselviS <gomathiselvi@gmail.com>
Co-authored-by: Bikouo Aubin <79859644+abikouo@users.noreply.github.com>
Co-authored-by: Bianca Henderson <beeankha@gmail.com>
2025-06-05 19:09:02 +00:00

374 lines
13 KiB
Python

#!/usr/bin/python
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
__metaclass__ = type
# STARTREMOVE (downstream)
DOCUMENTATION = r"""
module: openshift_adm_migrate_template_instances
short_description: Update TemplateInstances to point to the latest group-version-kinds
version_added: "2.2.0"
author: Alina Buzachis (@alinabuzachis)
description:
- Update TemplateInstances to point to the latest group-version-kinds.
- Analogous to C(oc adm migrate template-instances).
extends_documentation_fragment:
- kubernetes.core.k8s_auth_options
- kubernetes.core.k8s_wait_options
options:
namespace:
description:
- The namespace that the template can be found in.
- If no namespace if specified, migrate objects in all namespaces.
type: str
requirements:
- python >= 3.6
- kubernetes >= 12.0.0
"""
EXAMPLES = r"""
- name: Migrate TemplateInstances in namespace=test
community.okd.openshift_adm_migrate_template_instances:
namespace: test
register: _result
- name: Migrate TemplateInstances in all namespaces
community.okd.openshift_adm_migrate_template_instances:
register: _result
"""
RETURN = r"""
result:
description:
- List with all TemplateInstances that have been migrated.
type: list
returned: success
elements: dict
sample: [
{
"apiVersion": "template.openshift.io/v1",
"kind": "TemplateInstance",
"metadata": {
"creationTimestamp": "2021-11-10T11:12:09Z",
"finalizers": [
"template.openshift.io/finalizer"
],
"managedFields": [
{
"apiVersion": "template.openshift.io/v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:spec": {
"f:template": {
"f:metadata": {
"f:name": {}
},
"f:objects": {},
"f:parameters": {}
}
}
},
"manager": "kubectl-create",
"operation": "Update",
"time": "2021-11-10T11:12:09Z"
},
{
"apiVersion": "template.openshift.io/v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:finalizers": {
".": {},
"v:\"template.openshift.io/finalizer\"": {}
}
},
"f:status": {
"f:conditions": {}
}
},
"manager": "openshift-controller-manager",
"operation": "Update",
"time": "2021-11-10T11:12:09Z"
},
{
"apiVersion": "template.openshift.io/v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:status": {
"f:objects": {}
}
},
"manager": "OpenAPI-Generator",
"operation": "Update",
"time": "2021-11-10T11:12:33Z"
}
],
"name": "demo",
"namespace": "test",
"resourceVersion": "545370",
"uid": "09b795d7-7f07-4d94-bf0f-2150ee66f88d"
},
"spec": {
"requester": {
"groups": [
"system:masters",
"system:authenticated"
],
"username": "system:admin"
},
"template": {
"metadata": {
"creationTimestamp": null,
"name": "template"
},
"objects": [
{
"apiVersion": "v1",
"kind": "Secret",
"metadata": {
"labels": {
"foo": "bar"
},
"name": "secret"
}
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "deployment"
},
"spec": {
"replicas": 0,
"selector": {
"matchLabels": {
"key": "value"
}
},
"template": {
"metadata": {
"labels": {
"key": "value"
}
},
"spec": {
"containers": [
{
"image": "k8s.gcr.io/e2e-test-images/agnhost:2.32",
"name": "hello-openshift"
}
]
}
}
}
},
{
"apiVersion": "v1",
"kind": "Route",
"metadata": {
"name": "route"
},
"spec": {
"to": {
"name": "foo"
}
}
}
],
"parameters": [
{
"name": "NAME",
"value": "${NAME}"
}
]
}
},
"status": {
"conditions": [
{
"lastTransitionTime": "2021-11-10T11:12:09Z",
"message": "",
"reason": "Created",
"status": "True",
"type": "Ready"
}
],
"objects": [
{
"ref": {
"apiVersion": "v1",
"kind": "Secret",
"name": "secret",
"namespace": "test",
"uid": "33fad364-6d47-4f9c-9e51-92cba5602a57"
}
},
{
"ref": {
"apiVersion": "apps/v1",
"kind": "Deployment",
"name": "deployment",
"namespace": "test",
"uid": "3b527f88-42a1-4811-9e2f-baad4e4d8807"
}
},
{
"ref": {
"apiVersion": "route.openshift.io/v1.Route",
"kind": "Route",
"name": "route",
"namespace": "test",
"uid": "5b5411de-8769-4e27-ba52-6781630e4008"
}
}
]
}
},
...
]
"""
# ENDREMOVE (downstream)
from ansible.module_utils._text import to_native
from ansible_collections.community.okd.plugins.module_utils.openshift_common import (
AnsibleOpenshiftModule,
)
try:
from kubernetes.dynamic.exceptions import DynamicApiError
except ImportError:
pass
from ansible_collections.kubernetes.core.plugins.module_utils.args_common import (
AUTH_ARG_SPEC,
WAIT_ARG_SPEC,
)
transforms = {
"Build": "build.openshift.io/v1",
"BuildConfig": "build.openshift.io/v1",
"DeploymentConfig": "apps.openshift.io/v1",
"Route": "route.openshift.io/v1",
}
class OpenShiftMigrateTemplateInstances(AnsibleOpenshiftModule):
def __init__(self, **kwargs):
super(OpenShiftMigrateTemplateInstances, self).__init__(**kwargs)
def patch_template_instance(self, resource, templateinstance):
result = None
try:
result = resource.status.patch(templateinstance)
except Exception as exc:
self.fail_json(
msg="Failed to migrate TemplateInstance {0} due to: {1}".format(
templateinstance["metadata"]["name"], to_native(exc)
)
)
return result.to_dict()
@staticmethod
def perform_migrations(templateinstances):
ti_list = []
ti_to_be_migrated = []
ti_list = (
templateinstances.get("kind") == "TemplateInstanceList"
and templateinstances.get("items")
or [templateinstances]
)
for ti_elem in ti_list:
objects = ti_elem["status"].get("objects")
if objects:
for i, obj in enumerate(objects):
object_type = obj["ref"]["kind"]
if (
object_type in transforms.keys()
and obj["ref"].get("apiVersion") != transforms[object_type]
):
ti_elem["status"]["objects"][i]["ref"]["apiVersion"] = (
transforms[object_type]
)
ti_to_be_migrated.append(ti_elem)
return ti_to_be_migrated
def execute_module(self):
templateinstances = None
namespace = self.params.get("namespace")
results = {"changed": False, "result": []}
resource = self.find_resource(
"templateinstances", "template.openshift.io/v1", fail=True
)
if namespace:
# Get TemplateInstances from a provided namespace
try:
templateinstances = resource.get(namespace=namespace).to_dict()
except DynamicApiError as exc:
self.fail_json(
msg="Failed to retrieve TemplateInstances in namespace '{0}': {1}".format(
namespace, exc.body
),
error=exc.status,
status=exc.status,
reason=exc.reason,
)
except Exception as exc:
self.fail_json(
msg="Failed to retrieve TemplateInstances in namespace '{0}': {1}".format(
namespace, to_native(exc)
),
error="",
status="",
reason="",
)
else:
# Get TemplateInstances from all namespaces
templateinstances = resource.get().to_dict()
ti_to_be_migrated = self.perform_migrations(templateinstances)
if ti_to_be_migrated:
if self.check_mode:
self.exit_json(**{"changed": True, "result": ti_to_be_migrated})
else:
for ti_elem in ti_to_be_migrated:
results["result"].append(
self.patch_template_instance(resource, ti_elem)
)
results["changed"] = True
self.exit_json(**results)
def argspec():
argument_spec = {}
argument_spec.update(AUTH_ARG_SPEC)
argument_spec.update(WAIT_ARG_SPEC)
argument_spec["namespace"] = dict(type="str")
return argument_spec
def main():
argument_spec = argspec()
module = OpenShiftMigrateTemplateInstances(
argument_spec=argument_spec, supports_check_mode=True
)
module.run_module()
if __name__ == "__main__":
main()