Beispiel #1
0
def destroy_appliance_mode_cluster(cluster):
    """
    Delete rosa cluster if appliance mode

    Args:
        cluster: name of the cluster

    Returns:
        bool: True if appliance mode and cluster delete initiated
              else False
    """
    service_id = get_rosa_cluster_service_id(cluster)
    if not service_id:
        logger.info(f"Cluster does not exist in rosa list service. "
                    f"The cluster '{cluster}' is not appliance mode cluster. ")
        return False

    delete_service_cmd = f"rosa delete service --id={service_id} --yes"
    utils.run_cmd(delete_service_cmd, timeout=1200)
    logger.info("Waiting for ROSA cluster state changed to uninstalling")
    for cluster_info in utils.TimeoutSampler(1000, 90, ocm.get_cluster_details,
                                             cluster):
        status = cluster_info["status"]["state"]
        logger.info(f"Cluster uninstalling status: {status}")
        if status == "uninstalling":
            logger.info(f"Cluster '{cluster}' is uninstalling")
            break
    for service_status in utils.TimeoutSampler(1000, 30,
                                               get_rosa_service_details,
                                               cluster):
        if "deleting service" in service_status:
            logger.info("Rosa service status is 'deleting service'")
            break
    return True
Beispiel #2
0
def create_cluster(cluster_name, version):
    """
    Create OCP cluster.

    Args:
        cluster_name (str): Cluster name
        version (str): cluster version

    """
    rosa_ocp_version = get_latest_rosa_version(version)
    create_account_roles(version)
    region = config.DEPLOYMENT["region"]
    compute_nodes = config.ENV_DATA["worker_replicas"]
    compute_machine_type = config.ENV_DATA["worker_instance_type"]
    cmd = (
        f"rosa create cluster --cluster-name {cluster_name} --region {region} "
        f"--compute-nodes {compute_nodes} --mode auto --compute-machine-type "
        f"{compute_machine_type}  --version {rosa_ocp_version} --sts --yes")
    utils.run_cmd(cmd)
    logger.info("Waiting for installation of ROSA cluster")
    for cluster_info in utils.TimeoutSampler(4000, 30, ocm.get_cluster_details,
                                             cluster_name):
        status = cluster_info["status"]["state"]
        logger.info(f"Current installation status: {status}")
        if status == "ready":
            logger.info("Cluster was installed")
            break
    cluster_info = ocm.get_cluster_details(cluster_name)
    # Create metadata file to store the cluster name
    cluster_info["clusterName"] = cluster_name
    cluster_info["clusterID"] = cluster_info["id"]
    cluster_path = config.ENV_DATA["cluster_path"]
    metadata_file = os.path.join(cluster_path, "metadata.json")
    with open(metadata_file, "w+") as f:
        json.dump(cluster_info, f)
Beispiel #3
0
def install_odf_addon(cluster):
    """
    Install ODF Managed Service addon to cluster.

    Args:
        cluster (str): cluster name or cluster id

    """
    addon_name = config.DEPLOYMENT["addon_name"]
    size = config.ENV_DATA["size"]
    notification_email_0 = config.REPORTING.get("notification_email_0")
    notification_email_1 = config.REPORTING.get("notification_email_1")
    notification_email_2 = config.REPORTING.get("notification_email_2")
    cmd = f"rosa install addon --cluster={cluster} --size {size} {addon_name}" f" --yes"
    if notification_email_0:
        cmd = cmd + f" --notification-email-0 {notification_email_0}"
    if notification_email_1:
        cmd = cmd + f" --notification-email-1 {notification_email_1}"
    if notification_email_2:
        cmd = cmd + f" --notification-email-2 {notification_email_2}"

    utils.run_cmd(cmd)
    for addon_info in utils.TimeoutSampler(4000, 30, get_addon_info, cluster,
                                           addon_name):
        logger.info(f"Current addon installation info: " f"{addon_info}")
        if "ready" in addon_info:
            logger.info(f"Addon {addon_name} was installed")
            break
        if "failed" in addon_info:
            raise ManagedServiceAddonDeploymentError(
                f"Addon {addon_name} failed to be installed")
Beispiel #4
0
def delete_odf_addon(cluster):
    """
    Delete ODF Managed Service addon from cluster.

    Args:
        cluster (str): cluster name or cluster id

    """
    cluster_type = config.ENV_DATA.get("cluster_type", "")
    if cluster_type.lower() == "provider" and config.ENV_DATA.get(
            "appliance_mode"):
        logger.info("Addon uninstallation is not allowed for appliance mode"
                    " managed service. It can be changed after fix of "
                    "https://issues.redhat.com/browse/SDA-6011")
        # TODO : Update rosa delete service addon command after completion of jira SDA-6011
        return

    addon_name = config.ENV_DATA["addon_name"]
    cmd = f"rosa uninstall addon --cluster={cluster} {addon_name} --yes"
    utils.run_cmd(cmd)
    for addon_info in utils.TimeoutSampler(4000, 30, get_addon_info, cluster,
                                           addon_name):
        logger.info(f"Current addon installation info: " f"{addon_info}")
        if "not installed" in addon_info:
            logger.info(f"Addon {addon_name} was uninstalled")
            break
        if "failed" in addon_info:
            raise ManagedServiceAddonDeploymentError(
                f"Addon {addon_name} failed to be uninstalled")
Beispiel #5
0
def install_odf_addon(cluster):
    """
    Install ODF Managed Service addon to cluster.

    Args:
        cluster (str): cluster name or cluster id

    """
    addon_name = config.ENV_DATA["addon_name"]
    size = config.ENV_DATA["size"]
    cluster_type = config.ENV_DATA.get("cluster_type", "")
    provider_name = config.ENV_DATA.get("provider_name", "")
    notification_email_0 = config.REPORTING.get("notification_email_0")
    notification_email_1 = config.REPORTING.get("notification_email_1")
    notification_email_2 = config.REPORTING.get("notification_email_2")
    cmd = f"rosa install addon --cluster={cluster} --size {size} {addon_name}" f" --yes"
    if notification_email_0:
        cmd = cmd + f" --notification-email-0 {notification_email_0}"
    if notification_email_1:
        cmd = cmd + f" --notification-email-1 {notification_email_1}"
    if notification_email_2:
        cmd = cmd + f" --notification-email-2 {notification_email_2}"

    if cluster_type.lower() == "provider":
        public_key = config.AUTH.get("managed_service",
                                     {}).get("public_key", "")
        if not public_key:
            raise ConfigurationError(
                "Public key for Managed Service not defined.\n"
                "Expected following configuration in auth.yaml file:\n"
                "managed_service:\n"
                '  private_key: "..."\n'
                '  public_key: "..."')
        public_key_only = remove_header_footer_from_key(public_key)
        cmd += f' --onboarding-validation-key "{public_key_only}"'

    if cluster_type.lower() == "consumer" and provider_name:
        unit = config.ENV_DATA.get("unit", "Ti")
        storage_provider_endpoint = get_storage_provider_endpoint(
            provider_name)
        cmd += f' --unit "{unit}" --storage-provider-endpoint "{storage_provider_endpoint}"'
        onboarding_ticket = generate_onboarding_token()
        if onboarding_ticket:
            cmd += f' --onboarding-ticket "{onboarding_ticket}"'
        else:
            raise ValueError(" Invalid onboarding ticket configuration")

    utils.run_cmd(cmd, timeout=1200)
    for addon_info in utils.TimeoutSampler(7200, 30, get_addon_info, cluster,
                                           addon_name):
        logger.info(f"Current addon installation info: " f"{addon_info}")
        if "ready" in addon_info:
            logger.info(f"Addon {addon_name} was installed")
            break
        if "failed" in addon_info:
            raise ManagedServiceAddonDeploymentError(
                f"Addon {addon_name} failed to be installed")
Beispiel #6
0
def delete_odf_addon(cluster):
    """
    Delete ODF Managed Service addon from cluster.

    Args:
        cluster (str): cluster name or cluster id

    """
    addon_name = config.DEPLOYMENT["addon_name"]
    cmd = f"rosa uninstall addon --cluster={cluster} {addon_name} --yes"
    utils.run_cmd(cmd)
    for addon_info in utils.TimeoutSampler(4000, 30, get_addon_info, cluster,
                                           addon_name):
        logger.info(f"Current addon installation info: " f"{addon_info}")
        if "not installed" in addon_info:
            logger.info(f"Addon {addon_name} was uninstalled")
            break
        if "failed" in addon_info:
            raise ManagedServiceAddonDeploymentError(
                f"Addon {addon_name} failed to be uninstalled")
Beispiel #7
0
    def start_ec2_instance(self, instance_id, wait=False):
        """
        Starting an instance

        Args:
            instance_id (str): ID of the instance to start
            wait (bool): True in case wait for status is needed,
                False otherwise

        Returns:
            bool: True in case operation succeeded, False otherwise
        """
        res = self.ec2_client.start_instances(InstanceIds=[instance_id])
        if wait:
            for sample in utils.TimeoutSampler(
                TIMEOUT, SLEEP, self.get_instances_status_by_id, instance_id
            ):
                if sample == RUNNING:
                    return True
            return False
        state = res.get('StartingInstances')[0].get('CurrentState').get('Code')
        return state == PENDING
Beispiel #8
0
def create_cluster(cluster_name, version, region):
    """
    Create OCP cluster.

    Args:
        cluster_name (str): Cluster name
        version (str): cluster version
        region (str): Cluster region

    """

    rosa_ocp_version = config.DEPLOYMENT["installer_version"]
    # Validate ocp version with rosa ocp supported version
    # Select the valid version if given version is invalid
    if not validate_ocp_version(rosa_ocp_version):
        logger.warning(f"Given OCP version {rosa_ocp_version} "
                       f"is not valid ROSA OCP version. "
                       f"Selecting latest rosa version for deployment")
        rosa_ocp_version = get_latest_rosa_version(version)
        logger.info(f"Using OCP version {rosa_ocp_version}")

    create_account_roles(version)
    compute_nodes = config.ENV_DATA["worker_replicas"]
    compute_machine_type = config.ENV_DATA["worker_instance_type"]
    multi_az = "--multi-az " if config.ENV_DATA.get(
        "multi_availability_zones") else ""
    cluster_type = config.ENV_DATA.get("cluster_type", "")
    provider_name = config.ENV_DATA.get("provider_name", "")
    rosa_mode = config.ENV_DATA.get("rosa_mode", "")
    cmd = (
        f"rosa create cluster --cluster-name {cluster_name} --region {region} "
        f"--compute-nodes {compute_nodes} --compute-machine-type "
        f"{compute_machine_type}  --version {rosa_ocp_version} {multi_az}--sts --yes"
    )
    if rosa_mode == "auto":
        cmd += " --mode auto"
    if cluster_type.lower() == "consumer" and config.ENV_DATA.get(
            "provider_name", ""):
        aws = AWSUtil()
        subnet_id = ",".join(aws.get_cluster_subnet_ids(provider_name))
        cmd = f"{cmd} --subnet-ids {subnet_id}"

    utils.run_cmd(cmd, timeout=1200)
    if rosa_mode != "auto":
        logger.info(
            "Waiting for ROSA cluster status changed to waiting or pending state"
        )
        for cluster_info in utils.TimeoutSampler(4500, 30,
                                                 ocm.get_cluster_details,
                                                 cluster_name):
            status = cluster_info["status"]["state"]
            logger.info(f"Current installation status: {status}")
            if status == "waiting" or status == "pending":
                logger.info(f"Cluster is in {status} state")
                break
        create_operator_roles(cluster_name)
        create_oidc_provider(cluster_name)

    logger.info("Waiting for installation of ROSA cluster")
    for cluster_info in utils.TimeoutSampler(4500, 30, ocm.get_cluster_details,
                                             cluster_name):
        status = cluster_info["status"]["state"]
        logger.info(f"Current installation status: {status}")
        if status == "ready":
            logger.info("Cluster was installed")
            break
    cluster_info = ocm.get_cluster_details(cluster_name)
    # Create metadata file to store the cluster name
    cluster_info["clusterName"] = cluster_name
    cluster_info["clusterID"] = cluster_info["id"]
    cluster_path = config.ENV_DATA["cluster_path"]
    metadata_file = os.path.join(cluster_path, "metadata.json")
    with open(metadata_file, "w+") as f:
        json.dump(cluster_info, f)
Beispiel #9
0
def appliance_mode_cluster(cluster_name):
    """
    Create appliance mode provider cluster

    Args:
        cluster_name (str): Cluster name

    """
    addon_name = config.ENV_DATA.get("addon_name", "")
    size = config.ENV_DATA["size"]
    public_key = config.AUTH.get("managed_service", {}).get("public_key", "")
    notification_email_0 = config.REPORTING.get("notification_email_0")
    notification_email_1 = config.REPORTING.get("notification_email_1")
    notification_email_2 = config.REPORTING.get("notification_email_2")
    region = config.ENV_DATA.get("region", "")
    private_link = config.ENV_DATA.get("private_link", False)
    machine_cidr = config.ENV_DATA.get("machine-cidr", "10.0.0.0/16")
    if not public_key:
        raise ConfigurationError(
            "Public key for Managed Service not defined.\n"
            "Expected following configuration in auth.yaml file:\n"
            "managed_service:\n"
            '  private_key: "..."\n'
            '  public_key: "..."')
    public_key_only = remove_header_footer_from_key(public_key)

    subnet_ids = config.ENV_DATA["ms_provider_subnet_ids_per_region"][region][
        "private_subnet"]
    if not private_link:
        subnet_ids += f",{config.ENV_DATA['ms_provider_subnet_ids_per_region'][region]['public_subnet']}"
    cmd = (f"rosa create service --type {addon_name} --name {cluster_name} "
           f"--machine-cidr {machine_cidr} --size {size} "
           f"--onboarding-validation-key {public_key_only} "
           f"--subnet-ids {subnet_ids}")
    if private_link:
        cmd += " --private-link "
    if notification_email_0:
        cmd = cmd + f" --notification-email-0 {notification_email_0}"
    if notification_email_1:
        cmd = cmd + f" --notification-email-1 {notification_email_1}"
    if notification_email_2:
        cmd = cmd + f" --notification-email-2 {notification_email_2}"
    if region:
        cmd = cmd + f" --region {region}"

    utils.run_cmd(cmd, timeout=1200)
    logger.info(
        "Waiting for ROSA cluster status changed to waiting or pending state")
    for cluster_info in utils.TimeoutSampler(4500, 30, ocm.get_cluster_details,
                                             cluster_name):
        status = cluster_info["status"]["state"]
        logger.info(f"Current installation status: {status}")
        if status == "waiting" or status == "pending":
            logger.info(f"Cluster is in {status} state")
            break
    create_operator_roles(cluster_name)
    create_oidc_provider(cluster_name)

    logger.info("Waiting for installation of ROSA cluster")
    for cluster_info in utils.TimeoutSampler(4500, 30, ocm.get_cluster_details,
                                             cluster_name):
        status = cluster_info["status"]["state"]
        logger.info(f"Cluster installation status: {status}")
        if status == "ready":
            logger.info("Cluster is installed")
            break
    if cluster_info["status"]["state"] == "ready":
        for addon_info in utils.TimeoutSampler(7200, 30, get_addon_info,
                                               cluster_name, addon_name):
            logger.info(f"Current addon installation info: " f"{addon_info}")
            if "ready" in addon_info:
                logger.info(f"Addon {addon_name} is installed")
                break
            if "failed" in addon_info:
                logger.warning(f"Addon {addon_name} failed to be installed")
        addon_info = get_addon_info(cluster_name, addon_name)
        if "failed" in addon_info:
            raise ManagedServiceAddonDeploymentError(
                f"Addon {addon_name} failed to be installed")
        logger.info("Waiting for ROSA service ready status")
    for service_status in utils.TimeoutSampler(7200, 30,
                                               get_rosa_service_details,
                                               cluster_name):
        if "ready" in service_status:
            logger.info(f"service {cluster_name} is ready")
            break
        elif "failed" in service_status:
            logger.info(f"service {cluster_name} is failed")
            break
        else:
            logger.info(f"Current service creation status: {service_status}")
    # Create metadata file to store the cluster name
    cluster_info = ocm.get_cluster_details(cluster_name)
    cluster_info["clusterName"] = cluster_name
    cluster_info["clusterID"] = cluster_info["id"]
    cluster_path = config.ENV_DATA["cluster_path"]
    metadata_file = os.path.join(cluster_path, "metadata.json")
    with open(metadata_file, "w+") as f:
        json.dump(cluster_info, f)