import concurrent
import os
import uuid
+import yaml
import juju
from juju.controller import Controller
+from juju.model import Model
from n2vc.exceptions import K8sException
from n2vc.k8s_conn import K8sConnector
-import yaml
-
+from n2vc.kubectl import Kubectl
from .exceptions import MethodNotImplemented
in the package>
- <URL_where_to_fetch_juju_bundle>
"""
-
- previous_workdir = os.getcwd()
+ try:
+ previous_workdir = os.getcwd()
+ except FileNotFoundError:
+ previous_workdir = "/app/storage"
bundle = kdu_model
if kdu_model.startswith("cs:"):
return status
+ async def get_services(
+ self, cluster_uuid: str, kdu_instance: str, namespace: str
+ ) -> list:
+ """Return a list of services of a kdu_instance"""
+
+ config_file = self.get_config_file(cluster_uuid=cluster_uuid)
+ kubectl = Kubectl(config_file=config_file)
+ return kubectl.get_services(
+ field_selector="metadata.namespace={}".format(kdu_instance)
+ )
+
+ async def get_service(
+ self, cluster_uuid: str, service_name: str, namespace: str
+ ) -> object:
+ """Return data for a specific service inside a namespace"""
+
+ config_file = self.get_config_file(cluster_uuid=cluster_uuid)
+ kubectl = Kubectl(config_file=config_file)
+
+ return kubectl.get_services(
+ field_selector="metadata.name={},metadata.namespace={}".format(
+ service_name, namespace
+ )
+ )[0]
+
# Private methods
async def add_k8s(self, cloud_name: str, credentials: str,) -> bool:
"""Add a k8s cloud to Juju
return True
- async def add_model(self, model_name: str, cluster_uuid: str,) -> juju.model.Model:
+ async def add_model(self, model_name: str, cluster_uuid: str,) -> Model:
"""Adds a model to the controller
Adds a new model to the Juju controller
"Adding model '{}' to cluster_uuid '{}'".format(model_name, cluster_uuid)
)
try:
- model = await self.controller.add_model(
- model_name, config={"authorized-keys": self.juju_public_key}
- )
+ if self.juju_public_key is not None:
+ model = await self.controller.add_model(
+ model_name, config={"authorized-keys": self.juju_public_key}
+ )
+ else:
+ model = await self.controller.add_model(model_name)
except Exception as ex:
self.log.debug(ex)
self.log.debug("Caught exception: {}".format(ex))
if "already exists" not in stderr:
raise Exception(stderr)
+ def get_config_file(self, cluster_uuid: str) -> str:
+ """
+ Get Cluster Kubeconfig location
+ """
+ return "{}/{}/.kube/config".format(self.fs.path, cluster_uuid)
+
def get_config(self, cluster_uuid: str,) -> dict:
"""Get the cluster configuration
"Unable to locate configuration for cluster {}".format(cluster_uuid)
)
- async def get_model(self, model_name: str, cluster_uuid: str,) -> juju.model.Model:
+ async def get_model(self, model_name: str, cluster_uuid: str,) -> Model:
"""Get a model from the Juju Controller.
Note: Model objects returned must call disconnected() before it goes