Skip to content

Commit b3bafff

Browse files
committed
Merge remote-tracking branch 'origin/4.14'
2 parents d213a4d + 9391fa9 commit b3bafff

File tree

19 files changed

+683
-479
lines changed

19 files changed

+683
-479
lines changed

engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
9595

9696
protected SearchBuilder<VMTemplateVO> AccountIdSearch;
9797
protected SearchBuilder<VMTemplateVO> NameSearch;
98+
protected SearchBuilder<VMTemplateVO> ValidNameSearch;
9899
protected SearchBuilder<VMTemplateVO> TmpltsInZoneSearch;
99100
protected SearchBuilder<VMTemplateVO> ActiveTmpltSearch;
100101
private SearchBuilder<VMTemplateVO> PublicSearch;
@@ -138,8 +139,9 @@ public VMTemplateVO findByTemplateName(String templateName) {
138139

139140
@Override
140141
public VMTemplateVO findValidByTemplateName(String templateName) {
141-
SearchCriteria<VMTemplateVO> sc = NameSearch.create();
142+
SearchCriteria<VMTemplateVO> sc = ValidNameSearch.create();
142143
sc.setParameters("name", templateName);
144+
sc.setParameters("state", VirtualMachineTemplate.State.Active);
143145
return findOneBy(sc);
144146
}
145147

@@ -319,6 +321,10 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
319321
UniqueNameSearch.and("uniqueName", UniqueNameSearch.entity().getUniqueName(), SearchCriteria.Op.EQ);
320322
NameSearch = createSearchBuilder();
321323
NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ);
324+
ValidNameSearch = createSearchBuilder();
325+
ValidNameSearch.and("name", ValidNameSearch.entity().getName(), SearchCriteria.Op.EQ);
326+
ValidNameSearch.and("state", ValidNameSearch.entity().getState(), SearchCriteria.Op.EQ);
327+
ValidNameSearch.and("removed", ValidNameSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
322328

323329
NameAccountIdSearch = createSearchBuilder();
324330
NameAccountIdSearch.and("name", NameAccountIdSearch.entity().getName(), SearchCriteria.Op.EQ);

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ private boolean isKubernetesServiceTemplateConfigured(DataCenter zone) {
294294
LOGGER.warn(String.format("Global setting %s is empty. Template name need to be specified for Kubernetes service to function", templateKey));
295295
return false;
296296
}
297-
final VMTemplateVO template = templateDao.findByTemplateName(templateName);
297+
final VMTemplateVO template = templateDao.findValidByTemplateName(templateName);
298298
if (template == null) {
299299
LOGGER.warn(String.format("Unable to find the template %s to be used for provisioning Kubernetes cluster nodes", templateName));
300300
return false;
@@ -377,22 +377,22 @@ private IpAddress getSourceNatIp(Network network) {
377377
}
378378

379379
private VMTemplateVO getKubernetesServiceTemplate(Hypervisor.HypervisorType hypervisorType) {
380-
String tempalteName = null;
380+
String templateName = null;
381381
switch (hypervisorType) {
382382
case Hyperv:
383-
tempalteName = KubernetesClusterHyperVTemplateName.value();
383+
templateName = KubernetesClusterHyperVTemplateName.value();
384384
break;
385385
case KVM:
386-
tempalteName = KubernetesClusterKVMTemplateName.value();
386+
templateName = KubernetesClusterKVMTemplateName.value();
387387
break;
388388
case VMware:
389-
tempalteName = KubernetesClusterVMwareTemplateName.value();
389+
templateName = KubernetesClusterVMwareTemplateName.value();
390390
break;
391391
case XenServer:
392-
tempalteName = KubernetesClusterXenserverTemplateName.value();
392+
templateName = KubernetesClusterXenserverTemplateName.value();
393393
break;
394394
}
395-
return templateDao.findValidByTemplateName(tempalteName);
395+
return templateDao.findValidByTemplateName(templateName);
396396
}
397397

398398
private boolean validateIsolatedNetwork(Network network, int clusterTotalNodeCount) {
@@ -516,7 +516,7 @@ private DeployDestination plan(final long nodesCount, final DataCenter zone, fin
516516
}
517517
boolean suitable_host_found = false;
518518
Cluster planCluster = null;
519-
for (int i = 1; i <= nodesCount + 1; i++) {
519+
for (int i = 1; i <= nodesCount; i++) {
520520
suitable_host_found = false;
521521
for (Map.Entry<String, Pair<HostVO, Integer>> hostEntry : hosts_with_resevered_capacity.entrySet()) {
522522
Pair<HostVO, Integer> hp = hostEntry.getValue();
@@ -993,7 +993,7 @@ public KubernetesCluster createKubernetesCluster(CreateKubernetesClusterCmd cmd)
993993
try {
994994
deployDestination = plan(totalNodeCount, zone, serviceOffering);
995995
} catch (InsufficientCapacityException e) {
996-
logAndThrow(Level.ERROR, String.format("Creating Kubernetes cluster failed due to insufficient capacity for %d cluster nodes in zone ID: %s with service offering ID: %s", totalNodeCount, zone.getUuid(), serviceOffering.getUuid()));
996+
logAndThrow(Level.ERROR, String.format("Creating Kubernetes cluster failed due to insufficient capacity for %d nodes cluster in zone ID: %s with service offering ID: %s", totalNodeCount, zone.getUuid(), serviceOffering.getUuid()));
997997
}
998998
if (deployDestination == null || deployDestination.getCluster() == null) {
999999
logAndThrow(Level.ERROR, String.format("Creating Kubernetes cluster failed due to error while finding suitable deployment plan for cluster in zone ID: %s", zone.getUuid()));

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterDestroyWorker.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -198,24 +198,25 @@ public boolean destroy() throws CloudRuntimeException {
198198
}
199199
if (cleanupNetwork) { // if network has additional VM, cannot proceed with cluster destroy
200200
NetworkVO network = networkDao.findById(kubernetesCluster.getNetworkId());
201-
if (network == null) {
202-
logAndThrow(Level.ERROR, String.format("Failed to find network for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
203-
}
204-
List<VMInstanceVO> networkVMs = vmInstanceDao.listNonRemovedVmsByTypeAndNetwork(network.getId(), VirtualMachine.Type.User);
205-
if (networkVMs.size() > clusterVMs.size()) {
206-
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()));
207-
}
208-
for (VMInstanceVO vm : networkVMs) {
209-
boolean vmFoundInKubernetesCluster = false;
210-
for (KubernetesClusterVmMap clusterVM : clusterVMs) {
211-
if (vm.getId() == clusterVM.getVmId()) {
212-
vmFoundInKubernetesCluster = true;
213-
break;
214-
}
201+
if (network != null) {
202+
List<VMInstanceVO> networkVMs = vmInstanceDao.listNonRemovedVmsByTypeAndNetwork(network.getId(), VirtualMachine.Type.User);
203+
if (networkVMs.size() > clusterVMs.size()) {
204+
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()));
215205
}
216-
if (!vmFoundInKubernetesCluster) {
217-
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()));
206+
for (VMInstanceVO vm : networkVMs) {
207+
boolean vmFoundInKubernetesCluster = false;
208+
for (KubernetesClusterVmMap clusterVM : clusterVMs) {
209+
if (vm.getId() == clusterVM.getVmId()) {
210+
vmFoundInKubernetesCluster = true;
211+
break;
212+
}
213+
}
214+
if (!vmFoundInKubernetesCluster) {
215+
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()));
216+
}
218217
}
218+
} else {
219+
LOGGER.error(String.format("Failed to find network for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
219220
}
220221
}
221222
if (LOGGER.isInfoEnabled()) {

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ protected DeployDestination plan(final long nodesCount, final DataCenter zone, f
207207
hosts_with_resevered_capacity.put(h.getUuid(), new Pair<HostVO, Integer>(h, 0));
208208
}
209209
boolean suitable_host_found = false;
210-
for (int i = 1; i <= nodesCount + 1; i++) {
210+
for (int i = 1; i <= nodesCount; i++) {
211211
suitable_host_found = false;
212212
for (Map.Entry<String, Pair<HostVO, Integer>> hostEntry : hosts_with_resevered_capacity.entrySet()) {
213213
Pair<HostVO, Integer> hp = hostEntry.getValue();

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,19 @@
7676

7777
public class KubernetesClusterStartWorker extends KubernetesClusterResourceModifierActionWorker {
7878

79+
private KubernetesSupportedVersion kubernetesClusterVersion;
80+
7981
public KubernetesClusterStartWorker(final KubernetesCluster kubernetesCluster, final KubernetesClusterManagerImpl clusterManager) {
8082
super(kubernetesCluster, clusterManager);
8183
}
8284

85+
public KubernetesSupportedVersion getKubernetesClusterVersion() {
86+
if (kubernetesClusterVersion == null) {
87+
kubernetesClusterVersion = kubernetesSupportedVersionDao.findById(kubernetesCluster.getKubernetesVersionId());
88+
}
89+
return kubernetesClusterVersion;
90+
}
91+
8392
private Pair<String, Map<Long, Network.IpAddresses>> getKubernetesMasterIpAddresses(final DataCenter zone, final Network network, final Account account) throws InsufficientAddressCapacityException {
8493
String masterIp = null;
8594
Map<Long, Network.IpAddresses> requestedIps = null;
@@ -105,7 +114,7 @@ private Pair<String, Map<Long, Network.IpAddresses>> getKubernetesMasterIpAddres
105114

106115
private boolean isKubernetesVersionSupportsHA() {
107116
boolean haSupported = false;
108-
final KubernetesSupportedVersion version = kubernetesSupportedVersionDao.findById(kubernetesCluster.getKubernetesVersionId());
117+
KubernetesSupportedVersion version = getKubernetesClusterVersion();
109118
if (version != null) {
110119
try {
111120
if (KubernetesVersionManagerImpl.compareSemanticVersions(version.getSemanticVersion(), KubernetesClusterService.MIN_KUBERNETES_VERSION_HA_SUPPORT) >= 0) {
@@ -161,6 +170,7 @@ private String getKubernetesMasterConfig(final String masterIp, final String ser
161170
KubernetesClusterUtil.generateClusterHACertificateKey(kubernetesCluster));
162171
}
163172
initArgs += String.format("--apiserver-cert-extra-sans=%s", serverIp);
173+
initArgs += String.format(" --kubernetes-version=%s", getKubernetesClusterVersion().getSemanticVersion());
164174
k8sMasterConfig = k8sMasterConfig.replace(clusterInitArgsKey, initArgs);
165175
k8sMasterConfig = k8sMasterConfig.replace(ejectIsoKey, String.valueOf(ejectIso));
166176
return k8sMasterConfig;

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/version/KubernetesVersionManagerImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,10 @@ public static int compareSemanticVersions(String v1, String v2) throws IllegalAr
181181
throw new IllegalArgumentException(String.format("Invalid version comparision with versions %s, %s", v1, v2));
182182
}
183183
if(!isSemanticVersion(v1)) {
184-
throw new IllegalArgumentException(String.format("Invalid version format, %s", v1));
184+
throw new IllegalArgumentException(String.format("Invalid version format, %s. Semantic version should be specified in MAJOR.MINOR.PATCH format", v1));
185185
}
186186
if(!isSemanticVersion(v2)) {
187-
throw new IllegalArgumentException(String.format("Invalid version format, %s", v2));
187+
throw new IllegalArgumentException(String.format("Invalid version format, %s. Semantic version should be specified in MAJOR.MINOR.PATCH format", v2));
188188
}
189189
String[] thisParts = v1.split("\\.");
190190
String[] thatParts = v2.split("\\.");
@@ -287,10 +287,10 @@ public KubernetesSupportedVersionResponse addKubernetesSupportedVersion(final Ad
287287
final Integer minimumCpu = cmd.getMinimumCpu();
288288
final Integer minimumRamSize = cmd.getMinimumRamSize();
289289
if (minimumCpu == null || minimumCpu < KubernetesClusterService.MIN_KUBERNETES_CLUSTER_NODE_CPU) {
290-
throw new InvalidParameterValueException(String.format("Invalid value for %s parameter", ApiConstants.MIN_CPU_NUMBER));
290+
throw new InvalidParameterValueException(String.format("Invalid value for %s parameter. Minimum %d vCPUs required.", ApiConstants.MIN_CPU_NUMBER, KubernetesClusterService.MIN_KUBERNETES_CLUSTER_NODE_CPU));
291291
}
292292
if (minimumRamSize == null || minimumRamSize < KubernetesClusterService.MIN_KUBERNETES_CLUSTER_NODE_RAM_SIZE) {
293-
throw new InvalidParameterValueException(String.format("Invalid value for %s parameter", ApiConstants.MIN_MEMORY));
293+
throw new InvalidParameterValueException(String.format("Invalid value for %s parameter. Minimum %dMB memory required", ApiConstants.MIN_MEMORY, KubernetesClusterService.MIN_KUBERNETES_CLUSTER_NODE_RAM_SIZE));
294294
}
295295
if (compareSemanticVersions(semanticVersion, MIN_KUBERNETES_VERSION) < 0) {
296296
throw new InvalidParameterValueException(String.format("New supported Kubernetes version cannot be added as %s is minimum version supported by Kubernetes Service", MIN_KUBERNETES_VERSION));

plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/AddKubernetesSupportedVersionCmd.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public class AddKubernetesSupportedVersionCmd extends BaseCmd implements AdminCm
6161
private String name;
6262

6363
@Parameter(name = ApiConstants.SEMANTIC_VERSION, type = CommandType.STRING, required = true,
64-
description = "the semantic version of the Kubernetes version")
64+
description = "the semantic version of the Kubernetes version. It needs to be specified in MAJOR.MINOR.PATCH format")
6565
private String semanticVersion;
6666

6767
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID,

plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/DeleteKubernetesSupportedVersionCmd.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,14 @@ public String getEventType() {
8383

8484
@Override
8585
public String getEventDescription() {
86-
return "Deleting Kubernetes supported version " + getId();
86+
String description = "Deleting Kubernetes supported version";
87+
KubernetesSupportedVersion version = _entityMgr.findById(KubernetesSupportedVersion.class, getId());
88+
if (version != null) {
89+
description += String.format(" ID: %s", version.getUuid());
90+
} else {
91+
description += String.format(" ID: %d", getId());
92+
}
93+
return description;
8794
}
8895

8996
/////////////////////////////////////////////////////

plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ public String getCreateEventDescription() {
259259

260260
@Override
261261
public String getEventDescription() {
262-
return "creating Kubernetes cluster. Cluster Id: " + getEntityId();
262+
return "Creating Kubernetes cluster. Cluster Id: " + getEntityId();
263263
}
264264

265265
@Override

plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/DeleteKubernetesClusterCmd.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,14 @@ public String getEventType() {
102102

103103
@Override
104104
public String getEventDescription() {
105+
String description = "Deleting Kubernetes cluster";
105106
KubernetesCluster cluster = _entityMgr.findById(KubernetesCluster.class, getId());
106-
return String.format("Deleting Kubernetes cluster ID: %s", cluster.getUuid());
107+
if (cluster != null) {
108+
description += String.format(" ID: %s", cluster.getUuid());
109+
} else {
110+
description += String.format(" ID: %d", getId());
111+
}
112+
return description;
107113
}
108114

109115
}

0 commit comments

Comments
 (0)