X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FN2VC.git;a=blobdiff_plain;f=n2vc%2Fk8s_helm_conn.py;h=01b448b7e97350823f4c7cae81bb0a4874495bea;hp=2b15d76151bfecd9c1c4872fd2a3308354a858e7;hb=refs%2Ftags%2Fv7.0.1rc3;hpb=1be063005248b51228cca94c7b5dd807ead01368 diff --git a/n2vc/k8s_helm_conn.py b/n2vc/k8s_helm_conn.py index 2b15d76..01b448b 100644 --- a/n2vc/k8s_helm_conn.py +++ b/n2vc/k8s_helm_conn.py @@ -30,6 +30,7 @@ import yaml from uuid import uuid4 import random from n2vc.k8s_conn import K8sConnector +from n2vc.exceptions import K8sException class K8sHelmConnector(K8sConnector): @@ -101,6 +102,17 @@ class K8sHelmConnector(K8sConnector): namespace: str = 'kube-system', reuse_cluster_uuid=None ) -> (str, bool): + """ + It prepares a given K8s cluster environment to run Charts on both sides: + client (OSM) + server (Tiller) + + :param k8s_creds: credentials to access a given K8s cluster, i.e. a valid '.kube/config' + :param namespace: optional namespace to be used for helm. By default, 'kube-system' will be used + :param reuse_cluster_uuid: existing cluster uuid for reuse + :return: uuid of the K8s cluster and True if connector has installed some software in the cluster + (on error, an exception will be raised) + """ cluster_uuid = reuse_cluster_uuid if not cluster_uuid: @@ -258,7 +270,7 @@ class K8sHelmConnector(K8sConnector): msg = 'Cluster has releases and not force. Cannot reset K8s environment. Cluster uuid: {}'\ .format(cluster_uuid) self.error(msg) - raise Exception(msg) + raise K8sException(msg) if uninstall_sw: @@ -280,7 +292,6 @@ class K8sHelmConnector(K8sConnector): else: msg = 'Tiller deployment not found in cluster {}'.format(cluster_uuid) self.error(msg) - # raise Exception(msg) self.debug('namespace for tiller: {}'.format(namespace)) @@ -346,7 +357,7 @@ class K8sHelmConnector(K8sConnector): version_str = '--version {}'.format(parts[1]) kdu_model = parts[0] - # generate a name for the releas. Then, check if already exists + # generate a name for the release. Then, check if already exists kdu_instance = None while kdu_instance is None: kdu_instance = K8sHelmConnector._generate_release_name(kdu_model) @@ -413,7 +424,7 @@ class K8sHelmConnector(K8sConnector): if rc != 0: msg = 'Error executing command: {}\nOutput: {}'.format(command, output) self.error(msg) - raise Exception(msg) + raise K8sException(msg) self.debug('Returning kdu_instance {}'.format(kdu_instance)) return kdu_instance @@ -534,7 +545,7 @@ class K8sHelmConnector(K8sConnector): if rc != 0: msg = 'Error executing command: {}\nOutput: {}'.format(command, output) self.error(msg) - raise Exception(msg) + raise K8sException(msg) # return new revision number instance = await self.get_instance_info(cluster_uuid=cluster_uuid, kdu_instance=kdu_instance) @@ -599,7 +610,7 @@ class K8sHelmConnector(K8sConnector): if rc != 0: msg = 'Error executing command: {}\nOutput: {}'.format(command, output) self.error(msg) - raise Exception(msg) + raise K8sException(msg) # return new revision number instance = await self.get_instance_info(cluster_uuid=cluster_uuid, kdu_instance=kdu_instance) @@ -770,6 +781,15 @@ class K8sHelmConnector(K8sConnector): def _generate_release_name( chart_name: str ): + # check embeded chart (file or dir) + if chart_name.startswith('/'): + # extract file or directory name + chart_name = chart_name[chart_name.rfind('/')+1:] + # check URL + elif '://' in chart_name: + # extract last portion of URL + chart_name = chart_name[chart_name.rfind('/')+1:] + name = '' for c in chart_name: if c.isalpha() or c.isnumeric(): @@ -788,7 +808,7 @@ class K8sHelmConnector(K8sConnector): def get_random_number(): r = random.randrange(start=1, stop=99999999) s = str(r) - s = s.rjust(width=10, fillchar=' ') + s = s.rjust(10, '0') return s name = name + get_random_number() @@ -1004,7 +1024,7 @@ class K8sHelmConnector(K8sConnector): if not os.path.exists(cluster_dir): msg = 'Base cluster dir {} does not exist'.format(cluster_dir) self.error(msg) - raise Exception(msg) + raise K8sException(msg) # kube dir kube_dir = cluster_dir + '/' + '.kube' @@ -1014,7 +1034,7 @@ class K8sHelmConnector(K8sConnector): if not os.path.exists(kube_dir): msg = 'Kube config dir {} does not exist'.format(kube_dir) self.error(msg) - raise Exception(msg) + raise K8sException(msg) # helm home dir helm_dir = cluster_dir + '/' + '.helm' @@ -1024,7 +1044,7 @@ class K8sHelmConnector(K8sConnector): if not os.path.exists(helm_dir): msg = 'Helm config dir {} does not exist'.format(helm_dir) self.error(msg) - raise Exception(msg) + raise K8sException(msg) config_filename = kube_dir + '/config' return kube_dir, helm_dir, config_filename, cluster_dir @@ -1105,7 +1125,10 @@ class K8sHelmConnector(K8sConnector): msg = 'Exception executing command: {} -> {}'.format(command, e) if show_error_log: self.error(msg) - return '', -1 + if raise_exception_on_error: + raise e + else: + return '', -1 def _remote_exec( self, @@ -1143,4 +1166,4 @@ class K8sHelmConnector(K8sConnector): msg = 'File {} does not exist'.format(filename) if exception_if_not_exists: self.error(msg) - raise Exception(msg) + raise K8sException(msg)