config/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/kube_cmd_version.py

89 lines
2.9 KiB
Python

#
# Copyright (c) 2021 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
import jsonpatch
import pecan
from pecan import rest
import wsme
from wsme import types as wtypes
import wsmeext.pecan as wsme_pecan
from oslo_log import log
from sysinv._i18n import _
from sysinv.api.controllers.v1 import base
from sysinv.api.controllers.v1 import types
from sysinv.api.controllers.v1 import utils
from sysinv.common import exception
from sysinv.common import utils as cutils
from sysinv import objects
LOG = log.getLogger(__name__)
LOCK_NAME = 'KubeCmdVersionController'
class KubeCmdVersionPatchType(types.JsonPatchType):
@staticmethod
def mandatory_attrs():
return ['/kubeadm_version', '/kubelet_version']
class KubeCmdVersion(base.APIBase):
"""API representation of a k8s cmd version."""
kubeadm_version = wtypes.text
"Kubeadm version for this entry"
kubelet_version = wtypes.text
"Kubelet version for this entry"
def __init__(self, **kwargs):
self.fields = objects.kube_cmd_version.fields
for k in self.fields:
if not hasattr(self, k):
continue
setattr(self, k, kwargs.get(k, wtypes.Unset))
@classmethod
def convert_with_links(cls, rpc_kube_cmd_version):
kube_version = KubeCmdVersion(**rpc_kube_cmd_version.as_dict())
return kube_version
class KubeCmdVersionController(rest.RestController):
"""REST controller for Kubernetes Cmd Versions."""
@wsme_pecan.wsexpose(KubeCmdVersion)
def get(self):
"""Get the kube cmd version object"""
kube_cmd_version = objects.kube_cmd_version.get(pecan.request.context)
return KubeCmdVersion.convert_with_links(kube_cmd_version)
@cutils.synchronized(LOCK_NAME)
@wsme_pecan.wsexpose(KubeCmdVersion, body=[KubeCmdVersionPatchType])
def patch(self, patch):
"""Modify the kube cmd version object"""
try:
utils.validate_patch(patch)
patch_obj = jsonpatch.JsonPatch(patch)
kube_cmd_version = objects.kube_cmd_version.get(pecan.request.context)
kube_cmd_version_patched = KubeCmdVersion(**jsonpatch.apply_patch(
kube_cmd_version.as_dict(),
patch_obj))
# Update only the fields that have changed
for field in objects.kube_cmd_version.fields:
if kube_cmd_version[field] != getattr(kube_cmd_version_patched, field):
kube_cmd_version[field] = getattr(kube_cmd_version_patched, field)
kube_cmd_version.save()
except utils.JSONPATCH_EXCEPTIONS as e:
raise exception.PatchError(patch=patch, reason=e)
except Exception as e:
LOG.exception(e)
raise wsme.exc.ClientSideError(_(
"Unable modify the KubeCmdVersion object."))
return KubeCmdVersion.convert_with_links(kube_cmd_version)