Skip to content

Commit 40e7807

Browse files
committed
Block VM-level affinity change on CKS VM
1 parent d3b4b2c commit 40e7807

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

api/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ enum KubernetesClusterNodeType {
3434
ControlledEntity findByUuid(String uuid);
3535
ControlledEntity findByVmId(long vmId);
3636
void checkVmCanBeDestroyed(UserVm userVm);
37+
void checkVmAffinityGroupsCanBeUpdated(UserVm userVm);
3738
boolean isValidNodeType(String nodeType);
3839
Map<String, Long> getServiceOfferingNodeTypeMap(Map<String, Map<String, String>> serviceOfferingNodeTypeMap);
3940
Map<String, Long> getTemplateNodeTypeMap(Map<String, Map<String, String>> templateNodeTypeMap);

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,27 @@ public void checkVmCanBeDestroyed(UserVm userVm) {
129129
throw new CloudRuntimeException(msg);
130130
}
131131

132+
@Override
133+
public void checkVmAffinityGroupsCanBeUpdated(UserVm userVm) {
134+
if (!UserVmManager.CKS_NODE.equals(userVm.getUserVmType())) {
135+
return;
136+
}
137+
KubernetesClusterVmMapVO clusterVmMapping = kubernetesClusterVmMapDao.findByVmId(userVm.getId());
138+
if (Objects.isNull(clusterVmMapping)) {
139+
return;
140+
}
141+
KubernetesCluster kubernetesCluster = kubernetesClusterDao.findById(clusterVmMapping.getClusterId());
142+
String errorMessage = "Affinity groups cannot be updated for a VM part of Kubernetes cluster";
143+
if (Objects.nonNull(kubernetesCluster)) {
144+
if (KubernetesCluster.ClusterType.ExternalManaged.equals(kubernetesCluster.getClusterType())) {
145+
return;
146+
}
147+
errorMessage += String.format(": %s", kubernetesCluster.getName());
148+
}
149+
errorMessage += ". Please use the cluster's Change Affinity option instead.";
150+
throw new CloudRuntimeException(errorMessage);
151+
}
152+
132153
@Override
133154
public boolean isValidNodeType(String nodeType) {
134155
if (StringUtils.isBlank(nodeType)) {

server/src/main/java/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import javax.inject.Inject;
2626
import javax.naming.ConfigurationException;
2727

28+
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
29+
2830
import org.apache.cloudstack.acl.ControlledEntity;
2931
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
3032
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
@@ -41,6 +43,8 @@
4143
import com.cloud.domain.dao.DomainDao;
4244
import com.cloud.event.ActionEvent;
4345
import com.cloud.event.EventTypes;
46+
import com.cloud.kubernetes.cluster.KubernetesServiceHelper;
47+
import com.cloud.utils.component.ComponentContext;
4448
import com.cloud.exception.InvalidParameterValueException;
4549
import com.cloud.exception.PermissionDeniedException;
4650
import com.cloud.hypervisor.Hypervisor;
@@ -435,6 +439,13 @@ public UserVm updateVMAffinityGroups(Long vmId, List<Long> affinityGroupIds) {
435439
if (UserVmManager.SHAREDFSVM.equals(vmInstance.getUserVmType())) {
436440
throw new InvalidParameterValueException("Operation not supported on Shared FileSystem Instance");
437441
}
442+
try {
443+
KubernetesServiceHelper kubernetesServiceHelper =
444+
ComponentContext.getDelegateComponentOfType(KubernetesServiceHelper.class);
445+
kubernetesServiceHelper.checkVmAffinityGroupsCanBeUpdated(vmInstance);
446+
} catch (NoSuchBeanDefinitionException ignored) {
447+
logger.debug("No KubernetesServiceHelper bean found");
448+
}
438449
if (Hypervisor.HypervisorType.External.equals(vmInstance.getHypervisorType())) {
439450
logger.error("Update VM Affinity Group not supported for {} as it is {} hypervisor instance",
440451
vmInstance, Hypervisor.HypervisorType.External.name());

0 commit comments

Comments
 (0)