Search in sources :

Example 1 with KubernetesClusterDetailsVO

use of com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO in project cloudstack by apache.

the class KubernetesClusterDestroyWorker method destroy.

public boolean destroy() throws CloudRuntimeException {
    init();
    validateClusterSate();
    this.clusterVMs = kubernetesClusterVmMapDao.listByClusterId(kubernetesCluster.getId());
    boolean cleanupNetwork = true;
    final KubernetesClusterDetailsVO clusterDetails = kubernetesClusterDetailsDao.findDetail(kubernetesCluster.getId(), "networkCleanup");
    if (clusterDetails != null) {
        cleanupNetwork = Boolean.parseBoolean(clusterDetails.getValue());
    }
    if (cleanupNetwork) {
        // if network has additional VM, cannot proceed with cluster destroy
        NetworkVO network = networkDao.findById(kubernetesCluster.getNetworkId());
        if (network != null) {
            List<VMInstanceVO> networkVMs = vmInstanceDao.listNonRemovedVmsByTypeAndNetwork(network.getId(), VirtualMachine.Type.User);
            if (networkVMs.size() > clusterVMs.size()) {
                logAndThrow(Level.ERROR, String.format("Network : %s for Kubernetes cluster : %s has instances using it which are not part of the Kubernetes cluster", network.getName(), kubernetesCluster.getName()));
            }
            for (VMInstanceVO vm : networkVMs) {
                boolean vmFoundInKubernetesCluster = false;
                for (KubernetesClusterVmMap clusterVM : clusterVMs) {
                    if (vm.getId() == clusterVM.getVmId()) {
                        vmFoundInKubernetesCluster = true;
                        break;
                    }
                }
                if (!vmFoundInKubernetesCluster) {
                    logAndThrow(Level.ERROR, String.format("VM : %s which is not a part of Kubernetes cluster : %s is using Kubernetes cluster network : %s", vm.getUuid(), kubernetesCluster.getName(), network.getName()));
                }
            }
        } else {
            LOGGER.error(String.format("Failed to find network for Kubernetes cluster : %s", kubernetesCluster.getName()));
        }
    }
    if (LOGGER.isInfoEnabled()) {
        LOGGER.info(String.format("Destroying Kubernetes cluster : %s", kubernetesCluster.getName()));
    }
    stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.DestroyRequested);
    boolean vmsDestroyed = destroyClusterVMs();
    // if there are VM's that were not expunged, we can not delete the network
    if (vmsDestroyed) {
        if (cleanupNetwork) {
            validateClusterVMsDestroyed();
            try {
                destroyKubernetesClusterNetwork();
            } catch (ManagementServerException e) {
                String msg = String.format("Failed to destroy network of Kubernetes cluster : %s cleanup", kubernetesCluster.getName());
                LOGGER.warn(msg, e);
                updateKubernetesClusterEntryForGC();
                throw new CloudRuntimeException(msg, e);
            }
        } else {
            try {
                checkForRulesToDelete();
            } catch (ManagementServerException e) {
                String msg = String.format("Failed to remove network rules of Kubernetes cluster : %s", kubernetesCluster.getName());
                LOGGER.warn(msg, e);
                updateKubernetesClusterEntryForGC();
                throw new CloudRuntimeException(msg, e);
            }
        }
    } else {
        String msg = String.format("Failed to destroy one or more VMs as part of Kubernetes cluster : %s cleanup", kubernetesCluster.getName());
        LOGGER.warn(msg);
        updateKubernetesClusterEntryForGC();
        throw new CloudRuntimeException(msg);
    }
    stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.OperationSucceeded);
    annotationDao.removeByEntityType(AnnotationService.EntityType.KUBERNETES_CLUSTER.name(), kubernetesCluster.getUuid());
    boolean deleted = kubernetesClusterDao.remove(kubernetesCluster.getId());
    if (!deleted) {
        logMessage(Level.WARN, String.format("Failed to delete Kubernetes cluster : %s", kubernetesCluster.getName()), null);
        updateKubernetesClusterEntryForGC();
        return false;
    }
    if (LOGGER.isInfoEnabled()) {
        LOGGER.info(String.format("Kubernetes cluster : %s is successfully deleted", kubernetesCluster.getName()));
    }
    return true;
}
Also used : KubernetesClusterDetailsVO(com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO) NetworkVO(com.cloud.network.dao.NetworkVO) ManagementServerException(com.cloud.exception.ManagementServerException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) VMInstanceVO(com.cloud.vm.VMInstanceVO) KubernetesClusterVmMap(com.cloud.kubernetes.cluster.KubernetesClusterVmMap)

Example 2 with KubernetesClusterDetailsVO

use of com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO in project cloudstack by apache.

the class KubernetesClusterActionWorker method getKubernetesClusterServerIpSshPort.

protected Pair<String, Integer> getKubernetesClusterServerIpSshPort(UserVm controlVm) {
    int port = CLUSTER_NODES_DEFAULT_START_SSH_PORT;
    KubernetesClusterDetailsVO detail = kubernetesClusterDetailsDao.findDetail(kubernetesCluster.getId(), ApiConstants.EXTERNAL_LOAD_BALANCER_IP_ADDRESS);
    if (detail != null && StringUtils.isNotEmpty(detail.getValue())) {
        return new Pair<>(detail.getValue(), port);
    }
    Network network = networkDao.findById(kubernetesCluster.getNetworkId());
    if (network == null) {
        LOGGER.warn(String.format("Network for Kubernetes cluster : %s cannot be found", kubernetesCluster.getName()));
        return new Pair<>(null, port);
    }
    if (Network.GuestType.Isolated.equals(network.getGuestType())) {
        List<? extends IpAddress> addresses = networkModel.listPublicIpsAssignedToGuestNtwk(network.getId(), true);
        if (CollectionUtils.isEmpty(addresses)) {
            LOGGER.warn(String.format("No public IP addresses found for network : %s, Kubernetes cluster : %s", network.getName(), kubernetesCluster.getName()));
            return new Pair<>(null, port);
        }
        for (IpAddress address : addresses) {
            if (address.isSourceNat()) {
                return new Pair<>(address.getAddress().addr(), port);
            }
        }
        LOGGER.warn(String.format("No source NAT IP addresses found for network : %s, Kubernetes cluster : %s", network.getName(), kubernetesCluster.getName()));
        return new Pair<>(null, port);
    } else if (Network.GuestType.Shared.equals(network.getGuestType())) {
        port = 22;
        controlVm = fetchControlVmIfMissing(controlVm);
        if (controlVm == null) {
            LOGGER.warn(String.format("Unable to retrieve control VM for Kubernetes cluster : %s", kubernetesCluster.getName()));
            return new Pair<>(null, port);
        }
        return new Pair<>(controlVm.getPrivateIpAddress(), port);
    }
    LOGGER.warn(String.format("Unable to retrieve server IP address for Kubernetes cluster : %s", kubernetesCluster.getName()));
    return new Pair<>(null, port);
}
Also used : KubernetesClusterDetailsVO(com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO) Network(com.cloud.network.Network) IpAddress(com.cloud.network.IpAddress) Pair(com.cloud.utils.Pair)

Example 3 with KubernetesClusterDetailsVO

use of com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO in project cloudstack by apache.

the class KubernetesClusterStartWorker method isKubernetesClusterKubeConfigAvailable.

private boolean isKubernetesClusterKubeConfigAvailable(final long timeoutTime) {
    if (StringUtils.isEmpty(publicIpAddress)) {
        KubernetesClusterDetailsVO kubeConfigDetail = kubernetesClusterDetailsDao.findDetail(kubernetesCluster.getId(), "kubeConfigData");
        if (kubeConfigDetail != null && StringUtils.isNotEmpty(kubeConfigDetail.getValue())) {
            return true;
        }
    }
    String kubeConfig = KubernetesClusterUtil.getKubernetesClusterConfig(kubernetesCluster, publicIpAddress, sshPort, getControlNodeLoginUser(), sshKeyFile, timeoutTime);
    if (StringUtils.isNotEmpty(kubeConfig)) {
        final String controlVMPrivateIpAddress = getControlVmPrivateIp();
        if (StringUtils.isNotEmpty(controlVMPrivateIpAddress)) {
            kubeConfig = kubeConfig.replace(String.format("server: https://%s:%d", controlVMPrivateIpAddress, CLUSTER_API_PORT), String.format("server: https://%s:%d", publicIpAddress, CLUSTER_API_PORT));
        }
        kubernetesClusterDetailsDao.addDetail(kubernetesCluster.getId(), "kubeConfigData", Base64.encodeBase64String(kubeConfig.getBytes(com.cloud.utils.StringUtils.getPreferredCharset())), false);
        return true;
    }
    return false;
}
Also used : KubernetesClusterDetailsVO(com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO)

Example 4 with KubernetesClusterDetailsVO

use of com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO in project cloudstack by apache.

the class KubernetesClusterResourceModifierActionWorker method updateKubeConfigWithRegistryDetails.

protected String updateKubeConfigWithRegistryDetails(String k8sConfig) {
    /* genarate /etc/containerd/config.toml file on the nodes only if Kubernetes cluster is created to
         * use docker private registry */
    String registryUsername = null;
    String registryPassword = null;
    String registryUrl = null;
    List<KubernetesClusterDetailsVO> details = kubernetesClusterDetailsDao.listDetails(kubernetesCluster.getId());
    for (KubernetesClusterDetailsVO detail : details) {
        if (detail.getName().equals(ApiConstants.DOCKER_REGISTRY_USER_NAME)) {
            registryUsername = detail.getValue();
        }
        if (detail.getName().equals(ApiConstants.DOCKER_REGISTRY_PASSWORD)) {
            registryPassword = detail.getValue();
        }
        if (detail.getName().equals(ApiConstants.DOCKER_REGISTRY_URL)) {
            registryUrl = detail.getValue();
        }
    }
    if (StringUtils.isNoneEmpty(registryUsername, registryPassword, registryUrl)) {
        // Update runcmd in the cloud-init configuration to run a script that updates the containerd config with provided registry details
        String runCmd = "- bash -x /opt/bin/setup-containerd";
        String registryEp = registryUrl.split("://")[1];
        k8sConfig = k8sConfig.replace("- containerd config default > /etc/containerd/config.toml", runCmd);
        final String registryUrlKey = "{{registry.url}}";
        final String registryUrlEpKey = "{{registry.url.endpoint}}";
        final String registryAuthKey = "{{registry.token}}";
        final String registryUname = "{{registry.username}}";
        final String registryPsswd = "{{registry.password}}";
        final String usernamePasswordKey = registryUsername + ":" + registryPassword;
        String base64Auth = Base64.encodeBase64String(usernamePasswordKey.getBytes(com.cloud.utils.StringUtils.getPreferredCharset()));
        k8sConfig = k8sConfig.replace(registryUrlKey, registryUrl);
        k8sConfig = k8sConfig.replace(registryUrlEpKey, registryEp);
        k8sConfig = k8sConfig.replace(registryUname, registryUsername);
        k8sConfig = k8sConfig.replace(registryPsswd, registryPassword);
        k8sConfig = k8sConfig.replace(registryAuthKey, base64Auth);
    }
    return k8sConfig;
}
Also used : KubernetesClusterDetailsVO(com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO)

Aggregations

KubernetesClusterDetailsVO (com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO)4 ManagementServerException (com.cloud.exception.ManagementServerException)1 KubernetesClusterVmMap (com.cloud.kubernetes.cluster.KubernetesClusterVmMap)1 IpAddress (com.cloud.network.IpAddress)1 Network (com.cloud.network.Network)1 NetworkVO (com.cloud.network.dao.NetworkVO)1 Pair (com.cloud.utils.Pair)1 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)1 VMInstanceVO (com.cloud.vm.VMInstanceVO)1