diff --git a/.asf.yaml b/.asf.yaml
index 8c1a5d51fdf1..dabefa1eb544 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -58,7 +58,10 @@ github:
- gpordeus
- hsato03
- bernardodemarco
+<<<<<<< HEAD
+=======
- abh1sar
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
protected_branches: ~
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 51c0b006c4a7..f34a350b9e9e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -86,8 +86,12 @@ jobs:
smoke/test_migration
smoke/test_multipleips_per_nic
smoke/test_nested_virtualization
+<<<<<<< HEAD
+ smoke/test_set_sourcenat",
+=======
smoke/test_set_sourcenat
smoke/test_webhook_lifecycle",
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
"smoke/test_network
smoke/test_network_acl
smoke/test_network_ipv6
diff --git a/agent/conf/cloudstack-agent.logrotate.in b/agent/conf/cloudstack-agent.logrotate.in
index 9f22b4bab868..cab7bfa12f40 100644
--- a/agent/conf/cloudstack-agent.logrotate.in
+++ b/agent/conf/cloudstack-agent.logrotate.in
@@ -15,13 +15,20 @@
# specific language governing permissions and limitations
# under the License.
+<<<<<<< HEAD
+/var/log/cloudstack/agent/security_group.log /var/log/cloudstack/agent/resizevolume.log /var/log/cloudstack/agent/rolling-maintenance.log {
+=======
/var/log/cloudstack/agent/security_group.log /var/log/cloudstack/agent/resizevolume.log /var/log/cloudstack/agent/rolling-maintenance.log /var/log/cloudstack/agent/agent.out /var/log/cloudstack/agent/agent.err {
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
copytruncate
daily
rotate 5
compress
missingok
size 10M
+<<<<<<< HEAD
+=======
dateext
dateformat -%Y-%m-%d
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/agent/conf/log4j-cloud.xml.in b/agent/conf/log4j-cloud.xml.in
index 29c1d5ee6415..222c013fbfdc 100644
--- a/agent/conf/log4j-cloud.xml.in
+++ b/agent/conf/log4j-cloud.xml.in
@@ -38,7 +38,11 @@ under the License.
+<<<<<<< HEAD
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
diff --git a/agent/src/test/java/com/cloud/agent/AgentShellTest.java b/agent/src/test/java/com/cloud/agent/AgentShellTest.java
index 4126692546f2..ef6ebe51c6b1 100644
--- a/agent/src/test/java/com/cloud/agent/AgentShellTest.java
+++ b/agent/src/test/java/com/cloud/agent/AgentShellTest.java
@@ -350,6 +350,8 @@ public void setHostTestValueIsNullPropertyDoesNotStartAndEndWithAtSignSetHosts()
Mockito.verify(agentShellSpy).setHosts(expected);
}
+<<<<<<< HEAD
+=======
@Test
public void updateAndGetConnectedHost() {
@@ -362,4 +364,5 @@ public void updateAndGetConnectedHost() {
Assert.assertEquals(expected, shell.getConnectedHost());
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/api/src/main/java/com/cloud/event/EventTypes.java b/api/src/main/java/com/cloud/event/EventTypes.java
index 689676290b36..c26acb021edb 100644
--- a/api/src/main/java/com/cloud/event/EventTypes.java
+++ b/api/src/main/java/com/cloud/event/EventTypes.java
@@ -29,9 +29,15 @@
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.config.Configuration;
import org.apache.cloudstack.ha.HAConfig;
+<<<<<<< HEAD
+import org.apache.cloudstack.storage.object.Bucket;
+import org.apache.cloudstack.storage.object.ObjectStore;
+import org.apache.cloudstack.quota.QuotaTariff;
+=======
import org.apache.cloudstack.quota.QuotaTariff;
import org.apache.cloudstack.storage.object.Bucket;
import org.apache.cloudstack.storage.object.ObjectStore;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.usage.Usage;
import org.apache.cloudstack.vm.schedule.VMSchedule;
@@ -1229,8 +1235,11 @@ public static Class getEntityClassForEvent(String eventName) {
public static boolean isVpcEvent(String eventType) {
return EventTypes.EVENT_VPC_CREATE.equals(eventType) || EventTypes.EVENT_VPC_DELETE.equals(eventType);
}
+<<<<<<< HEAD
+=======
public static void addEntityEventDetail(String event, Class> clazz) {
entityEventDetails.put(event, clazz);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/api/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterHelper.java b/api/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterHelper.java
new file mode 100644
index 000000000000..e160227749db
--- /dev/null
+++ b/api/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterHelper.java
@@ -0,0 +1,26 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.kubernetes.cluster;
+
+import com.cloud.utils.component.Adapter;
+import org.apache.cloudstack.acl.ControlledEntity;
+
+public interface KubernetesClusterHelper extends Adapter {
+
+ ControlledEntity findByUuid(String uuid);
+ ControlledEntity findByVmId(long vmId);
+}
diff --git a/api/src/main/java/com/cloud/network/NetworkService.java b/api/src/main/java/com/cloud/network/NetworkService.java
index b8dd464b3655..97a7f40132e3 100644
--- a/api/src/main/java/com/cloud/network/NetworkService.java
+++ b/api/src/main/java/com/cloud/network/NetworkService.java
@@ -20,7 +20,10 @@
import java.util.Map;
import com.cloud.dc.DataCenter;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.acl.ControlledEntity;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin;
import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
@@ -103,10 +106,13 @@ IpAddress allocatePortableIP(Account ipOwner, int regionId, Long zoneId, Long ne
Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapacityException, ConcurrentOperationException, ResourceAllocationException;
+<<<<<<< HEAD
+=======
Network createGuestNetwork(long networkOfferingId, String name, String displayText, Account owner,
PhysicalNetwork physicalNetwork, long zoneId, ControlledEntity.ACLType aclType) throws
InsufficientCapacityException, ConcurrentOperationException, ResourceAllocationException;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
Pair, Integer> searchForNetworks(ListNetworksCmd cmd);
boolean deleteNetwork(long networkId, boolean forced);
diff --git a/api/src/main/java/com/cloud/network/vpc/VpcService.java b/api/src/main/java/com/cloud/network/vpc/VpcService.java
index 0f0d29f4082c..ae3a8c4f65f0 100644
--- a/api/src/main/java/com/cloud/network/vpc/VpcService.java
+++ b/api/src/main/java/com/cloud/network/vpc/VpcService.java
@@ -132,8 +132,11 @@ Pair, Integer> listVpcs(Long id, String vpcName, String disp
*/
boolean startVpc(long vpcId, boolean destroyOnFailure) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
+<<<<<<< HEAD
+=======
void startVpc(CreateVPCCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/**
* Shuts down the VPC which includes shutting down all VPC provider and rules cleanup on the backend
*
diff --git a/api/src/main/java/com/cloud/user/ResourceLimitService.java b/api/src/main/java/com/cloud/user/ResourceLimitService.java
index 3b30b8fc4a57..ae975e550ee6 100644
--- a/api/src/main/java/com/cloud/user/ResourceLimitService.java
+++ b/api/src/main/java/com/cloud/user/ResourceLimitService.java
@@ -38,10 +38,14 @@ public interface ResourceLimitService {
static final ConfigKey MaxProjectSecondaryStorage = new ConfigKey<>("Project Defaults", Long.class, "max.project.secondary.storage", "400",
"The default maximum secondary storage space (in GiB) that can be used for a project", false);
static final ConfigKey ResourceCountCheckInterval = new ConfigKey<>("Advanced", Long.class, "resourcecount.check.interval", "300",
+<<<<<<< HEAD
+ "Time (in seconds) to wait before running resource recalculation and fixing task. Default is 300 seconds, Setting this to 0 disables execution of the task", true);
+=======
"Time (in seconds) to wait before running resource recalculation and fixing tasks like stale resource reservation cleanup" +
". Default is 300 seconds, Setting this to 0 disables execution of the task", true);
static final ConfigKey ResourceReservationCleanupDelay = new ConfigKey<>("Advanced", Long.class, "resource.reservation.cleanup.delay", "3600",
"Time (in seconds) after which a resource reservation gets deleted. Default is 3600 seconds, Setting this to 0 disables execution of the task", true);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
static final ConfigKey ResourceLimitHostTags = new ConfigKey<>("Advanced", String.class, "resource.limit.host.tags", "",
"A comma-separated list of tags for host resource limits", true);
static final ConfigKey ResourceLimitStorageTags = new ConfigKey<>("Advanced", String.class, "resource.limit.storage.tags", "",
diff --git a/api/src/main/java/com/cloud/uservm/UserVm.java b/api/src/main/java/com/cloud/uservm/UserVm.java
index 9035d2903c9a..5e32fbb370fb 100644
--- a/api/src/main/java/com/cloud/uservm/UserVm.java
+++ b/api/src/main/java/com/cloud/uservm/UserVm.java
@@ -48,6 +48,9 @@ public interface UserVm extends VirtualMachine, ControlledEntity {
void setAccountId(long accountId);
public boolean isDisplayVm();
+<<<<<<< HEAD
+=======
String getUserVmType();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/api/src/main/java/com/cloud/vm/UserVmService.java b/api/src/main/java/com/cloud/vm/UserVmService.java
index a30c4491f9dd..4e0eb1690e08 100644
--- a/api/src/main/java/com/cloud/vm/UserVmService.java
+++ b/api/src/main/java/com/cloud/vm/UserVmService.java
@@ -45,7 +45,10 @@
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ManagementServerException;
+<<<<<<< HEAD
+=======
import com.cloud.exception.OperationTimedoutException;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.StorageUnavailableException;
@@ -67,7 +70,14 @@ public interface UserVmService {
/**
* Destroys one virtual machine
*
+<<<<<<< HEAD
+ * @param userId
+ * the id of the user performing the action
+ * @param vmId
+ * the id of the virtual machine.
+=======
* @param cmd the API Command Object containg the parameters to use for this service action
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
* @throws ConcurrentOperationException
* @throws ResourceUnavailableException
*/
@@ -110,8 +120,11 @@ UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, E
UserVm rebootVirtualMachine(RebootVMCmd cmd) throws InsufficientCapacityException, ResourceUnavailableException, ResourceAllocationException;
+<<<<<<< HEAD
+=======
void startVirtualMachine(UserVm vm) throws OperationTimedoutException, ResourceUnavailableException, InsufficientCapacityException;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
UserVm updateVirtualMachine(UpdateVMCmd cmd) throws ResourceUnavailableException, InsufficientCapacityException;
/**
@@ -148,6 +161,17 @@ UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, E
* Creates a Basic Zone User VM in the database and returns the VM to the
* caller.
*
+<<<<<<< HEAD
+ *
+ *
+ * @param sshKeyPair
+ * - name of the ssh key pair used to login to the virtual
+ * machine
+ * @param cpuSpeed
+ * @param memory
+ * @param cpuNumber
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
* @param zone
* - availability zone for the virtual machine
* @param serviceOffering
@@ -223,6 +247,12 @@ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering s
* Creates a User VM in Advanced Zone (Security Group feature is enabled) in
* the database and returns the VM to the caller.
*
+<<<<<<< HEAD
+ *
+ *
+ * @param type
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
* @param zone
* - availability zone for the virtual machine
* @param serviceOffering
@@ -298,6 +328,17 @@ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOfferin
* Creates a User VM in Advanced Zone (Security Group feature is disabled)
* in the database and returns the VM to the caller.
*
+<<<<<<< HEAD
+ *
+ *
+ * @param sshKeyPair
+ * - name of the ssh key pair used to login to the virtual
+ * machine
+ * @param cpuSpeed
+ * @param memory
+ * @param cpuNumber
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
* @param zone
* - availability zone for the virtual machine
* @param serviceOffering
diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java b/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java
index 938936765167..ab6966c8f223 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java
@@ -17,9 +17,13 @@
package org.apache.cloudstack.api;
import java.util.ArrayList;
+<<<<<<< HEAD
+import java.util.List;
+=======
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.region.PortableIp;
import org.apache.commons.collections.CollectionUtils;
@@ -83,6 +87,12 @@ public enum ApiCommandResourceType {
ManagementServer(org.apache.cloudstack.management.ManagementServerHost.class),
ObjectStore(org.apache.cloudstack.storage.object.ObjectStore.class),
Bucket(org.apache.cloudstack.storage.object.Bucket.class),
+<<<<<<< HEAD
+ QuotaTariff(org.apache.cloudstack.quota.QuotaTariff.class);
+
+ private final Class> clazz;
+
+=======
QuotaTariff(org.apache.cloudstack.quota.QuotaTariff.class),
KubernetesCluster(null),
KubernetesSupportedVersion(null);
@@ -91,14 +101,18 @@ public enum ApiCommandResourceType {
static final Map> additionalClassMappings = new HashMap<>();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private ApiCommandResourceType(Class> clazz) {
this.clazz = clazz;
}
public Class> getAssociatedClass() {
+<<<<<<< HEAD
+=======
if (this.clazz == null && additionalClassMappings.containsKey(this)) {
return additionalClassMappings.get(this);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
return this.clazz;
}
@@ -128,8 +142,11 @@ public static ApiCommandResourceType fromString(String value) {
}
return null;
}
+<<<<<<< HEAD
+=======
public static void setClassMapping(ApiCommandResourceType type, Class> clazz) {
additionalClassMappings.put(type, clazz);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index 54c0227de9fa..48a7d4e62015 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -175,8 +175,11 @@ public class ApiConstants {
public static final String END_IPV6 = "endipv6";
public static final String END_PORT = "endport";
public static final String ENTRY_TIME = "entrytime";
+<<<<<<< HEAD
+=======
public static final String EVENT_ID = "eventid";
public static final String EVENT_TYPE = "eventtype";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String EXPIRES = "expires";
public static final String EXTRA_CONFIG = "extraconfig";
public static final String EXTRA_DHCP_OPTION = "extradhcpoption";
@@ -211,7 +214,10 @@ public class ApiConstants {
public static final String HA_PROVIDER = "haprovider";
public static final String HA_STATE = "hastate";
public static final String HEALTH = "health";
+<<<<<<< HEAD
+=======
public static final String HEADERS = "headers";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String HIDE_IP_ADDRESS_USAGE = "hideipaddressusage";
public static final String HOST_ID = "hostid";
public static final String HOST_IDS = "hostids";
@@ -266,7 +272,10 @@ public class ApiConstants {
public static final String IS_CLEANUP_REQUIRED = "iscleanuprequired";
public static final String IS_DYNAMIC = "isdynamic";
public static final String IS_EDGE = "isedge";
+<<<<<<< HEAD
+=======
public static final String IS_ENCRYPTED = "isencrypted";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String IS_EXTRACTABLE = "isextractable";
public static final String IS_FEATURED = "isfeatured";
public static final String IS_IMPLICIT = "isimplicit";
@@ -285,7 +294,10 @@ public class ApiConstants {
public static final String JOB_STATUS = "jobstatus";
public static final String KEEPALIVE_ENABLED = "keepaliveenabled";
public static final String KERNEL_VERSION = "kernelversion";
+<<<<<<< HEAD
+=======
public static final String KEY = "key";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String LABEL = "label";
public static final String LASTNAME = "lastname";
public static final String LAST_BOOT = "lastboottime";
@@ -360,7 +372,10 @@ public class ApiConstants {
public static final String SSHKEY_ENABLED = "sshkeyenabled";
public static final String PATH = "path";
public static final String PAYLOAD = "payload";
+<<<<<<< HEAD
+=======
public static final String PAYLOAD_URL = "payloadurl";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String POD_ID = "podid";
public static final String POD_NAME = "podname";
public static final String POD_IDS = "podids";
@@ -406,9 +421,17 @@ public class ApiConstants {
public static final String QUERY_FILTER = "queryfilter";
public static final String SCHEDULE = "schedule";
public static final String SCOPE = "scope";
+<<<<<<< HEAD
+ public static final String SECRET_KEY = "usersecretkey";
+ public static final String SECONDARY_IP = "secondaryip";
+ public static final String SINCE = "since";
+ public static final String KEY = "key";
+ public static final String SEARCH_BASE = "searchbase";
+=======
public static final String SEARCH_BASE = "searchbase";
public static final String SECONDARY_IP = "secondaryip";
public static final String SECRET_KEY = "secretkey";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String SECURITY_GROUP_IDS = "securitygroupids";
public static final String SECURITY_GROUP_NAMES = "securitygroupnames";
public static final String SECURITY_GROUP_NAME = "securitygroupname";
@@ -426,7 +449,10 @@ public class ApiConstants {
public static final String SHOW_UNIQUE = "showunique";
public static final String SIGNATURE = "signature";
public static final String SIGNATURE_VERSION = "signatureversion";
+<<<<<<< HEAD
+=======
public static final String SINCE = "since";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String SIZE = "size";
public static final String SNAPSHOT = "snapshot";
public static final String SNAPSHOT_ID = "snapshotid";
@@ -434,7 +460,12 @@ public class ApiConstants {
public static final String SNAPSHOT_TYPE = "snapshottype";
public static final String SNAPSHOT_QUIESCEVM = "quiescevm";
public static final String SOURCE_ZONE_ID = "sourcezoneid";
+<<<<<<< HEAD
+ public static final String SUITABLE_FOR_VM = "suitableforvirtualmachine";
+ public static final String SUPPORTS_STORAGE_SNAPSHOT = "supportsstoragesnapshot";
+=======
public static final String SSL_VERIFICATION = "sslverification";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String START_DATE = "startdate";
public static final String START_ID = "startid";
public static final String START_IP = "startip";
@@ -453,9 +484,12 @@ public class ApiConstants {
public static final String SYSTEM_VM_TYPE = "systemvmtype";
public static final String TAGS = "tags";
public static final String STORAGE_TAGS = "storagetags";
+<<<<<<< HEAD
+=======
public static final String SUCCESS = "success";
public static final String SUITABLE_FOR_VM = "suitableforvirtualmachine";
public static final String SUPPORTS_STORAGE_SNAPSHOT = "supportsstoragesnapshot";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String TARGET_IQN = "targetiqn";
public static final String TEMPLATE_FILTER = "templatefilter";
public static final String TEMPLATE_ID = "templateid";
@@ -489,7 +523,10 @@ public class ApiConstants {
public static final String USERNAME = "username";
public static final String USER_CONFIGURABLE = "userconfigurable";
public static final String USER_SECURITY_GROUP_LIST = "usersecuritygrouplist";
+<<<<<<< HEAD
+=======
public static final String USER_SECRET_KEY = "usersecretkey";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String USE_VIRTUAL_NETWORK = "usevirtualnetwork";
public static final String UPDATE_IN_SEQUENCE = "updateinsequence";
public static final String VALUE = "value";
@@ -569,7 +606,10 @@ public class ApiConstants {
public static final String ALLOCATION_STATE = "allocationstate";
public static final String MANAGED_STATE = "managedstate";
public static final String MANAGEMENT_SERVER_ID = "managementserverid";
+<<<<<<< HEAD
+=======
public static final String MANAGEMENT_SERVER_NAME = "managementservername";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final String STORAGE = "storage";
public static final String STORAGE_ID = "storageid";
public static final String PING_STORAGE_SERVER_IP = "pingstorageserverip";
@@ -1130,9 +1170,12 @@ public class ApiConstants {
public static final String PARAMETER_DESCRIPTION_IS_TAG_A_RULE = "Whether the informed tag is a JS interpretable rule or not.";
+<<<<<<< HEAD
+=======
public static final String WEBHOOK_ID = "webhookid";
public static final String WEBHOOK_NAME = "webhookname";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/**
* This enum specifies IO Drivers, each option controls specific policies on I/O.
* Qemu guests support "threads" and "native" options Since 0.8.8 ; "io_uring" is supported Since 6.3.0 (QEMU 5.0).
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java
index 4dfa76bb9dbe..82b803ea91df 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java
@@ -54,11 +54,15 @@ public class CreateServiceOfferingCmd extends BaseCmd {
@Parameter(name = ApiConstants.CPU_NUMBER, type = CommandType.INTEGER, required = false, description = "the CPU number of the service offering")
private Integer cpuNumber;
+<<<<<<< HEAD
+ @Parameter(name = ApiConstants.CPU_SPEED, type = CommandType.INTEGER, required = false, description = "the CPU speed of the service offering in MHz.")
+=======
@Parameter(name = ApiConstants.CPU_SPEED, type = CommandType.INTEGER, required = false, description = "For VMware and Xen based hypervisors this is the CPU speed of the service offering in MHz.\n" +
"For the KVM hypervisor," +
" the values of the parameters cpuSpeed and cpuNumber will be used to calculate the `shares` value. This value is used by the KVM hypervisor to calculate how much time" +
" the VM will have access to the host's CPU. The `shares` value does not have a unit, and its purpose is being a weight value for the host to compare between its guest" +
" VMs. For more information, see https://libvirt.org/formatdomain.html#cpu-tuning.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private Integer cpuSpeed;
@Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, description = "The display text of the service offering, defaults to 'name'.")
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/UpdateUserCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/UpdateUserCmd.java
index c9e1e934152d..62b935d9bdb7 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/UpdateUserCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/UpdateUserCmd.java
@@ -66,7 +66,11 @@ public class UpdateUserCmd extends BaseCmd {
@Parameter(name = ApiConstants.CURRENT_PASSWORD, type = CommandType.STRING, description = "Current password that was being used by the user. You must inform the current password when updating the password.", acceptedOnAdminPort = false)
private String currentPassword;
+<<<<<<< HEAD
+ @Parameter(name = ApiConstants.SECRET_KEY, type = CommandType.STRING, description = "The secret key for the user. Must be specified with userApiKey")
+=======
@Parameter(name = ApiConstants.USER_SECRET_KEY, type = CommandType.STRING, description = "The secret key for the user. Must be specified with userApiKey")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private String secretKey;
@Parameter(name = ApiConstants.TIMEZONE,
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java
index 49c6ee605c8c..98cd6ebf26f8 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java
@@ -34,11 +34,16 @@
import com.cloud.configuration.ResourceCount;
import com.cloud.user.Account;
+<<<<<<< HEAD
+@APICommand(name = "updateResourceCount", description = "Recalculate and update resource count for an account or domain.", responseObject = ResourceCountResponse.class,
+ requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+=======
@APICommand(name = "updateResourceCount",
description = "Recalculate and update resource count for an account or domain. " +
"This also executes some cleanup tasks before calculating resource counts.",
responseObject = ResourceCountResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public class UpdateResourceCountCmd extends BaseCmd {
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/CreateVMScheduleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/CreateVMScheduleCmd.java
index 5811eb1abfc5..d751eb09be72 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/CreateVMScheduleCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/CreateVMScheduleCmd.java
@@ -68,7 +68,11 @@ public class CreateVMScheduleCmd extends BaseCmd {
@Parameter(name = ApiConstants.ACTION,
type = CommandType.STRING,
required = true,
+<<<<<<< HEAD
+ description = "Action to take on the VM (start/stop/restart/force_stop/force_reboot).")
+=======
description = "Action to take on the VM (start/stop/reboot/force_stop/force_reboot).")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private String action;
@Parameter(name = ApiConstants.START_DATE,
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
index 50e1798112d2..f7e9f2cc9ddb 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
@@ -16,10 +16,16 @@
// under the License.
package org.apache.cloudstack.api.command.user.vm;
+<<<<<<< HEAD
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+=======
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.affinity.AffinityGroupResponse;
@@ -46,7 +52,10 @@
import org.apache.cloudstack.api.response.VpcResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.commons.lang3.BooleanUtils;
+<<<<<<< HEAD
+=======
import org.apache.commons.collections.CollectionUtils;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.server.ResourceIcon;
@@ -58,6 +67,10 @@
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
public class ListVMsCmd extends BaseListRetrieveOnlyResourceCountCmd implements UserCmd {
+<<<<<<< HEAD
+ private static final String s_name = "listvirtualmachinesresponse";
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
@@ -97,8 +110,12 @@ public class ListVMsCmd extends BaseListRetrieveOnlyResourceCountCmd implements
collectionType = CommandType.STRING,
description = "comma separated list of vm details requested, "
+ "value can be a list of [all, group, nics, stats, secgrp, tmpl, servoff, diskoff, backoff, iso, volume, min, affgrp]."
+<<<<<<< HEAD
+ + " If no parameter is passed in, the details will be defaulted to all")
+=======
+ " When no parameters are passed, all the details are returned if list.vm.default.details.stats is true (default),"
+ " otherwise when list.vm.default.details.stats is false the API response will exclude the stats details.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private List viewDetails;
@Parameter(name = ApiConstants.TEMPLATE_ID, type = CommandType.UUID, entityType = TemplateResponse.class, description = "list vms by template")
@@ -239,6 +256,24 @@ public Long getAutoScaleVmGroupId() {
return autoScaleVmGroupId;
}
+<<<<<<< HEAD
+ public EnumSet getDetails() throws InvalidParameterValueException {
+ EnumSet dv;
+ if (viewDetails == null || viewDetails.size() <= 0) {
+ dv = EnumSet.of(VMDetails.all);
+ } else {
+ try {
+ ArrayList dc = new ArrayList();
+ for (String detail : viewDetails) {
+ dc.add(VMDetails.valueOf(detail));
+ }
+ dv = EnumSet.copyOf(dc);
+ } catch (IllegalArgumentException e) {
+ throw new InvalidParameterValueException("The details parameter contains a non permitted value. The allowed values are " + EnumSet.allOf(VMDetails.class));
+ }
+ }
+ return dv;
+=======
protected boolean isViewDetailsEmpty() {
return CollectionUtils.isEmpty(viewDetails);
}
@@ -265,6 +300,7 @@ public EnumSet getDetails() throws InvalidParameterValueException {
} catch (IllegalArgumentException e) {
throw new InvalidParameterValueException("The details parameter contains a non permitted value. The allowed values are " + EnumSet.allOf(VMDetails.class));
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Override
@@ -287,6 +323,13 @@ public Boolean getVnf() {
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
+<<<<<<< HEAD
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Override
public ApiCommandResourceType getApiResourceType() {
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
index a1024a988981..59f6345c67ef 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
@@ -31,7 +31,10 @@
import org.apache.cloudstack.api.response.HostResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.PodResponse;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.response.ServiceOfferingResponse;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.response.StoragePoolResponse;
import org.apache.cloudstack.api.response.UserVmResponse;
import org.apache.cloudstack.api.response.VolumeResponse;
@@ -81,12 +84,15 @@ public class ListVolumesCmd extends BaseListRetrieveOnlyResourceCountCmd impleme
RoleType.Admin})
private String storageId;
+<<<<<<< HEAD
+=======
@Parameter(name = ApiConstants.SERVICE_OFFERING_ID, type = CommandType.UUID,
entityType = ServiceOfferingResponse.class,
description = "list volumes by disk offering of a service offering. If both service offering and " +
"disk offering are passed, service offering is ignored", since = "4.19.1")
private Long serviceOfferingId;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Parameter(name = ApiConstants.DISK_OFFERING_ID, type = CommandType.UUID, entityType = DiskOfferingResponse.class, description = "list volumes by disk offering", since = "4.4")
private Long diskOfferingId;
@@ -101,9 +107,12 @@ public class ListVolumesCmd extends BaseListRetrieveOnlyResourceCountCmd impleme
@Parameter(name = ApiConstants.STATE, type = CommandType.STRING, description = "state of the volume. Possible values are: Ready, Allocated, Destroy, Expunging, Expunged.")
private String state;
+<<<<<<< HEAD
+=======
@Parameter(name = ApiConstants.IS_ENCRYPTED, type = CommandType.BOOLEAN, description = "list only volumes that are encrypted", since = "4.19.1",
authorized = { RoleType.Admin })
private Boolean encrypted;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@@ -128,10 +137,13 @@ public Long getPodId() {
return podId;
}
+<<<<<<< HEAD
+=======
public Long getServiceOfferingId() {
return serviceOfferingId;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public Long getDiskOfferingId() {
return diskOfferingId;
}
@@ -165,10 +177,13 @@ public String getState() {
return state;
}
+<<<<<<< HEAD
+=======
public Boolean isEncrypted() {
return encrypted;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java
index 89a65f8c27cc..9cca20815cad 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java
@@ -208,7 +208,15 @@ public void create() throws ResourceAllocationException {
public void execute() {
Vpc vpc = null;
try {
+<<<<<<< HEAD
+ if (isStart()) {
+ _vpcService.startVpc(getEntityId(), true);
+ } else {
+ logger.debug("Not starting VPC as " + ApiConstants.START + "=false was passed to the API");
+ }
+=======
_vpcService.startVpc(this);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
vpc = _entityMgr.findById(Vpc.class, getEntityId());
} catch (ResourceUnavailableException ex) {
logger.warn("Exception: ", ex);
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/BucketResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/BucketResponse.java
index a1cce6e43d7a..478b45a3bf9c 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/BucketResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/BucketResponse.java
@@ -98,7 +98,11 @@ public class BucketResponse extends BaseResponseWithTagInformation implements Co
@Param(description = "Bucket Access Key")
private String accessKey;
+<<<<<<< HEAD
+ @SerializedName(ApiConstants.SECRET_KEY)
+=======
@SerializedName(ApiConstants.USER_SECRET_KEY)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Param(description = "Bucket Secret Key")
private String secretKey;
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
index 8deae7d80d3e..4af94f1a80b3 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
@@ -37,7 +37,10 @@
import com.cloud.uservm.UserVm;
import com.cloud.vm.VirtualMachine;
import com.google.gson.annotations.SerializedName;
+<<<<<<< HEAD
+=======
import org.apache.commons.collections.CollectionUtils;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@SuppressWarnings("unused")
@EntityReference(value = {VirtualMachine.class, UserVm.class, VirtualRouter.class})
@@ -274,10 +277,13 @@ public class UserVmResponse extends BaseResponseWithTagInformation implements Co
@Param(description = "the hypervisor on which the template runs")
private String hypervisor;
+<<<<<<< HEAD
+=======
@SerializedName(ApiConstants.IP_ADDRESS)
@Param(description = "the VM's primary IP address")
private String ipAddress;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@SerializedName(ApiConstants.PUBLIC_IP_ID)
@Param(description = "public IP address id associated with vm via Static nat rule")
private String publicIpId;
@@ -632,10 +638,13 @@ public String getHypervisor() {
return hypervisor;
}
+<<<<<<< HEAD
+=======
public String getIpAddress() {
return ipAddress;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public String getPublicIpId() {
return publicIpId;
}
@@ -872,6 +881,8 @@ public void setForVirtualNetwork(Boolean forVirtualNetwork) {
public void setNics(Set nics) {
this.nics = nics;
+<<<<<<< HEAD
+=======
setIpAddress(nics);
}
@@ -879,6 +890,7 @@ public void setIpAddress(final Set nics) {
if (CollectionUtils.isNotEmpty(nics)) {
this.ipAddress = nics.iterator().next().getIpaddress();
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
public void addNic(NicResponse nic) {
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java
index 726c9adf8a3c..cb50dda8bd63 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java
@@ -290,6 +290,15 @@ public class VolumeResponse extends BaseResponseWithTagInformation implements Co
private String externalUuid;
@SerializedName(ApiConstants.VOLUME_CHECK_RESULT)
+<<<<<<< HEAD
+ @Param(description = "details for the volume check result, they may vary for different hypervisors, since = 4.19.1")
+ private Map volumeCheckResult;
+
+ @SerializedName(ApiConstants.VOLUME_REPAIR_RESULT)
+ @Param(description = "details for the volume repair result, they may vary for different hypervisors, since = 4.19.1")
+ private Map volumeRepairResult;
+
+=======
@Param(description = "details for the volume check result, they may vary for different hypervisors", since = "4.19.1")
private Map volumeCheckResult;
@@ -301,6 +310,7 @@ public class VolumeResponse extends BaseResponseWithTagInformation implements Co
@Param(description = "the format of the disk encryption if applicable", since = "4.19.1")
private String encryptionFormat;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public String getPath() {
return path;
}
@@ -846,8 +856,11 @@ public Map getVolumeRepairResult() {
public void setVolumeRepairResult(Map volumeRepairResult) {
this.volumeRepairResult = volumeRepairResult;
}
+<<<<<<< HEAD
+=======
public void setEncryptionFormat(String encryptionFormat) {
this.encryptionFormat = encryptionFormat;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/api/src/main/java/org/apache/cloudstack/query/QueryService.java b/api/src/main/java/org/apache/cloudstack/query/QueryService.java
index 4c53314aef59..bdc1660cc791 100644
--- a/api/src/main/java/org/apache/cloudstack/query/QueryService.java
+++ b/api/src/main/java/org/apache/cloudstack/query/QueryService.java
@@ -125,9 +125,12 @@ public interface QueryService {
static final ConfigKey SharePublicTemplatesWithOtherDomains = new ConfigKey<>("Advanced", Boolean.class, "share.public.templates.with.other.domains", "true",
"If false, templates of this domain will not show up in the list templates of other domains.", true, ConfigKey.Scope.Domain);
+<<<<<<< HEAD
+=======
ConfigKey ReturnVmStatsOnVmList = new ConfigKey<>("Advanced", Boolean.class, "list.vm.default.details.stats", "true",
"Determines whether VM stats should be returned when details are not explicitly specified in listVirtualMachines API request. When false, details default to [group, nics, secgrp, tmpl, servoff, diskoff, backoff, iso, volume, min, affgrp]. When true, all details are returned including 'stats'.", true, ConfigKey.Scope.Global);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
ListResponse searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException;
ListResponse searchForUsers(Long domainId, boolean recursive) throws PermissionDeniedException;
diff --git a/api/src/main/java/org/apache/cloudstack/user/ResourceReservation.java b/api/src/main/java/org/apache/cloudstack/user/ResourceReservation.java
index d49120d44919..7dff18f21c40 100644
--- a/api/src/main/java/org/apache/cloudstack/user/ResourceReservation.java
+++ b/api/src/main/java/org/apache/cloudstack/user/ResourceReservation.java
@@ -22,8 +22,11 @@
import com.cloud.configuration.Resource;
+<<<<<<< HEAD
+=======
import java.util.Date;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/**
* an interface defining an {code}AutoClosable{code} reservation object
*/
@@ -41,6 +44,9 @@
String getTag();
Long getReservedAmount();
+<<<<<<< HEAD
+=======
Date getCreated();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/api/src/test/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmdTest.java b/api/src/test/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmdTest.java
index a28e9e9fd04f..6252c9346b34 100644
--- a/api/src/test/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmdTest.java
+++ b/api/src/test/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmdTest.java
@@ -167,16 +167,28 @@ public void testCreate() throws ResourceAllocationException {
@Test
public void testExecute() throws ResourceUnavailableException, InsufficientCapacityException {
+<<<<<<< HEAD
+ ReflectionTestUtils.setField(cmd, "start", true);
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
Vpc vpc = Mockito.mock(Vpc.class);
VpcResponse response = Mockito.mock(VpcResponse.class);
ReflectionTestUtils.setField(cmd, "id", 1L);
responseGenerator = Mockito.mock(ResponseGenerator.class);
+<<<<<<< HEAD
+ Mockito.when(_vpcService.startVpc(1L, true)).thenReturn(true);
+=======
Mockito.doNothing().when(_vpcService).startVpc(cmd);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
Mockito.when(_entityMgr.findById(Mockito.eq(Vpc.class), Mockito.any(Long.class))).thenReturn(vpc);
cmd._responseGenerator = responseGenerator;
Mockito.when(responseGenerator.createVpcResponse(ResponseObject.ResponseView.Restricted, vpc)).thenReturn(response);
cmd.execute();
+<<<<<<< HEAD
+ Mockito.verify(_vpcService, Mockito.times(1)).startVpc(Mockito.anyLong(), Mockito.anyBoolean());
+=======
Mockito.verify(_vpcService, Mockito.times(1)).startVpc(cmd);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
diff --git a/client/conf/log4j-cloud.xml.in b/client/conf/log4j-cloud.xml.in
index 148ccbfbb41b..a0a7ae9b8c1b 100755
--- a/client/conf/log4j-cloud.xml.in
+++ b/client/conf/log4j-cloud.xml.in
@@ -69,7 +69,11 @@ under the License.
+<<<<<<< HEAD
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
diff --git a/client/pom.xml b/client/pom.xml
index 23e0f1886bdb..5f38a0c146a1 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -440,11 +440,14 @@
org.apache.cloudstack
+<<<<<<< HEAD
+=======
cloud-mom-webhook
${project.version}
org.apache.cloudstack
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
cloud-framework-agent-lb
${project.version}
diff --git a/core/src/main/java/org/apache/cloudstack/storage/to/VolumeObjectTO.java b/core/src/main/java/org/apache/cloudstack/storage/to/VolumeObjectTO.java
index 6514038ac623..83c019030a0e 100644
--- a/core/src/main/java/org/apache/cloudstack/storage/to/VolumeObjectTO.java
+++ b/core/src/main/java/org/apache/cloudstack/storage/to/VolumeObjectTO.java
@@ -39,7 +39,10 @@ public class VolumeObjectTO extends DownloadableObjectTO implements DataTO {
private DataStoreTO dataStore;
private String name;
private Long size;
+<<<<<<< HEAD
+=======
private Long usableSize;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private String path;
private Long volumeId;
private String vmName;
@@ -162,10 +165,13 @@ public Long getSize() {
return size;
}
+<<<<<<< HEAD
+=======
public Long getUsableSize() {
return usableSize;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Override
public DataObjectType getObjectType() {
return DataObjectType.VOLUME;
@@ -183,10 +189,13 @@ public void setSize(long size) {
this.size = size;
}
+<<<<<<< HEAD
+=======
public void setUsableSize(Long usableSize) {
this.usableSize = usableSize;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public void setPath(String path) {
this.path = path;
}
diff --git a/core/src/main/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml b/core/src/main/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
index 732f36534d2d..b32d52b05ae1 100644
--- a/core/src/main/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
+++ b/core/src/main/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
@@ -288,10 +288,17 @@
+
+
+
+=======
class="org.apache.cloudstack.spring.lifecycle.registry.ExtensionRegistry">
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@@ -339,7 +346,11 @@
class="org.apache.cloudstack.spring.lifecycle.registry.ExtensionRegistry">
+<<<<<<< HEAD
+ >>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
class="org.apache.cloudstack.spring.lifecycle.registry.ExtensionRegistry">
@@ -358,9 +369,12 @@
+<<<<<<< HEAD
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
diff --git a/core/src/main/resources/META-INF/cloudstack/kubernetes/spring-core-lifecycle-kubernetes-context-inheritable.xml b/core/src/main/resources/META-INF/cloudstack/kubernetes/spring-core-lifecycle-kubernetes-context-inheritable.xml
index 96a9a634bae8..299acdc11f5f 100644
--- a/core/src/main/resources/META-INF/cloudstack/kubernetes/spring-core-lifecycle-kubernetes-context-inheritable.xml
+++ b/core/src/main/resources/META-INF/cloudstack/kubernetes/spring-core-lifecycle-kubernetes-context-inheritable.xml
@@ -25,8 +25,13 @@
>
+<<<<<<< HEAD
+
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
diff --git a/debian/rules b/debian/rules
index b52803702724..9c5beba9c8e6 100755
--- a/debian/rules
+++ b/debian/rules
@@ -103,8 +103,11 @@ override_dh_auto_install:
install -m0644 packaging/systemd/$(PACKAGE)-management.service debian/$(PACKAGE)-management/lib/systemd/system/$(PACKAGE)-management.service
install -m0644 packaging/systemd/$(PACKAGE)-management.default $(DESTDIR)/$(SYSCONFDIR)/default/$(PACKAGE)-management
+<<<<<<< HEAD
+=======
install -D -m0644 server/target/conf/cloudstack-management.logrotate $(DESTDIR)/$(SYSCONFDIR)/logrotate.d/cloudstack-management
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
# cloudstack-ui
mkdir $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/ui
mkdir -p $(DESTDIR)/usr/share/$(PACKAGE)-ui
@@ -161,8 +164,11 @@ override_dh_auto_install:
install -m0644 packaging/systemd/$(PACKAGE)-usage.service debian/$(PACKAGE)-usage/lib/systemd/system/$(PACKAGE)-usage.service
install -m0644 packaging/systemd/$(PACKAGE)-usage.default $(DESTDIR)/$(SYSCONFDIR)/default/$(PACKAGE)-usage
+<<<<<<< HEAD
+=======
install -D -m0644 usage/target/transformed/cloudstack-usage.logrotate $(DESTDIR)/$(SYSCONFDIR)/logrotate.d/cloudstack-usage
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
# cloudstack-marvin
mkdir -p $(DESTDIR)/usr/share/$(PACKAGE)-marvin
cp tools/marvin/dist/Marvin-*.tar.gz $(DESTDIR)/usr/share/$(PACKAGE)-marvin/
diff --git a/engine/components-api/src/main/java/com/cloud/alert/AlertManager.java b/engine/components-api/src/main/java/com/cloud/alert/AlertManager.java
index 3d4e6579f7ca..f6d683775121 100644
--- a/engine/components-api/src/main/java/com/cloud/alert/AlertManager.java
+++ b/engine/components-api/src/main/java/com/cloud/alert/AlertManager.java
@@ -38,10 +38,15 @@ public interface AlertManager extends Manager, AlertService {
public static final ConfigKey AlertSmtpUseStartTLS = new ConfigKey("Advanced", Boolean.class, "alert.smtp.useStartTLS", "false",
"If set to true and if we enable security via alert.smtp.useAuth, this will enable StartTLS to secure the connection.", true);
+<<<<<<< HEAD
+ public static final ConfigKey AlertSmtpEnabledSecurityProtocols = new ConfigKey("Advanced", String.class, "alert.smtp.enabledSecurityProtocols", "",
+ "White-space separated security protocols; ex: \"TLSv1 TLSv1.1\". Supported protocols: SSLv2Hello, SSLv3, TLSv1, TLSv1.1 and TLSv1.2", true);
+=======
public static final ConfigKey AlertSmtpUseAuth = new ConfigKey<>(ConfigKey.CATEGORY_ALERT, Boolean.class, "alert.smtp.useAuth", "false", "If true, use SMTP authentication when sending emails.", false, ConfigKey.Scope.ManagementServer);
public static final ConfigKey AlertSmtpEnabledSecurityProtocols = new ConfigKey(ConfigKey.CATEGORY_ADVANCED, String.class, "alert.smtp.enabledSecurityProtocols", "",
"White-space separated security protocols; ex: \"TLSv1 TLSv1.1\". Supported protocols: SSLv2Hello, SSLv3, TLSv1, TLSv1.1 and TLSv1.2", true, ConfigKey.Kind.WhitespaceSeparatedListWithOptions, "SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2");
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public static final ConfigKey Ipv6SubnetCapacityThreshold = new ConfigKey("Advanced", Double.class,
"zone.virtualnetwork.ipv6subnet.capacity.notificationthreshold",
diff --git a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java
index 51d0846fafbc..c8c13b8eae40 100644
--- a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java
+++ b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java
@@ -25,6 +25,17 @@
import javax.annotation.PostConstruct;
import javax.inject.Inject;
+<<<<<<< HEAD
+import org.apache.commons.collections.MapUtils;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.framework.events.Event;
+import org.apache.cloudstack.framework.events.EventBus;
+import org.apache.cloudstack.framework.events.EventBusException;
+=======
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.framework.events.Event;
import org.apache.cloudstack.framework.events.EventBus;
@@ -33,6 +44,7 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao;
@@ -49,7 +61,10 @@ public class UsageEventUtils {
protected static Logger LOGGER = LogManager.getLogger(UsageEventUtils.class);
protected static EventBus s_eventBus = null;
protected static ConfigurationDao s_configDao;
+<<<<<<< HEAD
+=======
private static EventDistributor eventDistributor;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Inject
UsageEventDao usageEventDao;
@@ -207,9 +222,15 @@ private static void publishUsageEvent(String usageEventType, Long accountId, Lon
if( !configValue)
return;
try {
+<<<<<<< HEAD
+ s_eventBus = ComponentContext.getComponent(EventBus.class);
+ } catch (NoSuchBeanDefinitionException nbe) {
+ return; // no provider is configured to provide events bus, so just return
+=======
eventDistributor = ComponentContext.getComponent(EventDistributor.class);
} catch (NoSuchBeanDefinitionException nbe) {
return; // no provider is configured to provide events distributor, so just return
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
Account account = s_accountDao.findById(accountId);
@@ -238,7 +259,15 @@ private static void publishUsageEvent(String usageEventType, Long accountId, Lon
event.setDescription(eventDescription);
+<<<<<<< HEAD
+ try {
+ s_eventBus.publish(event);
+ } catch (EventBusException e) {
+ LOGGER.warn("Failed to publish usage event on the event bus.");
+ }
+=======
eventDistributor.publish(event);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
static final String Name = "management-server";
diff --git a/engine/components-api/src/main/java/com/cloud/network/NetworkStateListener.java b/engine/components-api/src/main/java/com/cloud/network/NetworkStateListener.java
index 107e177ef579..a01ba243c39a 100644
--- a/engine/components-api/src/main/java/com/cloud/network/NetworkStateListener.java
+++ b/engine/components-api/src/main/java/com/cloud/network/NetworkStateListener.java
@@ -25,9 +25,17 @@
import javax.inject.Inject;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+<<<<<<< HEAD
+import org.apache.cloudstack.framework.events.EventBus;
+import org.apache.cloudstack.framework.events.EventBusException;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+=======
import org.apache.cloudstack.framework.events.EventDistributor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.event.EventCategory;
import com.cloud.network.Network.Event;
@@ -41,7 +49,11 @@ public class NetworkStateListener implements StateListener>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
protected Logger logger = LogManager.getLogger(getClass());
@@ -49,10 +61,13 @@ public NetworkStateListener(ConfigurationDao configDao) {
_configDao = configDao;
}
+<<<<<<< HEAD
+=======
public void setEventDistributor(EventDistributor eventDistributor) {
this.eventDistributor = eventDistributor;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Override
public boolean preStateTransitionEvent(State oldState, Event event, State newState, Network vo, boolean status, Object opaque) {
pubishOnEventBus(event.name(), "preStateTransitionEvent", vo, oldState, newState);
@@ -68,20 +83,37 @@ public boolean postStateTransitionEvent(StateMachine2.Transition t
return true;
}
+<<<<<<< HEAD
+ private void pubishOnEventBus(String event, String status, Network vo, State oldState, State newState) {
+
+=======
private void pubishOnEventBus(String event, String status, Network vo, State oldState, State newState) {
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
String configKey = "publish.resource.state.events";
String value = _configDao.getValue(configKey);
boolean configValue = Boolean.parseBoolean(value);
if(!configValue)
return;
+<<<<<<< HEAD
+ try {
+ s_eventBus = ComponentContext.getComponent(EventBus.class);
+ } catch (NoSuchBeanDefinitionException nbe) {
+ return; // no provider is configured to provide events bus, so just return
+=======
if (eventDistributor == null) {
setEventDistributor(ComponentContext.getComponent(EventDistributor.class));
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
String resourceName = getEntityFromClassName(Network.class.getName());
org.apache.cloudstack.framework.events.Event eventMsg =
+<<<<<<< HEAD
+ new org.apache.cloudstack.framework.events.Event("management-server", EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(), event, resourceName, vo.getUuid());
+ Map eventDescription = new HashMap();
+=======
new org.apache.cloudstack.framework.events.Event("management-server", EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(), event, resourceName, vo.getUuid());
Map eventDescription = new HashMap<>();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
eventDescription.put("resource", resourceName);
eventDescription.put("id", vo.getUuid());
eventDescription.put("old-state", oldState.name());
@@ -91,8 +123,16 @@ private void pubishOnEventBus(String event, String status, Network vo, State old
eventDescription.put("eventDateTime", eventDate);
eventMsg.setDescription(eventDescription);
+<<<<<<< HEAD
+ try {
+ s_eventBus.publish(eventMsg);
+ } catch (EventBusException e) {
+ logger.warn("Failed to publish state change event on the event bus.");
+ }
+=======
eventDistributor.publish(eventMsg);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
private String getEntityFromClassName(String entityClassName) {
diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
index 4772a5ad92de..8f1a37a2bf4d 100755
--- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1077,10 +1077,13 @@ protected void checkAndAttemptMigrateVmAcrossCluster(final VMInstanceVO vm, fina
return;
}
Host lastHost = _hostDao.findById(vm.getLastHostId());
+<<<<<<< HEAD
+=======
if (lastHost == null) {
logger.warn("Could not find last host with id [{}], skipping migrate VM [{}] across cluster check." , vm.getLastHostId(), vm.getUuid());
return;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (destinationClusterId.equals(lastHost.getClusterId())) {
return;
}
@@ -3011,7 +3014,11 @@ protected void createStoragePoolMappingsForVolumes(VirtualMachineProfile profile
executeManagedStorageChecksWhenTargetStoragePoolNotProvided(targetHost, currentPool, volume);
if (ScopeType.HOST.equals(currentPool.getScope()) || isStorageCrossClusterMigration(plan.getClusterId(), currentPool)) {
createVolumeToStoragePoolMappingIfPossible(profile, plan, volumeToPoolObjectMap, volume, currentPool);
+<<<<<<< HEAD
+ } else if (shouldMapVolume(profile, volume, currentPool)){
+=======
} else if (shouldMapVolume(profile, currentPool)){
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
volumeToPoolObjectMap.put(volume, currentPool);
}
}
@@ -3023,10 +3030,18 @@ protected void createStoragePoolMappingsForVolumes(VirtualMachineProfile profile
* Some context: VMware migration workflow requires all volumes to be mapped (even if volume stays on its current pool);
* however, this is not necessary/desirable for the KVM flow.
*/
+<<<<<<< HEAD
+ protected boolean shouldMapVolume(VirtualMachineProfile profile, Volume volume, StoragePoolVO currentPool) {
+ boolean isManaged = currentPool.isManaged();
+ boolean isNotKvm = HypervisorType.KVM != profile.getHypervisorType();
+ boolean isNotDatadisk = Type.DATADISK != volume.getVolumeType();
+ return isNotKvm || isNotDatadisk || isManaged;
+=======
protected boolean shouldMapVolume(VirtualMachineProfile profile, StoragePoolVO currentPool) {
boolean isManaged = currentPool.isManaged();
boolean isNotKvm = HypervisorType.KVM != profile.getHypervisorType();
return isNotKvm || isManaged;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
/**
diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index c6d156d470b4..28e6e115e434 100644
--- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -1185,9 +1185,14 @@ public VolumeVO doInTransaction(TransactionStatus status) {
logger.error("Unable to destroy existing volume [{}] due to [{}].", volumeToString, e.getMessage());
}
// In case of VMware VM will continue to use the old root disk until expunged, so force expunge old root disk
+<<<<<<< HEAD
+ if (vm.getHypervisorType() == HypervisorType.VMware) {
+ logger.info("Trying to expunge volume [{}] from primary data storage.", volumeToString);
+=======
// For system VM we do not need volume entry in Destroy state
if (vm.getHypervisorType() == HypervisorType.VMware || vm.getType().isUsedBySystem()) {
logger.info(String.format("Trying to expunge volume [%s] from primary data storage.", volumeToString));
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
AsyncCallFuture future = volService.expungeVolumeAsync(volFactory.getVolume(existingVolume.getId()));
try {
future.get();
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java
index 7ef7fd44b244..d573996cd69a 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java
@@ -112,8 +112,12 @@ public interface VolumeDao extends GenericDao, StateDao>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
* @return total Primary Storage space (in bytes) used
*/
long primaryStorageUsedForAccount(long accountId, List virtualRouters);
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java
index 2e68dcae3c57..cb995f0ee3e6 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java
@@ -81,6 +81,10 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol
@Inject
ResourceTagDao _tagsDao;
+<<<<<<< HEAD
+ protected static final String SELECT_VM_SQL = "SELECT DISTINCT instance_id from volumes v where v.host_id = ? and v.mirror_state = ?";
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
// need to account for zone-wide primary storage where storage_pool has
// null-value pod and cluster, where hypervisor information is stored in
// storage_pool
diff --git a/engine/schema/src/main/java/com/cloud/vm/UserVmVO.java b/engine/schema/src/main/java/com/cloud/vm/UserVmVO.java
index ce3a9a84a34f..f266f7017127 100644
--- a/engine/schema/src/main/java/com/cloud/vm/UserVmVO.java
+++ b/engine/schema/src/main/java/com/cloud/vm/UserVmVO.java
@@ -148,7 +148,10 @@ public boolean isUpdateParameters() {
return updateParameters;
}
+<<<<<<< HEAD
+=======
@Override
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public String getUserVmType() {
return userVmType;
}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/reservation/ReservationVO.java b/engine/schema/src/main/java/org/apache/cloudstack/reservation/ReservationVO.java
index df0ede6821ad..734c6b5f58a9 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/reservation/ReservationVO.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/reservation/ReservationVO.java
@@ -25,14 +25,20 @@
import javax.persistence.Id;
import javax.persistence.Table;
+<<<<<<< HEAD
+=======
import com.cloud.utils.db.GenericDao;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.user.ResourceReservation;
import com.cloud.configuration.Resource;
import com.cloud.utils.exception.CloudRuntimeException;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.utils.identity.ManagementServerNode;
import java.util.Date;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Entity
@Table(name = "resource_reservation")
@@ -61,12 +67,15 @@ public class ReservationVO implements ResourceReservation {
@Column(name = "amount")
long amount;
+<<<<<<< HEAD
+=======
@Column(name = "mgmt_server_id")
Long managementServerId;
@Column(name = GenericDao.CREATED_COLUMN)
private Date created;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
protected ReservationVO() {
}
@@ -79,7 +88,10 @@ public ReservationVO(Long accountId, Long domainId, Resource.ResourceType resour
this.resourceType = resourceType;
this.tag = tag;
this.amount = delta;
+<<<<<<< HEAD
+=======
this.managementServerId = ManagementServerNode.getManagementServerId();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
public ReservationVO(Long accountId, Long domainId, Resource.ResourceType resourceType, Long delta) {
@@ -125,6 +137,8 @@ public void setResourceId(long resourceId) {
this.resourceId = resourceId;
}
+<<<<<<< HEAD
+=======
@Override
public Date getCreated() {
return created;
@@ -137,4 +151,5 @@ public void setCreated(Date created) {
public Long getManagementServerId() {
return managementServerId;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/reservation/dao/ReservationDao.java b/engine/schema/src/main/java/org/apache/cloudstack/reservation/dao/ReservationDao.java
index d6d494f61f92..c64334a25969 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/reservation/dao/ReservationDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/reservation/dao/ReservationDao.java
@@ -23,17 +23,26 @@
import com.cloud.configuration.Resource;
import com.cloud.utils.db.GenericDao;
+<<<<<<< HEAD
+=======
import java.util.Date;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import java.util.List;
public interface ReservationDao extends GenericDao {
long getAccountReservation(Long account, Resource.ResourceType resourceType, String tag);
long getDomainReservation(Long domain, Resource.ResourceType resourceType, String tag);
void setResourceId(Resource.ResourceType type, Long resourceId);
+<<<<<<< HEAD
+ List getResourceIds(long accountId, Resource.ResourceType type);
+ List getReservationsForAccount(long accountId, Resource.ResourceType type, String tag);
+ void removeByIds(List reservationIds);
+=======
List getReservationsForAccount(long accountId, Resource.ResourceType type, String tag);
void removeByIds(List reservationIds);
int removeByMsId(long managementServerId);
int removeStaleReservations(Long accountId, Resource.ResourceType resourceType, String tag, Date createdBefore);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/reservation/dao/ReservationDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/reservation/dao/ReservationDaoImpl.java
index 3b17f4e4294e..858b1d184d93 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/reservation/dao/ReservationDaoImpl.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/reservation/dao/ReservationDaoImpl.java
@@ -18,8 +18,13 @@
//
package org.apache.cloudstack.reservation.dao;
+<<<<<<< HEAD
+import java.util.List;
+import java.util.stream.Collectors;
+=======
import java.util.Date;
import java.util.List;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.reservation.ReservationVO;
@@ -42,8 +47,11 @@ public class ReservationDaoImpl extends GenericDaoBase impl
private static final String ACCOUNT_ID = "accountId";
private static final String DOMAIN_ID = "domainId";
private static final String IDS = "ids";
+<<<<<<< HEAD
+=======
private static final String MS_ID = "managementServerId";
private static final String CREATED = "created";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private final SearchBuilder listResourceByAccountAndTypeSearch;
private final SearchBuilder listAccountAndTypeSearch;
private final SearchBuilder listAccountAndTypeAndNoTagSearch;
@@ -52,7 +60,10 @@ public class ReservationDaoImpl extends GenericDaoBase impl
private final SearchBuilder listDomainAndTypeAndNoTagSearch;
private final SearchBuilder listResourceByAccountAndTypeAndNoTagSearch;
private final SearchBuilder listIdsSearch;
+<<<<<<< HEAD
+=======
private final SearchBuilder listMsIdSearch;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public ReservationDaoImpl() {
@@ -74,14 +85,20 @@ public ReservationDaoImpl() {
listAccountAndTypeSearch.and(ACCOUNT_ID, listAccountAndTypeSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
listAccountAndTypeSearch.and(RESOURCE_TYPE, listAccountAndTypeSearch.entity().getResourceType(), SearchCriteria.Op.EQ);
listAccountAndTypeSearch.and(RESOURCE_TAG, listAccountAndTypeSearch.entity().getTag(), SearchCriteria.Op.EQ);
+<<<<<<< HEAD
+=======
listAccountAndTypeSearch.and(CREATED, listAccountAndTypeSearch.entity().getCreated(), SearchCriteria.Op.LT);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
listAccountAndTypeSearch.done();
listAccountAndTypeAndNoTagSearch = createSearchBuilder();
listAccountAndTypeAndNoTagSearch.and(ACCOUNT_ID, listAccountAndTypeAndNoTagSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
listAccountAndTypeAndNoTagSearch.and(RESOURCE_TYPE, listAccountAndTypeAndNoTagSearch.entity().getResourceType(), SearchCriteria.Op.EQ);
listAccountAndTypeAndNoTagSearch.and(RESOURCE_TAG, listAccountAndTypeAndNoTagSearch.entity().getTag(), SearchCriteria.Op.NULL);
+<<<<<<< HEAD
+=======
listAccountAndTypeAndNoTagSearch.and(CREATED, listAccountAndTypeAndNoTagSearch.entity().getCreated(), SearchCriteria.Op.LT);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
listAccountAndTypeAndNoTagSearch.done();
listDomainAndTypeSearch = createSearchBuilder();
@@ -99,15 +116,27 @@ public ReservationDaoImpl() {
listIdsSearch = createSearchBuilder();
listIdsSearch.and(IDS, listIdsSearch.entity().getId(), SearchCriteria.Op.IN);
listIdsSearch.done();
+<<<<<<< HEAD
+=======
listMsIdSearch = createSearchBuilder();
listMsIdSearch.and(MS_ID, listMsIdSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ);
listMsIdSearch.done();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Override
public long getAccountReservation(Long accountId, Resource.ResourceType resourceType, String tag) {
long total = 0;
+<<<<<<< HEAD
+ SearchCriteria sc = tag == null ?
+ listAccountAndTypeAndNoTagSearch.create() : listAccountAndTypeSearch.create();
+ sc.setParameters(ACCOUNT_ID, accountId);
+ sc.setParameters(RESOURCE_TYPE, resourceType);
+ if (tag != null) {
+ sc.setParameters(RESOURCE_TAG, tag);
+ }
+=======
SearchCriteria sc;
if (tag == null) {
sc = listAccountAndTypeAndNoTagSearch.create();
@@ -117,6 +146,7 @@ public long getAccountReservation(Long accountId, Resource.ResourceType resource
}
sc.setParameters(ACCOUNT_ID, accountId);
sc.setParameters(RESOURCE_TYPE, resourceType);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
List reservations = listBy(sc);
for (ReservationVO reservation : reservations) {
total += reservation.getReservedAmount();
@@ -127,6 +157,15 @@ public long getAccountReservation(Long accountId, Resource.ResourceType resource
@Override
public long getDomainReservation(Long domainId, Resource.ResourceType resourceType, String tag) {
long total = 0;
+<<<<<<< HEAD
+ SearchCriteria sc = tag == null ?
+ listDomainAndTypeAndNoTagSearch.create() : listDomainAndTypeSearch.create();
+ sc.setParameters(DOMAIN_ID, domainId);
+ sc.setParameters(RESOURCE_TYPE, resourceType);
+ if (tag != null) {
+ sc.setParameters(RESOURCE_TAG, tag);
+ }
+=======
SearchCriteria sc;
if (tag == null) {
sc = listDomainAndTypeAndNoTagSearch.create();
@@ -136,6 +175,7 @@ public long getDomainReservation(Long domainId, Resource.ResourceType resourceTy
}
sc.setParameters(DOMAIN_ID, domainId);
sc.setParameters(RESOURCE_TYPE, resourceType);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
List reservations = listBy(sc);
for (ReservationVO reservation : reservations) {
total += reservation.getReservedAmount();
@@ -163,6 +203,24 @@ public void setResourceId(Resource.ResourceType type, Long resourceId) {
}
@Override
+<<<<<<< HEAD
+ public List getResourceIds(long accountId, Resource.ResourceType type) {
+ SearchCriteria sc = listResourceByAccountAndTypeSearch.create();
+ sc.setParameters(ACCOUNT_ID, accountId);
+ sc.setParameters(RESOURCE_TYPE, type);
+ return listBy(sc).stream().map(ReservationVO::getResourceId).collect(Collectors.toList());
+ }
+
+ @Override
+ public List getReservationsForAccount(long accountId, Resource.ResourceType type, String tag) {
+ SearchCriteria sc = tag == null ?
+ listResourceByAccountAndTypeAndNoTagSearch.create() : listResourceByAccountAndTypeSearch.create();
+ sc.setParameters(ACCOUNT_ID, accountId);
+ sc.setParameters(RESOURCE_TYPE, type);
+ if (tag != null) {
+ sc.setParameters(RESOURCE_TAG, tag);
+ }
+=======
public List getReservationsForAccount(long accountId, Resource.ResourceType type, String tag) {
SearchCriteria sc;
if (tag == null) {
@@ -173,6 +231,7 @@ public List getReservationsForAccount(long accountId, Resource.Re
}
sc.setParameters(ACCOUNT_ID, accountId);
sc.setParameters(RESOURCE_TYPE, type);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
return listBy(sc);
}
@@ -184,6 +243,8 @@ public void removeByIds(List reservationIds) {
remove(sc);
}
}
+<<<<<<< HEAD
+=======
@Override
public int removeByMsId(long managementServerId) {
@@ -208,4 +269,5 @@ public int removeStaleReservations(Long accountId, Resource.ResourceType resourc
return remove(sc);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
index 21c5dc76d96c..33c668f9182b 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
@@ -130,7 +130,11 @@ public List findByZone(ZoneScope scope, Boolean readonly) {
}
if (scope.getScopeId() != null) {
SearchCriteria scc = createSearchCriteria();
+<<<<<<< HEAD
+ scc.addOr("scope", SearchCriteria.Op.EQ, ScopeType.REGION);
+=======
scc.addOr("scope", SearchCriteria.Op.EQ, ScopeType.ZONE);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
scc.addOr("dcId", SearchCriteria.Op.EQ, scope.getScopeId());
sc.addAnd("scope", SearchCriteria.Op.SC, scc);
}
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41900to41910-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-41900to41910-cleanup.sql
index 2d57db2b778e..27fdc84c2660 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-41900to41910-cleanup.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41900to41910-cleanup.sql
@@ -18,7 +18,10 @@
--;
-- Schema upgrade cleanup from 4.19.0.0 to 4.19.1.0
--;
+<<<<<<< HEAD
+=======
-- List VMs response optimisation, don't sum during API handling
UPDATE cloud.configuration set value='false' where name='vm.stats.increment.metrics';
DELETE from cloud.configuration where name='vm.stats.increment.metrics.in.memory';
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql b/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql
index 295ad147a993..1066a14cdfc9 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41910to42000.sql
@@ -23,6 +23,17 @@
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_limit', 'tag', 'varchar(64) DEFAULT NULL COMMENT "tag for the limit" ');
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_count', 'tag', 'varchar(64) DEFAULT NULL COMMENT "tag for the resource count" ');
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'tag', 'varchar(64) DEFAULT NULL COMMENT "tag for the resource reservation" ');
+<<<<<<< HEAD
+ALTER TABLE `resource_count`
+DROP INDEX `i_resource_count__type_accountId`,
+DROP INDEX `i_resource_count__type_domaintId`,
+ADD UNIQUE INDEX `i_resource_count__type_tag_accountId` (`type`,`tag`,`account_id`),
+ADD UNIQUE INDEX `i_resource_count__type_tag_domaintId` (`type`,`tag`,`domain_id`);
+
+
+ALTER TABLE `cloud`.`resource_reservation`
+ ADD COLUMN `resource_id` bigint unsigned NULL;
+=======
CALL `cloud`.`IDEMPOTENT_DROP_INDEX`('i_resource_count__type_accountId', 'cloud.resource_count');
CALL `cloud`.`IDEMPOTENT_DROP_INDEX`('i_resource_count__type_domaintId', 'cloud.resource_count');
@@ -37,16 +48,20 @@ BEGIN
CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_INDEX`('cloud.resource_count', 'i_resource_count__type_tag_accountId', '(type, tag, account_id)');
CALL `cloud`.`IDEMPOTENT_ADD_UNIQUE_INDEX`('cloud.resource_count', 'i_resource_count__type_tag_domainId', '(type, tag, domain_id)');
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
ALTER TABLE `cloud`.`resource_reservation`
MODIFY COLUMN `amount` bigint NOT NULL;
+<<<<<<< HEAD
+=======
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'resource_id', 'bigint unsigned NULL COMMENT "id of the resource" ');
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'mgmt_server_id', 'bigint unsigned NULL COMMENT "management server id" ');
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.resource_reservation', 'created', 'datetime DEFAULT NULL COMMENT "date when the reservation was created" ');
UPDATE `cloud`.`resource_reservation` SET `created` = now() WHERE created IS NULL;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
-- Update Default System offering for Router to 512MiB
UPDATE `cloud`.`service_offering` SET ram_size = 512 WHERE unique_name IN ("Cloud.Com-SoftwareRouter", "Cloud.Com-SoftwareRouter-Local",
@@ -81,6 +96,10 @@ CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.network_offerings','nsx_mode', 'varc
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.vpc_offerings','for_nsx', 'int(1) unsigned DEFAULT "0" COMMENT "is nsx enabled for the resource"');
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.vpc_offerings','nsx_mode', 'varchar(32) COMMENT "mode in which the network would route traffic"');
+<<<<<<< HEAD
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
-- Create table to persist quota email template configurations
CREATE TABLE IF NOT EXISTS `cloud_usage`.`quota_email_configuration`(
`account_id` int(11) NOT NULL,
@@ -92,6 +111,8 @@ CREATE TABLE IF NOT EXISTS `cloud_usage`.`quota_email_configuration`(
-- Add `is_implicit` column to `host_tags` table
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.host_tags', 'is_implicit', 'int(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT "If host tag is implicit or explicit" ');
+<<<<<<< HEAD
+=======
-- Webhooks feature
DROP TABLE IF EXISTS `cloud`.`webhook`;
@@ -150,3 +171,4 @@ SET
WHERE
name IN ("quota.usage.smtp.useStartTLS", "quota.usage.smtp.useAuth", "alert.smtp.useAuth", "project.smtp.useAuth")
AND value NOT IN ("true", "y", "t", "1", "on", "yes");
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
diff --git a/engine/schema/src/main/resources/META-INF/db/views/cloud.user_vm_view.sql b/engine/schema/src/main/resources/META-INF/db/views/cloud.user_vm_view.sql
index 62294ed5d890..121891fd1752 100644
--- a/engine/schema/src/main/resources/META-INF/db/views/cloud.user_vm_view.sql
+++ b/engine/schema/src/main/resources/META-INF/db/views/cloud.user_vm_view.sql
@@ -196,7 +196,11 @@ FROM
LEFT JOIN `networks` ON ((`nics`.`network_id` = `networks`.`id`)))
LEFT JOIN `vpc` ON (((`networks`.`vpc_id` = `vpc`.`id`)
AND ISNULL(`vpc`.`removed`))))
+<<<<<<< HEAD
+ LEFT JOIN `user_ip_address` ON ((`user_ip_address`.`vm_id` = `vm_instance`.`id`)))
+=======
LEFT JOIN `user_ip_address` FORCE INDEX(`fk_user_ip_address__vm_id`) ON ((`user_ip_address`.`vm_id` = `vm_instance`.`id`)))
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
LEFT JOIN `user_vm_details` `ssh_details` ON (((`ssh_details`.`vm_id` = `vm_instance`.`id`)
AND (`ssh_details`.`name` = 'SSH.KeyPairNames'))))
LEFT JOIN `resource_tags` ON (((`resource_tags`.`resource_id` = `vm_instance`.`id`)
diff --git a/engine/schema/src/main/resources/META-INF/db/views/cloud.volume_view.sql b/engine/schema/src/main/resources/META-INF/db/views/cloud.volume_view.sql
index 950dcddf4c71..7855c22c89fc 100644
--- a/engine/schema/src/main/resources/META-INF/db/views/cloud.volume_view.sql
+++ b/engine/schema/src/main/resources/META-INF/db/views/cloud.volume_view.sql
@@ -39,7 +39,10 @@ SELECT
`volumes`.`path` AS `path`,
`volumes`.`chain_info` AS `chain_info`,
`volumes`.`external_uuid` AS `external_uuid`,
+<<<<<<< HEAD
+=======
`volumes`.`encrypt_format` AS `encrypt_format`,
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
`account`.`id` AS `account_id`,
`account`.`uuid` AS `account_uuid`,
`account`.`account_name` AS `account_name`,
diff --git a/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java b/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java
index fa570e0e8fbe..de4f49fe69fd 100644
--- a/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java
+++ b/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java
@@ -41,7 +41,11 @@ public enum Scope {
}
public enum Kind {
+<<<<<<< HEAD
+ CSV, Order, Select
+=======
CSV, Order, Select, WhitespaceSeparatedListWithOptions
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
private final String _category;
@@ -136,10 +140,13 @@ public ConfigKey(String category, Class type, String name, String defaultValu
this(type, name, category, defaultValue, description, isDynamic, Scope.Global, null);
}
+<<<<<<< HEAD
+=======
public ConfigKey(String category, Class type, String name, String defaultValue, String description, boolean isDynamic, Kind kind, String options) {
this(type, name, category, defaultValue, description, isDynamic, Scope.Global, null, null, null, null, null, kind, options);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public ConfigKey(String category, Class type, String name, String defaultValue, String description, boolean isDynamic, String parent) {
this(type, name, category, defaultValue, description, isDynamic, Scope.Global, null, null, parent, null, null, null, null);
}
diff --git a/framework/events/src/main/java/org/apache/cloudstack/framework/events/Event.java b/framework/events/src/main/java/org/apache/cloudstack/framework/events/Event.java
index 7a14f385fa15..7ea6692abe89 100644
--- a/framework/events/src/main/java/org/apache/cloudstack/framework/events/Event.java
+++ b/framework/events/src/main/java/org/apache/cloudstack/framework/events/Event.java
@@ -20,6 +20,11 @@
package org.apache.cloudstack.framework.events;
import com.google.gson.Gson;
+<<<<<<< HEAD
+
+public class Event {
+
+=======
import com.google.gson.annotations.Expose;
public class Event {
@@ -28,12 +33,22 @@ public class Event {
Long eventId;
@Expose(serialize = false, deserialize = false)
String eventUuid;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
String eventCategory;
String eventType;
String eventSource;
String resourceType;
String resourceUUID;
String description;
+<<<<<<< HEAD
+
+ public Event(String eventSource, String eventCategory, String eventType, String resourceType, String resourceUUID) {
+ this.eventCategory = eventCategory;
+ this.eventType = eventType;
+ this.eventSource = eventSource;
+ this.resourceType = resourceType;
+ this.resourceUUID = resourceUUID;
+=======
@Expose(serialize = false, deserialize = false)
Long resourceAccountId;
@Expose(serialize = false, deserialize = false)
@@ -63,6 +78,7 @@ public String getEventUuid() {
public void setEventUuid(String eventUuid) {
this.eventUuid = eventUuid;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
public String getEventCategory() {
@@ -95,7 +111,11 @@ public String getDescription() {
public void setDescription(Object message) {
Gson gson = new Gson();
+<<<<<<< HEAD
+ this.description = gson.toJson(message).toString();
+=======
this.description = gson.toJson(message);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
public void setDescription(String description) {
@@ -117,6 +137,8 @@ public void setResourceUUID(String uuid) {
public String getResourceUUID() {
return resourceUUID;
}
+<<<<<<< HEAD
+=======
public Long getResourceAccountId() {
return resourceAccountId;
@@ -141,4 +163,5 @@ public Long getResourceDomainId() {
public void setResourceDomainId(Long resourceDomainId) {
this.resourceDomainId = resourceDomainId;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/framework/events/src/main/java/org/apache/cloudstack/framework/events/EventBus.java b/framework/events/src/main/java/org/apache/cloudstack/framework/events/EventBus.java
index 6cd6256ce81d..5ec1bd77bd69 100644
--- a/framework/events/src/main/java/org/apache/cloudstack/framework/events/EventBus.java
+++ b/framework/events/src/main/java/org/apache/cloudstack/framework/events/EventBus.java
@@ -27,8 +27,11 @@
*/
public interface EventBus {
+<<<<<<< HEAD
+=======
String getName();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/**
* publish an event on to the event bus
*
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Account.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Account.java
index 37c90ab0bcd9..e2e29e3f4954 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Account.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Account.java
@@ -17,9 +17,13 @@
package org.apache.cloudstack.quota.activationrule.presetvariables;
+<<<<<<< HEAD
+public class Account extends GenericPresetVariable{
+=======
public class Account extends GenericPresetVariable {
@PresetVariableDefinition(description = "Role of the account. This field will not exist if the account is a project.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private Role role;
public Role getRole() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/BackupOffering.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/BackupOffering.java
index d8457d294ec3..00c56ae28d7d 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/BackupOffering.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/BackupOffering.java
@@ -20,7 +20,10 @@
package org.apache.cloudstack.quota.activationrule.presetvariables;
public class BackupOffering extends GenericPresetVariable {
+<<<<<<< HEAD
+=======
@PresetVariableDefinition(description = "External ID of the backup offering that generated the backup.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private String externalId;
public String getExternalId() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/ComputeOffering.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/ComputeOffering.java
index 1d294276d470..d5443ada3225 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/ComputeOffering.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/ComputeOffering.java
@@ -18,7 +18,10 @@
package org.apache.cloudstack.quota.activationrule.presetvariables;
public class ComputeOffering extends GenericPresetVariable {
+<<<<<<< HEAD
+=======
@PresetVariableDefinition(description = "A boolean informing if the compute offering is customized or not.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private boolean customized;
public boolean isCustomized() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/ComputingResources.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/ComputingResources.java
index 9c86d2d6e0c9..322096b64087 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/ComputingResources.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/ComputingResources.java
@@ -21,6 +21,10 @@
import org.apache.commons.lang3.builder.ToStringStyle;
public class ComputingResources {
+<<<<<<< HEAD
+ private Integer memory;
+ private Integer cpuNumber;
+=======
@PresetVariableDefinition(description = "Current VM's memory (in MiB).")
private Integer memory;
@@ -28,6 +32,7 @@ public class ComputingResources {
private Integer cpuNumber;
@PresetVariableDefinition(description = "Current VM's CPU speed (in MHz).")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private Integer cpuSpeed;
public Integer getMemory() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Domain.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Domain.java
index 6d83da4cd8fb..f0d4dc127091 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Domain.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Domain.java
@@ -18,7 +18,10 @@
package org.apache.cloudstack.quota.activationrule.presetvariables;
public class Domain extends GenericPresetVariable {
+<<<<<<< HEAD
+=======
@PresetVariableDefinition(description = "Path of the domain owner of the resource.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private String path;
public String getPath() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/GenericPresetVariable.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/GenericPresetVariable.java
index f59f23abdc15..a34c1eacd7c3 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/GenericPresetVariable.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/GenericPresetVariable.java
@@ -23,12 +23,17 @@
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
public class GenericPresetVariable {
+<<<<<<< HEAD
+ private String id;
+ private String name;
+=======
@PresetVariableDefinition(description = "ID of the resource.")
private String id;
@PresetVariableDefinition(description = "Name of the resource.")
private String name;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
protected transient Set fieldNamesToIncludeInToString = new HashSet<>();
public String getId() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Host.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Host.java
index 4a0fd2f5a078..cbe4e0e06848 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Host.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Host.java
@@ -20,10 +20,15 @@
import java.util.List;
public class Host extends GenericPresetVariable {
+<<<<<<< HEAD
+ private List tags;
+
+=======
@PresetVariableDefinition(description = "List of tags of the host where the VM is running (i.e.: [\"a\", \"b\"]).")
private List tags;
@PresetVariableDefinition(description = "Whether the tag is a rule interpreted in JavaScript.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private Boolean isTagARule;
public List getTags() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariables.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariables.java
index b27bf589c167..c328c984803f 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariables.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariables.java
@@ -19,6 +19,13 @@
public class PresetVariables {
+<<<<<<< HEAD
+ private Account account;
+ private Domain domain;
+ private GenericPresetVariable project;
+ private String resourceType;
+ private Value value;
+=======
@PresetVariableDefinition(description = "Account owner of the resource.")
private Account account;
@@ -35,6 +42,7 @@ public class PresetVariables {
private Value value;
@PresetVariableDefinition(description = "Zone where the resource is.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private GenericPresetVariable zone;
public Account getAccount() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Role.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Role.java
index 3f953b3a4ff8..9bc0d103d4b6 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Role.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Role.java
@@ -20,7 +20,10 @@
import org.apache.cloudstack.acl.RoleType;
public class Role extends GenericPresetVariable {
+<<<<<<< HEAD
+=======
@PresetVariableDefinition(description = "Role type of the resource's owner.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private RoleType type;
public RoleType getType() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Storage.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Storage.java
index 9b6cfb310922..a56101c31871 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Storage.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Storage.java
@@ -22,6 +22,11 @@
import com.cloud.storage.ScopeType;
public class Storage extends GenericPresetVariable {
+<<<<<<< HEAD
+ private List tags;
+
+ private Boolean isTagARule;
+=======
@PresetVariableDefinition(description = "List of string representing the tags of the storage where the volume is (i.e.: [\"a\", \"b\"]).")
private List tags;
@@ -29,6 +34,7 @@ public class Storage extends GenericPresetVariable {
private Boolean isTagARule;
@PresetVariableDefinition(description = "Scope of the storage where the volume is. Values can be: ZONE, CLUSTER or HOST. Applicable only for primary storages.")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private ScopeType scope;
public List getTags() {
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Value.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Value.java
index d87146d8798e..fae00d2f4dd5 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Value.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Value.java
@@ -23,6 +23,27 @@
import com.cloud.storage.Snapshot;
import com.cloud.storage.Storage.ProvisioningType;
import com.cloud.vm.snapshot.VMSnapshot;
+<<<<<<< HEAD
+
+public class Value extends GenericPresetVariable {
+ private Host host;
+ private String osName;
+ private List accountResources;
+ private Map tags;
+ private String tag;
+ private Long size;
+ private Long virtualSize;
+ private ProvisioningType provisioningType;
+ private Snapshot.Type snapshotType;
+ private VMSnapshot.Type vmSnapshotType;
+ private ComputeOffering computeOffering;
+ private GenericPresetVariable template;
+ private GenericPresetVariable diskOffering;
+ private Storage storage;
+ private ComputingResources computingResources;
+ private BackupOffering backupOffering;
+ private String hypervisorType;
+=======
import org.apache.cloudstack.quota.constant.QuotaTypes;
public class Value extends GenericPresetVariable {
@@ -92,6 +113,7 @@ public class Value extends GenericPresetVariable {
private String hypervisorType;
@PresetVariableDefinition(description = "The volume format. Values can be: RAW, VHD, VHDX, OVA and QCOW2.", supportedTypes = {QuotaTypes.VOLUME, QuotaTypes.VOLUME_SECONDARY})
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private String volumeFormat;
private String state;
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java
index 81b4643eb450..df5fd3c8dc5d 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java
@@ -48,16 +48,26 @@ public interface QuotaConfig {
public static final ConfigKey QuotaSmtpPort = new ConfigKey("Advanced", String.class, "quota.usage.smtp.port", "", "Quota SMTP port.", true);
+<<<<<<< HEAD
+ public static final ConfigKey QuotaSmtpAuthType = new ConfigKey("Advanced", String.class, "quota.usage.smtp.useAuth", "",
+=======
public static final ConfigKey QuotaSmtpAuthType = new ConfigKey("Advanced", Boolean.class, "quota.usage.smtp.useAuth", "false",
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
"If true, use secure SMTP authentication when sending emails.", true);
public static final ConfigKey QuotaSmtpSender = new ConfigKey("Advanced", String.class, "quota.usage.smtp.sender", "",
"Sender of quota alert email (will be in the From header of the email).", true);
public static final ConfigKey QuotaSmtpEnabledSecurityProtocols = new ConfigKey("Advanced", String.class, "quota.usage.smtp.enabledSecurityProtocols", "",
+<<<<<<< HEAD
+ "White-space separated security protocols; ex: \"TLSv1 TLSv1.1\". Supported protocols: SSLv2Hello, SSLv3, TLSv1, TLSv1.1 and TLSv1.2.", true);
+
+ public static final ConfigKey QuotaSmtpUseStartTLS = new ConfigKey("Advanced", String.class, "quota.usage.smtp.useStartTLS", "false",
+=======
"White-space separated security protocols; ex: \"TLSv1 TLSv1.1\". Supported protocols: SSLv2Hello, SSLv3, TLSv1, TLSv1.1 and TLSv1.2.", true, ConfigKey.Kind.WhitespaceSeparatedListWithOptions, "SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2");
public static final ConfigKey QuotaSmtpUseStartTLS = new ConfigKey("Advanced", Boolean.class, "quota.usage.smtp.useStartTLS", "false",
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
"If set to true and if we enable security via quota.usage.smtp.useAuth, this will enable StartTLS to secure the connection.", true);
public static final ConfigKey QuotaActivationRuleTimeout = new ConfigKey<>("Advanced", Long.class, "quota.activationrule.timeout", "2000", "The maximum runtime,"
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaTypes.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaTypes.java
index 947183577a88..0ed77429440f 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaTypes.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaTypes.java
@@ -22,7 +22,10 @@
import org.apache.cloudstack.usage.UsageTypes;
import org.apache.cloudstack.usage.UsageUnitTypes;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public class QuotaTypes extends UsageTypes {
private final Integer quotaType;
@@ -101,6 +104,8 @@ static public String getDescription(int quotaType) {
}
return null;
}
+<<<<<<< HEAD
+=======
static public QuotaTypes getQuotaType(int quotaType) {
return quotaTypeMap.get(quotaType);
@@ -110,4 +115,5 @@ static public QuotaTypes getQuotaType(int quotaType) {
public String toString() {
return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "quotaType", "quotaName");
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/ValueTest.java b/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/ValueTest.java
index bad33da88367..6128081a76e7 100644
--- a/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/ValueTest.java
+++ b/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/ValueTest.java
@@ -26,6 +26,8 @@
public class ValueTest {
@Test
+<<<<<<< HEAD
+=======
public void setIdTestAddFieldIdToCollection() {
Value variable = new Value();
variable.setId(null);
@@ -40,6 +42,7 @@ public void setNameTestAddFieldNameToCollection() {
}
@Test
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public void setHostTestAddFieldHostToCollection() {
Value variable = new Value();
variable.setHost(null);
diff --git a/packaging/centos7/cloud.spec b/packaging/centos7/cloud.spec
index 80b8443e09b9..f6d37be0f10c 100644
--- a/packaging/centos7/cloud.spec
+++ b/packaging/centos7/cloud.spec
@@ -314,7 +314,10 @@ install -D packaging/systemd/cloudstack-management.default ${RPM_BUILD_ROOT}%{_s
install -D server/target/conf/cloudstack-sudoers ${RPM_BUILD_ROOT}%{_sysconfdir}/sudoers.d/%{name}-management
touch ${RPM_BUILD_ROOT}%{_localstatedir}/run/%{name}-management.pid
#install -D server/target/conf/cloudstack-catalina.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-catalina
+<<<<<<< HEAD
+=======
install -D server/target/conf/cloudstack-management.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-management
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
# SystemVM template
mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/templates/systemvm
@@ -379,7 +382,10 @@ cp client/target/lib/mysql*jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/lib/
install -D packaging/systemd/cloudstack-usage.service ${RPM_BUILD_ROOT}%{_unitdir}/%{name}-usage.service
install -D packaging/systemd/cloudstack-usage.default ${RPM_BUILD_ROOT}%{_sysconfdir}/default/%{name}-usage
mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/usage/
+<<<<<<< HEAD
+=======
install -D usage/target/transformed/cloudstack-usage.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-usage
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
# CLI
cp -r cloud-cli/cloudtool ${RPM_BUILD_ROOT}%{python_sitearch}/
@@ -625,7 +631,10 @@ pip3 install --upgrade urllib3
%{_defaultdocdir}/%{name}-management-%{version}/LICENSE
%{_defaultdocdir}/%{name}-management-%{version}/NOTICE
#%attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-catalina
+<<<<<<< HEAD
+=======
%config(noreplace) %attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-management
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
%{_datadir}/%{name}-management/setup/wheel/*.whl
%files agent
@@ -673,7 +682,10 @@ pip3 install --upgrade urllib3
%files usage
%attr(0644,root,root) %{_unitdir}/%{name}-usage.service
%config(noreplace) %{_sysconfdir}/default/%{name}-usage
+<<<<<<< HEAD
+=======
%config(noreplace) %attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-usage
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
%attr(0644,root,root) %{_datadir}/%{name}-usage/*.jar
%attr(0644,root,root) %{_datadir}/%{name}-usage/lib/*.jar
%dir %attr(0770,root,cloud) %{_localstatedir}/log/%{name}/usage
diff --git a/packaging/centos8/cloud.spec b/packaging/centos8/cloud.spec
index ebb7af125830..e64cd315d7d8 100644
--- a/packaging/centos8/cloud.spec
+++ b/packaging/centos8/cloud.spec
@@ -296,7 +296,10 @@ install -D packaging/systemd/cloudstack-management.default ${RPM_BUILD_ROOT}%{_s
install -D server/target/conf/cloudstack-sudoers ${RPM_BUILD_ROOT}%{_sysconfdir}/sudoers.d/%{name}-management
touch ${RPM_BUILD_ROOT}%{_localstatedir}/run/%{name}-management.pid
#install -D server/target/conf/cloudstack-catalina.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-catalina
+<<<<<<< HEAD
+=======
install -D server/target/conf/cloudstack-management.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-management
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
# SystemVM template
mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/templates/systemvm
@@ -361,7 +364,10 @@ cp client/target/lib/mysql*jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/lib/
install -D packaging/systemd/cloudstack-usage.service ${RPM_BUILD_ROOT}%{_unitdir}/%{name}-usage.service
install -D packaging/systemd/cloudstack-usage.default ${RPM_BUILD_ROOT}%{_sysconfdir}/default/%{name}-usage
mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/usage/
+<<<<<<< HEAD
+=======
install -D usage/target/transformed/cloudstack-usage.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-usage
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
# Marvin
mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-marvin
@@ -579,7 +585,10 @@ pip3 install --upgrade /usr/share/cloudstack-marvin/Marvin-*.tar.gz
%config(noreplace) %{_sysconfdir}/%{name}/management/log4j2.xml
%config(noreplace) %{_sysconfdir}/%{name}/management/environment.properties
%config(noreplace) %{_sysconfdir}/%{name}/management/java.security.ciphers
+<<<<<<< HEAD
+=======
%config(noreplace) %attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-management
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
%attr(0644,root,root) %{_unitdir}/%{name}-management.service
%attr(0755,cloud,cloud) %{_localstatedir}/run/%{name}-management.pid
%attr(0755,root,root) %{_bindir}/%{name}-setup-management
@@ -651,7 +660,10 @@ pip3 install --upgrade /usr/share/cloudstack-marvin/Marvin-*.tar.gz
%files usage
%attr(0644,root,root) %{_unitdir}/%{name}-usage.service
%config(noreplace) %{_sysconfdir}/default/%{name}-usage
+<<<<<<< HEAD
+=======
%config(noreplace) %attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-usage
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
%attr(0644,root,root) %{_datadir}/%{name}-usage/*.jar
%attr(0644,root,root) %{_datadir}/%{name}-usage/lib/*.jar
%dir %attr(0770,root,cloud) %{_localstatedir}/log/%{name}/usage
diff --git a/packaging/systemd/cloudstack-agent.service b/packaging/systemd/cloudstack-agent.service
index 5e2e5db0b210..be8643a8591b 100644
--- a/packaging/systemd/cloudstack-agent.service
+++ b/packaging/systemd/cloudstack-agent.service
@@ -31,8 +31,11 @@ EnvironmentFile=/etc/default/cloudstack-agent
ExecStart=/usr/bin/java $JAVA_OPTS $JAVA_DEBUG -cp $CLASSPATH $JAVA_CLASS
Restart=always
RestartSec=10s
+<<<<<<< HEAD
+=======
StandardOutput=append:/var/log/cloudstack/agent/agent.out
StandardError=append:/var/log/cloudstack/agent/agent.err
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
[Install]
WantedBy=multi-user.target
diff --git a/packaging/systemd/cloudstack-management.service b/packaging/systemd/cloudstack-management.service
index 55780af7a5c6..5c96771d6322 100644
--- a/packaging/systemd/cloudstack-management.service
+++ b/packaging/systemd/cloudstack-management.service
@@ -35,8 +35,11 @@ EnvironmentFile=/etc/default/cloudstack-management
WorkingDirectory=/var/log/cloudstack/management
PIDFile=/var/run/cloudstack-management.pid
ExecStart=/usr/bin/java $JAVA_DEBUG $JAVA_OPTS -cp $CLASSPATH $BOOTSTRAP_CLASS
+<<<<<<< HEAD
+=======
StandardOutput=append:/var/log/cloudstack/management/management-server.out
StandardError=append:/var/log/cloudstack/management/management-server.err
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
[Install]
WantedBy=multi-user.target
diff --git a/packaging/systemd/cloudstack-usage.service b/packaging/systemd/cloudstack-usage.service
index bf5bd2a189b9..95ae70eee228 100644
--- a/packaging/systemd/cloudstack-usage.service
+++ b/packaging/systemd/cloudstack-usage.service
@@ -35,8 +35,11 @@ Environment=JAVA_PID=$$
ExecStart=/bin/sh -ec '/usr/bin/java -Dpid=${JAVA_PID} $JAVA_OPTS $JAVA_DEBUG -cp $CLASSPATH $JAVA_CLASS'
Restart=always
RestartSec=10s
+<<<<<<< HEAD
+=======
StandardOutput=append:/var/log/cloudstack/usage/usage.out
StandardError=append:/var/log/cloudstack/usage/usage.err
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
[Install]
WantedBy=multi-user.target
diff --git a/plugins/api/discovery/src/main/java/org/apache/cloudstack/api/response/ApiDiscoveryResponse.java b/plugins/api/discovery/src/main/java/org/apache/cloudstack/api/response/ApiDiscoveryResponse.java
index 81a9df750cbe..d69a652c347f 100644
--- a/plugins/api/discovery/src/main/java/org/apache/cloudstack/api/response/ApiDiscoveryResponse.java
+++ b/plugins/api/discovery/src/main/java/org/apache/cloudstack/api/response/ApiDiscoveryResponse.java
@@ -16,6 +16,15 @@
// under the License.
package org.apache.cloudstack.api.response;
+<<<<<<< HEAD
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+import java.util.HashSet;
+import java.util.Set;
+=======
import java.util.HashSet;
import java.util.Set;
@@ -24,6 +33,7 @@
import com.cloud.serializer.Param;
import com.google.gson.annotations.SerializedName;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@SuppressWarnings("unused")
public class ApiDiscoveryResponse extends BaseResponse {
@@ -65,6 +75,8 @@ public ApiDiscoveryResponse() {
isAsync = false;
}
+<<<<<<< HEAD
+=======
public ApiDiscoveryResponse(ApiDiscoveryResponse another) {
this.name = another.getName();
this.description = another.getDescription();
@@ -77,6 +89,7 @@ public ApiDiscoveryResponse(ApiDiscoveryResponse another) {
this.setObjectName(another.getObjectName());
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public void setName(String name) {
this.name = name;
}
@@ -136,8 +149,11 @@ public void addApiResponse(ApiResponseResponse apiResponse) {
public Set getApiResponse() {
return apiResponse;
}
+<<<<<<< HEAD
+=======
public String getType() {
return type;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/plugins/api/discovery/src/main/java/org/apache/cloudstack/api/response/ApiParameterResponse.java b/plugins/api/discovery/src/main/java/org/apache/cloudstack/api/response/ApiParameterResponse.java
index 75f0aacd5046..ea99ee23db1c 100644
--- a/plugins/api/discovery/src/main/java/org/apache/cloudstack/api/response/ApiParameterResponse.java
+++ b/plugins/api/discovery/src/main/java/org/apache/cloudstack/api/response/ApiParameterResponse.java
@@ -16,14 +16,22 @@
// under the License.
package org.apache.cloudstack.api.response;
+<<<<<<< HEAD
+import com.google.gson.annotations.SerializedName;
+
+=======
import java.util.List;
import org.apache.cloudstack.acl.RoleType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseResponse;
import com.cloud.serializer.Param;
+<<<<<<< HEAD
+=======
import com.google.gson.annotations.SerializedName;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public class ApiParameterResponse extends BaseResponse {
@SerializedName(ApiConstants.NAME)
@@ -54,8 +62,11 @@ public class ApiParameterResponse extends BaseResponse {
@Param(description = "comma separated related apis to get the parameter")
private String related;
+<<<<<<< HEAD
+=======
private transient List authorizedRoleTypes = null;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public ApiParameterResponse() {
}
@@ -91,6 +102,8 @@ public void setRelated(String related) {
this.related = related;
}
+<<<<<<< HEAD
+=======
public void setAuthorizedRoleTypes(List authorizedRoleTypes) {
this.authorizedRoleTypes = authorizedRoleTypes;
}
@@ -98,4 +111,5 @@ public void setAuthorizedRoleTypes(List authorizedRoleTypes) {
public List getAuthorizedRoleTypes() {
return authorizedRoleTypes;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/plugins/api/discovery/src/main/java/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java b/plugins/api/discovery/src/main/java/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java
index 452b95cf2c05..7de21a7d5acb 100644
--- a/plugins/api/discovery/src/main/java/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java
+++ b/plugins/api/discovery/src/main/java/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java
@@ -18,10 +18,15 @@
import java.lang.reflect.Field;
import java.util.ArrayList;
+<<<<<<< HEAD
+import java.util.HashMap;
+import java.util.HashSet;
+=======
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
@@ -30,22 +35,34 @@
import javax.inject.Inject;
import org.apache.cloudstack.acl.APIChecker;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.acl.Role;
import org.apache.cloudstack.acl.RoleService;
import org.apache.cloudstack.acl.RoleType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.BaseAsyncCmd;
import org.apache.cloudstack.api.BaseAsyncCreateCmd;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.Parameter;
+<<<<<<< HEAD
+import org.apache.cloudstack.acl.Role;
+import org.apache.cloudstack.acl.RoleService;
+import org.apache.cloudstack.acl.RoleType;
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.command.user.discovery.ListApisCmd;
import org.apache.cloudstack.api.response.ApiDiscoveryResponse;
import org.apache.cloudstack.api.response.ApiParameterResponse;
import org.apache.cloudstack.api.response.ApiResponseResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
+<<<<<<< HEAD
+=======
import org.apache.commons.collections.CollectionUtils;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.commons.lang3.StringUtils;
import org.reflections.ReflectionUtils;
import org.springframework.stereotype.Component;
@@ -218,9 +235,12 @@ private ApiDiscoveryResponse getCmdRequestMap(Class> cmdClass, APICommand apiC
paramResponse.setSince(parameterAnnotation.since());
}
paramResponse.setRelated(parameterAnnotation.entityType()[0].getName());
+<<<<<<< HEAD
+=======
if (parameterAnnotation.authorized() != null) {
paramResponse.setAuthorizedRoleTypes(Arrays.asList(parameterAnnotation.authorized()));
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
response.addParam(paramResponse);
}
}
@@ -253,7 +273,10 @@ public ListResponse extends BaseResponse> listApis(User user, String name) {
if (user == null)
return null;
+<<<<<<< HEAD
+=======
Account account = accountService.getAccount(user.getAccountId());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (name != null) {
if (!s_apiNameDiscoveryResponseMap.containsKey(name))
@@ -267,9 +290,16 @@ public ListResponse extends BaseResponse> listApis(User user, String name) {
return null;
}
}
+<<<<<<< HEAD
+ responseList.add(s_apiNameDiscoveryResponseMap.get(name));
+
+ } else {
+ Account account = accountService.getAccount(user.getAccountId());
+=======
responseList.add(getApiDiscoveryResponseWithAccessibleParams(name, account));
} else {
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (account == null) {
throw new PermissionDeniedException(String.format("The account with id [%s] for user [%s] is null.", user.getAccountId(), user));
}
@@ -290,13 +320,19 @@ public ListResponse extends BaseResponse> listApis(User user, String name) {
}
for (String apiName: apisAllowed) {
+<<<<<<< HEAD
+ responseList.add(s_apiNameDiscoveryResponseMap.get(apiName));
+=======
responseList.add(getApiDiscoveryResponseWithAccessibleParams(apiName, account));
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
response.setResponses(responseList);
return response;
}
+<<<<<<< HEAD
+=======
private static ApiDiscoveryResponse getApiDiscoveryResponseWithAccessibleParams(String name, Account account) {
if (Account.Type.ADMIN.equals(account.getType())) {
return s_apiNameDiscoveryResponseMap.get(name);
@@ -317,6 +353,7 @@ private static ApiDiscoveryResponse getApiDiscoveryResponseWithAccessibleParams(
return apiDiscoveryResponse;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Override
public List> getCommands() {
List> cmdList = new ArrayList>();
diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilder.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilder.java
index ecbb809b60bd..1a0fed4a0631 100644
--- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilder.java
+++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilder.java
@@ -20,7 +20,10 @@
import org.apache.cloudstack.api.command.QuotaConfigureEmailCmd;
import org.apache.cloudstack.api.command.QuotaEmailTemplateListCmd;
import org.apache.cloudstack.api.command.QuotaEmailTemplateUpdateCmd;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.command.QuotaPresetVariablesListCmd;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.command.QuotaStatementCmd;
import org.apache.cloudstack.api.command.QuotaTariffCreateCmd;
import org.apache.cloudstack.api.command.QuotaTariffListCmd;
@@ -73,6 +76,8 @@ public interface QuotaResponseBuilder {
boolean deleteQuotaTariff(String quotaTariffUuid);
+<<<<<<< HEAD
+=======
/**
* Lists the preset variables for the usage type informed in the command.
* @param cmd used to retrieve the Quota usage type parameter.
@@ -80,6 +85,7 @@ public interface QuotaResponseBuilder {
*/
List listQuotaPresetVariables(QuotaPresetVariablesListCmd cmd);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
Pair configureQuotaEmail(QuotaConfigureEmailCmd cmd);
QuotaConfigureEmailResponse createQuotaConfigureEmailResponse(QuotaEmailConfigurationVO quotaEmailConfigurationVO, Double minBalance, long accountId);
diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
index 7b5667ac13db..d9c090c1c820 100644
--- a/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
+++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java
@@ -16,15 +16,21 @@
//under the License.
package org.apache.cloudstack.api.response;
+<<<<<<< HEAD
+=======
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
+<<<<<<< HEAD
+=======
import java.util.Arrays;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
@@ -35,7 +41,10 @@
import java.util.List;
import java.util.ListIterator;
import java.util.function.Consumer;
+<<<<<<< HEAD
+=======
import java.util.stream.Collectors;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import javax.inject.Inject;
@@ -46,7 +55,10 @@
import org.apache.cloudstack.api.command.QuotaConfigureEmailCmd;
import org.apache.cloudstack.api.command.QuotaEmailTemplateListCmd;
import org.apache.cloudstack.api.command.QuotaEmailTemplateUpdateCmd;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.command.QuotaPresetVariablesListCmd;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.command.QuotaStatementCmd;
import org.apache.cloudstack.api.command.QuotaTariffCreateCmd;
import org.apache.cloudstack.api.command.QuotaTariffListCmd;
@@ -56,11 +68,14 @@
import org.apache.cloudstack.quota.QuotaManagerImpl;
import org.apache.cloudstack.quota.QuotaService;
import org.apache.cloudstack.quota.QuotaStatement;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.quota.activationrule.presetvariables.ComputingResources;
import org.apache.cloudstack.quota.activationrule.presetvariables.GenericPresetVariable;
import org.apache.cloudstack.quota.activationrule.presetvariables.PresetVariableDefinition;
import org.apache.cloudstack.quota.activationrule.presetvariables.PresetVariables;
import org.apache.cloudstack.quota.activationrule.presetvariables.Value;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.quota.constant.QuotaConfig;
import org.apache.cloudstack.quota.constant.QuotaTypes;
import org.apache.cloudstack.quota.dao.QuotaAccountDao;
@@ -78,8 +93,11 @@
import org.apache.cloudstack.quota.vo.QuotaTariffVO;
import org.apache.cloudstack.quota.vo.QuotaUsageVO;
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
+<<<<<<< HEAD
+=======
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.springframework.stereotype.Component;
@@ -132,8 +150,11 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
@Inject
private QuotaEmailConfigurationDao quotaEmailConfigurationDao;
+<<<<<<< HEAD
+=======
private final Class>[] assignableClasses = {GenericPresetVariable.class, ComputingResources.class};
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Override
public QuotaTariffResponse createQuotaTariffResponse(QuotaTariffVO tariff) {
final QuotaTariffResponse response = new QuotaTariffResponse();
@@ -696,6 +717,8 @@ public boolean deleteQuotaTariff(String quotaTariffUuid) {
}
@Override
+<<<<<<< HEAD
+=======
public List listQuotaPresetVariables(QuotaPresetVariablesListCmd cmd) {
List response;
List> variables = new ArrayList<>();
@@ -809,6 +832,7 @@ public QuotaPresetVariablesItemResponse createPresetVariablesItemResponse(Pair>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public Pair configureQuotaEmail(QuotaConfigureEmailCmd cmd) {
validateQuotaConfigureEmailCmdParameters(cmd);
diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
index 17fa7bd8425e..fa0b8be04fcf 100644
--- a/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
+++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java
@@ -33,7 +33,10 @@
import org.apache.cloudstack.api.command.QuotaEmailTemplateUpdateCmd;
import org.apache.cloudstack.api.command.QuotaEnabledCmd;
import org.apache.cloudstack.api.command.QuotaListEmailConfigurationCmd;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.command.QuotaPresetVariablesListCmd;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.command.QuotaStatementCmd;
import org.apache.cloudstack.api.command.QuotaSummaryCmd;
import org.apache.cloudstack.api.command.QuotaTariffCreateCmd;
@@ -120,7 +123,10 @@ public List> getCommands() {
cmdList.add(QuotaTariffDeleteCmd.class);
cmdList.add(QuotaConfigureEmailCmd.class);
cmdList.add(QuotaListEmailConfigurationCmd.class);
+<<<<<<< HEAD
+=======
cmdList.add(QuotaPresetVariablesListCmd.class);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
return cmdList;
}
diff --git a/plugins/database/quota/src/test/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImplTest.java b/plugins/database/quota/src/test/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImplTest.java
index 6bca4ea85bb3..6e734a899750 100644
--- a/plugins/database/quota/src/test/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImplTest.java
+++ b/plugins/database/quota/src/test/java/org/apache/cloudstack/api/response/QuotaResponseBuilderImplTest.java
@@ -29,7 +29,10 @@
import com.cloud.domain.DomainVO;
import com.cloud.domain.dao.DomainDao;
+<<<<<<< HEAD
+=======
import com.cloud.utils.Pair;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.command.QuotaConfigureEmailCmd;
import org.apache.cloudstack.api.command.QuotaEmailTemplateListCmd;
@@ -37,9 +40,12 @@
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.quota.QuotaService;
import org.apache.cloudstack.quota.QuotaStatement;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.quota.activationrule.presetvariables.PresetVariableDefinition;
import org.apache.cloudstack.quota.activationrule.presetvariables.PresetVariables;
import org.apache.cloudstack.quota.activationrule.presetvariables.Value;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.quota.constant.QuotaConfig;
import org.apache.cloudstack.quota.constant.QuotaTypes;
import org.apache.cloudstack.quota.dao.QuotaAccountDao;
@@ -423,6 +429,8 @@ public void getQuotaSummaryResponseTestAccountIsNotNullQuotaIsEnabledShouldRetur
assertTrue(quotaSummaryResponse.getQuotaEnabled());
}
+<<<<<<< HEAD
+=======
@Test
public void filterSupportedTypesTestReturnWhenQuotaTypeDoesNotMatch() throws NoSuchFieldException {
List> variables = new ArrayList<>();
@@ -463,6 +471,7 @@ public void filterSupportedTypesTestCallRecursiveMethodWhenIsGenericPresetVariab
Mockito.verify(quotaResponseBuilderSpy, Mockito.atLeastOnce()).addAllPresetVariables(Mockito.any(), Mockito.any(QuotaTypes.class), Mockito.anyList(),
Mockito.anyString());
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Test (expected = InvalidParameterValueException.class)
public void validateQuotaConfigureEmailCmdParametersTestNullQuotaAccount() {
@@ -486,6 +495,10 @@ public void validateQuotaConfigureEmailCmdParametersTestEnableNullAndTemplateNam
quotaResponseBuilderSpy.validateQuotaConfigureEmailCmdParameters(quotaConfigureEmailCmdMock);
}
+<<<<<<< HEAD
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Test
public void validateQuotaConfigureEmailCmdParametersTestNullTemplateName() {
Mockito.doReturn(quotaAccountVOMock).when(quotaAccountDaoMock).findByIdQuotaAccount(Mockito.any());
diff --git a/plugins/event-bus/inmemory/src/main/java/org/apache/cloudstack/mom/inmemory/InMemoryEventBus.java b/plugins/event-bus/inmemory/src/main/java/org/apache/cloudstack/mom/inmemory/InMemoryEventBus.java
index 0c00c0639fd9..4f4b8cfc9d42 100644
--- a/plugins/event-bus/inmemory/src/main/java/org/apache/cloudstack/mom/inmemory/InMemoryEventBus.java
+++ b/plugins/event-bus/inmemory/src/main/java/org/apache/cloudstack/mom/inmemory/InMemoryEventBus.java
@@ -60,8 +60,11 @@ public UUID subscribe(EventTopic topic, EventSubscriber subscriber) throws Event
if (subscriber == null || topic == null) {
throw new EventBusException("Invalid EventSubscriber/EventTopic object passed.");
}
+<<<<<<< HEAD
+=======
logger.debug("subscribing '{}' to events of type '{}' from '{}'", subscriber.toString(), topic.getEventType(), topic.getEventSource());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
UUID subscriberId = UUID.randomUUID();
subscribers.put(subscriberId, new Pair(topic, subscriber));
@@ -70,7 +73,10 @@ public UUID subscribe(EventTopic topic, EventSubscriber subscriber) throws Event
@Override
public void unsubscribe(UUID subscriberId, EventSubscriber subscriber) throws EventBusException {
+<<<<<<< HEAD
+=======
logger.debug("unsubscribing '{}'", subscriberId);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (subscriberId == null) {
throw new EventBusException("Cannot unregister a null subscriberId.");
}
@@ -88,9 +94,13 @@ public void unsubscribe(UUID subscriberId, EventSubscriber subscriber) throws Ev
@Override
public void publish(Event event) throws EventBusException {
+<<<<<<< HEAD
+ if (subscribers == null || subscribers.isEmpty()) {
+=======
logger.trace("publish '{}'", event.getDescription());
if (subscribers == null || subscribers.isEmpty()) {
logger.trace("no subscribers, no publish");
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
return; // no subscriber to publish to, so just return
}
diff --git a/plugins/event-bus/kafka/src/main/java/org/apache/cloudstack/mom/kafka/KafkaEventBus.java b/plugins/event-bus/kafka/src/main/java/org/apache/cloudstack/mom/kafka/KafkaEventBus.java
index f2589d2d7d09..2590d805bea4 100644
--- a/plugins/event-bus/kafka/src/main/java/org/apache/cloudstack/mom/kafka/KafkaEventBus.java
+++ b/plugins/event-bus/kafka/src/main/java/org/apache/cloudstack/mom/kafka/KafkaEventBus.java
@@ -87,23 +87,34 @@ public void setName(String name) {
@Override
public UUID subscribe(EventTopic topic, EventSubscriber subscriber) throws EventBusException {
+<<<<<<< HEAD
+=======
logger.debug("subscribing '{}' to events of type '{}' from '{}'", subscriber.toString(), topic.getEventType(), topic.getEventSource());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/* NOOP */
return UUID.randomUUID();
}
@Override
public void unsubscribe(UUID subscriberId, EventSubscriber subscriber) throws EventBusException {
+<<<<<<< HEAD
+=======
logger.debug("unsubscribing '{}'", subscriberId);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/* NOOP */
}
@Override
public void publish(Event event) throws EventBusException {
+<<<<<<< HEAD
+ ProducerRecord record = new ProducerRecord(_topic, event.getResourceUUID(), event.getDescription());
+ _producer.send(record);
+=======
logger.trace("publish '{}'", event.getDescription());
ProducerRecord newRecord = new ProducerRecord<>(_topic, event.getResourceUUID(), event.getDescription());
_producer.send(newRecord);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Override
diff --git a/plugins/event-bus/rabbitmq/src/main/java/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java b/plugins/event-bus/rabbitmq/src/main/java/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
index e8067e75b406..bff6edf5398a 100644
--- a/plugins/event-bus/rabbitmq/src/main/java/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
+++ b/plugins/event-bus/rabbitmq/src/main/java/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
@@ -185,12 +185,19 @@ public static void setRetryInterval(Integer retryInterval) {
*/
@Override
public UUID subscribe(EventTopic topic, EventSubscriber subscriber) throws EventBusException {
+<<<<<<< HEAD
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (subscriber == null || topic == null) {
throw new EventBusException("Invalid EventSubscriber/EventTopic object passed.");
}
+<<<<<<< HEAD
+=======
logger.debug("subscribing '{}' to events of type '{}' from '{}'", subscriber.toString(), topic.getEventType(), topic.getEventSource());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
// create a UUID, that will be used for managing subscriptions and also used as queue name
// for on the queue used for the subscriber on the AMQP broker
UUID queueId = UUID.randomUUID();
@@ -251,7 +258,10 @@ public void handleDelivery(String queueName, Envelope envelope, AMQP.BasicProper
@Override
public void unsubscribe(UUID subscriberId, EventSubscriber subscriber) throws EventBusException {
+<<<<<<< HEAD
+=======
logger.debug("unsubscribing '{}'", subscriberId);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
String classname = subscriber.getClass().getName();
String queueName = UUID.nameUUIDFromBytes(classname.getBytes()).toString();
@@ -267,7 +277,10 @@ public void unsubscribe(UUID subscriberId, EventSubscriber subscriber) throws Ev
// publish event on to the exchange created on AMQP server
@Override
public void publish(Event event) throws EventBusException {
+<<<<<<< HEAD
+=======
logger.trace("publish '{}'", event.getDescription());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
String routingKey = createRoutingKey(event);
String eventDescription = event.getDescription();
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetRemoteVmsCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetRemoteVmsCommandWrapper.java
index a9da4a50452a..d6bdebf7eda1 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetRemoteVmsCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetRemoteVmsCommandWrapper.java
@@ -47,7 +47,13 @@ public final class LibvirtGetRemoteVmsCommandWrapper extends CommandWrapper>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
HashMap unmanagedInstances = new HashMap<>();
try {
Connect conn = LibvirtConnection.getConnection(hypervisorURI);
@@ -56,20 +62,38 @@ public Answer execute(final GetRemoteVmsCommand command, final LibvirtComputingR
final Domain domain = libvirtComputingResource.getDomain(conn, name);
final DomainInfo.DomainState ps = domain.getInfo().state;
+<<<<<<< HEAD
+
+ final VirtualMachine.PowerState state = libvirtComputingResource.convertToPowerState(ps);
+
+ logger.debug("VM " + domain.getName() + ": powerstate = " + ps + "; vm state=" + state.toString());
+=======
final VirtualMachine.PowerState state = libvirtComputingResource.convertToPowerState(ps);
logger.debug("VM " + domain.getName() + " - powerstate: " + ps + ", state: " + state.toString());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (state == VirtualMachine.PowerState.PowerOff) {
try {
UnmanagedInstanceTO instance = getUnmanagedInstance(libvirtComputingResource, domain, conn);
unmanagedInstances.put(instance.getName(), instance);
} catch (Exception e) {
+<<<<<<< HEAD
+ logger.error("Error while fetching instance details", e);
+=======
logger.error("Couldn't fetch VM " + domain.getName() + " details, due to: " + e.getMessage(), e);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
domain.free();
}
+<<<<<<< HEAD
+ logger.debug("Found Vms: "+ unmanagedInstances.size());
+ return new GetRemoteVmsAnswer(command, "", unmanagedInstances);
+ } catch (final LibvirtException e) {
+ logger.error("Error while listing stopped Vms on remote host: "+ e.getMessage());
+ return new Answer(command, false, result);
+=======
logger.debug("Found " + unmanagedInstances.size() + " stopped VMs on host " + command.getRemoteIp());
return new GetRemoteVmsAnswer(command, "", unmanagedInstances);
} catch (final LibvirtException e) {
@@ -78,6 +102,7 @@ public Answer execute(final GetRemoteVmsCommand command, final LibvirtComputingR
return new Answer(command, false, "Unable to connect to remote host " + command.getRemoteIp() + ", please check the libvirtd tcp connectivity and retry");
}
return new Answer(command, false, "Unable to list stopped VMs on remote host " + command.getRemoteIp() + ", due to: " + e.getMessage());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
@@ -103,8 +128,13 @@ private UnmanagedInstanceTO getUnmanagedInstance(LibvirtComputingResource libvir
return instance;
} catch (Exception e) {
+<<<<<<< HEAD
+ logger.debug("Unable to retrieve unmanaged instance info. ", e);
+ throw new CloudRuntimeException("Unable to retrieve unmanaged instance info. " + e.getMessage());
+=======
logger.debug("Unable to retrieve unmanaged instance info, due to: " + e.getMessage(), e);
throw new CloudRuntimeException("Unable to retrieve unmanaged instance info, due to: " + e.getMessage());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
@@ -116,6 +146,10 @@ private UnmanagedInstanceTO.PowerState getPowerState(VirtualMachine.PowerState v
return UnmanagedInstanceTO.PowerState.PowerOff;
default:
return UnmanagedInstanceTO.PowerState.PowerUnknown;
+<<<<<<< HEAD
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
@@ -162,6 +196,10 @@ private List getUnmanagedInstanceDisks(List>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
Pair sourceHostPath = getSourceHostPath(libvirtComputingResource, diskDef.getSourcePath());
if (sourceHostPath != null) {
disk.setDatastoreHost(sourceHostPath.first());
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
index e15a32876927..bfe99db8a927 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
@@ -67,7 +67,10 @@
import com.cloud.agent.api.MigrateAnswer;
import com.cloud.agent.api.MigrateCommand;
import com.cloud.agent.api.MigrateCommand.MigrateDiskInfo;
+<<<<<<< HEAD
+=======
import com.cloud.agent.api.to.DataTO;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.agent.api.to.DiskTO;
import com.cloud.agent.api.to.DpdkTO;
import com.cloud.agent.api.to.VirtualMachineTO;
@@ -91,7 +94,10 @@ public final class LibvirtMigrateCommandWrapper extends CommandWrapper>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
protected String createMigrationURI(final String destinationIp, final LibvirtComputingResource libvirtComputingResource) {
if (StringUtils.isEmpty(destinationIp)) {
@@ -166,7 +172,10 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
String vncPassword = org.apache.commons.lang3.StringUtils.truncate(to.getVncPassword(), 8);
xmlDesc = replaceIpForVNCInDescFileAndNormalizePassword(xmlDesc, target, vncPassword, vmName);
+<<<<<<< HEAD
+=======
// Replace Config Drive ISO path
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
String oldIsoVolumePath = getOldVolumePath(disks, vmName);
String newIsoVolumePath = getNewVolumePathIfDatastoreHasChanged(libvirtComputingResource, conn, to);
if (newIsoVolumePath != null && !newIsoVolumePath.equals(oldIsoVolumePath)) {
@@ -176,6 +185,8 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
logger.debug(String.format("Replaced disk mount point [%s] with [%s] in VM [%s] XML configuration. New XML configuration is [%s].", oldIsoVolumePath, newIsoVolumePath, vmName, xmlDesc));
}
}
+<<<<<<< HEAD
+=======
// Replace CDROM ISO path
String oldCdromIsoPath = getOldVolumePathForCdrom(disks, vmName);
@@ -184,6 +195,7 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0.
xmlDesc = replaceCdromIsoPath(xmlDesc, vmName, oldCdromIsoPath, newCdromIsoPath);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
// delete the metadata of vm snapshots before migration
vmsnapshots = libvirtComputingResource.cleanVMSnapshotMetadata(dm);
@@ -712,6 +724,8 @@ private String getNewVolumePathIfDatastoreHasChanged(LibvirtComputingResource li
return newIsoVolumePath;
}
+<<<<<<< HEAD
+=======
private String getOldVolumePathForCdrom(List disks, String vmName) {
String oldIsoVolumePath = null;
for (DiskDef disk : disks) {
@@ -787,6 +801,7 @@ protected String replaceCdromIsoPath(String xmlDesc, String vmName, String oldIs
return getXml(doc);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private String getPathFromSourceText(Set paths, String sourceText) {
if (paths != null && StringUtils.isNotBlank(sourceText)) {
for (String path : paths) {
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java
index cd5ce031e64e..4cc6e7cf91e8 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java
@@ -140,6 +140,10 @@ protected MigrateVolumeAnswer migratePowerFlexVolume(final MigrateVolumeCommand
logger.info(String.format("Block copy has started for the volume %s : %s ", destDiskLabel, srcPath));
return checkBlockJobStatus(command, dm, destDiskLabel, srcPath, destPath, libvirtComputingResource, conn, srcSecretUUID);
+<<<<<<< HEAD
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
} catch (Exception e) {
String msg = "Migrate volume failed due to " + e.toString();
logger.warn(msg, e);
@@ -165,6 +169,19 @@ protected MigrateVolumeAnswer migratePowerFlexVolume(final MigrateVolumeCommand
protected MigrateVolumeAnswer checkBlockJobStatus(MigrateVolumeCommand command, Domain dm, String diskLabel, String srcPath, String destPath, LibvirtComputingResource libvirtComputingResource, Connect conn, String srcSecretUUID) throws LibvirtException {
int timeBetweenTries = 1000; // Try more frequently (every sec) and return early if disk is found
int waitTimeInSec = command.getWait();
+<<<<<<< HEAD
+ while (waitTimeInSec > 0) {
+ DomainBlockJobInfo blockJobInfo = dm.getBlockJobInfo(diskLabel, 0);
+ if (blockJobInfo != null) {
+ logger.debug(String.format("Volume %s : %s block copy progress: %s%% current value:%s end value:%s", diskLabel, srcPath, (blockJobInfo.end == 0)? 0 : 100*(blockJobInfo.cur / (double) blockJobInfo.end), blockJobInfo.cur, blockJobInfo.end));
+ if (blockJobInfo.cur == blockJobInfo.end) {
+ logger.info(String.format("Block copy completed for the volume %s : %s", diskLabel, srcPath));
+ dm.blockJobAbort(diskLabel, Domain.BlockJobAbortFlags.PIVOT);
+ if (StringUtils.isNotEmpty(srcSecretUUID)) {
+ libvirtComputingResource.removeLibvirtVolumeSecret(conn, srcSecretUUID);
+ }
+ break;
+=======
double blockCopyProgress = 0;
while (waitTimeInSec > 0) {
DomainBlockJobInfo blockJobInfo = dm.getBlockJobInfo(diskLabel, 0);
@@ -186,6 +203,7 @@ protected MigrateVolumeAnswer checkBlockJobStatus(MigrateVolumeCommand command,
logger.warn(msg);
return new MigrateVolumeAnswer(command, false, msg, null);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
} else {
logger.info("Failed to get the block copy status, trying to abort the job");
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
index 674799c0bbe3..a69b0184e472 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
@@ -38,9 +38,12 @@ public interface KVMStoragePool {
public static final long HeartBeatUpdateRetrySleep = AgentPropertiesFileHandler.getPropertyValue(AgentProperties.KVM_HEARTBEAT_UPDATE_RETRY_SLEEP);
public static final long HeartBeatCheckerTimeout = AgentPropertiesFileHandler.getPropertyValue(AgentProperties.KVM_HEARTBEAT_CHECKER_TIMEOUT);
+<<<<<<< HEAD
+=======
public default KVMPhysicalDisk createPhysicalDisk(String volumeUuid, PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, Long usableSize, byte[] passphrase) {
return createPhysicalDisk(volumeUuid, format, provisioningType, size, passphrase);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public KVMPhysicalDisk createPhysicalDisk(String volumeUuid, PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, byte[] passphrase);
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
index b9671c872d13..44ed3e54e751 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
@@ -1633,7 +1633,11 @@ public Answer createVolume(final CreateObjectCommand cmd) {
}
} else {
vol = primaryPool.createPhysicalDisk(volume.getUuid(), format,
+<<<<<<< HEAD
+ volume.getProvisioningType(), disksize, volume.getPassphrase());
+=======
volume.getProvisioningType(), disksize, volume.getUsableSize(), volume.getPassphrase());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
final VolumeObjectTO newVol = new VolumeObjectTO();
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
index b80accd60181..2e680dab1db9 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java
@@ -848,7 +848,11 @@ private KVMPhysicalDisk createPhysicalDiskByQemuImg(String name, KVMStoragePool
destFile.setFormat(format);
destFile.setSize(size);
Map options = new HashMap();
+<<<<<<< HEAD
+ if (pool.getType() == StoragePoolType.NetworkFilesystem){
+=======
if (List.of(StoragePoolType.NetworkFilesystem, StoragePoolType.Filesystem).contains(pool.getType())) {
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
options.put("preallocation", QemuImg.PreallocationType.getPreallocationType(provisioningType).toString());
}
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
index 1b660671b41f..e59b7dad6899 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStorageAdaptor.java
@@ -154,11 +154,14 @@ public boolean deleteStoragePool(String uuid) {
return MapStorageUuidToStoragePool.remove(uuid) != null;
}
+<<<<<<< HEAD
+=======
@Override
public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, QemuImg.PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, byte[] passphrase) {
return createPhysicalDisk(name, pool, format, provisioningType, size, null, passphrase);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/**
* ScaleIO doesn't need to communicate with the hypervisor normally to create a volume. This is used only to prepare a ScaleIO data disk for encryption.
* Thin encrypted volumes are provisioned in QCOW2 format, which insulates the guest from zeroes/unallocated blocks in the block device that would
@@ -168,12 +171,19 @@ public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, Qemu
* @param format disk format
* @param provisioningType provisioning type
* @param size disk size
+<<<<<<< HEAD
+=======
* @param usableSize usage disk size
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
* @param passphrase passphrase
* @return the disk object
*/
@Override
+<<<<<<< HEAD
+ public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, QemuImg.PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, byte[] passphrase) {
+=======
public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, QemuImg.PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, Long usableSize, byte[] passphrase) {
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (passphrase == null || passphrase.length == 0) {
return null;
}
@@ -191,12 +201,16 @@ public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, Qemu
QemuImg qemuImg = new QemuImg(0, true, false);
Map options = new HashMap<>();
List qemuObjects = new ArrayList<>();
+<<<<<<< HEAD
+ long formattedSize = getUsableBytesFromRawBytes(disk.getSize());
+=======
long formattedSize;
if (usableSize != null && usableSize > 0) {
formattedSize = usableSize;
} else {
formattedSize = getUsableBytesFromRawBytes(disk.getSize());
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
options.put("preallocation", QemuImg.PreallocationType.Metadata.toString());
qemuObjects.add(QemuObject.prepareSecretForQemuImg(disk.getFormat(), disk.getQemuEncryptFormat(), keyFile.toString(), "sec0", options));
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java
index 77f21910da6c..d2630b3a6725 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/ScaleIOStoragePool.java
@@ -73,11 +73,14 @@ private void addSDCDetails() {
}
@Override
+<<<<<<< HEAD
+=======
public KVMPhysicalDisk createPhysicalDisk(String volumeUuid, QemuImg.PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, Long usableSize, byte[] passphrase) {
return this.storageAdaptor.createPhysicalDisk(volumeUuid, this, format, provisioningType, size, usableSize, passphrase);
}
@Override
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public KVMPhysicalDisk createPhysicalDisk(String volumeUuid, QemuImg.PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, byte[] passphrase) {
return this.storageAdaptor.createPhysicalDisk(volumeUuid, this, format, provisioningType, size, passphrase);
}
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
index 6d58dccb5d1e..a892131df6fa 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java
@@ -41,11 +41,14 @@ public interface StorageAdaptor {
public boolean deleteStoragePool(String uuid);
+<<<<<<< HEAD
+=======
public default KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool,
PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, Long usableSize, byte[] passphrase) {
return createPhysicalDisk(name, pool, format, provisioningType, size, passphrase);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool,
PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, byte[] passphrase);
@@ -57,6 +60,10 @@ public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool,
public boolean disconnectPhysicalDisk(Map volumeToDisconnect);
+<<<<<<< HEAD
+ // given local path to file/device (per Libvirt XML), 1) check that device is
+ // handled by your adaptor, return false if not. 2) clean up device, return true
+=======
/**
* Given local path to file/device (per Libvirt XML),
* 1) Make sure to check that device is handled by your adaptor, return false if not.
@@ -68,6 +75,7 @@ public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool,
* @param localPath path for the file/device from the disk definition per Libvirt XML.
* @return true if the operation is successful; false if the operation fails or the adapter fails to handle the path.
*/
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public boolean disconnectPhysicalDiskByPath(String localPath);
public boolean deletePhysicalDisk(String uuid, KVMStoragePool pool, Storage.ImageFormat format);
diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapperTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapperTest.java
index b9316c6c042e..ad9077fdd8d7 100644
--- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapperTest.java
+++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapperTest.java
@@ -214,7 +214,10 @@ public void testGetUnmanagedInstanceDisks() {
LibvirtDomainXMLParser parser = Mockito.mock(LibvirtDomainXMLParser.class);
Mockito.when(parser.getDisks()).thenReturn(List.of(diskDef));
+<<<<<<< HEAD
+=======
Mockito.doReturn(new Pair(null, null)).when(convertInstanceCommandWrapper).getNfsStoragePoolHostAndPath(destinationPool);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
List unmanagedInstanceDisks = convertInstanceCommandWrapper.getUnmanagedInstanceDisks(disks, parser);
Assert.assertEquals(1, unmanagedInstanceDisks.size());
diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java
index 3c5e54e2ba89..15fe64e481dd 100644
--- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java
+++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java
@@ -132,7 +132,10 @@ public class LibvirtMigrateCommandWrapperTest {
" \n" +
" \n" +
" \n" +
+<<<<<<< HEAD
+=======
" \n" +
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
" \n" +
" \n" +
" \n" +
@@ -250,7 +253,10 @@ public class LibvirtMigrateCommandWrapperTest {
" \n" +
" \n" +
" \n" +
+<<<<<<< HEAD
+=======
" \n" +
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
" \n" +
" \n" +
" \n" +
@@ -1009,6 +1015,8 @@ public void getMigrateStorageDeviceLabelsTestFindPathAndLabels() {
assertTrue(result.containsAll(Arrays.asList("vda", "vdb")));
}
+<<<<<<< HEAD
+=======
@Test
public void replaceCdromIsoPathTest() throws ParserConfigurationException, IOException, TransformerException,
SAXException {
@@ -1019,4 +1027,5 @@ public void replaceCdromIsoPathTest() throws ParserConfigurationException, IOExc
Assert.assertTrue(finalXml.contains(newIsoVolumePath));
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
index 7be0dd5862fe..67df6330ba10 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
@@ -948,7 +948,11 @@ private String createVMAndFolderWithVMName(VmwareContext context, VmwareHypervis
dsMo.moveDatastoreFile(vmwareLayoutFilePair[i], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[i], dcMo.getMor(), true);
}
+<<<<<<< HEAD
+ logger.info("detach disks from volume-wrapper VM and destroy" + vmdkName);
+=======
logger.info("detach disks from volume-wrapper VM and destroy {}", vmdkName);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
vmMo.detachAllDisksAndDestroy();
String srcFile = dsMo.getDatastorePath(vmdkName, true);
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterHelperImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterHelperImpl.java
new file mode 100644
index 000000000000..60bd81c7c5a5
--- /dev/null
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterHelperImpl.java
@@ -0,0 +1,61 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.kubernetes.cluster;
+
+import com.cloud.kubernetes.cluster.dao.KubernetesClusterDao;
+import com.cloud.kubernetes.cluster.dao.KubernetesClusterVmMapDao;
+import com.cloud.utils.component.AdapterBase;
+import org.apache.cloudstack.acl.ControlledEntity;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+import org.springframework.stereotype.Component;
+
+import javax.inject.Inject;
+import java.util.Objects;
+
+@Component
+public class KubernetesClusterHelperImpl extends AdapterBase implements KubernetesClusterHelper, Configurable {
+
+ @Inject
+ private KubernetesClusterDao kubernetesClusterDao;
+ @Inject
+ private KubernetesClusterVmMapDao kubernetesClusterVmMapDao;
+
+ @Override
+ public ControlledEntity findByUuid(String uuid) {
+ return kubernetesClusterDao.findByUuid(uuid);
+ }
+
+ @Override
+ public ControlledEntity findByVmId(long vmId) {
+ KubernetesClusterVmMapVO clusterVmMapVO = kubernetesClusterVmMapDao.getClusterMapFromVmId(vmId);
+ if (Objects.isNull(clusterVmMapVO)) {
+ return null;
+ }
+ return kubernetesClusterDao.findById(clusterVmMapVO.getClusterId());
+ }
+
+ @Override
+ public String getConfigComponentName() {
+ return KubernetesClusterHelper.class.getSimpleName();
+ }
+
+ @Override
+ public ConfigKey>[] getConfigKeys() {
+ return new ConfigKey>[]{};
+ }
+}
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 151344575dcc..9397a9acb859 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
@@ -40,11 +40,19 @@
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+<<<<<<< HEAD
+import com.cloud.uservm.UserVm;
+import com.cloud.vm.UserVmService;
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.acl.ControlledEntity;
import org.apache.cloudstack.acl.SecurityChecker;
import org.apache.cloudstack.annotation.AnnotationService;
import org.apache.cloudstack.annotation.dao.AnnotationDao;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiConstants.VMDetails;
import org.apache.cloudstack.api.BaseCmd;
@@ -89,7 +97,10 @@
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.domain.Domain;
+<<<<<<< HEAD
+=======
import com.cloud.event.ActionEvent;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientServerCapacityException;
@@ -157,7 +168,10 @@
import com.cloud.user.UserVO;
import com.cloud.user.dao.SSHKeyPairDao;
import com.cloud.user.dao.UserDao;
+<<<<<<< HEAD
+=======
import com.cloud.uservm.UserVm;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.utils.Pair;
import com.cloud.utils.Ternary;
import com.cloud.utils.component.ComponentContext;
@@ -175,7 +189,10 @@
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.utils.fsm.StateMachine2;
import com.cloud.utils.net.NetUtils;
+<<<<<<< HEAD
+=======
import com.cloud.vm.UserVmService;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.VMInstanceDao;
@@ -517,7 +534,13 @@ private DeployDestination plan(final long nodesCount, final DataCenter zone, fin
logger.debug(String.format("Checking host ID: %s for capacity already reserved %d", hostVO.getUuid(), reserved));
}
if (capacityManager.checkIfHostHasCapacity(hostVO.getId(), cpu_requested * reserved, ram_requested * reserved, false, cpuOvercommitRatio, memoryOvercommitRatio, true)) {
+<<<<<<< HEAD
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("Found host ID: %s for with enough capacity, CPU=%d RAM=%s", hostVO.getUuid(), cpu_requested * reserved, toHumanReadableSize(ram_requested * reserved)));
+ }
+=======
logger.debug("Found host ID == '{}' to have enough capacity, CPU={} RAM={}", hostVO.getUuid(), cpu_requested * reserved, toHumanReadableSize(ram_requested * reserved));
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
hostEntry.setValue(new Pair(hostVO, reserved));
suitable_host_found = true;
planCluster = cluster;
@@ -866,6 +889,15 @@ private Network getKubernetesClusterNetworkIfMissing(final String clusterName, f
logger.info(String.format("Creating network for account ID: %s from the network offering ID: %s as part of Kubernetes cluster: %s deployment process", owner.getUuid(), networkOffering.getUuid(), clusterName));
}
+<<<<<<< HEAD
+ try {
+ network = networkMgr.createGuestNetwork(networkOffering.getId(), clusterName + "-network", owner.getAccountName() + "-network",
+ null, null, null, false, null, owner, null, physicalNetwork, zone.getId(),
+ ControlledEntity.ACLType.Account, null, null, null, null, true, null,
+ null, null, null, null, null, null, null, null, null);
+ } catch (ConcurrentOperationException | InsufficientCapacityException | ResourceAllocationException e) {
+ logAndThrow(Level.ERROR, String.format("Unable to create network for the Kubernetes cluster: %s", clusterName));
+=======
CallContext networkContext = CallContext.register(CallContext.current(), ApiCommandResourceType.Network);
try {
network = networkService.createGuestNetwork(networkOffering.getId(), clusterName + "-network",
@@ -875,6 +907,7 @@ private Network getKubernetesClusterNetworkIfMissing(final String clusterName, f
logAndThrow(Level.ERROR, String.format("Unable to create network for the Kubernetes cluster: %s", clusterName));
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
return network;
@@ -1143,8 +1176,11 @@ protected boolean stateTransitTo(long kubernetesClusterId, KubernetesCluster.Eve
}
@Override
+<<<<<<< HEAD
+=======
@ActionEvent(eventType = KubernetesClusterEventTypes.EVENT_KUBERNETES_CLUSTER_CREATE,
eventDescription = "creating Kubernetes cluster", create = true)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public KubernetesCluster createUnmanagedKubernetesCluster(CreateKubernetesClusterCmd cmd) throws CloudRuntimeException {
if (!KubernetesServiceEnabled.value()) {
logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
@@ -1191,13 +1227,19 @@ public KubernetesClusterVO doInTransaction(TransactionStatus status) {
if (logger.isInfoEnabled()) {
logger.info(String.format("Kubernetes cluster with name: %s and ID: %s has been created", cluster.getName(), cluster.getUuid()));
}
+<<<<<<< HEAD
+=======
CallContext.current().putContextParameter(KubernetesCluster.class, cluster.getUuid());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
return cluster;
}
@Override
+<<<<<<< HEAD
+=======
@ActionEvent(eventType = KubernetesClusterEventTypes.EVENT_KUBERNETES_CLUSTER_CREATE,
eventDescription = "creating Kubernetes cluster", create = true)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public KubernetesCluster createManagedKubernetesCluster(CreateKubernetesClusterCmd cmd) throws CloudRuntimeException {
if (!KubernetesServiceEnabled.value()) {
logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
@@ -1254,7 +1296,10 @@ public KubernetesClusterVO doInTransaction(TransactionStatus status) {
if (logger.isInfoEnabled()) {
logger.info(String.format("Kubernetes cluster name: %s and ID: %s has been created", cluster.getName(), cluster.getUuid()));
}
+<<<<<<< HEAD
+=======
CallContext.current().putContextParameter(KubernetesCluster.class, cluster.getUuid());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
return cluster;
}
@@ -1281,6 +1326,8 @@ private SecurityGroup getOrCreateSecurityGroupForAccount(Account owner) {
return securityGroup;
}
+<<<<<<< HEAD
+=======
@Override
@ActionEvent(eventType = KubernetesClusterEventTypes.EVENT_KUBERNETES_CLUSTER_CREATE,
eventDescription = "creating Kubernetes cluster", async = true)
@@ -1321,17 +1368,36 @@ public void startKubernetesCluster(StartKubernetesClusterCmd cmd) throws CloudRu
}
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/**
* Start operation can be performed at two different life stages of Kubernetes cluster. First when a freshly created cluster
* in which case there are no resources provisioned for the Kubernetes cluster. So during start all the resources
* are provisioned from scratch. Second kind of start, happens on Stopped Kubernetes cluster, in which all resources
* are provisioned (like volumes, nics, networks etc). It just that VM's are not in running state. So just
* start the VM's (which can possibly implicitly start the network also).
+<<<<<<< HEAD
+ * @param kubernetesClusterId
+=======
* @param kubernetesCluster
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
* @param onCreate
* @return
* @throws CloudRuntimeException
*/
+<<<<<<< HEAD
+
+ @Override
+ public boolean startKubernetesCluster(long kubernetesClusterId, boolean onCreate) throws CloudRuntimeException {
+ if (!KubernetesServiceEnabled.value()) {
+ logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
+ }
+ final KubernetesClusterVO kubernetesCluster = kubernetesClusterDao.findById(kubernetesClusterId);
+ if (kubernetesCluster == null) {
+ throw new InvalidParameterValueException("Failed to find Kubernetes cluster with given ID");
+ }
+ if (kubernetesCluster.getRemoved() != null) {
+ throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s is already deleted", kubernetesCluster.getName()));
+=======
public boolean startKubernetesCluster(KubernetesClusterVO kubernetesCluster, boolean onCreate) throws CloudRuntimeException {
if (!KubernetesServiceEnabled.value()) {
logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
@@ -1339,6 +1405,7 @@ public boolean startKubernetesCluster(KubernetesClusterVO kubernetesCluster, boo
if (kubernetesCluster.getRemoved() != null) {
throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s is already deleted",
kubernetesCluster.getName()));
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
accountManager.checkAccess(CallContext.current().getCallingAccount(), SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
if (kubernetesCluster.getState().equals(KubernetesCluster.State.Running)) {
@@ -1396,8 +1463,11 @@ private String[] getServiceUserKeys(KubernetesClusterVO kubernetesCluster) {
}
@Override
+<<<<<<< HEAD
+=======
@ActionEvent(eventType = KubernetesClusterEventTypes.EVENT_KUBERNETES_CLUSTER_STOP,
eventDescription = "stopping Kubernetes cluster", async = true)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public boolean stopKubernetesCluster(StopKubernetesClusterCmd cmd) throws CloudRuntimeException {
long kubernetesClusterId = cmd.getId();
if (!KubernetesServiceEnabled.value()) {
@@ -1432,8 +1502,11 @@ public boolean stopKubernetesCluster(StopKubernetesClusterCmd cmd) throws CloudR
}
@Override
+<<<<<<< HEAD
+=======
@ActionEvent(eventType = KubernetesClusterEventTypes.EVENT_KUBERNETES_CLUSTER_DELETE,
eventDescription = "deleting Kubernetes cluster", async = true)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public boolean deleteKubernetesCluster(DeleteKubernetesClusterCmd cmd) throws CloudRuntimeException {
if (!KubernetesServiceEnabled.value()) {
logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
@@ -1536,6 +1609,15 @@ public ListResponse listKubernetesClusters(ListKubern
if (clusterType != null) {
sc.setParameters("cluster_type", clusterType);
}
+<<<<<<< HEAD
+ List kubernetesClusters = kubernetesClusterDao.search(sc, searchFilter);
+ for (KubernetesClusterVO cluster : kubernetesClusters) {
+ KubernetesClusterResponse clusterResponse = createKubernetesClusterResponse(cluster.getId());
+ responsesList.add(clusterResponse);
+ }
+ ListResponse response = new ListResponse();
+ response.setResponses(responsesList);
+=======
Pair, Integer> kubernetesClustersAndCount = kubernetesClusterDao.searchAndCount(sc, searchFilter);
for (KubernetesClusterVO cluster : kubernetesClustersAndCount.first()) {
KubernetesClusterResponse clusterResponse = createKubernetesClusterResponse(cluster.getId());
@@ -1543,6 +1625,7 @@ public ListResponse listKubernetesClusters(ListKubern
}
ListResponse response = new ListResponse<>();
response.setResponses(responsesList, kubernetesClustersAndCount.second());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
return response;
}
@@ -1576,8 +1659,11 @@ public KubernetesClusterConfigResponse getKubernetesClusterConfig(GetKubernetesC
}
@Override
+<<<<<<< HEAD
+=======
@ActionEvent(eventType = KubernetesClusterEventTypes.EVENT_KUBERNETES_CLUSTER_SCALE,
eventDescription = "scaling Kubernetes cluster", async = true)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public boolean scaleKubernetesCluster(ScaleKubernetesClusterCmd cmd) throws CloudRuntimeException {
if (!KubernetesServiceEnabled.value()) {
logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
@@ -1585,6 +1671,18 @@ public boolean scaleKubernetesCluster(ScaleKubernetesClusterCmd cmd) throws Clou
validateKubernetesClusterScaleParameters(cmd);
KubernetesClusterVO kubernetesCluster = kubernetesClusterDao.findById(cmd.getId());
+<<<<<<< HEAD
+ String[] keys = getServiceUserKeys(kubernetesCluster);
+ KubernetesClusterScaleWorker scaleWorker =
+ new KubernetesClusterScaleWorker(kubernetesClusterDao.findById(cmd.getId()),
+ serviceOfferingDao.findById(cmd.getServiceOfferingId()),
+ cmd.getClusterSize(),
+ cmd.getNodeIds(),
+ cmd.isAutoscalingEnabled(),
+ cmd.getMinSize(),
+ cmd.getMaxSize(),
+ this);
+=======
final Long clusterSize = cmd.getClusterSize();
if (clusterSize != null) {
CallContext.current().setEventDetails(String.format("Kubernetes cluster ID: %s scaling from size: %d to %d",
@@ -1600,14 +1698,18 @@ public boolean scaleKubernetesCluster(ScaleKubernetesClusterCmd cmd) throws Clou
cmd.getMinSize(),
cmd.getMaxSize(),
this);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
scaleWorker.setKeys(keys);
scaleWorker = ComponentContext.inject(scaleWorker);
return scaleWorker.scaleCluster();
}
@Override
+<<<<<<< HEAD
+=======
@ActionEvent(eventType = KubernetesClusterEventTypes.EVENT_KUBERNETES_CLUSTER_UPGRADE,
eventDescription = "upgrading Kubernetes cluster", async = true)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public boolean upgradeKubernetesCluster(UpgradeKubernetesClusterCmd cmd) throws CloudRuntimeException {
if (!KubernetesServiceEnabled.value()) {
logAndThrow(Level.ERROR, "Kubernetes Service plugin is disabled");
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterService.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterService.java
index 6acc876493ef..2f0a29491184 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterService.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterService.java
@@ -23,7 +23,10 @@
import org.apache.cloudstack.api.command.user.kubernetes.cluster.ListKubernetesClustersCmd;
import org.apache.cloudstack.api.command.user.kubernetes.cluster.RemoveVirtualMachinesFromKubernetesClusterCmd;
import org.apache.cloudstack.api.command.user.kubernetes.cluster.ScaleKubernetesClusterCmd;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.command.user.kubernetes.cluster.StartKubernetesClusterCmd;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.command.user.kubernetes.cluster.StopKubernetesClusterCmd;
import org.apache.cloudstack.api.command.user.kubernetes.cluster.UpgradeKubernetesClusterCmd;
import org.apache.cloudstack.api.response.KubernetesClusterConfigResponse;
@@ -99,9 +102,13 @@ public interface KubernetesClusterService extends PluggableService, Configurable
KubernetesCluster createManagedKubernetesCluster(CreateKubernetesClusterCmd cmd) throws CloudRuntimeException;
+<<<<<<< HEAD
+ boolean startKubernetesCluster(long kubernetesClusterId, boolean onCreate) throws CloudRuntimeException;
+=======
void startKubernetesCluster(CreateKubernetesClusterCmd cmd) throws CloudRuntimeException;
void startKubernetesCluster(StartKubernetesClusterCmd cmd) throws CloudRuntimeException;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
boolean stopKubernetesCluster(StopKubernetesClusterCmd cmd) throws CloudRuntimeException;
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 0ef3ee96d328..3deeebe3858a 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
@@ -34,11 +34,17 @@
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
+<<<<<<< HEAD
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.ca.CAManager;
+import org.apache.cloudstack.config.ApiServiceConfiguration;
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.ca.CAManager;
import org.apache.cloudstack.config.ApiServiceConfiguration;
import org.apache.cloudstack.context.CallContext;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.commons.collections.CollectionUtils;
@@ -94,7 +100,11 @@
import com.cloud.vm.UserVmDetailVO;
import com.cloud.vm.UserVmService;
import com.cloud.vm.UserVmVO;
+<<<<<<< HEAD
+import com.cloud.vm.VirtualMachineManager;
+=======
import com.cloud.vm.VirtualMachine;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.vm.VmDetailConstants;
import com.cloud.vm.dao.UserVmDao;
import com.cloud.vm.dao.UserVmDetailsDao;
@@ -152,6 +162,11 @@ public class KubernetesClusterActionWorker {
@Inject
protected VlanDao vlanDao;
@Inject
+<<<<<<< HEAD
+ protected VirtualMachineManager itMgr;
+ @Inject
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
protected LaunchPermissionDao launchPermissionDao;
@Inject
public ProjectService projectService;
@@ -475,8 +490,11 @@ protected void attachIsoKubernetesVMs(List clusterVMs, final KubernetesS
}
for (UserVm vm : clusterVMs) {
+<<<<<<< HEAD
+=======
CallContext vmContext = CallContext.register(CallContext.current(), ApiCommandResourceType.VirtualMachine);
vmContext.putContextParameter(VirtualMachine.class, vm.getUuid());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
templateService.attachIso(iso.getId(), vm.getId(), true);
if (logger.isInfoEnabled()) {
@@ -484,8 +502,11 @@ protected void attachIsoKubernetesVMs(List clusterVMs, final KubernetesS
}
} catch (CloudRuntimeException ex) {
logTransitStateAndThrow(Level.ERROR, String.format("Failed to attach binaries ISO for VM : %s in the Kubernetes cluster name: %s", vm.getDisplayName(), kubernetesCluster.getName()), kubernetesCluster.getId(), failedEvent, ex);
+<<<<<<< HEAD
+=======
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
}
@@ -497,14 +518,20 @@ protected void attachIsoKubernetesVMs(List clusterVMs) throws CloudRunti
protected void detachIsoKubernetesVMs(List clusterVMs) {
for (UserVm vm : clusterVMs) {
boolean result = false;
+<<<<<<< HEAD
+=======
CallContext vmContext = CallContext.register(CallContext.current(), ApiCommandResourceType.VirtualMachine);
vmContext.putContextParameter(VirtualMachine.class, vm.getUuid());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
result = templateService.detachIso(vm.getId(), true);
} catch (CloudRuntimeException ex) {
logger.warn(String.format("Failed to detach binaries ISO from VM : %s in the Kubernetes cluster : %s ", vm.getDisplayName(), kubernetesCluster.getName()), ex);
+<<<<<<< HEAD
+=======
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
if (result) {
if (logger.isInfoEnabled()) {
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 047d32f1f9fa..f34a12e1aa33 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
@@ -25,7 +25,10 @@
import org.apache.cloudstack.annotation.AnnotationService;
import org.apache.cloudstack.annotation.dao.AnnotationDao;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.context.CallContext;
import org.apache.commons.collections.CollectionUtils;
@@ -94,9 +97,12 @@ private boolean destroyClusterVMs() {
if (userVM == null || userVM.isRemoved()) {
continue;
}
+<<<<<<< HEAD
+=======
CallContext vmContext = CallContext.register(CallContext.current(),
ApiCommandResourceType.VirtualMachine);
vmContext.setEventResourceId(vmID);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
UserVm vm = userVmService.destroyVm(vmID, true);
if (!userVmManager.expunge(userVM)) {
@@ -110,8 +116,11 @@ private boolean destroyClusterVMs() {
} catch (ResourceUnavailableException | ConcurrentOperationException e) {
logger.warn(String.format("Failed to destroy VM : %s part of the Kubernetes cluster : %s cleanup. Moving on with destroying remaining resources provisioned for the Kubernetes cluster", userVM.getDisplayName(), kubernetesCluster.getName()), e);
return false;
+<<<<<<< HEAD
+=======
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
}
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 d75076eb3d38..dfaadd7b13e4 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
@@ -31,13 +31,23 @@
import javax.inject.Inject;
+<<<<<<< HEAD
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.command.user.firewall.CreateFirewallRuleCmd;
import org.apache.cloudstack.api.command.user.network.CreateNetworkACLCmd;
+<<<<<<< HEAD
+import org.apache.cloudstack.api.command.user.vm.StartVMCmd;
+import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
+=======
import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
import org.apache.cloudstack.context.CallContext;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
@@ -85,9 +95,13 @@
import com.cloud.network.vpc.NetworkACLItemDao;
import com.cloud.network.vpc.NetworkACLItemVO;
import com.cloud.network.vpc.NetworkACLService;
+<<<<<<< HEAD
+import com.cloud.offering.ServiceOffering;
+=======
import com.cloud.offering.NetworkOffering;
import com.cloud.offering.ServiceOffering;
import com.cloud.offerings.dao.NetworkOfferingDao;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.resource.ResourceManager;
import com.cloud.storage.Volume;
import com.cloud.storage.VolumeApiService;
@@ -264,7 +278,13 @@ protected DeployDestination plan(final long nodesCount, final DataCenter zone, f
logger.debug(String.format("Checking host : %s for capacity already reserved %d", h.getName(), reserved));
}
if (capacityManager.checkIfHostHasCapacity(h.getId(), cpu_requested * reserved, ram_requested * reserved, false, cpuOvercommitRatio, memoryOvercommitRatio, true)) {
+<<<<<<< HEAD
+ if (logger.isDebugEnabled()) {
+ logger.debug(String.format("Found host : %s for with enough capacity, CPU=%d RAM=%s", h.getName(), cpu_requested * reserved, toHumanReadableSize(ram_requested * reserved)));
+ }
+=======
logger.debug("Found host {} with enough capacity: CPU={} RAM={}", h.getName(), cpu_requested * reserved, toHumanReadableSize(ram_requested * reserved));
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
hostEntry.setValue(new Pair(h, reserved));
suitable_host_found = true;
break;
@@ -324,6 +344,20 @@ protected void resizeNodeVolume(final UserVm vm) throws ManagementServerExceptio
}
protected void startKubernetesVM(final UserVm vm) throws ManagementServerException {
+<<<<<<< HEAD
+ try {
+ StartVMCmd startVm = new StartVMCmd();
+ startVm = ComponentContext.inject(startVm);
+ Field f = startVm.getClass().getDeclaredField("id");
+ f.setAccessible(true);
+ f.set(startVm, vm.getId());
+ itMgr.advanceStart(vm.getUuid(), null, null);
+ if (logger.isInfoEnabled()) {
+ logger.info(String.format("Started VM : %s in the Kubernetes cluster : %s", vm.getDisplayName(), kubernetesCluster.getName()));
+ }
+ } catch (IllegalAccessException | NoSuchFieldException | OperationTimedoutException | ResourceUnavailableException | InsufficientCapacityException ex) {
+ throw new ManagementServerException(String.format("Failed to start VM in the Kubernetes cluster : %s", kubernetesCluster.getName()), ex);
+=======
CallContext vmContext = null;
if (!ApiCommandResourceType.VirtualMachine.equals(CallContext.current().getEventResourceType())); {
vmContext = CallContext.register(CallContext.current(), ApiCommandResourceType.VirtualMachine);
@@ -337,6 +371,7 @@ protected void startKubernetesVM(final UserVm vm) throws ManagementServerExcepti
if (vmContext != null) {
CallContext.unregister();
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
UserVm startVm = userVmDao.findById(vm.getId());
@@ -349,6 +384,21 @@ protected List provisionKubernetesClusterNodeVms(final long nodeCount, f
ResourceUnavailableException, InsufficientCapacityException {
List nodes = new ArrayList<>();
for (int i = offset + 1; i <= nodeCount; i++) {
+<<<<<<< HEAD
+ UserVm vm = createKubernetesNode(publicIpAddress);
+ addKubernetesClusterVm(kubernetesCluster.getId(), vm.getId(), false);
+ if (kubernetesCluster.getNodeRootDiskSize() > 0) {
+ resizeNodeVolume(vm);
+ }
+ startKubernetesVM(vm);
+ vm = userVmDao.findById(vm.getId());
+ if (vm == null) {
+ throw new ManagementServerException(String.format("Failed to provision worker VM for Kubernetes cluster : %s" , kubernetesCluster.getName()));
+ }
+ nodes.add(vm);
+ if (logger.isInfoEnabled()) {
+ logger.info(String.format("Provisioned node VM : %s in to the Kubernetes cluster : %s", vm.getDisplayName(), kubernetesCluster.getName()));
+=======
CallContext vmContext = CallContext.register(CallContext.current(), ApiCommandResourceType.VirtualMachine);
try {
UserVm vm = createKubernetesNode(publicIpAddress);
@@ -366,6 +416,7 @@ protected List provisionKubernetesClusterNodeVms(final long nodeCount, f
logger.info("Provisioned node VM : {} in to the Kubernetes cluster : {}", vm.getDisplayName(), kubernetesCluster.getName());
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
return nodes;
@@ -636,7 +687,10 @@ protected void provisionLoadBalancerRule(final IpAddress publicIp, final Network
protected void createFirewallRules(IpAddress publicIp, List clusterVMIds, boolean apiRule) throws ManagementServerException {
// Firewall rule for SSH access on each node VM
+<<<<<<< HEAD
+=======
CallContext.register(CallContext.current(), null);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
int endPort = CLUSTER_NODES_DEFAULT_START_SSH_PORT + clusterVMIds.size() - 1;
provisionFirewallRules(publicIp, owner, CLUSTER_NODES_DEFAULT_START_SSH_PORT, endPort);
@@ -645,14 +699,20 @@ protected void createFirewallRules(IpAddress publicIp, List clusterVMIds,
}
} catch (NoSuchFieldException | IllegalAccessException | ResourceUnavailableException | NetworkRuleConflictException e) {
throw new ManagementServerException(String.format("Failed to provision firewall rules for SSH access for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
+<<<<<<< HEAD
+=======
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
if (!apiRule) {
return;
}
// Firewall rule for API access for control node VMs
+<<<<<<< HEAD
+=======
CallContext.register(CallContext.current(), null);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
provisionFirewallRules(publicIp, owner, CLUSTER_API_PORT, CLUSTER_API_PORT);
if (logger.isInfoEnabled()) {
@@ -661,8 +721,11 @@ protected void createFirewallRules(IpAddress publicIp, List clusterVMIds,
}
} catch (NoSuchFieldException | IllegalAccessException | ResourceUnavailableException | NetworkRuleConflictException e) {
throw new ManagementServerException(String.format("Failed to provision firewall rules for API access for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
+<<<<<<< HEAD
+=======
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
@@ -703,7 +766,10 @@ protected void createVpcTierAclRules(Network network) throws ManagementServerExc
return;
}
// ACL rule for API access for control node VMs
+<<<<<<< HEAD
+=======
CallContext.register(CallContext.current(), null);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
provisionVpcTierAllowPortACLRule(network, CLUSTER_API_PORT, CLUSTER_API_PORT);
if (logger.isInfoEnabled()) {
@@ -712,10 +778,14 @@ protected void createVpcTierAclRules(Network network) throws ManagementServerExc
}
} catch (NoSuchFieldException | IllegalAccessException | ResourceUnavailableException | InvalidParameterValueException | PermissionDeniedException e) {
throw new ManagementServerException(String.format("Failed to provision firewall rules for API access for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
+<<<<<<< HEAD
+ }
+=======
} finally {
CallContext.unregister();
}
CallContext.register(CallContext.current(), null);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
provisionVpcTierAllowPortACLRule(network, DEFAULT_SSH_PORT, DEFAULT_SSH_PORT);
if (logger.isInfoEnabled()) {
@@ -724,8 +794,11 @@ protected void createVpcTierAclRules(Network network) throws ManagementServerExc
}
} catch (NoSuchFieldException | IllegalAccessException | ResourceUnavailableException | InvalidParameterValueException | PermissionDeniedException e) {
throw new ManagementServerException(String.format("Failed to provision firewall rules for API access for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
+<<<<<<< HEAD
+=======
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
index f5ac553733d6..84429b4a70df 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
@@ -26,9 +26,13 @@
import javax.inject.Inject;
+<<<<<<< HEAD
+import org.apache.cloudstack.api.InternalIdentity;
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.api.InternalIdentity;
import org.apache.cloudstack.context.CallContext;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
@@ -320,9 +324,12 @@ private void removeNodesFromCluster(List vmMaps) throw
if (!removeKubernetesClusterNode(publicIpAddress, sshPort, userVM, 3, 30000)) {
logTransitStateAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster : %s, failed to remove Kubernetes node: %s running on VM : %s", kubernetesCluster.getName(), userVM.getHostName(), userVM.getDisplayName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
}
+<<<<<<< HEAD
+=======
CallContext vmContext = CallContext.register(CallContext.current(),
ApiCommandResourceType.VirtualMachine);
vmContext.setEventResourceId(userVM.getId());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
UserVm vm = userVmService.destroyVm(userVM.getId(), true);
if (!userVmManager.expunge(userVM)) {
@@ -332,8 +339,11 @@ private void removeNodesFromCluster(List vmMaps) throw
} catch (ResourceUnavailableException e) {
logTransitStateAndThrow(Level.ERROR, String.format("Scaling Kubernetes cluster %s failed, unable to remove VM ID: %s",
kubernetesCluster.getName() , userVM.getDisplayName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed, e);
+<<<<<<< HEAD
+=======
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
kubernetesClusterVmMapDao.expunge(vmMapVO.getId());
if (System.currentTimeMillis() > scaleTimeoutTime) {
@@ -445,10 +455,17 @@ public boolean scaleCluster() throws CloudRuntimeException {
if (existingServiceOffering == null) {
logAndThrow(Level.ERROR, String.format("Scaling Kubernetes cluster : %s failed, service offering for the Kubernetes cluster not found!", kubernetesCluster.getName()));
}
+<<<<<<< HEAD
+ final boolean autscalingChanged = isAutoscalingChanged();
+ final boolean serviceOfferingScalingNeeded = serviceOffering != null && serviceOffering.getId() != existingServiceOffering.getId();
+
+ if (autscalingChanged) {
+=======
final boolean autoscalingChanged = isAutoscalingChanged();
final boolean serviceOfferingScalingNeeded = serviceOffering != null && serviceOffering.getId() != existingServiceOffering.getId();
if (autoscalingChanged) {
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
boolean autoScaled = autoscaleCluster(this.isAutoscalingEnabled, minSize, maxSize);
if (autoScaled && serviceOfferingScalingNeeded) {
scaleKubernetesClusterOffering();
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 b2fbbd31f6ba..391435811847 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
@@ -533,7 +533,11 @@ public boolean startKubernetesClusterOnCreate() {
}
attachIsoKubernetesVMs(clusterVMs);
if (!KubernetesClusterUtil.isKubernetesClusterControlVmRunning(kubernetesCluster, publicIpAddress, publicIpSshPort.second(), startTimeoutTime)) {
+<<<<<<< HEAD
+ String msg = String.format("Failed to setup Kubernetes cluster : %s in usable state as unable to access control node VMs of the cluster", kubernetesCluster.getName());
+=======
String msg = String.format("Failed to setup Kubernetes cluster : %s is not in usable state as the system is unable to access control node VMs of the cluster", kubernetesCluster.getName());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (kubernetesCluster.getControlNodeCount() > 1 && Network.GuestType.Shared.equals(network.getGuestType())) {
msg = String.format("%s. Make sure external load-balancer has port forwarding rules for SSH access on ports %d-%d and API access on port %d",
msg,
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStopWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStopWorker.java
index 60802d12e729..432d35ab404f 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStopWorker.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStopWorker.java
@@ -20,8 +20,11 @@
import java.util.List;
import org.apache.logging.log4j.Level;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.context.CallContext;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.kubernetes.cluster.KubernetesCluster;
@@ -46,15 +49,21 @@ public boolean stop() throws CloudRuntimeException {
if (vm == null) {
logTransitStateAndThrow(Level.ERROR, String.format("Failed to find all VMs in Kubernetes cluster : %s", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
}
+<<<<<<< HEAD
+=======
CallContext vmContext = CallContext.register(CallContext.current(), ApiCommandResourceType.VirtualMachine);
vmContext.setEventResourceId(vm.getId());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
try {
userVmService.stopVirtualMachine(vm.getId(), false);
} catch (ConcurrentOperationException ex) {
logger.warn(String.format("Failed to stop VM : %s in Kubernetes cluster : %s",
vm.getDisplayName(), kubernetesCluster.getName()), ex);
+<<<<<<< HEAD
+=======
} finally {
CallContext.unregister();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
for (final UserVm userVm : clusterVMs) {
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDao.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDao.java
index eaeccd09f801..5c986fc147b2 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDao.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDao.java
@@ -30,6 +30,9 @@ public interface KubernetesClusterVmMapDao extends GenericDao vmIds);
public int removeByClusterId(long clusterId);
+<<<<<<< HEAD
+=======
KubernetesClusterVmMapVO findByVmId(long vmId);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDaoImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDaoImpl.java
index 5e465848e1c1..7143d75999f0 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDaoImpl.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterVmMapDaoImpl.java
@@ -81,6 +81,8 @@ public int removeByClusterId(long clusterId) {
sc.setParameters("clusterId", clusterId);
return remove(sc);
}
+<<<<<<< HEAD
+=======
@Override
public KubernetesClusterVmMapVO findByVmId(long vmId) {
@@ -91,4 +93,5 @@ public KubernetesClusterVmMapVO findByVmId(long vmId) {
sc.setParameters("vmId", vmId);
return findOneBy(sc);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java
index 7a3268014fdb..88cafb9f93cf 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java
@@ -266,11 +266,21 @@ public static boolean isKubernetesClusterControlVmRunning(final KubernetesCluste
socket.connect(new InetSocketAddress(ipAddress, port), 10000);
controlVmRunning = true;
} catch (IOException e) {
+<<<<<<< HEAD
+ if (LOGGER.isInfoEnabled()) {
+ LOGGER.info(String.format("Waiting for Kubernetes cluster : %s control node VMs to be accessible", kubernetesCluster.getName()));
+ }
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException ex) {
+ LOGGER.warn(String.format("Error while waiting for Kubernetes cluster : %s control node VMs to be accessible", kubernetesCluster.getName()), ex);
+=======
LOGGER.info("Waiting for Kubernetes cluster : {} control node VMs to be accessible", kubernetesCluster.getName());
try {
Thread.sleep(10000);
} catch (InterruptedException ex) {
LOGGER.warn("Error while waiting for Kubernetes cluster : {} control node VMs to be accessible", kubernetesCluster.getName(), ex);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
}
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 ba2b4288d480..667c4302b36d 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
@@ -22,7 +22,10 @@
import javax.inject.Inject;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.command.admin.kubernetes.version.AddKubernetesSupportedVersionCmd;
import org.apache.cloudstack.api.command.admin.kubernetes.version.DeleteKubernetesSupportedVersionCmd;
@@ -32,7 +35,10 @@
import org.apache.cloudstack.api.command.user.kubernetes.version.ListKubernetesSupportedVersionsCmd;
import org.apache.cloudstack.api.response.KubernetesSupportedVersionResponse;
import org.apache.cloudstack.api.response.ListResponse;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.context.CallContext;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.commons.lang3.StringUtils;
import com.cloud.api.query.dao.TemplateJoinDao;
@@ -53,7 +59,10 @@
import com.cloud.template.TemplateApiService;
import com.cloud.template.VirtualMachineTemplate;
import com.cloud.user.AccountManager;
+<<<<<<< HEAD
+=======
import com.cloud.utils.Pair;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.Filter;
@@ -82,6 +91,8 @@ public class KubernetesVersionManagerImpl extends ManagerBase implements Kuberne
public static final String MINIMUN_AUTOSCALER_SUPPORTED_VERSION = "1.15.0";
+<<<<<<< HEAD
+=======
protected void updateTemplateDetailsInKubernetesSupportedVersionResponse(
final KubernetesSupportedVersion kubernetesSupportedVersion, KubernetesSupportedVersionResponse response) {
TemplateJoinVO template = templateJoinDao.findById(kubernetesSupportedVersion.getIsoId());
@@ -96,6 +107,7 @@ protected void updateTemplateDetailsInKubernetesSupportedVersionResponse(
response.setDirectDownload(template.isDirectDownload());
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private KubernetesSupportedVersionResponse createKubernetesSupportedVersionResponse(final KubernetesSupportedVersion kubernetesSupportedVersion) {
KubernetesSupportedVersionResponse response = new KubernetesSupportedVersionResponse();
response.setObjectName("kubernetessupportedversion");
@@ -115,19 +127,39 @@ private KubernetesSupportedVersionResponse createKubernetesSupportedVersionRespo
response.setSupportsHA(compareSemanticVersions(kubernetesSupportedVersion.getSemanticVersion(),
KubernetesClusterService.MIN_KUBERNETES_VERSION_HA_SUPPORT)>=0);
response.setSupportsAutoscaling(versionSupportsAutoscaling(kubernetesSupportedVersion));
+<<<<<<< HEAD
+ TemplateJoinVO template = templateJoinDao.findById(kubernetesSupportedVersion.getIsoId());
+ if (template != null) {
+ response.setIsoId(template.getUuid());
+ response.setIsoName(template.getName());
+ if (template.getState() != null) {
+ response.setIsoState(template.getState().toString());
+ }
+ response.setDirectDownload(template.isDirectDownload());
+ }
+=======
updateTemplateDetailsInKubernetesSupportedVersionResponse(kubernetesSupportedVersion, response);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
response.setCreated(kubernetesSupportedVersion.getCreated());
return response;
}
+<<<<<<< HEAD
+ private ListResponse createKubernetesSupportedVersionListResponse(List versions) {
+=======
private ListResponse createKubernetesSupportedVersionListResponse(
List versions, Integer count) {
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
List responseList = new ArrayList<>();
for (KubernetesSupportedVersionVO version : versions) {
responseList.add(createKubernetesSupportedVersionResponse(version));
}
ListResponse response = new ListResponse<>();
+<<<<<<< HEAD
+ response.setResponses(responseList);
+=======
response.setResponses(responseList, count);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
return response;
}
@@ -161,7 +193,10 @@ private List filterKubernetesSupportedVersions(Li
private VirtualMachineTemplate registerKubernetesVersionIso(final Long zoneId, final String versionName, final String isoUrl, final String isoChecksum, final boolean directDownload) throws IllegalAccessException, NoSuchFieldException,
IllegalArgumentException, ResourceAllocationException {
+<<<<<<< HEAD
+=======
CallContext.register(CallContext.current(), ApiCommandResourceType.Iso);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
String isoName = String.format("%s-Kubernetes-Binaries-ISO", versionName);
RegisterIsoCmd registerIsoCmd = new RegisterIsoCmd();
registerIsoCmd = ComponentContext.inject(registerIsoCmd);
@@ -179,15 +214,25 @@ private VirtualMachineTemplate registerKubernetesVersionIso(final Long zoneId, f
registerIsoCmd.setDirectDownload(directDownload);
registerIsoCmd.setAccountName(accountManager.getSystemAccount().getAccountName());
registerIsoCmd.setDomainId(accountManager.getSystemAccount().getDomainId());
+<<<<<<< HEAD
+ return templateService.registerIso(registerIsoCmd);
+=======
try {
return templateService.registerIso(registerIsoCmd);
} finally {
CallContext.unregister();
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
private void deleteKubernetesVersionIso(long templateId) throws IllegalAccessException, NoSuchFieldException,
IllegalArgumentException {
+<<<<<<< HEAD
+ DeleteIsoCmd deleteIsoCmd = new DeleteIsoCmd();
+ deleteIsoCmd = ComponentContext.inject(deleteIsoCmd);
+ deleteIsoCmd.setId(templateId);
+ templateService.deleteIso(deleteIsoCmd);
+=======
CallContext isoContext = CallContext.register(CallContext.current(), ApiCommandResourceType.Iso);
isoContext.setEventResourceId(templateId);
DeleteIsoCmd deleteIsoCmd = new DeleteIsoCmd();
@@ -198,6 +243,7 @@ private void deleteKubernetesVersionIso(long templateId) throws IllegalAccessExc
} finally {
CallContext.unregister();
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
public static int compareSemanticVersions(String v1, String v2) throws IllegalArgumentException {
@@ -293,6 +339,16 @@ public ListResponse listKubernetesSupportedV
if(keyword != null){
sc.setParameters("keyword", "%" + keyword + "%");
}
+<<<<<<< HEAD
+ List versions = kubernetesSupportedVersionDao.search(sc, searchFilter);
+ versions = filterKubernetesSupportedVersions(versions, minimumSemanticVersion);
+
+ return createKubernetesSupportedVersionListResponse(versions);
+ }
+
+ @Override
+ @ActionEvent(eventType = KubernetesVersionEventTypes.EVENT_KUBERNETES_VERSION_ADD, eventDescription = "Adding Kubernetes supported version")
+=======
Pair, Integer> versionsAndCount =
kubernetesSupportedVersionDao.searchAndCount(sc, searchFilter);
List versions =
@@ -304,6 +360,7 @@ public ListResponse listKubernetesSupportedV
@Override
@ActionEvent(eventType = KubernetesVersionEventTypes.EVENT_KUBERNETES_VERSION_ADD,
eventDescription = "Adding Kubernetes supported version")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public KubernetesSupportedVersionResponse addKubernetesSupportedVersion(final AddKubernetesSupportedVersionCmd cmd) {
if (!KubernetesClusterService.KubernetesServiceEnabled.value()) {
throw new CloudRuntimeException("Kubernetes Service plugin is disabled");
@@ -355,14 +412,21 @@ public KubernetesSupportedVersionResponse addKubernetesSupportedVersion(final Ad
KubernetesSupportedVersionVO supportedVersionVO = new KubernetesSupportedVersionVO(name, semanticVersion, template.getId(), zoneId, minimumCpu, minimumRamSize);
supportedVersionVO = kubernetesSupportedVersionDao.persist(supportedVersionVO);
+<<<<<<< HEAD
+=======
CallContext.current().putContextParameter(KubernetesSupportedVersion.class, supportedVersionVO.getUuid());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
return createKubernetesSupportedVersionResponse(supportedVersionVO);
}
@Override
+<<<<<<< HEAD
+ @ActionEvent(eventType = KubernetesVersionEventTypes.EVENT_KUBERNETES_VERSION_DELETE, eventDescription = "Deleting Kubernetes supported version", async = true)
+=======
@ActionEvent(eventType = KubernetesVersionEventTypes.EVENT_KUBERNETES_VERSION_DELETE,
eventDescription = "deleting Kubernetes supported version", async = true)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public boolean deleteKubernetesSupportedVersion(final DeleteKubernetesSupportedVersionCmd cmd) {
if (!KubernetesClusterService.KubernetesServiceEnabled.value()) {
throw new CloudRuntimeException("Kubernetes Service plugin is disabled");
@@ -393,8 +457,12 @@ public boolean deleteKubernetesSupportedVersion(final DeleteKubernetesSupportedV
}
@Override
+<<<<<<< HEAD
+ @ActionEvent(eventType = KubernetesVersionEventTypes.EVENT_KUBERNETES_VERSION_UPDATE, eventDescription = "Updating Kubernetes supported version")
+=======
@ActionEvent(eventType = KubernetesVersionEventTypes.EVENT_KUBERNETES_VERSION_UPDATE,
eventDescription = "Updating Kubernetes supported version")
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public KubernetesSupportedVersionResponse updateKubernetesSupportedVersion(final UpdateKubernetesSupportedVersionCmd cmd) {
if (!KubernetesClusterService.KubernetesServiceEnabled.value()) {
throw new CloudRuntimeException("Kubernetes Service plugin is disabled");
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/AddKubernetesSupportedVersionCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/AddKubernetesSupportedVersionCmd.java
index 139b79a182a1..c986d4be2715 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/AddKubernetesSupportedVersionCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/AddKubernetesSupportedVersionCmd.java
@@ -21,7 +21,10 @@
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd;
@@ -135,11 +138,14 @@ public long getEntityOwnerId() {
return CallContext.current().getCallingAccountId();
}
+<<<<<<< HEAD
+=======
@Override
public ApiCommandResourceType getApiResourceType() {
return ApiCommandResourceType.KubernetesSupportedVersion;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/DeleteKubernetesSupportedVersionCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/DeleteKubernetesSupportedVersionCmd.java
index a7799a33f188..676295e623fc 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/DeleteKubernetesSupportedVersionCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/DeleteKubernetesSupportedVersionCmd.java
@@ -21,7 +21,10 @@
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseAsyncCmd;
@@ -86,11 +89,14 @@ public String getEventDescription() {
return description;
}
+<<<<<<< HEAD
+=======
@Override
public ApiCommandResourceType getApiResourceType() {
return ApiCommandResourceType.KubernetesSupportedVersion;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/UpdateKubernetesSupportedVersionCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/UpdateKubernetesSupportedVersionCmd.java
index 990b6a936b70..306602e0e685 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/UpdateKubernetesSupportedVersionCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/admin/kubernetes/version/UpdateKubernetesSupportedVersionCmd.java
@@ -21,7 +21,10 @@
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd;
@@ -30,7 +33,10 @@
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.command.admin.AdminCmd;
import org.apache.cloudstack.api.response.KubernetesSupportedVersionResponse;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.context.CallContext;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.kubernetes.version.KubernetesSupportedVersion;
@@ -75,6 +81,9 @@ public String getState() {
@Override
public long getEntityOwnerId() {
+<<<<<<< HEAD
+ return 0;
+=======
return CallContext.current().getCallingAccountId();
}
@@ -86,6 +95,7 @@ public ApiCommandResourceType getApiResourceType() {
@Override
public Long getApiResourceId() {
return getId();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
/////////////////////////////////////////////////////
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java
index 56d7b0c5838e..0837cbc875cf 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/CreateKubernetesClusterCmd.java
@@ -272,23 +272,42 @@ public String getCreateEventType() {
@Override
public String getCreateEventDescription() {
+<<<<<<< HEAD
+ return "creating Kubernetes cluster";
+=======
return "Creating Kubernetes cluster";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Override
public String getEventDescription() {
+<<<<<<< HEAD
+ return "Creating Kubernetes cluster. Cluster Id: " + getEntityId();
+=======
return "Creating Kubernetes cluster Id: " + getEntityId();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Override
public ApiCommandResourceType getApiResourceType() {
+<<<<<<< HEAD
+ return ApiCommandResourceType.VirtualMachine;
+=======
return ApiCommandResourceType.KubernetesCluster;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Override
public void execute() {
try {
+<<<<<<< HEAD
+ if (KubernetesCluster.ClusterType.valueOf(getClusterType()) == KubernetesCluster.ClusterType.CloudManaged
+ && !kubernetesClusterService.startKubernetesCluster(getEntityId(), true)) {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to start Kubernetes cluster");
+ }
+=======
kubernetesClusterService.startKubernetesCluster(this);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
KubernetesClusterResponse response = kubernetesClusterService.createKubernetesClusterResponse(getEntityId());
response.setResponseName(getCommandName());
setResponseObject(response);
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/DeleteKubernetesClusterCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/DeleteKubernetesClusterCmd.java
index 2ce8151c0631..78102ef0621f 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/DeleteKubernetesClusterCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/DeleteKubernetesClusterCmd.java
@@ -20,7 +20,10 @@
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseAsyncCmd;
@@ -114,6 +117,8 @@ public String getEventType() {
}
@Override
+<<<<<<< HEAD
+=======
public ApiCommandResourceType getApiResourceType() {
return ApiCommandResourceType.KubernetesCluster;
}
@@ -124,6 +129,7 @@ public Long getApiResourceId() {
}
@Override
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public String getEventDescription() {
String description = "Deleting Kubernetes cluster";
KubernetesCluster cluster = _entityMgr.findById(KubernetesCluster.class, getId());
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/RemoveVirtualMachinesFromKubernetesClusterCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/RemoveVirtualMachinesFromKubernetesClusterCmd.java
index 5c87f01862f3..ae9c55c5eab2 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/RemoveVirtualMachinesFromKubernetesClusterCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/RemoveVirtualMachinesFromKubernetesClusterCmd.java
@@ -20,7 +20,10 @@
import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd;
@@ -85,11 +88,14 @@ public long getEntityOwnerId() {
}
@Override
+<<<<<<< HEAD
+=======
public ApiCommandResourceType getApiResourceType() {
return ApiCommandResourceType.KubernetesCluster;
}
@Override
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public void execute() throws ServerApiException {
try {
List responseList = kubernetesClusterService.removeVmsFromCluster(this);
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/ScaleKubernetesClusterCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/ScaleKubernetesClusterCmd.java
index ee3566564e41..3afbde802c00 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/ScaleKubernetesClusterCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/ScaleKubernetesClusterCmd.java
@@ -24,7 +24,10 @@
import org.apache.cloudstack.acl.SecurityChecker;
import org.apache.cloudstack.api.ACL;
import org.apache.cloudstack.api.APICommand;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseAsyncCmd;
@@ -145,11 +148,14 @@ public long getEntityOwnerId() {
return CallContext.current().getCallingAccount().getId();
}
+<<<<<<< HEAD
+=======
@Override
public ApiCommandResourceType getApiResourceType() {
return ApiCommandResourceType.KubernetesCluster;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/StartKubernetesClusterCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/StartKubernetesClusterCmd.java
index bfe00ca27b28..1cbeaecc58ef 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/StartKubernetesClusterCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/StartKubernetesClusterCmd.java
@@ -20,7 +20,10 @@
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseAsyncCmd;
@@ -86,20 +89,49 @@ public long getEntityOwnerId() {
return CallContext.current().getCallingAccount().getId();
}
+<<<<<<< HEAD
+=======
@Override
public ApiCommandResourceType getApiResourceType() {
return ApiCommandResourceType.KubernetesCluster;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
+<<<<<<< HEAD
+ public KubernetesCluster validateRequest() {
+ if (getId() == null || getId() < 1L) {
+ throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid Kubernetes cluster ID provided");
+ }
+ final KubernetesCluster kubernetesCluster = kubernetesClusterService.findById(getId());
+ if (kubernetesCluster == null) {
+ throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Given Kubernetes cluster was not found");
+ }
+ if (!kubernetesClusterService.isCommandSupported(kubernetesCluster, getActualCommandName())) {
+ throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
+ String.format("Start kubernetes cluster is not supported for an externally managed cluster (%s)", kubernetesCluster.getName()));
+ }
+ return kubernetesCluster;
+ }
+
+ @Override
+ public void execute() throws ServerApiException, ConcurrentOperationException {
+ final KubernetesCluster kubernetesCluster = validateRequest();
+ try {
+ if (!kubernetesClusterService.startKubernetesCluster(kubernetesCluster.getId(), false)) {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to start Kubernetes cluster ID: %d", getId()));
+ }
+ final KubernetesClusterResponse response = kubernetesClusterService.createKubernetesClusterResponse(kubernetesCluster.getId());
+=======
@Override
public void execute() throws ServerApiException, ConcurrentOperationException {
try {
kubernetesClusterService.startKubernetesCluster(this);
final KubernetesClusterResponse response = kubernetesClusterService.createKubernetesClusterResponse(getId());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
response.setResponseName(getCommandName());
setResponseObject(response);
} catch (CloudRuntimeException ex) {
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/StopKubernetesClusterCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/StopKubernetesClusterCmd.java
index 23d6878cf729..bc4b7f88552e 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/StopKubernetesClusterCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/StopKubernetesClusterCmd.java
@@ -20,7 +20,10 @@
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseAsyncCmd;
@@ -87,11 +90,14 @@ public long getEntityOwnerId() {
return CallContext.current().getCallingAccount().getId();
}
+<<<<<<< HEAD
+=======
@Override
public ApiCommandResourceType getApiResourceType() {
return ApiCommandResourceType.KubernetesCluster;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/UpgradeKubernetesClusterCmd.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/UpgradeKubernetesClusterCmd.java
index a3f2e0576459..e05cfcce660d 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/UpgradeKubernetesClusterCmd.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/command/user/kubernetes/cluster/UpgradeKubernetesClusterCmd.java
@@ -21,7 +21,10 @@
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.api.ApiCommandResourceType;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseAsyncCmd;
@@ -97,11 +100,14 @@ public long getEntityOwnerId() {
return CallContext.current().getCallingAccount().getId();
}
+<<<<<<< HEAD
+=======
@Override
public ApiCommandResourceType getApiResourceType() {
return ApiCommandResourceType.KubernetesCluster;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
diff --git a/plugins/integrations/kubernetes-service/src/main/resources/META-INF/cloudstack/kubernetes-service/spring-kubernetes-service-context.xml b/plugins/integrations/kubernetes-service/src/main/resources/META-INF/cloudstack/kubernetes-service/spring-kubernetes-service-context.xml
index 9d236eed26cd..177484bfb77e 100644
--- a/plugins/integrations/kubernetes-service/src/main/resources/META-INF/cloudstack/kubernetes-service/spring-kubernetes-service-context.xml
+++ b/plugins/integrations/kubernetes-service/src/main/resources/META-INF/cloudstack/kubernetes-service/spring-kubernetes-service-context.xml
@@ -34,8 +34,13 @@
+<<<<<<< HEAD
+
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
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 f7e816596c26..77cecf89e185 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
@@ -35,7 +35,10 @@
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.framework.config.ConfigKey;
+<<<<<<< HEAD
+=======
import org.apache.commons.collections.CollectionUtils;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -67,7 +70,10 @@
import com.cloud.user.AccountVO;
import com.cloud.user.User;
import com.cloud.user.UserVO;
+<<<<<<< HEAD
+=======
import com.cloud.utils.Pair;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.SearchBuilder;
@@ -144,6 +150,16 @@ public void listKubernetesSupportedVersionsTest() {
when(versionVO.getSemanticVersion()).thenReturn(KubernetesVersionService.MIN_KUBERNETES_VERSION);
versionVOs.add(versionVO);
when(kubernetesSupportedVersionDao.findById(Mockito.anyLong())).thenReturn(versionVO);
+<<<<<<< HEAD
+ when(kubernetesSupportedVersionDao.search(Mockito.any(SearchCriteria.class), Mockito.any(Filter.class))).thenReturn(versionVOs);
+ ListResponse response =
+ kubernetesVersionService.listKubernetesSupportedVersions(
+ cmd);
+ Assert.assertNotNull(response);
+ Assert.assertEquals(Integer.valueOf(1), response.getCount());
+ Assert.assertEquals(1, response.getResponses().size());
+ Assert.assertEquals(KubernetesVersionService.MIN_KUBERNETES_VERSION, response.getResponses().get(0).getSemanticVersion());
+=======
when(kubernetesSupportedVersionDao.searchAndCount(Mockito.any(SearchCriteria.class),
Mockito.any(Filter.class))).thenReturn(new Pair<>(versionVOs, versionVOs.size()));
ListResponse versionsResponse =
@@ -151,6 +167,7 @@ public void listKubernetesSupportedVersionsTest() {
Assert.assertEquals(versionVOs.size(), versionsResponse.getCount().intValue());
Assert.assertTrue(CollectionUtils.isNotEmpty(versionsResponse.getResponses()));
Assert.assertEquals(versionVOs.size(), versionsResponse.getResponses().size());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Test(expected = InvalidParameterValueException.class)
@@ -215,12 +232,18 @@ public void addKubernetesSupportedVersionIsoUrlTest() throws ResourceAllocationE
when(cmd.getMinimumRamSize()).thenReturn(KubernetesClusterService.MIN_KUBERNETES_CLUSTER_NODE_RAM_SIZE);
Account systemAccount = new AccountVO("system", 1L, "", Account.Type.ADMIN, "uuid");
when(accountManager.getSystemAccount()).thenReturn(systemAccount);
+<<<<<<< HEAD
+ try (MockedStatic mockedComponentContext = Mockito.mockStatic(ComponentContext.class)) {
+ mockedComponentContext.when(() -> ComponentContext.inject(Mockito.any(RegisterIsoCmd.class))).thenReturn(
+ new RegisterIsoCmd());
+=======
CallContext callContext = Mockito.mock(CallContext.class);
try (MockedStatic mockedComponentContext = Mockito.mockStatic(ComponentContext.class);
MockedStatic mockedCallContext = Mockito.mockStatic(CallContext.class)) {
mockedComponentContext.when(() -> ComponentContext.inject(Mockito.any(RegisterIsoCmd.class))).thenReturn(
new RegisterIsoCmd());
mockedCallContext.when(CallContext::current).thenReturn(callContext);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
when(templateService.registerIso(Mockito.any(RegisterIsoCmd.class))).thenReturn(
Mockito.mock(VirtualMachineTemplate.class));
diff --git a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java
index f5b2ee5bda78..9fb4b32b39a8 100644
--- a/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java
+++ b/plugins/metrics/src/main/java/org/apache/cloudstack/api/ListVMsMetricsCmd.java
@@ -17,12 +17,18 @@
package org.apache.cloudstack.api;
+<<<<<<< HEAD
+=======
import java.util.EnumSet;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import java.util.List;
import javax.inject.Inject;
+<<<<<<< HEAD
+=======
import com.cloud.exception.InvalidParameterValueException;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.command.user.UserCmd;
import org.apache.cloudstack.api.command.user.vm.ListVMsCmd;
@@ -44,21 +50,34 @@
* although most of it is not suitable/useful for the API purpose.
*
*/
+<<<<<<< HEAD
+@APICommand(name = ListVMsMetricsCmd.APINAME, description = "Lists VM metrics", responseObject = VmMetricsResponse.class,
+ requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, responseView = ResponseObject.ResponseView.Restricted,
+ since = "4.9.3", authorized = {RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User})
+public class ListVMsMetricsCmd extends ListVMsCmd implements UserCmd {
+ public static final String APINAME = "listVirtualMachinesMetrics";
+=======
@APICommand(name = "listVirtualMachinesMetrics", description = "Lists VM metrics", responseObject = VmMetricsResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, responseView = ResponseObject.ResponseView.Restricted,
since = "4.9.3", authorized = {RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User})
public class ListVMsMetricsCmd extends ListVMsCmd implements UserCmd {
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Inject
private MetricsService metricsService;
@Override
+<<<<<<< HEAD
+ public String getCommandName() {
+ return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+=======
public EnumSet getDetails() throws InvalidParameterValueException {
if (isViewDetailsEmpty()) {
return EnumSet.of(ApiConstants.VMDetails.all);
}
return super.getDetails();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Override
diff --git a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
index 6025a41d69cb..6fae2479fe8e 100644
--- a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
+++ b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java
@@ -617,6 +617,10 @@ public List listVmMetrics(List vmResponses) {
}
metricsResponse.setHasAnnotation(vmResponse.hasAnnotation());
+<<<<<<< HEAD
+ metricsResponse.setIpAddress(vmResponse.getNics());
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
metricsResponse.setCpuTotal(vmResponse.getCpuNumber(), vmResponse.getCpuSpeed());
metricsResponse.setMemTotal(vmResponse.getMemory());
metricsResponse.setNetworkRead(vmResponse.getNetworkKbsRead());
diff --git a/plugins/metrics/src/main/java/org/apache/cloudstack/response/VmMetricsResponse.java b/plugins/metrics/src/main/java/org/apache/cloudstack/response/VmMetricsResponse.java
index 7e5db7939db9..60cfd614210d 100644
--- a/plugins/metrics/src/main/java/org/apache/cloudstack/response/VmMetricsResponse.java
+++ b/plugins/metrics/src/main/java/org/apache/cloudstack/response/VmMetricsResponse.java
@@ -17,13 +17,26 @@
package org.apache.cloudstack.response;
+<<<<<<< HEAD
+import java.util.Set;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.response.NicResponse;
+=======
import org.apache.cloudstack.api.ApiConstants;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.api.response.UserVmResponse;
import com.cloud.serializer.Param;
import com.google.gson.annotations.SerializedName;
public class VmMetricsResponse extends UserVmResponse {
+<<<<<<< HEAD
+ @SerializedName(ApiConstants.IP_ADDRESS)
+ @Param(description = "the VM's primary IP address")
+ private String ipAddress;
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@SerializedName("cputotal")
@Param(description = "the total cpu capacity in Ghz")
@@ -53,6 +66,14 @@ public class VmMetricsResponse extends UserVmResponse {
@Param(description = "the total disk iops")
private Long diskIopsTotal;
+<<<<<<< HEAD
+ public void setIpAddress(final Set nics) {
+ if (nics != null && nics.size() > 0) {
+ this.ipAddress = nics.iterator().next().getIpaddress();
+ }
+ }
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public void setCpuTotal(final Integer cpuNumber, final Integer cpuSpeed) {
if (cpuNumber != null && cpuSpeed != null) {
diff --git a/plugins/metrics/src/test/java/org/apache/cloudstack/response/HostMetricsResponseTest.java b/plugins/metrics/src/test/java/org/apache/cloudstack/response/HostMetricsResponseTest.java
index d81d6f6dadbf..3221df445e67 100644
--- a/plugins/metrics/src/test/java/org/apache/cloudstack/response/HostMetricsResponseTest.java
+++ b/plugins/metrics/src/test/java/org/apache/cloudstack/response/HostMetricsResponseTest.java
@@ -56,6 +56,8 @@ public void testSetCpuAllocatedWithValidCpu() {
Assert.assertEquals(expected, hostResponse.getCpuAllocatedGhz());
}
+<<<<<<< HEAD
+=======
@Test
public void testSetCpuAllocatedWithNullCpu() {
String expected = null;
@@ -79,4 +81,5 @@ public void testSetCpuAllocatedWithNullCpuSpeed() {
hostResponse.setCpuAllocated(String.format("50%s25%%", decimalSeparator), 10, null);
Assert.assertEquals(expected, hostResponse.getCpuAllocatedGhz());
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/EventUtils.java b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/EventUtils.java
index d47bf6eceeb0..19ec52bb6fa4 100644
--- a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/EventUtils.java
+++ b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/EventUtils.java
@@ -18,6 +18,23 @@
package org.apache.cloudstack.network.contrail.management;
import java.lang.reflect.Method;
+<<<<<<< HEAD
+import java.util.HashMap;
+import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.stereotype.Component;
+
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.framework.events.EventBus;
+import org.apache.cloudstack.framework.events.EventBusException;
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+=======
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -31,6 +48,7 @@
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.stereotype.Component;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.event.ActionEvent;
import com.cloud.event.ActionEvents;
@@ -41,20 +59,30 @@
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.component.ComponentMethodInterceptor;
+<<<<<<< HEAD
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Component
public class EventUtils {
protected static Logger LOGGER = LogManager.getLogger(EventUtils.class);
+<<<<<<< HEAD
+ protected static EventBus s_eventBus = null;
+=======
private static EventDistributor eventDistributor;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public EventUtils() {
}
+<<<<<<< HEAD
+=======
public static void setEventDistributor(EventDistributor eventDistributorImpl) {
eventDistributor = eventDistributorImpl;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private static void publishOnMessageBus(String eventCategory, String eventType, String details, Event.State state) {
if (state != com.cloud.event.Event.State.Completed) {
@@ -62,7 +90,11 @@ private static void publishOnMessageBus(String eventCategory, String eventType,
}
try {
+<<<<<<< HEAD
+ s_eventBus = ComponentContext.getComponent(EventBus.class);
+=======
setEventDistributor(ComponentContext.getComponent(EventDistributor.class));
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
} catch (NoSuchBeanDefinitionException nbe) {
return; // no provider is configured to provide events bus, so just return
}
@@ -70,12 +102,26 @@ private static void publishOnMessageBus(String eventCategory, String eventType,
org.apache.cloudstack.framework.events.Event event =
new org.apache.cloudstack.framework.events.Event(ManagementService.Name, eventCategory, eventType, EventTypes.getEntityForEvent(eventType), null);
+<<<<<<< HEAD
+ Map eventDescription = new HashMap();
+=======
Map eventDescription = new HashMap<>();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
eventDescription.put("event", eventType);
eventDescription.put("status", state.toString());
eventDescription.put("details", details);
event.setDescription(eventDescription);
+<<<<<<< HEAD
+ try {
+ s_eventBus.publish(event);
+ } catch (EventBusException evx) {
+ String errMsg = "Failed to publish contrail event.";
+ LOGGER.warn(errMsg, evx);
+ }
+
+=======
eventDistributor.publish(event);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
public static class EventInterceptor implements ComponentMethodInterceptor, MethodInterceptor {
@@ -116,7 +162,11 @@ public Object invoke(MethodInvocation invocation) throws Throwable {
}
protected List getActionEvents(Method m) {
+<<<<<<< HEAD
+ List result = new ArrayList();
+=======
List result = new ArrayList<>();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
ActionEvents events = m.getAnnotation(ActionEvents.class);
diff --git a/plugins/pom.xml b/plugins/pom.xml
index 279067e2c97f..e5b03869ea19 100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -79,7 +79,10 @@
event-bus/inmemory
event-bus/kafka
event-bus/rabbitmq
+<<<<<<< HEAD
+=======
event-bus/webhook
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
ha-planners/skip-heurestics
diff --git a/plugins/storage/volume/linstor/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java b/plugins/storage/volume/linstor/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
index 97b813669a6b..556c6b8791a9 100644
--- a/plugins/storage/volume/linstor/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
+++ b/plugins/storage/volume/linstor/src/main/java/com/cloud/hypervisor/kvm/storage/LinstorStorageAdaptor.java
@@ -135,12 +135,33 @@ public KVMPhysicalDisk getPhysicalDisk(String name, KVMStoragePool pool)
List volumeDefs = api.volumeDefinitionList(rscName, null, null);
final long size = volumeDefs.isEmpty() ? 0 : volumeDefs.get(0).getSizeKib() * 1024;
+<<<<<<< HEAD
+ List resources = api.viewResources(
+ Collections.emptyList(),
+ Collections.singletonList(rscName),
+ Collections.emptyList(),
+ null,
+ null,
+ null);
+ if (!resources.isEmpty() && !resources.get(0).getVolumes().isEmpty()) {
+ final String devPath = resources.get(0).getVolumes().get(0).getDevicePath();
+ final KVMPhysicalDisk kvmDisk = new KVMPhysicalDisk(devPath, name, pool);
+ kvmDisk.setFormat(QemuImg.PhysicalDiskFormat.RAW);
+ kvmDisk.setSize(size);
+ kvmDisk.setVirtualSize(size);
+ return kvmDisk;
+ } else {
+ logger.error("Linstor: viewResources didn't return resources or volumes for " + rscName);
+ throw new CloudRuntimeException("Linstor: viewResources didn't return resources or volumes.");
+ }
+=======
final String devicePath = LinstorUtil.getDevicePath(api, rscName);
final KVMPhysicalDisk kvmDisk = new KVMPhysicalDisk(devicePath, name, pool);
kvmDisk.setFormat(QemuImg.PhysicalDiskFormat.RAW);
kvmDisk.setSize(size);
kvmDisk.setVirtualSize(size);
return kvmDisk;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
} catch (ApiException apiEx) {
logger.error(apiEx);
throw new CloudRuntimeException(apiEx.getBestMessage(), apiEx);
diff --git a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
index 3d09fce8bab4..1f8966f9a039 100644
--- a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
+++ b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
@@ -29,6 +29,10 @@
import com.linbit.linstor.api.model.ResourceDefinitionModify;
import com.linbit.linstor.api.model.ResourceGroupSpawn;
import com.linbit.linstor.api.model.ResourceMakeAvailable;
+<<<<<<< HEAD
+import com.linbit.linstor.api.model.ResourceWithVolumes;
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.linbit.linstor.api.model.Snapshot;
import com.linbit.linstor.api.model.SnapshotRestore;
import com.linbit.linstor.api.model.VolumeDefinition;
@@ -100,7 +104,10 @@
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.cloudstack.storage.datastore.util.LinstorConfigurationManager;
import org.apache.cloudstack.storage.datastore.util.LinstorUtil;
+<<<<<<< HEAD
+=======
import org.apache.cloudstack.storage.snapshot.SnapshotObject;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.storage.to.SnapshotObjectTO;
import org.apache.cloudstack.storage.to.VolumeObjectTO;
import org.apache.cloudstack.storage.volume.VolumeObject;
@@ -232,7 +239,11 @@ private void deleteSnapshot(@Nonnull DataStore dataStore, @Nonnull String rscDef
try
{
+<<<<<<< HEAD
+ ApiCallRcList answers = linstorApi.resourceSnapshotDelete(rscDefName, snapshotName);
+=======
ApiCallRcList answers = linstorApi.resourceSnapshotDelete(rscDefName, snapshotName, Collections.emptyList());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (answers.hasError())
{
for (ApiCallRc answer : answers)
@@ -343,6 +354,28 @@ private String checkLinstorAnswers(@Nonnull ApiCallRcList answers) {
return answers.stream().filter(ApiCallRc::isError).findFirst().map(ApiCallRc::getMessage).orElse(null);
}
+<<<<<<< HEAD
+ private String getDeviceName(DevelopersApi linstorApi, String rscName) throws ApiException {
+ List resources = linstorApi.viewResources(
+ Collections.emptyList(),
+ Collections.singletonList(rscName),
+ Collections.emptyList(),
+ null,
+ null,
+ null);
+ if (!resources.isEmpty() && !resources.get(0).getVolumes().isEmpty())
+ {
+ logger.info("Linstor: Created drbd device: " + resources.get(0).getVolumes().get(0).getDevicePath());
+ return resources.get(0).getVolumes().get(0).getDevicePath();
+ } else
+ {
+ logger.error("Linstor: viewResources didn't return resources or volumes.");
+ throw new CloudRuntimeException("Linstor: viewResources didn't return resources or volumes.");
+ }
+ }
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private void applyQoSSettings(StoragePoolVO storagePool, DevelopersApi api, String rscName, Long maxIops)
throws ApiException
{
@@ -428,7 +461,11 @@ private String createResourceBase(
applyAuxProps(api, rscName, volName, vmName);
+<<<<<<< HEAD
+ return getDeviceName(api, rscName);
+=======
return LinstorUtil.getDevicePath(api, rscName);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
} catch (ApiException apiEx)
{
logger.error("Linstor: ApiEx - " + apiEx.getMessage());
@@ -448,7 +485,11 @@ private String createResource(VolumeInfo vol, StoragePoolVO storagePoolVO) {
{
applyQoSSettings(storagePoolVO, linstorApi, rscName, vol.getMaxIops());
+<<<<<<< HEAD
+ return deviceName;
+=======
return LinstorUtil.getDevicePath(linstorApi, rscName);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
} catch (ApiException apiEx)
{
logger.error("Linstor: ApiEx - " + apiEx.getMessage());
@@ -500,7 +541,11 @@ private String cloneResource(long csCloneId, VolumeInfo volumeInfo, StoragePoolV
applyAuxProps(linstorApi, rscName, volumeInfo.getName(), volumeInfo.getAttachedVmName());
applyQoSSettings(storagePoolVO, linstorApi, rscName, volumeInfo.getMaxIops());
+<<<<<<< HEAD
+ return getDeviceName(linstorApi, rscName);
+=======
return LinstorUtil.getDevicePath(linstorApi, rscName);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
} catch (ApiException apiEx) {
logger.error("Linstor: ApiEx - " + apiEx.getMessage());
throw new CloudRuntimeException(apiEx.getBestMessage(), apiEx);
@@ -552,7 +597,11 @@ private String createResourceFromSnapshot(long csSnapshotId, String rscName, Sto
applyAuxProps(linstorApi, rscName, volumeVO.getName(), null);
applyQoSSettings(storagePoolVO, linstorApi, rscName, volumeVO.getMaxIops());
+<<<<<<< HEAD
+ return getDeviceName(linstorApi, rscName);
+=======
return LinstorUtil.getDevicePath(linstorApi, rscName);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
} catch (ApiException apiEx) {
logger.error("Linstor: ApiEx - " + apiEx.getMessage());
throw new CloudRuntimeException(apiEx.getBestMessage(), apiEx);
@@ -921,7 +970,11 @@ private String restoreResourceFromSnapshot(
api.resourceSnapshotRestore(rscName, snapshotName, sr);
+<<<<<<< HEAD
+ return getDeviceName(api, restoredName);
+=======
return LinstorUtil.getDevicePath(api, restoredName);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
private Answer copyTemplate(DataObject srcData, DataObject dstData) {
@@ -1005,13 +1058,24 @@ private Answer copyVolume(DataObject srcData, DataObject dstData) {
* @param api Linstor Developer api object
* @param pool StoragePool this resource resides on
* @param rscName rscName of the snapshotted resource
+<<<<<<< HEAD
+ * @param snapshotInfo snapshot info of the snapshot
+=======
* @param snapshotName Name of the snapshot to copy from
* @param snapshotObject snapshot object of the origCmd, so the path can be modified
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
* @param origCmd original LinstorBackupSnapshotCommand that needs to have a patched path
* @return answer from agent operation
* @throws ApiException if any Linstor api operation fails
*/
private Answer copyFromTemporaryResource(
+<<<<<<< HEAD
+ DevelopersApi api, StoragePoolVO pool, String rscName, SnapshotInfo snapshotInfo, CopyCommand origCmd)
+ throws ApiException {
+ Answer answer;
+ String restoreName = rscName + "-rst";
+ String snapshotName = LinstorUtil.RSC_PREFIX + snapshotInfo.getUuid();
+=======
DevelopersApi api,
StoragePoolVO pool,
String rscName,
@@ -1021,13 +1085,20 @@ private Answer copyFromTemporaryResource(
throws ApiException {
Answer answer;
String restoreName = rscName + "-rst";
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
String devName = restoreResourceFromSnapshot(api, pool, rscName, snapshotName, restoreName);
Optional optEPAny = getLinstorEP(api, restoreName);
if (optEPAny.isPresent()) {
// patch the src device path to the temporary linstor resource
+<<<<<<< HEAD
+ SnapshotObjectTO soTO = (SnapshotObjectTO)snapshotInfo.getTO();
+ soTO.setPath(devName);
+ origCmd.setSrcTO(soTO);
+=======
snapshotObject.setPath(devName);
origCmd.setSrcTO(snapshotObject.getTO());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
answer = optEPAny.get().sendMessage(origCmd);
} else{
answer = new Answer(origCmd, false, "Unable to get matching Linstor endpoint.");
@@ -1037,6 +1108,8 @@ private Answer copyFromTemporaryResource(
return answer;
}
+<<<<<<< HEAD
+=======
/**
* vmsnapshots don't have our typical snapshot path set
* instead the path is the internal snapshot name e.g.: {vm}_VS_{datestr}
@@ -1060,13 +1133,19 @@ private String setCorrectSnapshotPath(DevelopersApi api, String rscName, Snapsho
return originalPath;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
protected Answer copySnapshot(DataObject srcData, DataObject destData) {
String value = _configDao.getValue(Config.BackupSnapshotWait.toString());
int _backupsnapshotwait = NumbersUtil.parseInt(
value, Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue()));
+<<<<<<< HEAD
+ SnapshotInfo snapshotInfo = (SnapshotInfo)srcData;
+ Boolean snapshotFullBackup = snapshotInfo.getFullBackup();
+=======
SnapshotObject snapshotObject = (SnapshotObject)srcData;
Boolean snapshotFullBackup = snapshotObject.getFullBackup();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
final StoragePoolVO pool = _storagePoolDao.findById(srcData.getDataStore().getId());
final DevelopersApi api = LinstorUtil.getLinstorAPI(pool.getHostAddress());
boolean fullSnapshot = true;
@@ -1077,6 +1156,13 @@ protected Answer copySnapshot(DataObject srcData, DataObject destData) {
options.put("fullSnapshot", fullSnapshot + "");
options.put(SnapshotInfo.BackupSnapshotAfterTakingSnapshot.key(),
String.valueOf(SnapshotInfo.BackupSnapshotAfterTakingSnapshot.value()));
+<<<<<<< HEAD
+ options.put("volumeSize", snapshotInfo.getBaseVolume().getSize() + "");
+
+ try {
+ CopyCommand cmd = new LinstorBackupSnapshotCommand(
+ srcData.getTO(),
+=======
options.put("volumeSize", snapshotObject.getBaseVolume().getSize() + "");
try {
@@ -1085,22 +1171,35 @@ protected Answer copySnapshot(DataObject srcData, DataObject destData) {
CopyCommand cmd = new LinstorBackupSnapshotCommand(
snapshotObject.getTO(),
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
destData.getTO(),
_backupsnapshotwait,
VirtualMachineManager.ExecuteInSequence.value());
cmd.setOptions(options);
+<<<<<<< HEAD
+ String rscName = LinstorUtil.RSC_PREFIX + snapshotInfo.getBaseVolume().getUuid();
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
Optional optEP = getDiskfullEP(api, rscName);
Answer answer;
if (optEP.isPresent()) {
answer = optEP.get().sendMessage(cmd);
} else {
logger.debug("No diskfull endpoint found to copy image, creating diskless endpoint");
+<<<<<<< HEAD
+ answer = copyFromTemporaryResource(api, pool, rscName, snapshotInfo, cmd);
+ }
+ return answer;
+ } catch (Exception e) {
+ logger.debug("copy snapshot failed: ", e);
+=======
answer = copyFromTemporaryResource(api, pool, rscName, snapshotName, snapshotObject, cmd);
}
return answer;
} catch (Exception e) {
logger.debug("copy snapshot failed, please cleanup snapshot manually: ", e);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
throw new CloudRuntimeException(e.toString());
}
diff --git a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
index bdb999459586..37b923f8c452 100644
--- a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
+++ b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/util/LinstorUtil.java
@@ -113,8 +113,12 @@ public static List getLinstorNodeNames(@Nonnull DevelopersApi api) throw
Collections.singletonList(storagePoolName),
Collections.emptyList(),
null,
+<<<<<<< HEAD
+ null
+=======
null,
true
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
);
return sps != null ? sps : Collections.emptyList();
}
@@ -168,8 +172,12 @@ public static List getRscGroupStoragePools(DevelopersApi api, Strin
rscGrps.get(0).getSelectFilter().getStoragePoolList(),
null,
null,
+<<<<<<< HEAD
+ null
+=======
null,
true
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
);
}
@@ -205,6 +213,8 @@ public static boolean isResourceInUse(DevelopersApi api, String rscName) throws
LOGGER.error("isResourceInUse: null returned from resourceList");
return false;
}
+<<<<<<< HEAD
+=======
/**
* Try to get the device path for the given resource name.
@@ -238,4 +248,5 @@ public static String getDevicePath(DevelopersApi api, String rscName) throws Api
LOGGER.error(errMsg);
throw new CloudRuntimeException("Linstor: " + errMsg);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/plugins/storage/volume/linstor/src/main/resources/META-INF/cloudstack/storage-volume-linstor/spring-storage-volume-linstor-context.xml b/plugins/storage/volume/linstor/src/main/resources/META-INF/cloudstack/storage-volume-linstor/spring-storage-volume-linstor-context.xml
index a900323ede53..d11f749351e3 100644
--- a/plugins/storage/volume/linstor/src/main/resources/META-INF/cloudstack/storage-volume-linstor/spring-storage-volume-linstor-context.xml
+++ b/plugins/storage/volume/linstor/src/main/resources/META-INF/cloudstack/storage-volume-linstor/spring-storage-volume-linstor-context.xml
@@ -29,8 +29,11 @@
+<<<<<<< HEAD
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
diff --git a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
index 8397334d0dd1..7d307de789cb 100644
--- a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
+++ b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
@@ -66,8 +66,11 @@
import org.apache.logging.log4j.LogManager;
import com.cloud.agent.api.Answer;
+<<<<<<< HEAD
+=======
import com.cloud.agent.api.GetVolumeStatAnswer;
import com.cloud.agent.api.GetVolumeStatCommand;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.agent.api.storage.MigrateVolumeCommand;
import com.cloud.agent.api.storage.ResizeVolumeCommand;
import com.cloud.agent.api.to.DataObjectType;
@@ -493,10 +496,17 @@ public void revertSnapshot(SnapshotInfo snapshot, SnapshotInfo snapshotOnPrimary
}
public CreateObjectAnswer createVolume(VolumeInfo volumeInfo, long storagePoolId) {
+<<<<<<< HEAD
+ return createVolume(volumeInfo, storagePoolId, false);
+ }
+
+ public CreateObjectAnswer createVolume(VolumeInfo volumeInfo, long storagePoolId, boolean migrationInvolved) {
+=======
return createVolume(volumeInfo, storagePoolId, false, null);
}
public CreateObjectAnswer createVolume(VolumeInfo volumeInfo, long storagePoolId, boolean migrationInvolved, Long usageSize) {
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
logger.debug("Creating PowerFlex volume");
StoragePoolVO storagePool = storagePoolDao.findById(storagePoolId);
@@ -546,9 +556,12 @@ public CreateObjectAnswer createVolume(VolumeInfo volumeInfo, long storagePoolId
VolumeObjectTO prepVolume = (VolumeObjectTO) createdObject.getTO();
prepVolume.setPath(volumePath);
prepVolume.setUuid(volumePath);
+<<<<<<< HEAD
+=======
if (usageSize != null) {
prepVolume.setUsableSize(usageSize);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
CreateObjectCommand cmd = new CreateObjectCommand(prepVolume);
EndPoint ep = selector.select(volumeInfo, true);
if (ep == null) {
@@ -851,8 +864,12 @@ public Answer liveMigrateVolume(DataObject srcData, DataObject destData) {
// Volume migration across different PowerFlex/ScaleIO clusters
final long srcVolumeId = srcData.getId();
DataStore srcStore = srcData.getDataStore();
+<<<<<<< HEAD
+ Map srcDetails = getVolumeDetails((VolumeInfo) srcData, srcStore);
+=======
VolumeInfo srcVolumeInfo = (VolumeInfo) srcData;
Map srcDetails = getVolumeDetails(srcVolumeInfo, srcStore);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
DataStore destStore = destData.getDataStore();
final long destPoolId = destStore.getId();
@@ -864,6 +881,10 @@ public Answer liveMigrateVolume(DataObject srcData, DataObject destData) {
EndPoint ep = RemoteHostEndPoint.getHypervisorHostEndPoint(host);
Answer answer = null;
+<<<<<<< HEAD
+ try {
+ CreateObjectAnswer createAnswer = createVolume((VolumeInfo) destData, destStore.getId(), true);
+=======
Long srcVolumeUsableSize = null;
try {
GetVolumeStatCommand statCmd = new GetVolumeStatCommand(srcVolumeInfo.getPath(), srcVolumeInfo.getStoragePoolType(), srcStore.getUuid());
@@ -875,6 +896,7 @@ public Answer liveMigrateVolume(DataObject srcData, DataObject destData) {
}
CreateObjectAnswer createAnswer = createVolume((VolumeInfo) destData, destStore.getId(), true, srcVolumeUsableSize);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
destVolumePath = createAnswer.getData().getPath();
destVolTO.setPath(destVolumePath);
diff --git a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java
index 4979fd1fa0aa..39b7bf5efb99 100644
--- a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java
+++ b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java
@@ -20,10 +20,14 @@
package org.apache.cloudstack.storage.datastore.driver;
import com.cloud.agent.api.Answer;
+<<<<<<< HEAD
+import com.cloud.agent.api.storage.MigrateVolumeAnswer;
+=======
import com.cloud.agent.api.GetVolumeStatAnswer;
import com.cloud.agent.api.GetVolumeStatCommand;
import com.cloud.agent.api.storage.MigrateVolumeAnswer;
import com.cloud.agent.api.storage.MigrateVolumeCommand;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import com.cloud.agent.api.to.DataTO;
import com.cloud.agent.api.to.DiskTO;
import com.cloud.configuration.Config;
@@ -208,15 +212,25 @@ public void testMigrateVolumeWithinSameScaleIOClusterSuccess() throws Exception
RemoteHostEndPoint ep = Mockito.mock(RemoteHostEndPoint.class);
remoteHostEndPointMock.when(() -> RemoteHostEndPoint.getHypervisorHostEndPoint(host)).thenReturn(ep);
+<<<<<<< HEAD
+ DataTO dataTO = Mockito.mock(DataTO.class);
+ CreateObjectAnswer createAnswer = new CreateObjectAnswer(dataTO);
+ doReturn(createAnswer).when(scaleIOPrimaryDataStoreDriver).createVolume(destData, 2L, true);
+=======
long volumeVirtualSize = 68673077248L;
DataTO dataTO = Mockito.mock(DataTO.class);
CreateObjectAnswer createAnswer = new CreateObjectAnswer(dataTO);
doReturn(createAnswer).when(scaleIOPrimaryDataStoreDriver).createVolume(destData, 2L, true, volumeVirtualSize);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
when(dataTO.getPath()).thenReturn("bec0ba7700000007:vol-11-6aef-10ee");
doReturn(true).when(scaleIOPrimaryDataStoreDriver)
.grantAccess(any(), any(), any());
when(configDao.getValue(Config.MigrateWait.key())).thenReturn("3600");
+<<<<<<< HEAD
+ MigrateVolumeAnswer migrateVolumeAnswer = Mockito.mock(MigrateVolumeAnswer.class);
+ when(ep.sendMessage(any())).thenReturn(migrateVolumeAnswer);
+=======
GetVolumeStatAnswer getVolumeStatAnswer = Mockito.mock(GetVolumeStatAnswer.class);
when(ep.sendMessage(any(GetVolumeStatCommand.class))).thenReturn(getVolumeStatAnswer);
@@ -225,6 +239,7 @@ public void testMigrateVolumeWithinSameScaleIOClusterSuccess() throws Exception
MigrateVolumeAnswer migrateVolumeAnswer = Mockito.mock(MigrateVolumeAnswer.class);
when(ep.sendMessage(any(MigrateVolumeCommand.class))).thenReturn(migrateVolumeAnswer);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
when(migrateVolumeAnswer.getResult()).thenReturn(true);
Mockito.doNothing().when(scaleIOPrimaryDataStoreDriver)
@@ -261,6 +276,18 @@ public void testMigrateVolumeWithinSameScaleIOClusterFailure() throws Exception
DataTO dataTO = Mockito.mock(DataTO.class);
CreateObjectAnswer createAnswer = new CreateObjectAnswer(dataTO);
+<<<<<<< HEAD
+ doReturn(createAnswer).when(scaleIOPrimaryDataStoreDriver).createVolume(destData, 2L, true);
+ when(dataTO.getPath()).thenReturn("bec0ba7700000007:vol-11-6aef-10ee");
+ doReturn(true).when(scaleIOPrimaryDataStoreDriver)
+ .grantAccess(any(), any(), any());
+
+ when(configDao.getValue(Config.MigrateWait.key())).thenReturn("3600");
+ MigrateVolumeAnswer migrateVolumeAnswer = Mockito.mock(MigrateVolumeAnswer.class);
+ when(ep.sendMessage(any())).thenReturn(migrateVolumeAnswer);
+ when(migrateVolumeAnswer.getResult()).thenReturn(false);
+ Mockito.doNothing().when(scaleIOPrimaryDataStoreDriver)
+=======
Mockito.lenient().doReturn(createAnswer).when(scaleIOPrimaryDataStoreDriver).createVolume(destData, 2L, true, null);
Mockito.lenient().when(dataTO.getPath()).thenReturn("bec0ba7700000007:vol-11-6aef-10ee");
Mockito.lenient().doReturn(true).when(scaleIOPrimaryDataStoreDriver)
@@ -276,6 +303,7 @@ public void testMigrateVolumeWithinSameScaleIOClusterFailure() throws Exception
when(ep.sendMessage(any())).thenReturn(migrateVolumeAnswer);
Mockito.lenient().when(migrateVolumeAnswer.getResult()).thenReturn(false);
Mockito.lenient().doNothing().when(scaleIOPrimaryDataStoreDriver)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
.revertBlockCopyVolumeOperations(any(), any(), any(), any());
Answer answer = scaleIOPrimaryDataStoreDriver.liveMigrateVolume(srcData, destData);
diff --git a/plugins/user-authenticators/oauth2/pom.xml b/plugins/user-authenticators/oauth2/pom.xml
index 5a1e49874a89..72fa061685da 100644
--- a/plugins/user-authenticators/oauth2/pom.xml
+++ b/plugins/user-authenticators/oauth2/pom.xml
@@ -59,5 +59,10 @@
1.20.0
compile
+
+ org.keycloak
+ keycloak-admin-client
+ 24.0.0
+
diff --git a/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticator.java b/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticator.java
index a59d1fc919b7..b68c2d9339de 100644
--- a/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticator.java
+++ b/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticator.java
@@ -31,6 +31,17 @@
import javax.inject.Inject;
import java.util.Map;
+<<<<<<< HEAD
+public class OAuth2UserAuthenticator extends AdapterBase implements UserAuthenticator {
+
+ @Inject
+ private UserAccountDao _userAccountDao;
+ @Inject
+ private UserDao _userDao;
+
+ @Inject
+ private OAuth2AuthManager _userOAuth2mgr;
+=======
import static org.apache.cloudstack.oauth2.OAuth2AuthManager.OAuth2IsPluginEnabled;
public class OAuth2UserAuthenticator extends AdapterBase implements UserAuthenticator {
@@ -42,6 +53,7 @@ public class OAuth2UserAuthenticator extends AdapterBase implements UserAuthenti
@Inject
private OAuth2AuthManager userOAuth2mgr;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Override
public Pair authenticate(String username, String password, Long domainId, Map requestParameters) {
@@ -49,6 +61,9 @@ public Pair authenticate(String username,
logger.debug("Trying OAuth2 auth for user: " + username);
}
+<<<<<<< HEAD
+ final UserAccount userAccount = _userAccountDao.getUserAccount(username, domainId);
+=======
if (!isOAuthPluginEnabled()) {
logger.debug("OAuth2 plugin is disabled");
return new Pair(false, null);
@@ -58,11 +73,16 @@ public Pair authenticate(String username,
}
final UserAccount userAccount = userAccountDao.getUserAccount(username, domainId);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (userAccount == null) {
logger.debug("Unable to find user with " + username + " in domain " + domainId + ", or user source is not OAUTH2");
return new Pair(false, null);
} else {
+<<<<<<< HEAD
+ User user = _userDao.getUser(userAccount.getId());
+=======
User user = userDao.getUser(userAccount.getId());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
final String[] provider = (String[])requestParameters.get(ApiConstants.PROVIDER);
final String[] emailArray = (String[])requestParameters.get(ApiConstants.EMAIL);
final String[] secretCodeArray = (String[])requestParameters.get(ApiConstants.SECRET_CODE);
@@ -70,7 +90,11 @@ public Pair authenticate(String username,
String email = ((emailArray == null) ? null : emailArray[0]);
String secretCode = ((secretCodeArray == null) ? null : secretCodeArray[0]);
+<<<<<<< HEAD
+ UserOAuth2Authenticator authenticator = _userOAuth2mgr.getUserOAuth2AuthenticationProvider(oauthProvider);
+=======
UserOAuth2Authenticator authenticator = userOAuth2mgr.getUserOAuth2AuthenticationProvider(oauthProvider);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (user != null && authenticator.verifyUser(email, secretCode)) {
return new Pair(true, null);
}
@@ -83,8 +107,11 @@ public Pair authenticate(String username,
public String encode(String password) {
return null;
}
+<<<<<<< HEAD
+=======
protected boolean isOAuthPluginEnabled() {
return OAuth2IsPluginEnabled.value();
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
diff --git a/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/keycloak/KeycloakOAuth2Provider.java b/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/keycloak/KeycloakOAuth2Provider.java
new file mode 100644
index 000000000000..13664598a5f9
--- /dev/null
+++ b/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/keycloak/KeycloakOAuth2Provider.java
@@ -0,0 +1,153 @@
+<<<<<<< HEAD
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
+package org.apache.cloudstack.oauth2.keycloak;
+
+import com.cloud.exception.CloudAuthenticationException;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.cloudstack.auth.UserOAuth2Authenticator;
+import org.apache.cloudstack.oauth2.dao.OauthProviderDao;
+import org.apache.cloudstack.oauth2.vo.OauthProviderVO;
+import org.apache.commons.lang3.StringUtils;
+import org.keycloak.OAuth2Constants;
+import org.keycloak.admin.client.Keycloak;
+<<<<<<< HEAD
+import org.keycloak.admin.client.resource.RealmResource;
+import org.keycloak.admin.client.resource.UserResource;
+import org.keycloak.representations.AccessTokenResponse;
+
+import javax.inject.Inject;
+import java.util.HashMap;
+import java.util.Map;
+=======
+import org.keycloak.admin.client.KeycloakBuilder;
+import org.keycloak.representations.idm.UserRepresentation;
+import org.keycloak.representations.AccessTokenResponse;
+
+import javax.inject.Inject;
+import java.util.List;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
+
+public class KeycloakOAuth2Provider extends AdapterBase implements UserOAuth2Authenticator {
+
+ protected String accessToken = null;
+ protected String refreshToken = null;
+
+ @Inject
+ OauthProviderDao _oauthProviderDao;
+
+ @Override
+ public String getName() {
+ return "keycloak";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Keycloak OAuth2 Provider Plugin";
+ }
+
+ @Override
+ public boolean verifyUser(String email, String secretCode) {
+ if (StringUtils.isAnyEmpty(email, secretCode)) {
+ throw new CloudAuthenticationException("Either email or secret code should not be null/empty");
+ }
+
+ OauthProviderVO providerVO = _oauthProviderDao.findByProvider(getName());
+ if (providerVO == null) {
+ throw new CloudAuthenticationException("Keycloak provider is not registered, so user cannot be verified");
+ }
+
+ String verifiedEmail = verifyCodeAndFetchEmail(secretCode);
+ if (verifiedEmail == null || !email.equals(verifiedEmail)) {
+ throw new CloudRuntimeException("Unable to verify the email address with the provided secret");
+ }
+ clearAccessAndRefreshTokens();
+
+ return true;
+ }
+
+ @Override
+ public String verifyCodeAndFetchEmail(String secretCode) {
+ OauthProviderVO keycloakProvider = _oauthProviderDao.findByProvider(getName());
+ String clientId = keycloakProvider.getClientId();
+<<<<<<< HEAD
+ String secret = keycloakProvider.getSecretKey();
+ String authServerUrl = keycloakProvider.getAuthServerUrl();
+ String realm = keycloakProvider.getRealm();
+
+ Keycloak keycloak = Keycloak.getInstance(authServerUrl, realm, clientId, secret, OAuth2Constants.CLIENT_CREDENTIALS);
+=======
+ String clientSecret = keycloakProvider.getSecretKey();
+ String redirectUri = keycloakProvider.getRedirectUri();
+ String authServerUrl = keycloakProvider.getAuthenticationUri();
+
+ Keycloak keycloak = KeycloakBuilder.builder()
+ .serverUrl(authServerUrl)
+ .realm(keycloakProvider.getProviderName())
+ .clientId(clientId)
+ .clientSecret(clientSecret)
+ .grantType(OAuth2Constants.AUTHORIZATION_CODE)
+ .redirectUri(redirectUri)
+ .code(secretCode)
+ .build();
+
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
+ AccessTokenResponse tokenResponse = keycloak.tokenManager().getAccessToken();
+
+ accessToken = tokenResponse.getToken();
+ refreshToken = tokenResponse.getRefreshToken();
+
+<<<<<<< HEAD
+ RealmResource realmResource = keycloak.realm(realm);
+ UserResource userResource = realmResource.users().get(tokenResponse.getSubject());
+
+ Map attributes = new HashMap<>();
+ try {
+ attributes = userResource.toRepresentation().getAttributes();
+ } catch (Exception e) {
+ throw new CloudRuntimeException(String.format("Failed to fetch the email address with the provided secret: %s", e.getMessage()));
+ }
+
+ return (String) attributes.get("email");
+=======
+ List users = keycloak.realm(keycloakProvider.getProviderName()).users().search("", 0, 1);
+ if (users.isEmpty()) {
+ throw new CloudRuntimeException("No user found with the provided secret");
+ }
+
+ return users.get(0).getEmail();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
+ }
+
+ protected void clearAccessAndRefreshTokens() {
+ accessToken = null;
+ refreshToken = null;
+ }
+
+ @Override
+ public String getUserEmailAddress() throws CloudRuntimeException {
+ return null;
+ }
+}
+<<<<<<< HEAD
+=======
+
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
diff --git a/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticatorTest.java b/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticatorTest.java
index d1c1889ba999..f0241d12bfbc 100644
--- a/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticatorTest.java
+++ b/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/OAuth2UserAuthenticatorTest.java
@@ -27,29 +27,42 @@
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+<<<<<<< HEAD
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+=======
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
+<<<<<<< HEAD
+=======
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+<<<<<<< HEAD
+
+=======
import static org.mockito.Mockito.doReturn;
@RunWith(MockitoJUnitRunner.class)
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public class OAuth2UserAuthenticatorTest {
@Mock
@@ -62,14 +75,22 @@ public class OAuth2UserAuthenticatorTest {
private OAuth2AuthManager userOAuth2mgr;
@InjectMocks
+<<<<<<< HEAD
+ private OAuth2UserAuthenticator authenticator;
+
+=======
@Spy
private OAuth2UserAuthenticator authenticator;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private AutoCloseable closeable;
@Before
public void setUp() {
closeable = MockitoAnnotations.openMocks(this);
+<<<<<<< HEAD
+=======
doReturn(true).when(authenticator).isOAuthPluginEnabled();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@After
@@ -77,7 +98,10 @@ public void tearDown() throws Exception {
closeable.close();
}
+<<<<<<< HEAD
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Test
public void testAuthenticateWithValidCredentials() {
String username = "testuser";
@@ -102,13 +126,22 @@ public void testAuthenticateWithValidCredentials() {
Pair result = authenticator.authenticate(username, null, domainId, requestParameters);
+<<<<<<< HEAD
+=======
assertTrue(result.first());
assertNull(result.second());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
verify(userAccountDao).getUserAccount(username, domainId);
verify(userDao).getUser(userAccount.getId());
verify(userOAuth2mgr).getUserOAuth2AuthenticationProvider(provider[0]);
verify(userOAuth2Authenticator).verifyUser(email[0], secretCode[0]);
+<<<<<<< HEAD
+
+ assertEquals(true, result.first().booleanValue());
+ assertEquals(null, result.second());
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Test
@@ -124,7 +157,11 @@ public void testAuthenticateWithInvalidCredentials() {
UserOAuth2Authenticator userOAuth2Authenticator = mock(UserOAuth2Authenticator.class);
when(userAccountDao.getUserAccount(username, domainId)).thenReturn(userAccount);
+<<<<<<< HEAD
+ when(userDao.getUser(userAccount.getId())).thenReturn( user);
+=======
when(userDao.getUser(userAccount.getId())).thenReturn(user);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
when(userOAuth2mgr.getUserOAuth2AuthenticationProvider(provider[0])).thenReturn(userOAuth2Authenticator);
when(userOAuth2Authenticator.verifyUser(email[0], secretCode[0])).thenReturn(false);
@@ -135,13 +172,22 @@ public void testAuthenticateWithInvalidCredentials() {
Pair result = authenticator.authenticate(username, null, domainId, requestParameters);
+<<<<<<< HEAD
+=======
assertFalse(result.first());
assertEquals(OAuth2UserAuthenticator.ActionOnFailedAuthentication.INCREMENT_INCORRECT_LOGIN_ATTEMPT_COUNT, result.second());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
verify(userAccountDao).getUserAccount(username, domainId);
verify(userDao).getUser(userAccount.getId());
verify(userOAuth2mgr).getUserOAuth2AuthenticationProvider(provider[0]);
verify(userOAuth2Authenticator).verifyUser(email[0], secretCode[0]);
+<<<<<<< HEAD
+
+ assertEquals(false, result.first().booleanValue());
+ assertEquals(OAuth2UserAuthenticator.ActionOnFailedAuthentication.INCREMENT_INCORRECT_LOGIN_ATTEMPT_COUNT, result.second());
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Test
@@ -161,11 +207,20 @@ public void testAuthenticateWithInvalidUserAccount() {
Pair result = authenticator.authenticate(username, null, domainId, requestParameters);
+<<<<<<< HEAD
+ verify(userAccountDao).getUserAccount(username, domainId);
+ verify(userDao, never()).getUser(anyLong());
+ verify(userOAuth2mgr, never()).getUserOAuth2AuthenticationProvider(anyString());
+
+ assertEquals(false, result.first().booleanValue());
+ assertEquals(null, result.second());
+=======
assertFalse(result.first());
assertNull(result.second());
verify(userAccountDao).getUserAccount(username, domainId);
verify(userDao, never()).getUser(anyLong());
verify(userOAuth2mgr, never()).getUserOAuth2AuthenticationProvider(anyString());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
diff --git a/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/keycloak/KeycloakOAuth2ProviderTest.java b/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/keycloak/KeycloakOAuth2ProviderTest.java
new file mode 100644
index 000000000000..3a8e4135caff
--- /dev/null
+++ b/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/keycloak/KeycloakOAuth2ProviderTest.java
@@ -0,0 +1,166 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.oauth2.keycloak;
+
+import com.cloud.exception.CloudAuthenticationException;
+import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.cloudstack.oauth2.dao.OauthProviderDao;
+import org.apache.cloudstack.oauth2.vo.OauthProviderVO;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.keycloak.admin.client.Keycloak;
+import org.keycloak.admin.client.resource.RealmResource;
+import org.keycloak.admin.client.resource.UserResource;
+import org.keycloak.representations.AccessTokenResponse;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+
+public class KeycloakOAuth2ProviderTest {
+
+ @Mock
+ private OauthProviderDao _oauthProviderDao;
+
+ @Spy
+ @InjectMocks
+ private KeycloakOAuth2Provider _keycloakOAuth2Provider;
+
+ private AutoCloseable closeable;
+
+ @Before
+ public void setUp() {
+ closeable = MockitoAnnotations.openMocks(this);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ closeable.close();
+ }
+
+ @Test(expected = CloudAuthenticationException.class)
+ public void testVerifyUserWithNullEmail() {
+ _keycloakOAuth2Provider.verifyUser(null, "secretCode");
+ }
+
+ @Test(expected = CloudAuthenticationException.class)
+ public void testVerifyUserWithNullSecretCode() {
+ _keycloakOAuth2Provider.verifyUser("email@example.com", null);
+ }
+
+ @Test(expected = CloudAuthenticationException.class)
+ public void testVerifyUserWithUnregisteredProvider() {
+ when(_oauthProviderDao.findByProvider(anyString())).thenReturn(null);
+ _keycloakOAuth2Provider.verifyUser("email@example.com", "secretCode");
+ }
+
+ @Test(expected = CloudRuntimeException.class)
+ public void testVerifyUserWithInvalidSecretCode() {
+ OauthProviderVO providerVO = mock(OauthProviderVO.class);
+ when(_oauthProviderDao.findByProvider(anyString())).thenReturn(providerVO);
+ when(providerVO.getClientId()).thenReturn("testClientId");
+ when(providerVO.getSecretKey()).thenReturn("testSecretKey");
+ when(providerVO.getAuthServerUrl()).thenReturn("http://localhost:8080/auth");
+ when(providerVO.getRealm()).thenReturn("testRealm");
+
+ Keycloak keycloak = mock(Keycloak.class);
+ when(Keycloak.getInstance(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(keycloak);
+
+ AccessTokenResponse tokenResponse = mock(AccessTokenResponse.class);
+ when(keycloak.tokenManager().getAccessToken()).thenReturn(tokenResponse);
+
+ RealmResource realmResource = mock(RealmResource.class);
+ when(keycloak.realm(anyString())).thenReturn(realmResource);
+
+ UserResource userResource = mock(UserResource.class);
+ when(realmResource.users().get(anyString())).thenReturn(userResource);
+
+ Map attributes = new HashMap<>();
+ attributes.put("email", null);
+ when(userResource.toRepresentation().getAttributes()).thenReturn(attributes);
+
+ _keycloakOAuth2Provider.verifyUser("email@example.com", "secretCode");
+ }
+
+ @Test(expected = CloudRuntimeException.class)
+ public void testVerifyUserWithMismatchedEmail() {
+ OauthProviderVO providerVO = mock(OauthProviderVO.class);
+ when(_oauthProviderDao.findByProvider(anyString())).thenReturn(providerVO);
+ when(providerVO.getClientId()).thenReturn("testClientId");
+ when(providerVO.getSecretKey()).thenReturn("testSecretKey");
+ when(providerVO.getAuthServerUrl()).thenReturn("http://localhost:8080/auth");
+ when(providerVO.getRealm()).thenReturn("testRealm");
+
+ Keycloak keycloak = mock(Keycloak.class);
+ when(Keycloak.getInstance(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(keycloak);
+
+ AccessTokenResponse tokenResponse = mock(AccessTokenResponse.class);
+ when(keycloak.tokenManager().getAccessToken()).thenReturn(tokenResponse);
+
+ RealmResource realmResource = mock(RealmResource.class);
+ when(keycloak.realm(anyString())).thenReturn(realmResource);
+
+ UserResource userResource = mock(UserResource.class);
+ when(realmResource.users().get(anyString())).thenReturn(userResource);
+
+ Map attributes = new HashMap<>();
+ attributes.put("email", "otheremail@example.com");
+ when(userResource.toRepresentation().getAttributes()).thenReturn(attributes);
+
+ _keycloakOAuth2Provider.verifyUser("email@example.com", "secretCode");
+ }
+
+ @Test
+ public void testVerifyUserEmail() {
+ OauthProviderVO providerVO = mock(OauthProviderVO.class);
+ when(_oauthProviderDao.findByProvider(anyString())).thenReturn(providerVO);
+ when(providerVO.getClientId()).thenReturn("testClientId");
+ when(providerVO.getSecretKey()).thenReturn("testSecretKey");
+ when(providerVO.getAuthServerUrl()).thenReturn("http://localhost:8080/auth");
+ when(providerVO.getRealm()).thenReturn("testRealm");
+
+ Keycloak keycloak = mock(Keycloak.class);
+ when(Keycloak.getInstance(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(keycloak);
+
+ AccessTokenResponse tokenResponse = mock(AccessTokenResponse.class);
+ when(keycloak.tokenManager().getAccessToken()).thenReturn(tokenResponse);
+
+ RealmResource realmResource = mock(RealmResource.class);
+ when(keycloak.realm(anyString())).thenReturn(realmResource);
+
+ UserResource userResource = mock(UserResource.class);
+ when(realmResource.users().get(anyString())).thenReturn(userResource);
+
+ Map attributes = new HashMap<>();
+ attributes.put("email", "email@example.com");
+ when(userResource.toRepresentation().getAttributes()).thenReturn(attributes);
+
+ boolean result = _keycloakOAuth2Provider.verifyUser("email@example.com", "secretCode");
+
+ assertTrue(result);
+ assertNull(_keycloakOAuth2Provider.accessToken);
+ }
+}
diff --git a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/api/command/SAML2LoginAPIAuthenticatorCmd.java b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/api/command/SAML2LoginAPIAuthenticatorCmd.java
index 6741a0b40685..e514e6f7c33e 100644
--- a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/api/command/SAML2LoginAPIAuthenticatorCmd.java
+++ b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/api/command/SAML2LoginAPIAuthenticatorCmd.java
@@ -142,6 +142,8 @@ public Response processSAMLResponse(String responseMessage) {
return responseObject;
}
+<<<<<<< HEAD
+=======
protected void checkAndFailOnMissingSAMLSignature(Signature signature) {
if (signature == null && SAML2AuthManager.SAMLCheckSignature.value()) {
logger.error("Failing SAML login due to missing signature in the SAML response and signature check is enforced. " +
@@ -150,6 +152,7 @@ protected void checkAndFailOnMissingSAMLSignature(Signature signature) {
}
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Override
public String authenticate(final String command, final Map params, final HttpSession session, final InetAddress remoteAddress, final String responseType, final StringBuilder auditTrailSb, final HttpServletRequest req, final HttpServletResponse resp) throws ServerApiException {
try {
@@ -231,7 +234,10 @@ public String authenticate(final String command, final Map par
session.setAttribute(SAMLPluginConstants.SAML_IDPID, issuer.getValue());
Signature sig = processedSAMLResponse.getSignature();
+<<<<<<< HEAD
+=======
checkAndFailOnMissingSAMLSignature(sig);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (idpMetadata.getSigningCertificate() != null && sig != null) {
BasicX509Credential credential = new BasicX509Credential();
credential.setEntityCertificate(idpMetadata.getSigningCertificate());
@@ -245,8 +251,14 @@ public String authenticate(final String command, final Map par
params, responseType));
}
}
+<<<<<<< HEAD
+ if (username == null) {
+ username = SAMLUtils.getValueFromAssertions(processedSAMLResponse.getAssertions(), SAML2AuthManager.SAMLUserAttributeName.value());
+ }
+=======
username = SAMLUtils.getValueFromAssertions(processedSAMLResponse.getAssertions(), SAML2AuthManager.SAMLUserAttributeName.value());
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
for (Assertion assertion: processedSAMLResponse.getAssertions()) {
if (assertion!= null && assertion.getSubject() != null && assertion.getSubject().getNameID() != null) {
@@ -278,7 +290,10 @@ public String authenticate(final String command, final Map par
continue;
}
Signature encSig = assertion.getSignature();
+<<<<<<< HEAD
+=======
checkAndFailOnMissingSAMLSignature(encSig);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (idpMetadata.getSigningCertificate() != null && encSig != null) {
BasicX509Credential sigCredential = new BasicX509Credential();
sigCredential.setEntityCertificate(idpMetadata.getSigningCertificate());
diff --git a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAML2AuthManager.java b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAML2AuthManager.java
index a5dae36581c6..1d5d8ad47b72 100644
--- a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAML2AuthManager.java
+++ b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAML2AuthManager.java
@@ -25,6 +25,53 @@
public interface SAML2AuthManager extends PluggableAPIAuthenticator, PluggableService {
+<<<<<<< HEAD
+ public static final ConfigKey SAMLIsPluginEnabled = new ConfigKey("Advanced", Boolean.class, "saml2.enabled", "false",
+ "Indicates whether SAML SSO plugin is enabled or not", true);
+
+ public static final ConfigKey SAMLServiceProviderID = new ConfigKey("Advanced", String.class, "saml2.sp.id", "org.apache.cloudstack",
+ "SAML2 Service Provider Identifier String", true);
+
+ public static final ConfigKey SAMLServiceProviderContactPersonName = new ConfigKey("Advanced", String.class, "saml2.sp.contact.person", "CloudStack Developers",
+ "SAML2 Service Provider Contact Person Name", true);
+
+ public static final ConfigKey SAMLServiceProviderContactEmail = new ConfigKey("Advanced", String.class, "saml2.sp.contact.email", "dev@cloudstack.apache.org",
+ "SAML2 Service Provider Contact Email Address", true);
+
+ public static final ConfigKey SAMLServiceProviderOrgName = new ConfigKey("Advanced", String.class, "saml2.sp.org.name", "Apache CloudStack",
+ "SAML2 Service Provider Organization Name", true);
+
+ public static final ConfigKey SAMLServiceProviderOrgUrl = new ConfigKey("Advanced", String.class, "saml2.sp.org.url", "http://cloudstack.apache.org",
+ "SAML2 Service Provider Organization URL", true);
+
+ public static final ConfigKey SAMLServiceProviderSingleSignOnURL = new ConfigKey("Advanced", String.class, "saml2.sp.sso.url", "http://localhost:8080/client/api?command=samlSso",
+ "SAML2 CloudStack Service Provider Single Sign On URL", true);
+
+ public static final ConfigKey SAMLServiceProviderSingleLogOutURL = new ConfigKey("Advanced", String.class, "saml2.sp.slo.url", "http://localhost:8080/client/",
+ "SAML2 CloudStack Service Provider Single Log Out URL", true);
+
+ public static final ConfigKey SAMLCloudStackRedirectionUrl = new ConfigKey("Advanced", String.class, "saml2.redirect.url", "http://localhost:8080/client",
+ "The CloudStack UI url the SSO should redirected to when successful", true);
+
+ public static final ConfigKey SAMLUserAttributeName = new ConfigKey("Advanced", String.class, "saml2.user.attribute", "uid",
+ "Attribute name to be looked for in SAML response that will contain the username", true);
+
+ public static final ConfigKey SAMLIdentityProviderMetadataURL = new ConfigKey("Advanced", String.class, "saml2.idp.metadata.url", "https://openidp.feide.no/simplesaml/saml2/idp/metadata.php",
+ "SAML2 Identity Provider Metadata XML Url", true);
+
+ public static final ConfigKey SAMLDefaultIdentityProviderId = new ConfigKey("Advanced", String.class, "saml2.default.idpid", "https://openidp.feide.no",
+ "The default IdP entity ID to use only in case of multiple IdPs", true);
+
+ public static final ConfigKey SAMLSignatureAlgorithm = new ConfigKey<>(String.class, "saml2.sigalg", "Advanced", "SHA1",
+ "The algorithm to use to when signing a SAML request. Default is SHA1, allowed algorithms: SHA1, SHA256, SHA384, SHA512", true, ConfigKey.Scope.Global, null, null, null, null, null, ConfigKey.Kind.Select, "SHA1,SHA256,SHA384,SHA512");
+
+ public static final ConfigKey SAMLAppendDomainSuffix = new ConfigKey("Advanced", Boolean.class, "saml2.append.idpdomain", "false",
+ "If enabled, create account/user dialog with SAML SSO enabled will append the IdP domain to the user or account name in the UI dialog", true);
+
+ public static final ConfigKey SAMLTimeout = new ConfigKey("Advanced", Integer.class, "saml2.timeout", "1800",
+ "SAML2 IDP Metadata refresh interval in seconds, minimum value is set to 300", true);
+
+=======
ConfigKey SAMLIsPluginEnabled = new ConfigKey("Advanced", Boolean.class, "saml2.enabled", "false",
"Indicates whether SAML SSO plugin is enabled or not", true);
@@ -73,6 +120,7 @@ public interface SAML2AuthManager extends PluggableAPIAuthenticator, PluggableSe
ConfigKey SAMLCheckSignature = new ConfigKey("Advanced", Boolean.class, "saml2.check.signature", "false",
"Whether SAML2 signature must be checked, when enforced and when the SAML response does not have a signature would lead to login exception", true);
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
public SAMLProviderMetadata getSPMetadata();
public SAMLProviderMetadata getIdPMetadata(String entityId);
public Collection getAllIdPMetadata();
diff --git a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAML2AuthManagerImpl.java b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAML2AuthManagerImpl.java
index c4bd696003b8..e7291b6b4779 100644
--- a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAML2AuthManagerImpl.java
+++ b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAML2AuthManagerImpl.java
@@ -533,6 +533,10 @@ public ConfigKey>[] getConfigKeys() {
SAMLServiceProviderSingleSignOnURL, SAMLServiceProviderSingleLogOutURL,
SAMLCloudStackRedirectionUrl, SAMLUserAttributeName,
SAMLIdentityProviderMetadataURL, SAMLDefaultIdentityProviderId,
+<<<<<<< HEAD
+ SAMLSignatureAlgorithm, SAMLAppendDomainSuffix, SAMLTimeout};
+=======
SAMLSignatureAlgorithm, SAMLAppendDomainSuffix, SAMLTimeout, SAMLCheckSignature};
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
}
diff --git a/plugins/user-authenticators/saml2/src/test/java/org/apache/cloudstack/api/command/SAML2LoginAPIAuthenticatorCmdTest.java b/plugins/user-authenticators/saml2/src/test/java/org/apache/cloudstack/api/command/SAML2LoginAPIAuthenticatorCmdTest.java
index ebdc5be8fe9e..00e9167c7b08 100644
--- a/plugins/user-authenticators/saml2/src/test/java/org/apache/cloudstack/api/command/SAML2LoginAPIAuthenticatorCmdTest.java
+++ b/plugins/user-authenticators/saml2/src/test/java/org/apache/cloudstack/api/command/SAML2LoginAPIAuthenticatorCmdTest.java
@@ -271,6 +271,8 @@ public void whenFailToAuthenticateThrowExceptionOrRedirectToUrlTestSaml2FailedLo
verifyTestWhenFailToAuthenticateThrowExceptionOrRedirectToUrl(false, hasThrownServerApiException, 0, 0);
}
+<<<<<<< HEAD
+=======
private void overrideDefaultConfigValue(final ConfigKey configKey, final String name, final Object o) throws IllegalAccessException, NoSuchFieldException {
Field f = ConfigKey.class.getDeclaredField(name);
f.setAccessible(true);
@@ -295,6 +297,7 @@ public void testFailOnSAMLSignatureCheckWhenTrue() throws NoSuchFieldException,
cmd.checkAndFailOnMissingSAMLSignature(null);
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private UserAccountVO configureTestWhenFailToAuthenticateThrowExceptionOrRedirectToUrl(String entity, String configurationValue, Boolean isUserAuthorized)
throws IOException {
Mockito.when(samlAuthManager.isUserAuthorized(nullable(Long.class), nullable(String.class))).thenReturn(isUserAuthorized);
diff --git a/pom.xml b/pom.xml
index 24247f50050f..ef4d3ab5526c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -171,7 +171,11 @@
10.1
2.6.6
0.6.0
+<<<<<<< HEAD
+ 0.3.0
+=======
0.5.1
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
0.10.2
3.4.4_1
4.0.1
diff --git a/server/conf/log4j-cloud.xml.in b/server/conf/log4j-cloud.xml.in
index 5d1d3162bc41..15a4dfc8d013 100755
--- a/server/conf/log4j-cloud.xml.in
+++ b/server/conf/log4j-cloud.xml.in
@@ -67,7 +67,11 @@ under the License.
+<<<<<<< HEAD
+
+=======
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
diff --git a/server/src/main/java/com/cloud/alert/AlertManagerImpl.java b/server/src/main/java/com/cloud/alert/AlertManagerImpl.java
index 4c4f08f12bd7..60aba6a00006 100644
--- a/server/src/main/java/com/cloud/alert/AlertManagerImpl.java
+++ b/server/src/main/java/com/cloud/alert/AlertManagerImpl.java
@@ -800,7 +800,11 @@ public String getConfigComponentName() {
@Override
public ConfigKey>[] getConfigKeys() {
return new ConfigKey>[] {CPUCapacityThreshold, MemoryCapacityThreshold, StorageAllocatedCapacityThreshold, StorageCapacityThreshold, AlertSmtpEnabledSecurityProtocols,
+<<<<<<< HEAD
+ AlertSmtpUseStartTLS, Ipv6SubnetCapacityThreshold};
+=======
AlertSmtpUseStartTLS, Ipv6SubnetCapacityThreshold, AlertSmtpUseAuth};
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
@Override
diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
index 3d87347291cc..a5a0ebac4e35 100644
--- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
@@ -1004,12 +1004,15 @@ private void addSystemVmInfoToIpResponse(NicVO nic, IPAddressResponse ipResponse
if (!isAdmin) {
return;
}
+<<<<<<< HEAD
+=======
try {
nic.getInstanceId();
} catch (NullPointerException ex) {
return;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
VirtualMachine vm = ApiDBUtils.findVMInstanceById(nic.getInstanceId());
if (vm == null) {
return;
diff --git a/server/src/main/java/com/cloud/api/ApiServer.java b/server/src/main/java/com/cloud/api/ApiServer.java
index 6a03b23bcd23..42b43806fcc6 100644
--- a/server/src/main/java/com/cloud/api/ApiServer.java
+++ b/server/src/main/java/com/cloud/api/ApiServer.java
@@ -95,7 +95,12 @@
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.Configurable;
+<<<<<<< HEAD
+import org.apache.cloudstack.framework.events.EventBus;
+import org.apache.cloudstack.framework.events.EventBusException;
+=======
import org.apache.cloudstack.framework.events.EventDistributor;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.apache.cloudstack.framework.jobs.AsyncJob;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
@@ -131,9 +136,16 @@
import org.apache.http.protocol.ResponseContent;
import org.apache.http.protocol.ResponseDate;
import org.apache.http.protocol.ResponseServer;
+<<<<<<< HEAD
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+=======
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
import org.springframework.stereotype.Component;
import com.cloud.api.dispatch.DispatchChainFactory;
@@ -195,6 +207,13 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer
private static final String CONTROL_CHARACTERS = "[\000-\011\013-\014\016-\037\177]";
@Inject
+<<<<<<< HEAD
+ private ApiDispatcher dispatcher;
+ @Inject
+ private DispatchChainFactory dispatchChainFactory;
+ @Inject
+ private AccountManager accountMgr;
+=======
private AccountManager accountMgr;
@Inject
private APIAuthenticationManager authManager;
@@ -204,16 +223,29 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer
private AsyncJobManager asyncMgr;
@Inject
private DispatchChainFactory dispatchChainFactory;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@Inject
private DomainManager domainMgr;
@Inject
private DomainDao domainDao;
@Inject
+<<<<<<< HEAD
+ private UUIDManager uuidMgr;
+ @Inject
+ private AsyncJobManager asyncMgr;
+ @Inject
+ private EntityManager entityMgr;
+ @Inject
+ private APIAuthenticationManager authManager;
+ @Inject
+ private ProjectDao projectDao;
+=======
private EntityManager entityMgr;
@Inject
private ProjectDao projectDao;
@Inject
private UUIDManager uuidMgr;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private List pluggableServices;
@@ -222,7 +254,10 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer
@Inject
private ApiAsyncJobDispatcher asyncDispatcher;
+<<<<<<< HEAD
+=======
private EventDistributor eventDistributor = null;
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
private static int s_workerCount = 0;
private static Map>> s_apiNameCmdClassMap = new HashMap>>();
@@ -310,10 +345,13 @@ public boolean configure(final String name, final Map params) th
return true;
}
+<<<<<<< HEAD
+=======
public void setEventDistributor(EventDistributor eventDistributor) {
this.eventDistributor = eventDistributor;
}
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
@MessageHandler(topic = AsyncJob.Topics.JOB_EVENT_PUBLISH)
public void handleAsyncJobPublishEvent(String subject, String senderAddress, Object args) {
assert (args != null);
@@ -325,8 +363,17 @@ public void handleAsyncJobPublishEvent(String subject, String senderAddress, Obj
if (logger.isTraceEnabled())
logger.trace("Handle asyjob publish event " + jobEvent);
+<<<<<<< HEAD
+
+ EventBus eventBus = null;
+ try {
+ eventBus = ComponentContext.getComponent(EventBus.class);
+ } catch (NoSuchBeanDefinitionException nbe) {
+ return; // no provider is configured to provide events bus, so just return
+=======
if (eventDistributor == null) {
setEventDistributor(ComponentContext.getComponent(EventDistributor.class));
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
}
if (!job.getDispatcher().equalsIgnoreCase("ApiAsyncJobDispatcher")) {
@@ -339,7 +386,11 @@ public void handleAsyncJobPublishEvent(String subject, String senderAddress, Obj
// Get the event type from the cmdInfo json string
String info = job.getCmdInfo();
String cmdEventType = "unknown";
+<<<<<<< HEAD
+ Map cmdInfoObj = new HashMap();
+=======
Map cmdInfoObj = new HashMap<>();
+>>>>>>> 9e53596ba92eaec1289e97bfc9f441cc3c507002
if (info != null) {
Type type = new TypeToken