Skip to content

Commit 208ae84

Browse files
Merge branch '4.16' into main
2 parents 2c11171 + da56a2a commit 208ae84

32 files changed

Lines changed: 583 additions & 151 deletions

File tree

api/src/main/java/com/cloud/storage/VolumeApiService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,5 +154,7 @@ Snapshot takeSnapshot(Long volumeId, Long policyId, Long snapshotId, Account acc
154154

155155
Volume recoverVolume(long volumeId);
156156

157+
boolean validateVolumeSizeInBytes(long size);
158+
157159
Volume changeDiskOfferingForVolume(ChangeOfferingForVolumeCmd cmd) throws ResourceAllocationException;
158160
}

api/src/main/java/org/apache/cloudstack/api/BaseCmd.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ public List<Field> getParamFields() {
355355
if (roleIsAllowed) {
356356
validFields.add(field);
357357
} else {
358-
s_logger.debug("Ignoring paremeter " + parameterAnnotation.name() + " as the caller is not authorized to pass it in");
358+
s_logger.debug("Ignoring parameter " + parameterAnnotation.name() + " as the caller is not authorized to pass it in");
359359
}
360360
}
361361

engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ public interface VolumeOrchestrationService {
7575
true
7676
);
7777

78+
ConfigKey<Long> MaxVolumeSize = new ConfigKey<Long>("Storage",
79+
Long.class,
80+
"storage.max.volume.size",
81+
"2000",
82+
"The maximum size for a volume (in GB).",
83+
true);
84+
7885
VolumeInfo moveVolume(VolumeInfo volume, long destPoolDcId, Long destPoolPodId, Long destPoolClusterId, HypervisorType dataDiskHyperType)
7986
throws ConcurrentOperationException, StorageUnavailableException;
8087

engine/orchestration/src/main/java/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public String reserveVirtualMachine(VMEntityVO vmEntityVO, DeploymentPlanner pla
221221
// call retry it.
222222
return UUID.randomUUID().toString();
223223
} else {
224-
throw new InsufficientServerCapacityException("Unable to create a deployment for " + vmProfile, DataCenter.class, plan.getDataCenterId(),
224+
throw new InsufficientServerCapacityException("No destination found for a deployment for " + vmProfile, DataCenter.class, plan.getDataCenterId(),
225225
areAffinityGroupsAssociated(vmProfile));
226226
}
227227
}

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
*/
1919
package org.apache.cloudstack.engine.orchestration;
2020

21+
import static com.cloud.storage.resource.StorageProcessor.REQUEST_TEMPLATE_RELOAD;
2122
import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
2223

2324
import java.util.ArrayList;
2425
import java.util.Comparator;
26+
import java.util.Date;
2527
import java.util.HashMap;
2628
import java.util.HashSet;
2729
import java.util.List;
@@ -35,13 +37,6 @@
3537
import javax.inject.Inject;
3638
import javax.naming.ConfigurationException;
3739

38-
import com.cloud.agent.api.to.DatadiskTO;
39-
import com.cloud.vm.SecondaryStorageVmVO;
40-
import com.cloud.vm.UserVmDetailVO;
41-
import com.cloud.vm.VMInstanceVO;
42-
import com.cloud.vm.VmDetailConstants;
43-
import com.cloud.vm.dao.SecondaryStorageVmDao;
44-
import com.cloud.vm.dao.UserVmDetailsDao;
4540
import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd;
4641
import org.apache.cloudstack.api.command.admin.volume.MigrateVolumeCmdByAdmin;
4742
import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
@@ -83,12 +78,13 @@
8378
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
8479
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
8580
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
81+
import org.apache.commons.collections.CollectionUtils;
8682
import org.apache.commons.collections.MapUtils;
8783
import org.apache.commons.lang3.StringUtils;
88-
import org.apache.commons.collections.CollectionUtils;
8984
import org.apache.log4j.Logger;
9085

9186
import com.cloud.agent.api.to.DataTO;
87+
import com.cloud.agent.api.to.DatadiskTO;
9288
import com.cloud.agent.api.to.DiskTO;
9389
import com.cloud.agent.api.to.VirtualMachineTO;
9490
import com.cloud.agent.manager.allocator.PodAllocator;
@@ -150,21 +146,24 @@
150146
import com.cloud.utils.fsm.NoTransitionException;
151147
import com.cloud.utils.fsm.StateMachine2;
152148
import com.cloud.vm.DiskProfile;
149+
import com.cloud.vm.SecondaryStorageVmVO;
153150
import com.cloud.vm.UserVmCloneSettingVO;
151+
import com.cloud.vm.UserVmDetailVO;
154152
import com.cloud.vm.UserVmVO;
153+
import com.cloud.vm.VMInstanceVO;
155154
import com.cloud.vm.VirtualMachine;
156155
import com.cloud.vm.VirtualMachine.State;
157156
import com.cloud.vm.VirtualMachineProfile;
158157
import com.cloud.vm.VirtualMachineProfileImpl;
158+
import com.cloud.vm.VmDetailConstants;
159159
import com.cloud.vm.VmWorkAttachVolume;
160160
import com.cloud.vm.VmWorkMigrateVolume;
161161
import com.cloud.vm.VmWorkSerializer;
162162
import com.cloud.vm.VmWorkTakeVolumeSnapshot;
163+
import com.cloud.vm.dao.SecondaryStorageVmDao;
163164
import com.cloud.vm.dao.UserVmCloneSettingDao;
164165
import com.cloud.vm.dao.UserVmDao;
165-
166-
import static com.cloud.storage.resource.StorageProcessor.REQUEST_TEMPLATE_RELOAD;
167-
import java.util.Date;
166+
import com.cloud.vm.dao.UserVmDetailsDao;
168167

169168
public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrationService, Configurable {
170169

@@ -1779,8 +1778,6 @@ public boolean canVmRestartOnAnotherServer(long vmId) {
17791778
return true;
17801779
}
17811780

1782-
public static final ConfigKey<Long> MaxVolumeSize = new ConfigKey<Long>(Long.class, "storage.max.volume.size", "Storage", "2000", "The maximum size for a volume (in GB).", true);
1783-
17841781
public static final ConfigKey<Boolean> RecreatableSystemVmEnabled = new ConfigKey<Boolean>(Boolean.class, "recreate.systemvm.enabled", "Advanced", "false",
17851782
"If true, will recreate system vm root disk whenever starting system vm", true);
17861783

framework/managed-context/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
</parent>
3030
<dependencies>
3131
<dependency>
32-
<groupId>log4j</groupId>
33-
<artifactId>log4j</artifactId>
34-
<version>${cs.log4j.version}</version>
32+
<groupId>ch.qos.reload4j</groupId>
33+
<artifactId>reload4j</artifactId>
34+
<version>${cs.reload4j.version}</version>
3535
</dependency>
3636
</dependencies>
3737
</project>

framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -139,16 +139,15 @@ public List<QuotaUsageVO> aggregatePendingQuotaRecordsForAccount(final AccountVO
139139
}
140140
s_logger.info("Getting pending quota records for account=" + account.getAccountName());
141141
for (UsageVO usageRecord : usageRecords.first()) {
142-
BigDecimal aggregationRatio = new BigDecimal(_aggregationDuration).divide(s_minutesInMonth, 8, RoundingMode.HALF_EVEN);
143142
switch (usageRecord.getUsageType()) {
144143
case QuotaTypes.RUNNING_VM:
145-
List<QuotaUsageVO> lq = updateQuotaRunningVMUsage(usageRecord, aggregationRatio);
144+
List<QuotaUsageVO> lq = updateQuotaRunningVMUsage(usageRecord);
146145
if (!lq.isEmpty()) {
147146
quotaListForAccount.addAll(lq);
148147
}
149148
break;
150149
case QuotaTypes.ALLOCATED_VM:
151-
QuotaUsageVO qu = updateQuotaAllocatedVMUsage(usageRecord, aggregationRatio);
150+
QuotaUsageVO qu = updateQuotaAllocatedVMUsage(usageRecord);
152151
if (qu != null) {
153152
quotaListForAccount.add(qu);
154153
}
@@ -159,7 +158,7 @@ public List<QuotaUsageVO> aggregatePendingQuotaRecordsForAccount(final AccountVO
159158
case QuotaTypes.VOLUME:
160159
case QuotaTypes.VM_SNAPSHOT:
161160
case QuotaTypes.BACKUP:
162-
qu = updateQuotaDiskUsage(usageRecord, aggregationRatio, usageRecord.getUsageType());
161+
qu = updateQuotaDiskUsage(usageRecord, usageRecord.getUsageType());
163162
if (qu != null) {
164163
quotaListForAccount.add(qu);
165164
}
@@ -170,7 +169,7 @@ public List<QuotaUsageVO> aggregatePendingQuotaRecordsForAccount(final AccountVO
170169
case QuotaTypes.NETWORK_OFFERING:
171170
case QuotaTypes.SECURITY_GROUP:
172171
case QuotaTypes.VPN_USERS:
173-
qu = updateQuotaRaw(usageRecord, aggregationRatio, usageRecord.getUsageType());
172+
qu = updateQuotaRaw(usageRecord, usageRecord.getUsageType());
174173
if (qu != null) {
175174
quotaListForAccount.add(qu);
176175
}
@@ -333,14 +332,14 @@ public boolean calculateQuotaUsage() {
333332
return true;
334333
}
335334

336-
public QuotaUsageVO updateQuotaDiskUsage(UsageVO usageRecord, final BigDecimal aggregationRatio, final int quotaType) {
335+
public QuotaUsageVO updateQuotaDiskUsage(UsageVO usageRecord, final int quotaType) {
337336
QuotaUsageVO quota_usage = null;
338337
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(quotaType, usageRecord.getEndDate());
339338
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
340339
BigDecimal quotaUsgage;
341340
BigDecimal onehourcostpergb;
342341
BigDecimal noofgbinuse;
343-
onehourcostpergb = tariff.getCurrencyValue().multiply(aggregationRatio);
342+
onehourcostpergb = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
344343
noofgbinuse = new BigDecimal(usageRecord.getSize()).divide(s_gb, 8, RoundingMode.HALF_EVEN);
345344
quotaUsgage = new BigDecimal(usageRecord.getRawUsage()).multiply(onehourcostpergb).multiply(noofgbinuse);
346345
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), usageRecord.getUsageType(),
@@ -352,7 +351,7 @@ public QuotaUsageVO updateQuotaDiskUsage(UsageVO usageRecord, final BigDecimal a
352351
return quota_usage;
353352
}
354353

355-
public List<QuotaUsageVO> updateQuotaRunningVMUsage(UsageVO usageRecord, final BigDecimal aggregationRatio) {
354+
public List<QuotaUsageVO> updateQuotaRunningVMUsage(UsageVO usageRecord) {
356355
List<QuotaUsageVO> quotalist = new ArrayList<QuotaUsageVO>();
357356
QuotaUsageVO quota_usage;
358357
BigDecimal cpuquotausgage, speedquotausage, memoryquotausage, vmusage;
@@ -368,7 +367,7 @@ public List<QuotaUsageVO> updateQuotaRunningVMUsage(UsageVO usageRecord, final B
368367
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.CPU_NUMBER, usageRecord.getEndDate());
369368
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0 && serviceoffering.getCpu() != null) {
370369
BigDecimal cpu = new BigDecimal(serviceoffering.getCpu());
371-
onehourcostpercpu = tariff.getCurrencyValue().multiply(aggregationRatio);
370+
onehourcostpercpu = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
372371
cpuquotausgage = rawusage.multiply(onehourcostpercpu).multiply(cpu);
373372
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.CPU_NUMBER,
374373
cpuquotausgage, usageRecord.getStartDate(), usageRecord.getEndDate());
@@ -377,8 +376,8 @@ public List<QuotaUsageVO> updateQuotaRunningVMUsage(UsageVO usageRecord, final B
377376
}
378377
tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.CPU_CLOCK_RATE, usageRecord.getEndDate());
379378
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0 && serviceoffering.getSpeed() != null) {
380-
BigDecimal speed = new BigDecimal(serviceoffering.getSpeed() / 100.00);
381-
onehourcostper100mhz = tariff.getCurrencyValue().multiply(aggregationRatio);
379+
BigDecimal speed = new BigDecimal(serviceoffering.getSpeed()*serviceoffering.getCpu() / 100.00);
380+
onehourcostper100mhz = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
382381
speedquotausage = rawusage.multiply(onehourcostper100mhz).multiply(speed);
383382
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.CPU_CLOCK_RATE,
384383
speedquotausage, usageRecord.getStartDate(), usageRecord.getEndDate());
@@ -388,7 +387,7 @@ public List<QuotaUsageVO> updateQuotaRunningVMUsage(UsageVO usageRecord, final B
388387
tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.MEMORY, usageRecord.getEndDate());
389388
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0 && serviceoffering.getRamSize() != null) {
390389
BigDecimal memory = new BigDecimal(serviceoffering.getRamSize());
391-
onehourcostper1mb = tariff.getCurrencyValue().multiply(aggregationRatio);
390+
onehourcostper1mb = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
392391
memoryquotausage = rawusage.multiply(onehourcostper1mb).multiply(memory);
393392
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.MEMORY, memoryquotausage,
394393
usageRecord.getStartDate(), usageRecord.getEndDate());
@@ -397,7 +396,7 @@ public List<QuotaUsageVO> updateQuotaRunningVMUsage(UsageVO usageRecord, final B
397396
}
398397
tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.RUNNING_VM, usageRecord.getEndDate());
399398
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
400-
onehourcostforvmusage = tariff.getCurrencyValue().multiply(aggregationRatio);
399+
onehourcostforvmusage = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
401400
vmusage = rawusage.multiply(onehourcostforvmusage);
402401
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.RUNNING_VM, vmusage,
403402
usageRecord.getStartDate(), usageRecord.getEndDate());
@@ -410,13 +409,13 @@ public List<QuotaUsageVO> updateQuotaRunningVMUsage(UsageVO usageRecord, final B
410409
return quotalist;
411410
}
412411

413-
public QuotaUsageVO updateQuotaAllocatedVMUsage(UsageVO usageRecord, final BigDecimal aggregationRatio) {
412+
public QuotaUsageVO updateQuotaAllocatedVMUsage(UsageVO usageRecord) {
414413
QuotaUsageVO quota_usage = null;
415414
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.ALLOCATED_VM, usageRecord.getEndDate());
416415
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
417416
BigDecimal vmusage;
418417
BigDecimal onehourcostforvmusage;
419-
onehourcostforvmusage = tariff.getCurrencyValue().multiply(aggregationRatio);
418+
onehourcostforvmusage = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
420419
vmusage = new BigDecimal(usageRecord.getRawUsage()).multiply(onehourcostforvmusage);
421420
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.ALLOCATED_VM, vmusage,
422421
usageRecord.getStartDate(), usageRecord.getEndDate());
@@ -428,13 +427,13 @@ public QuotaUsageVO updateQuotaAllocatedVMUsage(UsageVO usageRecord, final BigDe
428427
return quota_usage;
429428
}
430429

431-
public QuotaUsageVO updateQuotaRaw(UsageVO usageRecord, final BigDecimal aggregationRatio, final int ruleType) {
430+
public QuotaUsageVO updateQuotaRaw(UsageVO usageRecord, final int ruleType) {
432431
QuotaUsageVO quota_usage = null;
433432
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(ruleType, usageRecord.getEndDate());
434433
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
435434
BigDecimal ruleusage;
436435
BigDecimal onehourcost;
437-
onehourcost = tariff.getCurrencyValue().multiply(aggregationRatio);
436+
onehourcost = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
438437
ruleusage = new BigDecimal(usageRecord.getRawUsage()).multiply(onehourcost);
439438
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), ruleType, ruleusage,
440439
usageRecord.getStartDate(), usageRecord.getEndDate());

framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public void testAggregatePendingQuotaRecordsForAccount() {
151151

152152
QuotaUsageVO quotaUsageVO = new QuotaUsageVO();
153153
quotaUsageVO.setAccountId(2L);
154-
Mockito.doReturn(quotaUsageVO).when(quotaManager).updateQuotaAllocatedVMUsage(Mockito.eq(usageVO), Mockito.any(BigDecimal.class));
154+
Mockito.doReturn(quotaUsageVO).when(quotaManager).updateQuotaAllocatedVMUsage(Mockito.eq(usageVO));
155155

156156
assertTrue(quotaManager.aggregatePendingQuotaRecordsForAccount(accountVO, new Pair<List<? extends UsageVO>, Integer>(null, 0)).size() == 0);
157157
assertTrue(quotaManager.aggregatePendingQuotaRecordsForAccount(accountVO, usageRecords).size() == 1);
@@ -172,11 +172,11 @@ public void testUpdateQuotaRecords() {
172172

173173
QuotaUsageVO qu = quotaManager.updateQuotaNetwork(usageVO, UsageTypes.NETWORK_BYTES_SENT);
174174
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
175-
qu = quotaManager.updateQuotaAllocatedVMUsage(usageVO, new BigDecimal(0.5));
175+
qu = quotaManager.updateQuotaAllocatedVMUsage(usageVO);
176176
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
177-
qu = quotaManager.updateQuotaDiskUsage(usageVO, new BigDecimal(0.5), UsageTypes.VOLUME);
177+
qu = quotaManager.updateQuotaDiskUsage(usageVO, UsageTypes.VOLUME);
178178
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
179-
qu = quotaManager.updateQuotaRaw(usageVO, new BigDecimal(0.5), UsageTypes.VPN_USERS);
179+
qu = quotaManager.updateQuotaRaw(usageVO, UsageTypes.VPN_USERS);
180180
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
181181

182182
Mockito.verify(quotaUsageDao, Mockito.times(4)).persistQuotaUsage(Mockito.any(QuotaUsageVO.class));

plugins/affinity-group-processors/explicit-dedication/src/main/java/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,9 @@ private ExcludeList updateAvoidList(List<DedicatedResourceVO> dedicatedResources
305305
for (HostPodVO pod : podList) {
306306
DedicatedResourceVO dPod = _dedicatedDao.findByPodId(pod.getId());
307307
if (dPod != null && !dedicatedResources.contains(dPod)) {
308+
if (s_logger.isDebugEnabled()) {
309+
s_logger.debug(String.format("Avoiding POD %s [%s] because it is not dedicated.", pod.getName(), pod.getUuid()));
310+
}
308311
avoidList.addPod(pod.getId());
309312
} else {
310313
includeList.addPod(pod.getId());
@@ -343,6 +346,9 @@ private ExcludeList updateAvoidList(List<DedicatedResourceVO> dedicatedResources
343346

344347
for (HostPodVO pod : pods) {
345348
if (podsInIncludeList != null && !podsInIncludeList.contains(pod.getId())) {
349+
if (s_logger.isDebugEnabled()) {
350+
s_logger.debug(String.format("Avoiding POD %s [%s], as it is not in include list.", pod.getName(), pod.getUuid()));
351+
}
346352
avoidList.addPod(pod.getId());
347353
}
348354
}

plugins/alert-handlers/snmp-alerts/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
<artifactId>org.apache.servicemix.bundles.snmp4j</artifactId>
3434
</dependency>
3535
<dependency>
36-
<groupId>log4j</groupId>
37-
<artifactId>log4j</artifactId>
36+
<groupId>ch.qos.reload4j</groupId>
37+
<artifactId>reload4j</artifactId>
3838
</dependency>
3939
</dependencies>
4040
</project>

0 commit comments

Comments
 (0)