From 2c9b617b883af83350f5c41916ba9d34dd91f56b Mon Sep 17 00:00:00 2001 From: Kevin Smith Date: Thu, 1 Nov 2018 15:38:20 -0400 Subject: [PATCH] Kubernetes, VIM label support Changes include: -Sysinv will inform VIM when Kubernetes labels change. -Prep Sysinv semantic checks on label addition. Change-Id: If1f81eafc50af3dd310d7592dab56de0dc102f02 Story: 2002843 Task: 27752 Signed-off-by: Kevin Smith --- .../sysinv/sysinv/api/controllers/v1/label.py | 43 +++++++++++++++++++ .../sysinv/api/controllers/v1/vim_api.py | 31 +++++++++++++ 2 files changed, 74 insertions(+) diff --git a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/label.py b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/label.py index 4faefcf168..f44a9ad026 100644 --- a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/label.py +++ b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/label.py @@ -12,6 +12,8 @@ from sysinv.api.controllers.v1 import base from sysinv.api.controllers.v1 import collection from sysinv.api.controllers.v1 import types from sysinv.api.controllers.v1 import utils +from sysinv.api.controllers.v1 import vim_api +from sysinv.common import constants from sysinv.common import exception from sysinv.common import utils as cutils from sysinv.openstack.common import excutils @@ -196,6 +198,8 @@ class LabelController(rest.RestController): LOG.info("patch_data: %s" % body) host = objects.host.get_by_uuid(pecan.request.context, uuid) + _check_host_locked(host) + try: pecan.request.rpcapi.update_kubernetes_label( pecan.request.context, @@ -215,12 +219,24 @@ class LabelController(rest.RestController): 'label_key': key, 'label_value': value } + try: new_label = pecan.request.dbapi.label_create(uuid, values) new_records.append(new_label) except exception.HostLabelAlreadyExists: pass + try: + vim_api.vim_host_update( + None, + uuid, + host.hostname, + constants.VIM_DEFAULT_TIMEOUT_IN_SECS) + except Exception as e: + LOG.warn(_("No response vim_api host:%s e=%s" % + (host.hostname, e))) + pass + return LabelCollection.convert_with_links( new_records, limit=None, url=None, expand=False, sort_key='id', sort_dir='asc') @@ -236,6 +252,8 @@ class LabelController(rest.RestController): host = objects.host.get_by_uuid(pecan.request.context, lbl_obj.host_id) label_dict = {lbl_obj.label_key: None} + _check_host_locked(host) + try: pecan.request.rpcapi.update_kubernetes_label( pecan.request.context, @@ -253,3 +271,28 @@ class LabelController(rest.RestController): msg = _("Delete host label failed: host %s label %s=%s" % (host.hostname, lbl_obj.label_key, lbl_obj.label_value)) raise wsme.exc.ClientSideError(msg) + + try: + vim_api.vim_host_update( + None, + host.uuid, + host.hostname, + constants.VIM_DEFAULT_TIMEOUT_IN_SECS) + except Exception as e: + LOG.warn(_("No response vim_api host:%s e=%s" % + (host.hostname, e))) + pass + + +########### +# UTILS +########### +def _check_host_locked(host): + + # TODO(ksmith): + # turn this on later + return + + if (utils.is_aio_simplex_host_unlocked(host) or + host.administrative != constants.ADMIN_LOCKED): + raise wsme.exc.ClientSideError(_("Host must be locked.")) diff --git a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/vim_api.py b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/vim_api.py index 1a1c930efd..73d54547cb 100644 --- a/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/vim_api.py +++ b/sysinv/sysinv/sysinv/sysinv/api/controllers/v1/vim_api.py @@ -217,3 +217,34 @@ def vim_host_get_instances(token, uuid, hostname, timeout): response = rest_api_request(token, "GET", api_cmd, api_cmd_headers, json.dumps(api_cmd_payload), timeout) return response + + +def vim_host_update(token, uuid, hostname, timeout): + """ + Inform VIM of host change + """ + + api_cmd = None + if token: + api_cmd = token.get_service_url("nfvi", "nfv") + + if not api_cmd: + api_cmd = "http://localhost:30001" + + api_cmd += "/nfvi-plugins/v1/hosts" + + api_cmd_headers = dict() + api_cmd_headers['Content-type'] = "application/json" + api_cmd_headers['User-Agent'] = "sysinv/1.0" + + api_cmd_payload = dict() + api_cmd_payload['uuid'] = uuid + api_cmd_payload['hostname'] = hostname + + response = rest_api_request(token, "PATCH", api_cmd, api_cmd_headers, + json.dumps(api_cmd_payload), timeout) + + LOG.debug("vim_host_update api_cmd=%s headers=%s payload=%s" % + (api_cmd, api_cmd_headers, api_cmd_payload)) + + return response