diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDao.java index c43a2ea4ee9..c01c1650fc0 100644 --- a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDao.java +++ b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDao.java @@ -36,7 +36,7 @@ public interface VMTemplateDao extends GenericDao, StateDao< public VMTemplateVO findByTemplateName(String templateName); - // public void update(VMTemplateVO template); + public VMTemplateVO findValidByTemplateName(String templateName); public List listAllSystemVMTemplates(); diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java index 6773c205aa3..1621baef2df 100644 --- a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -136,6 +136,13 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem return findOneIncludingRemovedBy(sc); } + @Override + public VMTemplateVO findValidByTemplateName(String templateName) { + SearchCriteria sc = NameSearch.create(); + sc.setParameters("name", templateName); + return findOneBy(sc); + } + @Override public List listByParentTemplatetId(long parentTemplatetId) { SearchCriteria sc = ParentTemplateIdSearch.create(); diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java index 358fa034a8b..204f2d7b83d 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java @@ -51,7 +51,6 @@ import org.apache.cloudstack.api.response.KubernetesClusterResponse; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.commons.codec.binary.Base64; @@ -63,7 +62,6 @@ import com.cloud.api.ApiDBUtils; import com.cloud.api.query.dao.NetworkOfferingJoinDao; import com.cloud.api.query.dao.TemplateJoinDao; import com.cloud.api.query.vo.NetworkOfferingJoinVO; -import com.cloud.api.query.vo.TemplateJoinVO; import com.cloud.capacity.CapacityManager; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterDetailsVO; @@ -82,6 +80,7 @@ import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; import com.cloud.host.Host.Type; import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor; import com.cloud.kubernetes.cluster.actionworkers.KubernetesClusterActionWorker; import com.cloud.kubernetes.cluster.actionworkers.KubernetesClusterDestroyWorker; @@ -122,9 +121,7 @@ import com.cloud.resource.ResourceManager; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VMTemplateZoneDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountService; @@ -181,12 +178,12 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne @Inject protected ClusterDetailsDao clusterDetailsDao; @Inject + protected HostDao hostDao; + @Inject protected ServiceOfferingDao serviceOfferingDao; @Inject protected VMTemplateDao templateDao; @Inject - protected VMTemplateZoneDao templateZoneDao; - @Inject protected TemplateJoinDao templateJoinDao; @Inject protected AccountService accountService; @@ -300,8 +297,7 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne LOGGER.warn(String.format("Unable to find the template %s to be used for provisioning Kubernetes cluster nodes", templateName)); return false; } - List listZoneTemplate = templateZoneDao.listByZoneTemplate(zone.getId(), template.getId()); - if (listZoneTemplate == null || listZoneTemplate.isEmpty()) { + if (CollectionUtils.isEmpty(templateJoinDao.newTemplateView(template, zone.getId(), true))) { LOGGER.warn(String.format("The template ID: %s, name: %s is not available for use in zone ID: %s provisioning Kubernetes cluster nodes", template.getUuid(), templateName, zone.getUuid())); return false; } @@ -394,7 +390,7 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne tempalteName = KubernetesClusterXenserverTemplateName.value(); break; } - return templateDao.findByTemplateName(tempalteName); + return templateDao.findValidByTemplateName(tempalteName); } private boolean validateIsolatedNetwork(Network network, int clusterTotalNodeCount) { @@ -523,6 +519,10 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne for (Map.Entry> hostEntry : hosts_with_resevered_capacity.entrySet()) { Pair hp = hostEntry.getValue(); HostVO h = hp.first(); + hostDao.loadHostTags(h); + if (!Strings.isNullOrEmpty(offering.getHostTag()) && !(h.getHostTags() != null && h.getHostTags().contains(offering.getHostTag()))) { + continue; + } int reserved = hp.second(); reserved++; ClusterVO cluster = clusterDao.findById(h.getClusterId()); @@ -545,7 +545,7 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne } if (!suitable_host_found) { if (LOGGER.isInfoEnabled()) { - LOGGER.info(String.format("Suitable hosts not found in datacenter ID: %s for node %d", zone.getUuid(), i)); + LOGGER.info(String.format("Suitable hosts not found in datacenter ID: %s for node %d with offering ID: %s", zone.getUuid(), i, offering.getUuid())); } break; } @@ -556,8 +556,8 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne } return new DeployDestination(zone, null, planCluster, null); } - String msg = String.format("Cannot find enough capacity for Kubernetes cluster(requested cpu=%1$s memory=%2$s)", - cpu_requested * nodesCount, ram_requested * nodesCount); + String msg = String.format("Cannot find enough capacity for Kubernetes cluster(requested cpu=%d memory=%d) with offering ID: %s", + cpu_requested * nodesCount, ram_requested * nodesCount, offering.getUuid()); LOGGER.warn(msg); throw new InsufficientServerCapacityException(msg, DataCenter.class, zone.getId()); } @@ -684,12 +684,12 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne throw new InvalidParameterValueException(String.format("Kubernetes version ID: %s is not available for zone ID: %s", clusterKubernetesVersion.getUuid(), zone.getUuid())); } - TemplateJoinVO iso = templateJoinDao.findById(clusterKubernetesVersion.getIsoId()); + VMTemplateVO iso = templateDao.findById(clusterKubernetesVersion.getIsoId()); if (iso == null) { throw new InvalidParameterValueException(String.format("Invalid ISO associated with version ID: %s", clusterKubernetesVersion.getUuid())); } - if (!ObjectInDataStoreStateMachine.State.Ready.equals(iso.getState())) { - throw new InvalidParameterValueException(String.format("ISO associated with version ID: %s is not in Ready state", clusterKubernetesVersion.getUuid())); + if (CollectionUtils.isEmpty(templateJoinDao.newTemplateView(iso, zone.getId(), true))) { + throw new InvalidParameterValueException(String.format("ISO associated with version ID: %s is not in Ready state for datacenter ID: %s", clusterKubernetesVersion.getUuid(), zone.getUuid())); } ServiceOffering serviceOffering = serviceOfferingDao.findById(serviceOfferingId); @@ -887,6 +887,15 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne if (clusterSize < 1) { throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s cannot be scaled for size, %d", kubernetesCluster.getUuid(), clusterSize)); } + if (clusterSize > kubernetesCluster.getNodeCount()) { // Upscale + VMTemplateVO template = templateDao.findById(kubernetesCluster.getTemplateId()); + if (template == null) { + throw new InvalidParameterValueException(String.format("Invalid template associated with Kubernetes cluster ID: %s", kubernetesCluster.getUuid())); + } + if (CollectionUtils.isEmpty(templateJoinDao.newTemplateView(template, zone.getId(), true))) { + throw new InvalidParameterValueException(String.format("Template ID: %s associated with Kubernetes cluster ID: %s is not in Ready state for datacenter ID: %s", template.getUuid(), kubernetesCluster.getUuid(), zone.getUuid())); + } + } } } @@ -908,6 +917,10 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne if (!KubernetesCluster.State.Running.equals(kubernetesCluster.getState())) { throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s is not in running state", kubernetesCluster.getUuid())); } + final DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId()); + if (zone == null) { + logAndThrow(Level.WARN, String.format("Unable to find zone for Kubernetes cluster ID: %s", kubernetesCluster.getUuid())); + } KubernetesSupportedVersionVO upgradeVersion = kubernetesSupportedVersionDao.findById(upgradeVersionId); if (upgradeVersion == null || upgradeVersion.getRemoved() != null) { throw new InvalidParameterValueException("Invalid Kubernetes version ID"); @@ -939,12 +952,12 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne throw new InvalidParameterValueException(e.getMessage()); } - TemplateJoinVO iso = templateJoinDao.findById(upgradeVersion.getIsoId()); + VMTemplateVO iso = templateDao.findById(upgradeVersion.getIsoId()); if (iso == null) { throw new InvalidParameterValueException(String.format("Invalid ISO associated with version ID: %s", upgradeVersion.getUuid())); } - if (!ObjectInDataStoreStateMachine.State.Ready.equals(iso.getState())) { - throw new InvalidParameterValueException(String.format("ISO associated with version ID: %s is not in Ready state", upgradeVersion.getUuid())); + if (CollectionUtils.isEmpty(templateJoinDao.newTemplateView(iso, zone.getId(), true))) { + throw new InvalidParameterValueException(String.format("ISO associated with version ID: %s is not in Ready state for datacenter ID: %s", upgradeVersion.getUuid(), zone.getUuid())); } } diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java index aad9a225a44..0a52b66de90 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java @@ -122,6 +122,7 @@ public class KubernetesClusterActionWorker { protected KubernetesCluster kubernetesCluster; protected Account owner; + protected VirtualMachineTemplate clusterTemplate; protected File sshKeyFile; protected String publicIpAddress; protected int sshPort; @@ -136,6 +137,7 @@ public class KubernetesClusterActionWorker { protected void init() { this.owner = accountDao.findById(kubernetesCluster.getAccountId()); + this.clusterTemplate = templateDao.findById(kubernetesCluster.getTemplateId()); this.sshKeyFile = getManagementServerSshPublicKeyFile(); } diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterDestroyWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterDestroyWorker.java index 8d7f42730aa..c1a095fedbe 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterDestroyWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterDestroyWorker.java @@ -37,7 +37,6 @@ import com.cloud.kubernetes.cluster.KubernetesClusterVO; import com.cloud.kubernetes.cluster.KubernetesClusterVmMap; import com.cloud.kubernetes.cluster.KubernetesClusterVmMapVO; import com.cloud.network.IpAddress; -import com.cloud.network.Network; import com.cloud.network.dao.NetworkVO; import com.cloud.network.rules.FirewallRule; import com.cloud.user.Account; @@ -48,6 +47,8 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.ReservationContext; import com.cloud.vm.ReservationContextImpl; import com.cloud.vm.UserVmVO; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; public class KubernetesClusterDestroyWorker extends KubernetesClusterResourceModifierActionWorker { @@ -129,7 +130,7 @@ public class KubernetesClusterDestroyWorker extends KubernetesClusterResourceMod private void deleteKubernetesClusterNetworkRules() throws ManagementServerException { NetworkVO network = networkDao.findById(kubernetesCluster.getNetworkId()); - if (network == null || !Network.GuestType.Isolated.equals(network.getGuestType())) { + if (network == null) { return; } List removedVmIds = new ArrayList<>(); @@ -189,17 +190,39 @@ public class KubernetesClusterDestroyWorker extends KubernetesClusterResourceMod public boolean destroy() throws CloudRuntimeException { init(); validateClusterSate(); - if (LOGGER.isInfoEnabled()) { - LOGGER.info(String.format("Destroying Kubernetes cluster ID: %s", kubernetesCluster.getUuid())); - } - stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.DestroyRequested); this.clusterVMs = kubernetesClusterVmMapDao.listByClusterId(kubernetesCluster.getId()); - boolean vmsDestroyed = destroyClusterVMs(); 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) { + logAndThrow(Level.ERROR, String.format("Failed to find network for Kubernetes cluster ID: %s", kubernetesCluster.getUuid())); + } + List networkVMs = vmInstanceDao.listNonRemovedVmsByTypeAndNetwork(network.getId(), VirtualMachine.Type.User); + if (networkVMs.size() > clusterVMs.size()) { + logAndThrow(Level.ERROR, String.format("Network ID: %s for Kubernetes cluster ID: %s has instances using it which are not part of the Kubernetes cluster", network.getUuid(), kubernetesCluster.getUuid())); + } + 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 ID: %s which is not a part of Kubernetes cluster ID: %s is using Kubernetes cluster network ID: %s", vm.getUuid(), kubernetesCluster.getUuid(), network.getUuid())); + } + } + } + if (LOGGER.isInfoEnabled()) { + LOGGER.info(String.format("Destroying Kubernetes cluster ID: %s", kubernetesCluster.getUuid())); + } + 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) { diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java index 5d256140f34..aeed9b8de4a 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java @@ -50,6 +50,7 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.Host; import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor; import com.cloud.kubernetes.cluster.KubernetesCluster; import com.cloud.kubernetes.cluster.KubernetesClusterDetailsVO; @@ -69,7 +70,6 @@ import com.cloud.network.rules.RulesService; import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.offering.ServiceOffering; import com.cloud.resource.ResourceManager; -import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; import com.cloud.user.SSHKeyPairVO; import com.cloud.uservm.UserVm; @@ -97,6 +97,8 @@ public class KubernetesClusterResourceModifierActionWorker extends KubernetesClu @Inject protected ClusterDetailsDao clusterDetailsDao; @Inject + protected HostDao hostDao; + @Inject protected FirewallRulesDao firewallRulesDao; @Inject protected FirewallService firewallService; @@ -208,6 +210,13 @@ public class KubernetesClusterResourceModifierActionWorker extends KubernetesClu for (Map.Entry> hostEntry : hosts_with_resevered_capacity.entrySet()) { Pair hp = hostEntry.getValue(); HostVO h = hp.first(); + if (!h.getHypervisorType().equals(clusterTemplate.getHypervisorType())) { + continue; + } + hostDao.loadHostTags(h); + if (!Strings.isNullOrEmpty(offering.getHostTag()) && !(h.getHostTags() != null && h.getHostTags().contains(offering.getHostTag()))) { + continue; + } int reserved = hp.second(); reserved++; ClusterVO cluster = clusterDao.findById(h.getClusterId()); @@ -229,7 +238,7 @@ public class KubernetesClusterResourceModifierActionWorker extends KubernetesClu } if (!suitable_host_found) { if (LOGGER.isInfoEnabled()) { - LOGGER.info(String.format("Suitable hosts not found in datacenter ID: %s for node %d", zone.getUuid(), i)); + LOGGER.info(String.format("Suitable hosts not found in datacenter ID: %s for node %d, with offering ID: %s and hypervisor: %s", zone.getUuid(), i, offering.getUuid(), clusterTemplate.getHypervisorType().toString())); } break; } @@ -240,8 +249,8 @@ public class KubernetesClusterResourceModifierActionWorker extends KubernetesClu } return new DeployDestination(zone, null, null, null); } - String msg = String.format("Cannot find enough capacity for Kubernetes cluster(requested cpu=%1$s memory=%2$s)", - cpu_requested * nodesCount, ram_requested * nodesCount); + String msg = String.format("Cannot find enough capacity for Kubernetes cluster(requested cpu=%d memory=%d) with offering ID: %s and hypervisor: %s", + cpu_requested * nodesCount, ram_requested * nodesCount, offering.getUuid(), clusterTemplate.getHypervisorType().toString()); LOGGER.warn(msg); throw new InsufficientServerCapacityException(msg, DataCenter.class, zone.getId()); } @@ -306,7 +315,6 @@ public class KubernetesClusterResourceModifierActionWorker extends KubernetesClu UserVm nodeVm = null; DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId()); ServiceOffering serviceOffering = serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId()); - VirtualMachineTemplate template = templateDao.findById(kubernetesCluster.getTemplateId()); List networkIds = new ArrayList(); networkIds.add(kubernetesCluster.getNetworkId()); Account owner = accountDao.findById(kubernetesCluster.getAccountId()); @@ -319,12 +327,12 @@ public class KubernetesClusterResourceModifierActionWorker extends KubernetesClu String hostName = getKubernetesClusterNodeAvailableName(String.format("%s-node-%s", kubernetesClusterNodeNamePrefix, nodeInstance)); String k8sNodeConfig = null; try { - k8sNodeConfig = getKubernetesNodeConfig(joinIp, Hypervisor.HypervisorType.VMware.equals(template.getHypervisorType())); + k8sNodeConfig = getKubernetesNodeConfig(joinIp, Hypervisor.HypervisorType.VMware.equals(clusterTemplate.getHypervisorType())); } catch (IOException e) { logAndThrow(Level.ERROR, "Failed to read Kubernetes node configuration file", e); } String base64UserData = Base64.encodeBase64String(k8sNodeConfig.getBytes(StringUtils.getPreferredCharset())); - nodeVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, template, networkIds, owner, + nodeVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, null, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), null, addrs, null, null, null, customParameterMap, null, null, null, null); diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java index d4525630196..24690c53054 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java @@ -60,7 +60,6 @@ import com.cloud.network.Network; import com.cloud.network.addr.PublicIp; import com.cloud.network.rules.LoadBalancer; import com.cloud.offering.ServiceOffering; -import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; import com.cloud.user.SSHKeyPairVO; import com.cloud.uservm.UserVm; @@ -172,7 +171,6 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif UserVm masterVm = null; DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId()); ServiceOffering serviceOffering = serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId()); - VirtualMachineTemplate template = templateDao.findById(kubernetesCluster.getTemplateId()); List networkIds = new ArrayList(); networkIds.add(kubernetesCluster.getNetworkId()); Pair> ipAddresses = getKubernetesMasterIpAddresses(zone, network, owner); @@ -195,12 +193,12 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif boolean haSupported = isKubernetesVersionSupportsHA(); String k8sMasterConfig = null; try { - k8sMasterConfig = getKubernetesMasterConfig(masterIp, serverIp, hostName, haSupported, Hypervisor.HypervisorType.VMware.equals(template.getHypervisorType())); + k8sMasterConfig = getKubernetesMasterConfig(masterIp, serverIp, hostName, haSupported, Hypervisor.HypervisorType.VMware.equals(clusterTemplate.getHypervisorType())); } catch (IOException e) { logAndThrow(Level.ERROR, "Failed to read Kubernetes master configuration file", e); } String base64UserData = Base64.encodeBase64String(k8sMasterConfig.getBytes(StringUtils.getPreferredCharset())); - masterVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, template, networkIds, owner, + masterVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, null, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), requestedIps, addrs, null, null, null, customParameterMap, null, null, null, null); @@ -238,7 +236,6 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif UserVm additionalMasterVm = null; DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId()); ServiceOffering serviceOffering = serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId()); - VirtualMachineTemplate template = templateDao.findById(kubernetesCluster.getTemplateId()); List networkIds = new ArrayList(); networkIds.add(kubernetesCluster.getNetworkId()); Network.IpAddresses addrs = new Network.IpAddresses(null, null); @@ -250,12 +247,12 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif String hostName = getKubernetesClusterNodeAvailableName(String.format("%s-master-%d", kubernetesClusterNodeNamePrefix, additionalMasterNodeInstance + 1)); String k8sMasterConfig = null; try { - k8sMasterConfig = getKubernetesAdditionalMasterConfig(joinIp, Hypervisor.HypervisorType.VMware.equals(template.getHypervisorType())); + k8sMasterConfig = getKubernetesAdditionalMasterConfig(joinIp, Hypervisor.HypervisorType.VMware.equals(clusterTemplate.getHypervisorType())); } catch (IOException e) { logAndThrow(Level.ERROR, "Failed to read Kubernetes master configuration file", e); } String base64UserData = Base64.encodeBase64String(k8sMasterConfig.getBytes(StringUtils.getPreferredCharset())); - additionalMasterVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, template, networkIds, owner, + additionalMasterVm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, clusterTemplate, networkIds, owner, hostName, hostName, null, null, null, null, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(), null, addrs, null, null, null, customParameterMap, null, null, null, null); diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/version/KubernetesVersionManagerImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/version/KubernetesVersionManagerImpl.java index 4eefc3f12ec..5f2e42b11d5 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/version/KubernetesVersionManagerImpl.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/version/KubernetesVersionManagerImpl.java @@ -52,6 +52,9 @@ import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.AccountManager; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ManagerBase; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.exception.CloudRuntimeException; import com.google.common.base.Strings; @@ -246,19 +249,25 @@ public class KubernetesVersionManagerImpl extends ManagerBase implements Kuberne } minimumSemanticVersion = minVersion.getSemanticVersion(); } - List versions = new ArrayList<>(); + Filter searchFilter = new Filter(KubernetesSupportedVersionVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); + SearchBuilder sb = kubernetesSupportedVersionDao.createSearchBuilder(); + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("keyword", sb.entity().getName(), SearchCriteria.Op.LIKE); + SearchCriteria sc = sb.create(); + String keyword = cmd.getKeyword(); if (versionId != null) { - KubernetesSupportedVersionVO version = kubernetesSupportedVersionDao.findById(versionId); - if (version != null && (zoneId == null || version.getZoneId() == null || version.getZoneId().equals(zoneId))) { - versions.add(version); - } - } else { - if (zoneId == null) { - versions = kubernetesSupportedVersionDao.listAll(); - } else { - versions = kubernetesSupportedVersionDao.listAllInZone(zoneId); - } + sc.setParameters("id", versionId); } + if (zoneId != null) { + SearchCriteria scc = kubernetesSupportedVersionDao.createSearchCriteria(); + scc.addOr("zoneId", SearchCriteria.Op.EQ, zoneId); + scc.addOr("zoneId", SearchCriteria.Op.NULL); + sc.addAnd("zoneId", SearchCriteria.Op.SC, scc); + } + if(keyword != null){ + sc.setParameters("keyword", "%" + keyword + "%"); + } + List versions = kubernetesSupportedVersionDao.search(sc, searchFilter); versions = filterKubernetesSupportedVersions(versions, minimumSemanticVersion); return createKubernetesSupportedVersionListResponse(versions); diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/version/ListKubernetesSupportedVersionsCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/version/ListKubernetesSupportedVersionsCmd.java index efa029a1de5..6d2c285f413 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/version/ListKubernetesSupportedVersionsCmd.java +++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/version/ListKubernetesSupportedVersionsCmd.java @@ -36,7 +36,7 @@ import com.cloud.kubernetes.version.KubernetesVersionService; import com.google.common.base.Strings; @APICommand(name = ListKubernetesSupportedVersionsCmd.APINAME, - description = "Lists container clusters", + description = "Lists supported Kubernetes version", responseObject = KubernetesSupportedVersionResponse.class, responseView = ResponseObject.ResponseView.Restricted, authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User}) diff --git a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/version/KubernetesVersionServiceTest.java b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/version/KubernetesVersionServiceTest.java index 6878c4cd29b..59eb1217786 100644 --- a/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/version/KubernetesVersionServiceTest.java +++ b/plugins/integrations/kubernetes-service/src/test/java/com/cloud/kubernetes/version/KubernetesVersionServiceTest.java @@ -65,6 +65,9 @@ import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.UserVO; import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.exception.CloudRuntimeException; @RunWith(PowerMockRunner.class) @@ -101,6 +104,15 @@ public class KubernetesVersionServiceTest { overrideDefaultConfigValue(KubernetesClusterService.KubernetesServiceEnabled, "_defaultValue", "true"); + final SearchBuilder versionSearchBuilder = Mockito.mock(SearchBuilder.class); + final SearchCriteria versionSearchCriteria = Mockito.mock(SearchCriteria.class); + when(kubernetesSupportedVersionDao.createSearchBuilder()).thenReturn(versionSearchBuilder); + final KubernetesSupportedVersionVO kubernetesSupportedVersionVO = Mockito.mock(KubernetesSupportedVersionVO.class); + when(versionSearchBuilder.entity()).thenReturn(kubernetesSupportedVersionVO); + when(versionSearchBuilder.entity()).thenReturn(kubernetesSupportedVersionVO); + when(versionSearchBuilder.create()).thenReturn(versionSearchCriteria); + when(kubernetesSupportedVersionDao.createSearchCriteria()).thenReturn(versionSearchCriteria); + DataCenterVO zone = Mockito.mock(DataCenterVO.class); when(zone.getId()).thenReturn(1L); when(dataCenterDao.findById(Mockito.anyLong())).thenReturn(zone); @@ -127,9 +139,8 @@ public class KubernetesVersionServiceTest { KubernetesSupportedVersionVO versionVO = Mockito.mock(KubernetesSupportedVersionVO.class); when(versionVO.getSemanticVersion()).thenReturn(KubernetesVersionService.MIN_KUBERNETES_VERSION); versionVOs.add(versionVO); - when(kubernetesSupportedVersionDao.listAll()).thenReturn(versionVOs); - when(kubernetesSupportedVersionDao.listAllInZone(Mockito.anyLong())).thenReturn(versionVOs); when(kubernetesSupportedVersionDao.findById(Mockito.anyLong())).thenReturn(versionVO); + when(kubernetesSupportedVersionDao.search(Mockito.any(SearchCriteria.class), Mockito.any(Filter.class))).thenReturn(versionVOs); kubernetesVersionService.listKubernetesSupportedVersions(cmd); }