)
# helm repo update
- command = "env KUBECONFIG={} {} repo update".format(
- paths["kube_config"], self._helm_command
+ command = "env KUBECONFIG={} {} repo update {}".format(
+ paths["kube_config"], self._helm_command, name
+ )
+ self.log.debug("updating repo: {}".format(command))
+ await self._local_async_exec(
+ command=command, raise_exception_on_error=False, env=env
+ )
+
+ # sync fs
+ self.fs.reverse_sync(from_path=cluster_uuid)
+
+ async def repo_update(self, cluster_uuid: str, name: str, repo_type: str = "chart"):
+ self.log.debug(
+ "Cluster {}, updating {} repository {}".format(
+ cluster_uuid, repo_type, name
+ )
+ )
+
+ # init_env
+ paths, env = self._init_paths_env(
+ cluster_name=cluster_uuid, create_if_not_exist=True
)
+
+ # sync local dir
+ self.fs.sync(from_path=cluster_uuid)
+
+ # helm repo update
+ command = "{} repo update {}".format(self._helm_command, name)
self.log.debug("updating repo: {}".format(command))
await self._local_async_exec(
command=command, raise_exception_on_error=False, env=env
return True
+ def _is_helm_chart_a_file(self, chart_name: str):
+ return chart_name.count("/") > 1
+
async def _install_impl(
self,
cluster_id: str,
# version
kdu_model, version = self._split_version(kdu_model)
+ repo = self._split_repo(kdu_model)
+ if repo:
+ self.repo_update(cluster_id, repo)
+
command = self._get_install_command(
kdu_model,
kdu_instance,
# version
kdu_model, version = self._split_version(kdu_model)
+ repo = self._split_repo(kdu_model)
+ if repo:
+ self.repo_update(cluster_uuid, repo)
+
command = self._get_upgrade_command(
kdu_model,
kdu_instance,
kdu_model, version = self._split_version(kdu_model)
repo_url = await self._find_repo(kdu_model, cluster_uuid)
- if not repo_url:
- raise K8sException(
- "Repository not found for kdu_model {}".format(kdu_model)
- )
_, replica_str = await self._get_replica_count_url(
kdu_model, repo_url, resource_name
cluster_uuid: The UUID of the cluster
resource_name: Resource name
kdu_instance: KDU instance name
- kdu_model: The name or path of a bundle
+ kdu_model: The name or path of an Helm Chart
kwargs: Additional parameters
Returns:
)
replicas = await self._get_replica_count_instance(
- kdu_instance, instance_info["namespace"], paths["kube_config"]
+ kdu_instance=kdu_instance,
+ namespace=instance_info["namespace"],
+ kubeconfig=paths["kube_config"],
+ resource_name=resource_name,
)
# Get default value if scale count is not found from provided values
if not replicas:
- repo_url = await self._find_repo(kdu_model, cluster_uuid)
- if not repo_url:
- raise K8sException(
- "Repository not found for kdu_model {}".format(kdu_model)
- )
-
+ repo_url = await self._find_repo(
+ kdu_model=kdu_model, cluster_uuid=cluster_uuid
+ )
replicas, _ = await self._get_replica_count_url(
- kdu_model, repo_url, resource_name
+ kdu_model=kdu_model, repo_url=repo_url, resource_name=resource_name
)
if not replicas:
self.log.debug("Instance {} not found".format(kdu_instance))
return None
+ async def upgrade_charm(
+ self,
+ ee_id: str = None,
+ path: str = None,
+ charm_id: str = None,
+ charm_type: str = None,
+ timeout: float = None,
+ ) -> str:
+ """This method upgrade charms in VNFs
+
+ Args:
+ ee_id: Execution environment id
+ path: Local path to the charm
+ charm_id: charm-id
+ charm_type: Charm type can be lxc-proxy-charm, native-charm or k8s-proxy-charm
+ timeout: (Float) Timeout for the ns update operation
+
+ Returns:
+ The output of the update operation if status equals to "completed"
+ """
+ raise K8sException("KDUs deployed with Helm do not support charm upgrade")
+
async def exec_primitive(
self,
cluster_uuid: str = None,
)
async def values_kdu(self, kdu_model: str, repo_url: str = None) -> str:
+ """Method to obtain the Helm Chart package's values
+
+ Args:
+ kdu_model: The name or path of an Helm Chart
+ repo_url: Helm Chart repository url
+
+ Returns:
+ str: the values of the Helm Chart package
+ """
self.log.debug(
"inspect kdu_model values {} from (optional) repo: {}".format(
def _get_inspect_command(
self, show_command: str, kdu_model: str, repo_str: str, version: str
):
- """
- Obtain command to be executed to obtain information about the kdu
+ """Generates the command to obtain the information about an Helm Chart package
+ (´helm show ...´ command)
+
+ Args:
+ show_command: the second part of the command (`helm show <show_command>`)
+ kdu_model: The name or path of an Helm Chart
+ repo_url: Helm Chart repository url
+ version: constraint with specific version of the Chart to use
+
+ Returns:
+ str: the generated Helm Chart command
"""
@abc.abstractmethod
async def _exec_inspect_command(
self, inspect_command: str, kdu_model: str, repo_url: str = None
):
- """Obtains information about a kdu, no cluster (no env)."""
+ """Obtains information about an Helm Chart package (´helm show´ command)
+
+ Args:
+ inspect_command: the Helm sub command (`helm show <inspect_command> ...`)
+ kdu_model: The name or path of an Helm Chart
+ repo_url: Helm Chart repository url
+
+ Returns:
+ str: the requested info about the Helm Chart package
+ """
repo_str = ""
if repo_url:
async def _get_replica_count_url(
self,
kdu_model: str,
- repo_url: str,
+ repo_url: str = None,
resource_name: str = None,
):
"""Get the replica count value in the Helm Chart Values.
Args:
- kdu_model: The name or path of a bundle
+ kdu_model: The name or path of an Helm Chart
repo_url: Helm Chart repository url
resource_name: Resource name
"""
kdu_values = yaml.load(
- await self.values_kdu(kdu_model, repo_url), Loader=yaml.SafeLoader
+ await self.values_kdu(kdu_model=kdu_model, repo_url=repo_url),
+ Loader=yaml.SafeLoader,
)
if not kdu_values:
for key in params:
value = params.get(key)
if "!!yaml" in str(value):
- value = yaml.load(value[7:])
+ value = yaml.safe_load(value[7:])
params2[key] = value
values_file = get_random_number() + ".yaml"
def _split_version(self, kdu_model: str) -> (str, str):
version = None
- if ":" in kdu_model:
+ if not self._is_helm_chart_a_file(kdu_model) and ":" in kdu_model:
parts = kdu_model.split(sep=":")
if len(parts) == 2:
version = str(parts[1])
kdu_model = parts[0]
return kdu_model, version
+ async def _split_repo(self, kdu_model: str) -> str:
+ repo_name = None
+ idx = kdu_model.find("/")
+ if idx >= 0:
+ repo_name = kdu_model[:idx]
+ return repo_name
+
async def _find_repo(self, kdu_model: str, cluster_uuid: str) -> str:
+ """Obtain the Helm repository for an Helm Chart
+
+ Args:
+ kdu_model (str): the KDU model associated with the Helm Chart instantiation
+ cluster_uuid (str): The cluster UUID associated with the Helm Chart instantiation
+
+ Returns:
+ str: the repository URL; if Helm Chart is a local one, the function returns None
+ """
+
repo_url = None
idx = kdu_model.find("/")
if idx >= 0: