projects
/
osm
/
N2VC.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
adding optional namespace to K8s install
[osm/N2VC.git]
/
n2vc
/
k8s_juju_conn.py
diff --git
a/n2vc/k8s_juju_conn.py
b/n2vc/k8s_juju_conn.py
index
9bc5d40
..
550ad12
100644
(file)
--- a/
n2vc/k8s_juju_conn.py
+++ b/
n2vc/k8s_juju_conn.py
@@
-23,8
+23,6
@@
from juju.controller import Controller
from juju.model import Model
from juju.errors import JujuAPIError, JujuError
from juju.model import Model
from juju.errors import JujuAPIError, JujuError
-import logging
-
from n2vc.k8s_conn import K8sConnector
import os
from n2vc.k8s_conn import K8sConnector
import os
@@
-44,7
+42,7
@@
class K8sJujuConnector(K8sConnector):
db: object,
kubectl_command: str = '/usr/bin/kubectl',
juju_command: str = '/usr/bin/juju',
db: object,
kubectl_command: str = '/usr/bin/kubectl',
juju_command: str = '/usr/bin/juju',
- log
=
None,
+ log
: object =
None,
on_update_db=None,
):
"""
on_update_db=None,
):
"""
@@
-64,16
+62,15
@@
class K8sJujuConnector(K8sConnector):
)
self.fs = fs
)
self.fs = fs
- self.
info
('Initializing K8S Juju connector')
+ self.
log.debug
('Initializing K8S Juju connector')
self.authenticated = False
self.models = {}
self.authenticated = False
self.models = {}
- self.log = logging.getLogger(__name__)
self.juju_command = juju_command
self.juju_secret = ""
self.juju_command = juju_command
self.juju_secret = ""
- self.
info
('K8S Juju connector initialized')
+ self.
log.debug
('K8S Juju connector initialized')
"""Initialization"""
async def init_env(
"""Initialization"""
async def init_env(
@@
-144,19
+141,19
@@
class K8sJujuConnector(K8sConnector):
# Name the new k8s cloud
k8s_cloud = "k8s-{}".format(cluster_uuid)
# Name the new k8s cloud
k8s_cloud = "k8s-{}".format(cluster_uuid)
-
print
("Adding k8s cloud {}".format(k8s_cloud))
+
self.log.debug
("Adding k8s cloud {}".format(k8s_cloud))
await self.add_k8s(k8s_cloud, k8s_creds)
# Bootstrap Juju controller
await self.add_k8s(k8s_cloud, k8s_creds)
# Bootstrap Juju controller
-
print
("Bootstrapping...")
+
self.log.debug
("Bootstrapping...")
await self.bootstrap(k8s_cloud, cluster_uuid, loadbalancer)
await self.bootstrap(k8s_cloud, cluster_uuid, loadbalancer)
-
print
("Bootstrap done.")
+
self.log.debug
("Bootstrap done.")
# Get the controller information
# Parse ~/.local/share/juju/controllers.yaml
# controllers.testing.api-endpoints|ca-cert|uuid
# Get the controller information
# Parse ~/.local/share/juju/controllers.yaml
# controllers.testing.api-endpoints|ca-cert|uuid
-
print
("Getting controller endpoints")
+
self.log.debug
("Getting controller endpoints")
with open(os.path.expanduser(
"~/.local/share/juju/controllers.yaml"
)) as f:
with open(os.path.expanduser(
"~/.local/share/juju/controllers.yaml"
)) as f:
@@
-168,7
+165,7
@@
class K8sJujuConnector(K8sConnector):
# Parse ~/.local/share/juju/accounts
# controllers.testing.user|password
# Parse ~/.local/share/juju/accounts
# controllers.testing.user|password
-
print
("Getting accounts")
+
self.log.debug
("Getting accounts")
with open(os.path.expanduser(
"~/.local/share/juju/accounts.yaml"
)) as f:
with open(os.path.expanduser(
"~/.local/share/juju/accounts.yaml"
)) as f:
@@
-178,11
+175,6
@@
class K8sJujuConnector(K8sConnector):
self.juju_user = controller['user']
self.juju_secret = controller['password']
self.juju_user = controller['user']
self.juju_secret = controller['password']
- print("user: {}".format(self.juju_user))
- print("secret: {}".format(self.juju_secret))
- print("endpoint: {}".format(self.juju_endpoint))
- print("ca-cert: {}".format(self.juju_ca_cert))
-
# raise Exception("EOL")
self.juju_public_key = None
# raise Exception("EOL")
self.juju_public_key = None
@@
-198,7
+190,7
@@
class K8sJujuConnector(K8sConnector):
# Store the cluster configuration so it
# can be used for subsequent calls
# Store the cluster configuration so it
# can be used for subsequent calls
-
print
("Setting config")
+
self.log.debug
("Setting config")
await self.set_config(cluster_uuid, config)
else:
await self.set_config(cluster_uuid, config)
else:
@@
-248,6
+240,16
@@
class K8sJujuConnector(K8sConnector):
):
raise NotImplemented()
):
raise NotImplemented()
+ async def synchronize_repos(
+ self,
+ cluster_uuid: str,
+ name: str
+ ):
+ """
+ Returns None as currently add_repo is not implemented
+ """
+ return None
+
"""Reset"""
async def reset(
self,
"""Reset"""
async def reset(
self,
@@
-271,26
+273,26
@@
class K8sJujuConnector(K8sConnector):
# Destroy the model
namespace = self.get_namespace(cluster_uuid)
if await self.has_model(namespace):
# Destroy the model
namespace = self.get_namespace(cluster_uuid)
if await self.has_model(namespace):
-
print
("[reset] Destroying model")
+
self.log.debug
("[reset] Destroying model")
await self.controller.destroy_model(
namespace,
destroy_storage=True
)
# Disconnect from the controller
await self.controller.destroy_model(
namespace,
destroy_storage=True
)
# Disconnect from the controller
-
print
("[reset] Disconnecting controller")
+
self.log.debug
("[reset] Disconnecting controller")
await self.logout()
# Destroy the controller (via CLI)
await self.logout()
# Destroy the controller (via CLI)
-
print
("[reset] Destroying controller")
+
self.log.debug
("[reset] Destroying controller")
await self.destroy_controller(cluster_uuid)
await self.destroy_controller(cluster_uuid)
-
print
("[reset] Removing k8s cloud")
+
self.log.debug
("[reset] Removing k8s cloud")
k8s_cloud = "k8s-{}".format(cluster_uuid)
await self.remove_cloud(k8s_cloud)
except Exception as ex:
k8s_cloud = "k8s-{}".format(cluster_uuid)
await self.remove_cloud(k8s_cloud)
except Exception as ex:
-
print
("Caught exception during reset: {}".format(ex))
+
self.log.debug
("Caught exception during reset: {}".format(ex))
return True
return True
@@
-304,7
+306,8
@@
class K8sJujuConnector(K8sConnector):
timeout: float = 300,
params: dict = None,
db_dict: dict = None,
timeout: float = 300,
params: dict = None,
db_dict: dict = None,
- kdu_name: str = None
+ kdu_name: str = None,
+ namespace: str = None
) -> bool:
"""Install a bundle
) -> bool:
"""Install a bundle
@@
-316,12
+319,13
@@
class K8sJujuConnector(K8sConnector):
to finish
:param params dict: Key-value pairs of instantiation parameters
:param kdu_name: Name of the KDU instance to be installed
to finish
:param params dict: Key-value pairs of instantiation parameters
:param kdu_name: Name of the KDU instance to be installed
+ :param namespace: K8s namespace to use for the KDU instance
:return: If successful, returns ?
"""
if not self.authenticated:
:return: If successful, returns ?
"""
if not self.authenticated:
-
print
("[install] Logging in to the controller")
+
self.log.debug
("[install] Logging in to the controller")
await self.login(cluster_uuid)
##
await self.login(cluster_uuid)
##
@@
-349,6
+353,8
@@
class K8sJujuConnector(K8sConnector):
- <URL_where_to_fetch_juju_bundle>
"""
- <URL_where_to_fetch_juju_bundle>
"""
+ previous_workdir = os.getcwd()
+
bundle = kdu_model
if kdu_model.startswith("cs:"):
bundle = kdu_model
bundle = kdu_model
if kdu_model.startswith("cs:"):
bundle = kdu_model
@@
-356,31
+362,30
@@
class K8sJujuConnector(K8sConnector):
# Download the file
pass
else:
# Download the file
pass
else:
- # Local file
+ new_workdir = kdu_model.strip(kdu_model.split("/")[-1])
- # if kdu_model.endswith(".tar.gz") or kdu_model.endswith(".tgz")
- # Uncompress temporarily
- # bundle = <uncompressed file>
- pass
+ os.chdir(new_workdir)
+
+ bundle = "local:{}".format(kdu_model)
if not bundle:
# Raise named exception that the bundle could not be found
raise Exception()
if not bundle:
# Raise named exception that the bundle could not be found
raise Exception()
-
print
("[install] deploying {}".format(bundle))
+
self.log.debug
("[install] deploying {}".format(bundle))
await model.deploy(bundle)
# Get the application
if atomic:
# applications = model.applications
await model.deploy(bundle)
# Get the application
if atomic:
# applications = model.applications
-
print
("[install] Applications: {}".format(model.applications))
+
self.log.debug
("[install] Applications: {}".format(model.applications))
for name in model.applications:
for name in model.applications:
-
print
("[install] Waiting for {} to settle".format(name))
+
self.log.debug
("[install] Waiting for {} to settle".format(name))
application = model.applications[name]
try:
# It's not enough to wait for all units to be active;
# the application status needs to be active as well.
application = model.applications[name]
try:
# It's not enough to wait for all units to be active;
# the application status needs to be active as well.
-
print
("Waiting for all units to be active...")
+
self.log.debug
("Waiting for all units to be active...")
await model.block_until(
lambda: all(
unit.agent_status == 'idle'
await model.block_until(
lambda: all(
unit.agent_status == 'idle'
@@
-391,18
+396,21
@@
class K8sJujuConnector(K8sConnector):
),
timeout=timeout
)
),
timeout=timeout
)
-
print
("All units active.")
+
self.log.debug
("All units active.")
- except concurrent.futures._base.TimeoutError:
- print("[install] Timeout exceeded; resetting cluster")
+ except concurrent.futures._base.TimeoutError: # TODO use asyncio.TimeoutError
+ os.chdir(previous_workdir)
+ self.log.debug("[install] Timeout exceeded; resetting cluster")
await self.reset(cluster_uuid)
return False
# Wait for the application to be active
if model.is_connected():
await self.reset(cluster_uuid)
return False
# Wait for the application to be active
if model.is_connected():
-
print
("[install] Disconnecting model")
+
self.log.debug
("[install] Disconnecting model")
await model.disconnect()
await model.disconnect()
+ os.chdir(previous_workdir)
+
return kdu_instance
raise Exception("Unable to install")
return kdu_instance
raise Exception("Unable to install")
@@
-475,9
+483,9
@@
class K8sJujuConnector(K8sConnector):
"""
# TODO: This should be returned in an agreed-upon format
for name in bundle['applications']:
"""
# TODO: This should be returned in an agreed-upon format
for name in bundle['applications']:
-
print
(model.applications)
+
self.log.debug
(model.applications)
application = model.applications[name]
application = model.applications[name]
-
print
(application)
+
self.log.debug
(application)
path = bundle['applications'][name]['charm']
path = bundle['applications'][name]['charm']
@@
-659,7
+667,7
@@
class K8sJujuConnector(K8sConnector):
"""
cmd = [self.juju_command, "add-k8s", "--local", cloud_name]
"""
cmd = [self.juju_command, "add-k8s", "--local", cloud_name]
-
print
(cmd)
+
self.log.debug
(cmd)
process = await asyncio.create_subprocess_exec(
*cmd,
process = await asyncio.create_subprocess_exec(
*cmd,
@@
-677,7
+685,7
@@
class K8sJujuConnector(K8sConnector):
return_code = process.returncode
return_code = process.returncode
-
print
("add-k8s return code: {}".format(return_code))
+
self.log.debug
("add-k8s return code: {}".format(return_code))
if return_code > 0:
raise Exception(stderr)
if return_code > 0:
raise Exception(stderr)
@@
-737,7
+745,7
@@
class K8sJujuConnector(K8sConnector):
"""
cmd = [self.juju_command, "bootstrap", cloud_name, cluster_uuid, "--config", "controller-service-type=loadbalancer"]
"""
cmd = [self.juju_command, "bootstrap", cloud_name, cluster_uuid, "--config", "controller-service-type=loadbalancer"]
-
print
("Bootstrapping controller {} in cloud {}".format(
+
self.log.debug
("Bootstrapping controller {} in cloud {}".format(
cluster_uuid, cloud_name
))
cluster_uuid, cloud_name
))
@@
-940,7
+948,7
@@
class K8sJujuConnector(K8sConnector):
self.authenticated = True
self.log.debug("JujuApi: Logged into controller")
except Exception as ex:
self.authenticated = True
self.log.debug("JujuApi: Logged into controller")
except Exception as ex:
-
print
(ex)
+
self.log.debug
(ex)
self.log.debug("Caught exception: {}".format(ex))
pass
else:
self.log.debug("Caught exception: {}".format(ex))
pass
else:
@@
-949,12
+957,12
@@
class K8sJujuConnector(K8sConnector):
async def logout(self):
"""Logout of the Juju controller."""
async def logout(self):
"""Logout of the Juju controller."""
-
print
("[logout]")
+
self.log.debug
("[logout]")
if not self.authenticated:
return False
for model in self.models:
if not self.authenticated:
return False
for model in self.models:
-
print
("Logging out of model {}".format(model))
+
self.log.debug
("Logging out of model {}".format(model))
await self.models[model].disconnect()
if self.controller:
await self.models[model].disconnect()
if self.controller:
@@
-1027,7
+1035,7
@@
class K8sJujuConnector(K8sConnector):
cluster_config = "{}/{}.yaml".format(self.fs.path, cluster_uuid)
if not os.path.exists(cluster_config):
cluster_config = "{}/{}.yaml".format(self.fs.path, cluster_uuid)
if not os.path.exists(cluster_config):
-
print
("Writing config to {}".format(cluster_config))
+
self.log.debug
("Writing config to {}".format(cluster_config))
with open(cluster_config, 'w') as f:
f.write(yaml.dump(config, Dumper=yaml.Dumper))
with open(cluster_config, 'w') as f:
f.write(yaml.dump(config, Dumper=yaml.Dumper))