Pearl1594 commented on code in PR #7515:
URL: https://github.com/apache/cloudstack/pull/7515#discussion_r1191250311
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -600,8 +609,66 @@ private void validateEndpointUrl() {
throw new InvalidParameterValueException(error);
}
}
+ private void validateUnmanagedKubernetesClusterCreateParameters(final
CreateKubernetesClusterCmd cmd) throws CloudRuntimeException {
+ final String name = cmd.getName();
+ final Long zoneId = cmd.getZoneId();
+ final Account owner =
accountService.getActiveAccountById(cmd.getEntityOwnerId());
+ final Long networkId = cmd.getNetworkId();
+ final String sshKeyPair = cmd.getSSHKeyPairName();
+ final String dockerRegistryUserName = cmd.getDockerRegistryUserName();
+ final String dockerRegistryPassword = cmd.getDockerRegistryPassword();
+ final String dockerRegistryUrl = cmd.getDockerRegistryUrl();
+ final Long nodeRootDiskSize = cmd.getNodeRootDiskSize();
+ final String externalLoadBalancerIpAddress =
cmd.getExternalLoadBalancerIpAddress();
+
+ if (name == null || name.isEmpty()) {
+ throw new InvalidParameterValueException("Invalid name for the
Kubernetes cluster name:" + name);
+ }
+
+ DataCenter zone = dataCenterDao.findById(zoneId);
+ if (zone == null) {
+ throw new InvalidParameterValueException("Unable to find zone by
ID: " + zoneId);
+ }
+
+ if (zone.getAllocationState() == Grouping.AllocationState.Disabled) {
+ throw new PermissionDeniedException(String.format("Cannot perform
this operation, zone ID: %s is currently disabled", zone.getUuid()));
+ }
+
+ if (sshKeyPair != null && !sshKeyPair.isEmpty()) {
+ SSHKeyPairVO sshKeyPairVO =
sshKeyPairDao.findByName(owner.getAccountId(), owner.getDomainId(), sshKeyPair);
+ if (sshKeyPairVO == null) {
+ throw new InvalidParameterValueException(String.format("Given
SSH key pair with name: %s was not found for the account %s", sshKeyPair,
owner.getAccountName()));
+ }
+ }
+
+ if (nodeRootDiskSize != null && nodeRootDiskSize <= 0) {
+ throw new InvalidParameterValueException(String.format("Invalid
value for %s", ApiConstants.NODE_ROOT_DISK_SIZE));
+ }
- private void validateKubernetesClusterCreateParameters(final
CreateKubernetesClusterCmd cmd) throws CloudRuntimeException {
+ validateDockerRegistryParams(dockerRegistryUserName,
dockerRegistryPassword, dockerRegistryUrl);
+
+ Network network = null;
+ if (networkId != null) {
+ network = networkService.getNetwork(networkId);
+ if (network == null) {
+ throw new InvalidParameterValueException("Unable to find
network with given ID");
+ }
+ }
+
+ if (StringUtils.isNotEmpty(externalLoadBalancerIpAddress)) {
+ if (!NetUtils.isValidIp4(externalLoadBalancerIpAddress) &&
!NetUtils.isValidIp6(externalLoadBalancerIpAddress)) {
+ throw new InvalidParameterValueException("Invalid external
load balancer IP address");
+ }
+ if (network == null) {
+ throw new InvalidParameterValueException(String.format("%s
parameter must be specified along with %s parameter",
ApiConstants.EXTERNAL_LOAD_BALANCER_IP_ADDRESS, ApiConstants.NETWORK_ID));
+ }
+ if (Network.GuestType.Shared.equals(network.getGuestType())) {
+ throw new InvalidParameterValueException(String.format("%s
parameter must be specified along with %s type of network",
ApiConstants.EXTERNAL_LOAD_BALANCER_IP_ADDRESS,
Network.GuestType.Shared.toString()));
+ }
Review Comment:
Correct me if I'm wrong, but should this check be negated or the exception
should be different?
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -600,8 +609,66 @@ private void validateEndpointUrl() {
throw new InvalidParameterValueException(error);
}
}
+ private void validateUnmanagedKubernetesClusterCreateParameters(final
CreateKubernetesClusterCmd cmd) throws CloudRuntimeException {
+ final String name = cmd.getName();
+ final Long zoneId = cmd.getZoneId();
+ final Account owner =
accountService.getActiveAccountById(cmd.getEntityOwnerId());
+ final Long networkId = cmd.getNetworkId();
+ final String sshKeyPair = cmd.getSSHKeyPairName();
+ final String dockerRegistryUserName = cmd.getDockerRegistryUserName();
+ final String dockerRegistryPassword = cmd.getDockerRegistryPassword();
+ final String dockerRegistryUrl = cmd.getDockerRegistryUrl();
+ final Long nodeRootDiskSize = cmd.getNodeRootDiskSize();
+ final String externalLoadBalancerIpAddress =
cmd.getExternalLoadBalancerIpAddress();
+
+ if (name == null || name.isEmpty()) {
+ throw new InvalidParameterValueException("Invalid name for the
Kubernetes cluster name:" + name);
Review Comment:
nit: May be we could just say missing cluster name or something around those
lines, coz this would just print null for the name
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -1019,12 +1093,64 @@ protected boolean stateTransitTo(long
kubernetesClusterId, KubernetesCluster.Eve
}
@Override
- public KubernetesCluster
createKubernetesCluster(CreateKubernetesClusterCmd cmd) throws
CloudRuntimeException {
+ public KubernetesCluster
createUnmanagedKubernetesCluster(CreateKubernetesClusterCmd cmd) throws
CloudRuntimeException {
+ if (!KubernetesServiceEnabled.value()) {
+ logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
+ }
+
+ validateUnmanagedKubernetesClusterCreateParameters(cmd);
+
+ final DataCenter zone = dataCenterDao.findById(cmd.getZoneId());
+ final long controlNodeCount = cmd.getControlNodes();
+ final long clusterSize =
Objects.requireNonNullElse(cmd.getClusterSize(), 0L);
+ final ServiceOffering serviceOffering =
serviceOfferingDao.findById(cmd.getServiceOfferingId());
+ final Account owner =
accountService.getActiveAccountById(cmd.getEntityOwnerId());
+ final KubernetesSupportedVersion clusterKubernetesVersion =
kubernetesSupportedVersionDao.findById(cmd.getKubernetesVersionId());
+
+ final Network network = networkDao.findById(cmd.getNetworkId());
+ long cores;
+ long memory;
+ Long serviceOfferingId = null;
+ if (serviceOffering != null) {
+ serviceOfferingId = serviceOffering.getId();
+ cores = serviceOffering.getCpu() * (controlNodeCount +
clusterSize);
+ memory = serviceOffering.getRamSize() * (controlNodeCount +
clusterSize);
+ } else {
+ cores = 0;
+ memory = 0;
+ }
+
+ final Long finalServiceOfferingId = serviceOfferingId;
+ final Long defaultNetworkId = network == null ? null : network.getId();
+ final Long clusterKubernetesVersionId = clusterKubernetesVersion ==
null ? null : clusterKubernetesVersion.getId();
+ final KubernetesClusterVO cluster = Transaction.execute(new
TransactionCallback<KubernetesClusterVO>() {
+ @Override
+ public KubernetesClusterVO doInTransaction(TransactionStatus
status) {
+ KubernetesClusterVO newCluster = new
KubernetesClusterVO(cmd.getName(), cmd.getDisplayName(), zone.getId(),
clusterKubernetesVersionId,
+ finalServiceOfferingId, null, defaultNetworkId,
owner.getDomainId(),
+ owner.getAccountId(), controlNodeCount, clusterSize,
KubernetesCluster.State.Running, cmd.getSSHKeyPairName(), cores, memory,
+ cmd.getNodeRootDiskSize(), "", false);
+ kubernetesClusterDao.persist(newCluster);
+ return newCluster;
+ }
+ });
+
+ addKubernetesClusterDetails(cluster, network, cmd);
+
+ if (LOGGER.isInfoEnabled()) {
+ LOGGER.info(String.format("Kubernetes cluster name: %s and ID: %s
has been created", cluster.getName(), cluster.getUuid()));
Review Comment:
```suggestion
LOGGER.info(String.format("Kubernetes cluster with name: %s and
ID: %s has been created", cluster.getName(), cluster.getUuid()));
```
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -1111,6 +1238,10 @@ public boolean startKubernetesCluster(long
kubernetesClusterId, boolean onCreate
if (kubernetesCluster == null) {
throw new InvalidParameterValueException("Failed to find
Kubernetes cluster with given ID");
}
+ if (!kubernetesCluster.getManaged()) {
+ LOGGER.debug(String.format("Kubernetes cluster : %s is not managed
by CloudStack", kubernetesCluster.getName()));
+ return true;
Review Comment:
can we add what operation is not supported for un-managed clusters
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -1329,6 +1479,82 @@ public boolean
upgradeKubernetesCluster(UpgradeKubernetesClusterCmd cmd) throws
return upgradeWorker.upgradeCluster();
}
+ @Override
+ public boolean addVmsToCluster(AddVmsToKubernetesClusterCmd cmd) {
+ if (!KubernetesServiceEnabled.value()) {
+ logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
+ }
+ List<Long> vmIds = cmd.getVmIds();
+ Long clusterId = cmd.getId();
+
+ if (vmIds == null || vmIds.isEmpty() || clusterId == null) {
+ throw new InvalidParameterValueException("Invalid parameters
specified");
+ }
+
+ KubernetesClusterVO kubernetesCluster =
kubernetesClusterDao.findById(clusterId);
+ if (kubernetesCluster == null) {
+ throw new InvalidParameterValueException("Invalid Kubernetes
cluster ID specified");
+ }
+ // User should have access to both VM and Kubernetes cluster
+ accountManager.checkAccess(CallContext.current().getCallingAccount(),
SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
+ for (Long vmId : vmIds) {
+ VMInstanceVO vmInstance = vmInstanceDao.findById(vmId);
+ if (vmInstance == null) {
+ throw new InvalidParameterValueException("Invalid VM ID
specified");
+ }
+
accountManager.checkAccess(CallContext.current().getCallingAccount(),
SecurityChecker.AccessType.OperateEntry, false, vmInstance);
+ }
+
+ if (kubernetesCluster.getManaged()) {
+ throw new InvalidParameterValueException("VM cannot be added to a
managed Kubernetes cluster");
+ }
+
+ KubernetesClusterVmMapVO clusterVmMap = null;
+ List<KubernetesClusterVmMapVO> clusterVmMapList =
kubernetesClusterVmMapDao.listByClusterIdAndVmIdsIn(clusterId, vmIds);
+ ArrayList<Long> alreadyExistingVmIds = new ArrayList<>();
+ for (KubernetesClusterVmMapVO clusterVmMapVO : clusterVmMapList) {
+ alreadyExistingVmIds.add(clusterVmMapVO.getVmId());
+ }
+
+ for (Long vmId : vmIds) {
+ if (alreadyExistingVmIds.contains(vmId)) {
+ continue;
+ }
+ clusterVmMap = new KubernetesClusterVmMapVO(clusterId, vmId,
cmd.isControlNode());
+ kubernetesClusterVmMapDao.persist(clusterVmMap);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean removeVmsFromCluster(RemoveVmsFromKubernetesClusterCmd cmd)
{
+ if (!KubernetesServiceEnabled.value()) {
+ logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
+ }
+ List<Long> vmIds = cmd.getVmIds();
+ Long clusterId = cmd.getId();
+
+ if (vmIds == null || vmIds.isEmpty() || clusterId == null) {
+ throw new InvalidParameterValueException("Invalid parameters
specified");
+ }
Review Comment:
same here, may be worth specifying what argument is missing
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -832,6 +900,9 @@ private void
validateKubernetesClusterScaleParameters(ScaleKubernetesClusterCmd
Account caller = CallContext.current().getCallingAccount();
accountManager.checkAccess(caller,
SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
+ if (!kubernetesCluster.getManaged()) {
+ throw new InvalidParameterValueException(String.format("Kubernetes
cluster %s is not managed by Apache CloudStack", kubernetesCluster.getName()));
Review Comment:
Should we move this check right up, so as to first check if it's a managed
cluster or not and then proceed with checking other params? Also, would it make
sense to add that Scaling an unmanaged cluster is not supported via Cloudstack?
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -1329,6 +1479,82 @@ public boolean
upgradeKubernetesCluster(UpgradeKubernetesClusterCmd cmd) throws
return upgradeWorker.upgradeCluster();
}
+ @Override
+ public boolean addVmsToCluster(AddVmsToKubernetesClusterCmd cmd) {
+ if (!KubernetesServiceEnabled.value()) {
+ logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
+ }
+ List<Long> vmIds = cmd.getVmIds();
+ Long clusterId = cmd.getId();
+
+ if (vmIds == null || vmIds.isEmpty() || clusterId == null) {
+ throw new InvalidParameterValueException("Invalid parameters
specified");
+ }
+
+ KubernetesClusterVO kubernetesCluster =
kubernetesClusterDao.findById(clusterId);
+ if (kubernetesCluster == null) {
+ throw new InvalidParameterValueException("Invalid Kubernetes
cluster ID specified");
+ }
+ // User should have access to both VM and Kubernetes cluster
+ accountManager.checkAccess(CallContext.current().getCallingAccount(),
SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
+ for (Long vmId : vmIds) {
+ VMInstanceVO vmInstance = vmInstanceDao.findById(vmId);
+ if (vmInstance == null) {
+ throw new InvalidParameterValueException("Invalid VM ID
specified");
+ }
+
accountManager.checkAccess(CallContext.current().getCallingAccount(),
SecurityChecker.AccessType.OperateEntry, false, vmInstance);
+ }
+
+ if (kubernetesCluster.getManaged()) {
+ throw new InvalidParameterValueException("VM cannot be added to a
managed Kubernetes cluster");
+ }
+
+ KubernetesClusterVmMapVO clusterVmMap = null;
+ List<KubernetesClusterVmMapVO> clusterVmMapList =
kubernetesClusterVmMapDao.listByClusterIdAndVmIdsIn(clusterId, vmIds);
+ ArrayList<Long> alreadyExistingVmIds = new ArrayList<>();
+ for (KubernetesClusterVmMapVO clusterVmMapVO : clusterVmMapList) {
+ alreadyExistingVmIds.add(clusterVmMapVO.getVmId());
+ }
+
+ for (Long vmId : vmIds) {
Review Comment:
nit: maybe we could use vmIds.removeAll(alreadyExistingVmIds) to get the VMs
that aren't existing
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -1329,6 +1479,82 @@ public boolean
upgradeKubernetesCluster(UpgradeKubernetesClusterCmd cmd) throws
return upgradeWorker.upgradeCluster();
}
+ @Override
+ public boolean addVmsToCluster(AddVmsToKubernetesClusterCmd cmd) {
+ if (!KubernetesServiceEnabled.value()) {
+ logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
+ }
+ List<Long> vmIds = cmd.getVmIds();
+ Long clusterId = cmd.getId();
+
+ if (vmIds == null || vmIds.isEmpty() || clusterId == null) {
+ throw new InvalidParameterValueException("Invalid parameters
specified");
Review Comment:
could be helpful to specify what parameter wasn't passed, i.e., vmIDs or
clusterID
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -1019,12 +1093,64 @@ protected boolean stateTransitTo(long
kubernetesClusterId, KubernetesCluster.Eve
}
@Override
- public KubernetesCluster
createKubernetesCluster(CreateKubernetesClusterCmd cmd) throws
CloudRuntimeException {
+ public KubernetesCluster
createUnmanagedKubernetesCluster(CreateKubernetesClusterCmd cmd) throws
CloudRuntimeException {
+ if (!KubernetesServiceEnabled.value()) {
+ logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
+ }
+
+ validateUnmanagedKubernetesClusterCreateParameters(cmd);
+
+ final DataCenter zone = dataCenterDao.findById(cmd.getZoneId());
+ final long controlNodeCount = cmd.getControlNodes();
+ final long clusterSize =
Objects.requireNonNullElse(cmd.getClusterSize(), 0L);
+ final ServiceOffering serviceOffering =
serviceOfferingDao.findById(cmd.getServiceOfferingId());
+ final Account owner =
accountService.getActiveAccountById(cmd.getEntityOwnerId());
+ final KubernetesSupportedVersion clusterKubernetesVersion =
kubernetesSupportedVersionDao.findById(cmd.getKubernetesVersionId());
+
+ final Network network = networkDao.findById(cmd.getNetworkId());
+ long cores;
+ long memory;
+ Long serviceOfferingId = null;
+ if (serviceOffering != null) {
+ serviceOfferingId = serviceOffering.getId();
+ cores = serviceOffering.getCpu() * (controlNodeCount +
clusterSize);
+ memory = serviceOffering.getRamSize() * (controlNodeCount +
clusterSize);
+ } else {
Review Comment:
nit: can we initialize cores and memory to 0, and do away with the else
block?
##########
plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java:
##########
@@ -76,13 +76,13 @@ public class CreateKubernetesClusterCmd extends
BaseAsyncCreateCmd {
description = "availability zone in which Kubernetes cluster to be
launched")
private Long zoneId;
- @Parameter(name = ApiConstants.KUBERNETES_VERSION_ID, type =
CommandType.UUID, entityType = KubernetesSupportedVersionResponse.class,
required = true,
+ @Parameter(name = ApiConstants.KUBERNETES_VERSION_ID, type =
CommandType.UUID, entityType = KubernetesSupportedVersionResponse.class,
Review Comment:
I believe we can add since to parameters too..
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -1329,6 +1479,82 @@ public boolean
upgradeKubernetesCluster(UpgradeKubernetesClusterCmd cmd) throws
return upgradeWorker.upgradeCluster();
}
+ @Override
+ public boolean addVmsToCluster(AddVmsToKubernetesClusterCmd cmd) {
+ if (!KubernetesServiceEnabled.value()) {
+ logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
+ }
+ List<Long> vmIds = cmd.getVmIds();
+ Long clusterId = cmd.getId();
+
+ if (vmIds == null || vmIds.isEmpty() || clusterId == null) {
+ throw new InvalidParameterValueException("Invalid parameters
specified");
+ }
+
+ KubernetesClusterVO kubernetesCluster =
kubernetesClusterDao.findById(clusterId);
+ if (kubernetesCluster == null) {
+ throw new InvalidParameterValueException("Invalid Kubernetes
cluster ID specified");
+ }
+ // User should have access to both VM and Kubernetes cluster
+ accountManager.checkAccess(CallContext.current().getCallingAccount(),
SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
+ for (Long vmId : vmIds) {
+ VMInstanceVO vmInstance = vmInstanceDao.findById(vmId);
+ if (vmInstance == null) {
+ throw new InvalidParameterValueException("Invalid VM ID
specified");
+ }
+
accountManager.checkAccess(CallContext.current().getCallingAccount(),
SecurityChecker.AccessType.OperateEntry, false, vmInstance);
+ }
+
+ if (kubernetesCluster.getManaged()) {
+ throw new InvalidParameterValueException("VM cannot be added to a
managed Kubernetes cluster");
Review Comment:
can we move this check before the VM ids check, to fail faster, in case the
cluster is of managed type
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -600,8 +609,66 @@ private void validateEndpointUrl() {
throw new InvalidParameterValueException(error);
}
}
+ private void validateUnmanagedKubernetesClusterCreateParameters(final
CreateKubernetesClusterCmd cmd) throws CloudRuntimeException {
+ final String name = cmd.getName();
+ final Long zoneId = cmd.getZoneId();
+ final Account owner =
accountService.getActiveAccountById(cmd.getEntityOwnerId());
+ final Long networkId = cmd.getNetworkId();
+ final String sshKeyPair = cmd.getSSHKeyPairName();
+ final String dockerRegistryUserName = cmd.getDockerRegistryUserName();
+ final String dockerRegistryPassword = cmd.getDockerRegistryPassword();
+ final String dockerRegistryUrl = cmd.getDockerRegistryUrl();
+ final Long nodeRootDiskSize = cmd.getNodeRootDiskSize();
+ final String externalLoadBalancerIpAddress =
cmd.getExternalLoadBalancerIpAddress();
+
+ if (name == null || name.isEmpty()) {
+ throw new InvalidParameterValueException("Invalid name for the
Kubernetes cluster name:" + name);
+ }
+
+ DataCenter zone = dataCenterDao.findById(zoneId);
+ if (zone == null) {
+ throw new InvalidParameterValueException("Unable to find zone by
ID: " + zoneId);
+ }
+
+ if (zone.getAllocationState() == Grouping.AllocationState.Disabled) {
+ throw new PermissionDeniedException(String.format("Cannot perform
this operation, zone ID: %s is currently disabled", zone.getUuid()));
+ }
+
+ if (sshKeyPair != null && !sshKeyPair.isEmpty()) {
Review Comment:
Strings.isNullOrEmpty()
```suggestion
if (!Strings.isNullOrEmpty(sshKeyPair)) {
```
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -1178,6 +1309,9 @@ public boolean stopKubernetesCluster(long
kubernetesClusterId) throws CloudRunti
if (kubernetesCluster == null) {
throw new InvalidParameterValueException("Failed to find
Kubernetes cluster with given ID");
}
+ if (!kubernetesCluster.getManaged()) {
+ throw new InvalidParameterValueException(String.format("Kubernetes
cluster : %s is not managed by CloudStack", kubernetesCluster.getName()));
+ }
Review Comment:
can we add what operation is not supported for un-managed clusters
##########
plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java:
##########
@@ -961,6 +1032,9 @@ private void
validateKubernetesClusterUpgradeParameters(UpgradeKubernetesCluster
throw new InvalidParameterValueException("Invalid Kubernetes
cluster ID");
}
accountManager.checkAccess(CallContext.current().getCallingAccount(),
SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
+ if (!kubernetesCluster.getManaged()) {
+ throw new InvalidParameterValueException(String.format("Kubernetes
cluster : %s is not managed by Apache CloudStack",
kubernetesCluster.getName()));
+ }
Review Comment:
Same here, Should we move this check right up, so as to first check if it's
a managed cluster or not and then proceed with checking other params? Also, may
be worth adding the operation that isn't supported via CloudStack for unmanaged
clusters?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]