namespace: str = 'kube-system',
reuse_cluster_uuid: str = None,
) -> (str, bool):
- """Initialize a Kubernetes environment
-
- :param k8s_creds dict: A dictionary containing the Kubernetes cluster
- configuration
- :param namespace str: The Kubernetes namespace to initialize
+ """
+ It prepares a given K8s cluster environment to run Juju bundles.
- :return: UUID of the k8s context or raises an exception
+ :param k8s_creds: credentials to access a given K8s cluster, i.e. a valid '.kube/config'
+ :param namespace: optional namespace to be used for juju. 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)
"""
"""Bootstrapping
# TODO: Pull info from db based on the namespace #
##################################################
+ ###################################################
+ # TODO: Make it idempotent, calling add-k8s and #
+ # bootstrap whenever reuse_cluster_uuid is passed #
+ # as parameter #
+ # `init_env` is called to initialize the K8s #
+ # cluster for juju. If this initialization fails, #
+ # it can be called again by LCM with the param #
+ # reuse_cluster_uuid, e.g. to try to fix it. #
+ ###################################################
+
if not reuse_cluster_uuid:
# This is a new cluster, so bootstrap it
loadbalancer = False if localk8s else True
# Name the new k8s cloud
- k8s_cloud = "{}-k8s".format(namespace)
+ k8s_cloud = "k8s-{}".format(cluster_uuid)
print("Adding k8s cloud {}".format(k8s_cloud))
await self.add_k8s(k8s_cloud, k8s_creds)
atomic: bool = True,
timeout: float = 300,
params: dict = None,
- db_dict: dict = None
+ db_dict: dict = None,
+ kdu_name: str = None
) -> bool:
"""Install a bundle
:param timeout int: The time, in seconds, to wait for the install
to finish
:param params dict: Key-value pairs of instantiation parameters
+ :param kdu_name: Name of the KDU instance to be installed
:return: If successful, returns ?
"""
##
# Get or create the model, based on the NS
# uuid.
- model_name = db_dict["filter"]["_id"]
+ if kdu_name:
+ kdu_instance = "{}-{}".format(kdu_name, db_dict["filter"]["_id"])
+ else:
+ kdu_instance = db_dict["filter"]["_id"]
- self.log.debug("Checking for model named {}".format(model_name))
- model = await self.get_model(model_name, cluster_uuid=cluster_uuid)
+ self.log.debug("Checking for model named {}".format(kdu_instance))
+ model = await self.get_model(kdu_instance, cluster_uuid=cluster_uuid)
if not model:
# Create the new model
- self.log.debug("Adding model: {}".format(model_name))
- model = await self.add_model(model_name, cluster_uuid=cluster_uuid)
+ self.log.debug("Adding model: {}".format(kdu_instance))
+ model = await self.add_model(kdu_instance, cluster_uuid=cluster_uuid)
if model:
# TODO: Instantiation parameters
print("[install] Disconnecting model")
await model.disconnect()
- return True
+ return kdu_instance
raise Exception("Unable to install")
async def instances_list(
async def uninstall(
self,
cluster_uuid: str,
- kdu_instance: str,
+ kdu_instance: str
) -> bool:
"""Uninstall a KDU instance
- :param cluster_uuid str: The UUID of the cluster to uninstall
+ :param cluster_uuid str: The UUID of the cluster
:param kdu_instance str: The unique name of the KDU instance
:return: Returns True if successful, or raises an exception
"""
- removed = False
-
- # Remove an application from the model
- model = await self.get_model(self.get_namespace(cluster_uuid), cluster_uuid=cluster_uuid)
-
- if model:
- # Get the application
- if kdu_instance not in model.applications:
- # TODO: Raise a named exception
- raise Exception("Application not found.")
+ await self.controller.destroy_models(kdu_instance)
- application = model.applications[kdu_instance]
-
- # Destroy the application
- await application.destroy()
-
- # TODO: Verify removal
-
- removed = True
- return removed
+ return True
"""Introspection"""
async def inspect_kdu(