summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBin Yang <bin.yang@windriver.com>2020-02-25 18:57:28 +0800
committerBin Yang <bin.yang@windriver.com>2020-02-26 11:24:27 +0800
commit88f203e636918622360e4ebbdc7073ecf00655cf (patch)
tree4ca9a0eb7260c78fee7e0a8b7ddb9b2fe0d2d33a
parent12ab737b2f4117e67bebfd6f867ec243282ba396 (diff)
StarlingX registration should create connectivity to k8s plugin
Change-Id: I55bdb07849e10943a86dd788b40e2554faf4edb6 Issue-ID: MULTICLOUD-830 Signed-off-by: Bin Yang <bin.yang@windriver.com>
-rw-r--r--share/starlingx_base/registration/registration.py126
-rw-r--r--starlingx/requirements.txt2
-rw-r--r--windriver/requirements.txt2
3 files changed, 130 insertions, 0 deletions
diff --git a/share/starlingx_base/registration/registration.py b/share/starlingx_base/registration/registration.py
index 565799a0..c45db66b 100644
--- a/share/starlingx_base/registration/registration.py
+++ b/share/starlingx_base/registration/registration.py
@@ -17,6 +17,10 @@ import json
import uuid
import traceback
+import requests
+
+from ruamel import yaml
+
from django.conf import settings
from newton_base.registration import registration as newton_registration
@@ -252,6 +256,14 @@ class RegistryHelper(newton_registration.RegistryHelper):
except Exception as e:
self._logger.debug("update cloud region fails %s" % str(e))
+ # update k8s connectivity
+ try:
+ self._update_k8s_info(cloud_owner, cloud_region_id, viminfo,
+ cloud_extra_info, sess)
+ except Exception as e:
+ self.__logger.debug("update k8s info failes %s" % str(e))
+ # continue the registration without reporting error
+
try:
return super(RegistryHelper, self).registryV0(vimid, project_idorname)
except Exception as e:
@@ -290,6 +302,7 @@ class RegistryHelper(newton_registration.RegistryHelper):
})
return instruction_capability
+
def _update_cloud_region(self, cloud_owner, cloud_region_id, openstack_region_id, viminfo, session=None):
if cloud_owner and cloud_region_id:
self._logger.debug(
@@ -419,6 +432,119 @@ class RegistryHelper(newton_registration.RegistryHelper):
return []
+ def _update_k8s_info(self, cloud_owner, cloud_region_id,
+ viminfo, cloud_extra_info, session=None):
+ try:
+ vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
+
+ # check system version of starlingx
+ systeminfo = self._get_list_resources(
+ "/isystems", "platform", session, viminfo, vimid,
+ "isystems")
+ systemversion = systeminfo[0].get("software_version", None) if systeminfo else None
+ if not systemversion:
+ self._logger.warn("query system version fails")
+ return
+
+ # check if a k8s platform
+ is_k8s_cluster = False
+ # check WRCP versions:
+ if systemversion == "19.12":
+ is_k8s_cluster = True
+ elif systemversion == "19.10":
+ is_k8s_cluster = True
+
+ if not is_k8s_cluster:
+ self._logger.info("%s, %s is not a k8s platform, system version: %s"
+ % (cloud_owner, cloud_region_id, systemversion))
+ return
+
+ # check if user token provided to access k8s platform
+ k8s_apitoken = cloud_extra_info.get(
+ "k8s-apitoken", None) if cloud_extra_info else None
+ k8s_apiserver = cloud_extra_info.get(
+ "k8s-apiserver", None) if cloud_extra_info else None
+ if not k8s_apitoken:
+ self._logger.warn("k8s-apitoken is not provided,"\
+ "k8s connectivity must be provisioned in other ways")
+ return
+
+ if not k8s_apiserver:
+ self._logger.warn("k8s-apiserver is not provided,"\
+ "k8s connectivity must be provisioned in other ways")
+ return
+
+ # now create kube config
+ kubecfgdata = {
+ "apiVersion": "v1",
+ "clusters":
+ [
+ {"cluster": {
+ "insecure-skip-tls-verify": True,
+ "server": k8s_apiserver
+ },
+ "name": "wrcpcluster"}
+ ],
+ "contexts":
+ [
+ {"context": {
+ "cluster": "wrcpcluster",
+ "namespace": "default",
+ "user": "admin-user"},
+ "name": "wrcpcluster-admin"}
+ ],
+ "current-context": "wrcpcluster-admin",
+ "kind": "Config",
+ "preferences": {},
+ "users":
+ [
+ {"name": "admin-user",
+ "user":{
+ "token": k8s_apitoken
+ }}
+ ]
+ }
+
+ kubecfgfilepath = "/tmp/k8sconfig_%s_%s" % (cloud_owner, cloud_region_id)
+
+ # encoding = utf-8 by default
+ with open(kubecfgfilepath, "w") as kubecfgfile:
+ yaml.dump(kubecfgdata, kubecfgfile, Dumper=yaml.RoundTripDumper)
+
+ # now create connectivity to multicloud-k8s
+ multicloudK8sUrl = "%s://%s:%s/api/multicloud-k8s/v1" % (
+ settings.MSB_SERVICE_PROTOCOL, settings.MSB_SERVICE_ADDR, settings.MSB_SERVICE_PORT)
+ auth_api_url = "/v1/connectivity-info"
+
+ metadata1 = {
+ "cloud-owner" : cloud_owner,
+ "cloud-region" : cloud_region_id,
+ "other-connectivity-list" : {}
+ }
+
+ with open(kubecfgfilepath, "rb") as kubecfgfile:
+ files = {
+ 'metadata': (None, json.dumps(metadata1)),
+ 'file': kubecfgfile
+ }
+
+ resp = requests.post(multicloudK8sUrl+auth_api_url, files=files, verify=False)
+ if resp.status_code == 201:
+ self._logger.info("create k8sconnectivity for %s, %s, succeeds: %s"
+ % (cloud_owner, cloud_region_id, resp.content))
+ else:
+ self._logger.warn("create k8sconnectivity for %s, %s, fails:%s"
+ % (cloud_owner, cloud_region_id, resp.content))
+ #print(resp.content, resp.status_code)
+
+ except HttpError as e:
+ self._logger.error("HttpError: status:%s, response:%s"
+ % (e.http_status, e.response.json()))
+ return []
+ except Exception:
+ self._logger.error(traceback.format_exc())
+ return []
+
class InfraResourceAuditor(newton_registration.RegistryHelper):
def __init__(self, multicloud_prefix, aai_base_url):
diff --git a/starlingx/requirements.txt b/starlingx/requirements.txt
index 854d64b9..e92acdad 100644
--- a/starlingx/requirements.txt
+++ b/starlingx/requirements.txt
@@ -25,6 +25,8 @@ keystoneauth1==2.18.0
# python-memcached
python-memcached
+ruamel.yaml==0.16.10
+
# uwsgi for parallel processing
# uwsgi
diff --git a/windriver/requirements.txt b/windriver/requirements.txt
index bad5c0d4..19e9b1eb 100644
--- a/windriver/requirements.txt
+++ b/windriver/requirements.txt
@@ -11,6 +11,8 @@ keystoneauth1==2.18.0
# python-memcached
python-memcached
+ruamel.yaml==0.16.10
+
# uwsgi for parallel processing
# uwsgi