Skip to content

Commit 1e5d133

Browse files
committed
Merge branch '4.20' of https://github.com/apache/cloudstack
2 parents 39c5641 + 04731b0 commit 1e5d133

File tree

44 files changed

+864
-149
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+864
-149
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ jobs:
236236
237237
- name: Install Python dependencies
238238
run: |
239-
python3 -m pip install --user --upgrade urllib3 lxml paramiko nose texttable ipmisim pyopenssl pycrypto mock flask netaddr pylint pycodestyle six astroid pynose
239+
python3 -m pip install --user --upgrade urllib3 lxml paramiko nose texttable ipmisim pyopenssl pycryptodome mock flask netaddr pylint pycodestyle six astroid pynose
240240
241241
- name: Install jacoco dependencies
242242
run: |

core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@ public class GetVmIpAddressCommand extends Command {
2424
String vmName;
2525
String vmNetworkCidr;
2626
boolean windows = false;
27+
String macAddress;
2728

28-
public GetVmIpAddressCommand(String vmName, String vmNetworkCidr, boolean windows) {
29+
public GetVmIpAddressCommand(String vmName, String vmNetworkCidr, boolean windows, String macAddress) {
2930
this.vmName = vmName;
3031
this.windows = windows;
3132
this.vmNetworkCidr = vmNetworkCidr;
33+
this.macAddress = macAddress;
3234
}
3335

3436
@Override
@@ -47,4 +49,8 @@ public boolean isWindows(){
4749
public String getVmNetworkCidr() {
4850
return vmNetworkCidr;
4951
}
52+
53+
public String getMacAddress() {
54+
return macAddress;
55+
}
5056
}

engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl
247247
protected final ConfigKey<Boolean> CheckTxnBeforeSending = new ConfigKey<>("Developer", Boolean.class, "check.txn.before.sending.agent.commands", "false",
248248
"This parameter allows developers to enable a check to see if a transaction wraps commands that are sent to the resource. This is not to be enabled on production systems.", true);
249249

250+
public static final List<Host.Type> HOST_DOWN_ALERT_UNSUPPORTED_HOST_TYPES = Arrays.asList(
251+
Host.Type.SecondaryStorage,
252+
Host.Type.ConsoleProxy
253+
);
254+
250255
@Override
251256
public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
252257

@@ -1093,9 +1098,11 @@ protected boolean handleDisconnectWithInvestigation(final AgentAttache attache,
10931098
if (determinedState == Status.Down) {
10941099
final String message = String.format("Host %s is down. Starting HA on the VMs", host);
10951100
logger.error(message);
1096-
if (host.getType() != Host.Type.SecondaryStorage && host.getType() != Host.Type.ConsoleProxy) {
1097-
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, host.getDataCenterId(),
1098-
host.getPodId(), String.format("Host down, %s", host), message);
1101+
if (Status.Down.equals(host.getStatus())) {
1102+
logger.debug(String.format("Skipping sending alert for %s as it already in %s state",
1103+
host, host.getStatus()));
1104+
} else if (!HOST_DOWN_ALERT_UNSUPPORTED_HOST_TYPES.contains(host.getType())) {
1105+
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(), "Host down, " + host.getId(), message);
10991106
}
11001107
event = Status.Event.HostDown;
11011108
} else if (determinedState == Status.Up) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) {
595595
if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) {
596596
offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
597597
"Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null,
598-
defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, false, false, null, null, null,true, null, null, false);
598+
defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null, true, true, false, false, null, null, null,true, null, null, false);
599599
}
600600

601601
//#6 - default vpc offering with no LB service

engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworksDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,6 @@ public interface UsageNetworksDao extends GenericDao<UsageNetworksVO, Long> {
2828
void remove(long networkId, Date removed);
2929

3030
List<UsageNetworksVO> getUsageRecords(Long accountId, Date startDate, Date endDate);
31+
32+
List<UsageNetworksVO> listAll(long networkId);
3133
}

engine/schema/src/main/java/com/cloud/usage/dao/UsageNetworksDaoImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
import com.cloud.usage.UsageNetworksVO;
2020
import com.cloud.utils.DateUtil;
2121
import com.cloud.utils.db.GenericDaoBase;
22+
import com.cloud.utils.db.SearchBuilder;
2223
import com.cloud.utils.db.SearchCriteria;
2324
import com.cloud.utils.db.TransactionLegacy;
2425

2526
import org.springframework.stereotype.Component;
2627
import org.apache.logging.log4j.LogManager;
2728
import org.apache.logging.log4j.Logger;
2829

30+
import javax.annotation.PostConstruct;
2931
import java.sql.PreparedStatement;
3032
import java.sql.ResultSet;
3133
import java.util.ArrayList;
@@ -40,6 +42,14 @@ public class UsageNetworksDaoImpl extends GenericDaoBase<UsageNetworksVO, Long>
4042
" account_id = ? AND ((removed IS NULL AND created <= ?) OR (created BETWEEN ? AND ?) OR (removed BETWEEN ? AND ?) " +
4143
" OR ((created <= ?) AND (removed >= ?)))";
4244

45+
private SearchBuilder<UsageNetworksVO> usageNetworksSearch;
46+
47+
@PostConstruct
48+
public void init() {
49+
usageNetworksSearch = createSearchBuilder();
50+
usageNetworksSearch.and("networkId", usageNetworksSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
51+
usageNetworksSearch.done();
52+
}
4353

4454
@Override
4555
public void update(long networkId, long newNetworkOffering, String state) {
@@ -131,4 +141,11 @@ public List<UsageNetworksVO> getUsageRecords(Long accountId, Date startDate, Dat
131141

132142
return usageRecords;
133143
}
144+
145+
@Override
146+
public List<UsageNetworksVO> listAll(long networkId) {
147+
SearchCriteria<UsageNetworksVO> sc = usageNetworksSearch.create();
148+
sc.setParameters("networkId", networkId);
149+
return listBy(sc);
150+
}
134151
}

engine/schema/src/main/java/com/cloud/usage/dao/UsageVpcDao.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424

2525
public interface UsageVpcDao extends GenericDao<UsageVpcVO, Long> {
2626
void update(UsageVpcVO usage);
27+
2728
void remove(long vpcId, Date removed);
29+
2830
List<UsageVpcVO> getUsageRecords(Long accountId, Date startDate, Date endDate);
31+
32+
List<UsageVpcVO> listAll(long vpcId);
2933
}

engine/schema/src/main/java/com/cloud/usage/dao/UsageVpcDaoImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
import com.cloud.usage.UsageVpcVO;
2020
import com.cloud.utils.DateUtil;
2121
import com.cloud.utils.db.GenericDaoBase;
22+
import com.cloud.utils.db.SearchBuilder;
2223
import com.cloud.utils.db.SearchCriteria;
2324
import com.cloud.utils.db.TransactionLegacy;
2425
import org.springframework.stereotype.Component;
2526

27+
import javax.annotation.PostConstruct;
2628
import java.sql.PreparedStatement;
2729
import java.sql.ResultSet;
2830
import java.util.ArrayList;
@@ -36,6 +38,15 @@ public class UsageVpcDaoImpl extends GenericDaoBase<UsageVpcVO, Long> implements
3638
" account_id = ? AND ((removed IS NULL AND created <= ?) OR (created BETWEEN ? AND ?) OR (removed BETWEEN ? AND ?) " +
3739
" OR ((created <= ?) AND (removed >= ?)))";
3840

41+
private SearchBuilder<UsageVpcVO> usageVpcSearch;
42+
43+
@PostConstruct
44+
public void init() {
45+
usageVpcSearch = createSearchBuilder();
46+
usageVpcSearch.and("vpcId", usageVpcSearch.entity().getVpcId(), SearchCriteria.Op.EQ);
47+
usageVpcSearch.done();
48+
}
49+
3950
@Override
4051
public void update(UsageVpcVO usage) {
4152
TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
@@ -124,4 +135,11 @@ public List<UsageVpcVO> getUsageRecords(Long accountId, Date startDate, Date end
124135

125136
return usageRecords;
126137
}
138+
139+
@Override
140+
public List<UsageVpcVO> listAll(long vpcId) {
141+
SearchCriteria<UsageVpcVO> sc = usageVpcSearch.create();
142+
sc.setParameters("vpcId", vpcId);
143+
return listBy(sc);
144+
}
127145
}

engine/schema/src/main/resources/META-INF/db/schema-42000to42010.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,6 @@ CALL `cloud`.`IDEMPOTENT_UPDATE_API_PERMISSION`('Read-Only Admin - Default', 'va
7575

7676
CALL `cloud`.`IDEMPOTENT_UPDATE_API_PERMISSION`('Support Admin - Default', 'setupUserTwoFactorAuthentication', 'ALLOW');
7777
CALL `cloud`.`IDEMPOTENT_UPDATE_API_PERMISSION`('Support Admin - Default', 'validateUserTwoFactorAuthenticationCode', 'ALLOW');
78+
79+
-- Re-apply VPC: update default network offering for vpc tier to conserve_mode=1 (#8309)
80+
UPDATE `cloud`.`network_offerings` SET conserve_mode=1 WHERE name='DefaultIsolatedNetworkOfferingForVpcNetworks';

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVmIpAddressCommandWrapper.java

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,13 @@ public Answer execute(final GetVmIpAddressCommand command, final LibvirtComputin
6666

6767
String sanitizedVmName = sanitizeBashCommandArgument(vmName);
6868
String networkCidr = command.getVmNetworkCidr();
69+
String macAddress = command.getMacAddress();
6970

70-
ip = ipFromDomIf(sanitizedVmName, networkCidr);
71+
init();
7172

72-
if (ip == null) {
73+
ip = ipFromDomIf(sanitizedVmName, networkCidr, macAddress);
74+
75+
if (ip == null && networkCidr != null) {
7376
if(!command.isWindows()) {
7477
ip = ipFromDhcpLeaseFile(sanitizedVmName, networkCidr);
7578
} else {
@@ -87,32 +90,56 @@ public Answer execute(final GetVmIpAddressCommand command, final LibvirtComputin
8790
return new Answer(command, result, ip);
8891
}
8992

90-
private String ipFromDomIf(String sanitizedVmName, String networkCidr) {
93+
private String ipFromDomIf(String sanitizedVmName, String networkCidr, String macAddress) {
9194
String ip = null;
9295
List<String[]> commands = new ArrayList<>();
9396
commands.add(new String[]{virsh_path, "domifaddr", sanitizedVmName, "--source", "agent"});
9497
Pair<Integer,String> response = executePipedCommands(commands, 0);
9598
if (response != null) {
9699
String output = response.second();
97-
String[] lines = output.split("\n");
98-
for (String line : lines) {
99-
if (line.contains("ipv4")) {
100-
String[] parts = line.split(" ");
101-
String[] ipParts = parts[parts.length-1].split("/");
102-
if (ipParts.length > 1) {
103-
if (NetUtils.isIpWithInCidrRange(ipParts[0], networkCidr)) {
104-
ip = ipParts[0];
105-
break;
106-
}
107-
}
108-
}
100+
Pair<String, String> ipAddresses = getIpAddresses(output, macAddress);
101+
String ipv4 = ipAddresses.first();
102+
if (networkCidr == null || NetUtils.isIpWithInCidrRange(ipv4, networkCidr)) {
103+
ip = ipv4;
109104
}
110105
} else {
111106
logger.error("ipFromDomIf: Command execution failed for VM: " + sanitizedVmName);
112107
}
113108
return ip;
114109
}
115110

111+
private Pair<String, String> getIpAddresses(String output, String macAddress) {
112+
String ipv4 = null;
113+
String ipv6 = null;
114+
boolean found = false;
115+
String[] lines = output.split("\n");
116+
for (String line : lines) {
117+
String[] parts = line.replaceAll(" +", " ").trim().split(" ");
118+
if (parts.length < 4) {
119+
continue;
120+
}
121+
String device = parts[0];
122+
String mac = parts[1];
123+
if (found) {
124+
if (!device.equals("-") || !mac.equals("-")) {
125+
break;
126+
}
127+
} else if (!mac.equals(macAddress)) {
128+
continue;
129+
}
130+
found = true;
131+
String ipFamily = parts[2];
132+
String ipPart = parts[3].split("/")[0];
133+
if (ipFamily.equals("ipv4")) {
134+
ipv4 = ipPart;
135+
} else if (ipFamily.equals("ipv6")) {
136+
ipv6 = ipPart;
137+
}
138+
}
139+
logger.debug(String.format("Found ipv4: %s and ipv6: %s with mac address %s", ipv4, ipv6, macAddress));
140+
return new Pair<>(ipv4, ipv6);
141+
}
142+
116143
private String ipFromDhcpLeaseFile(String sanitizedVmName, String networkCidr) {
117144
String ip = null;
118145
List<String[]> commands = new ArrayList<>();

0 commit comments

Comments
 (0)