Skip to content

Commit bdd8105

Browse files
committed
ui: show, allow host externaldetails update
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent bd84a5c commit bdd8105

14 files changed

Lines changed: 138 additions & 77 deletions

File tree

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
import com.cloud.utils.db.EntityManager;
9595
import com.cloud.utils.db.UUIDManager;
9696
import com.cloud.vm.UserVmService;
97+
import com.cloud.vm.VmDetailConstants;
9798
import com.cloud.vm.snapshot.VMSnapshotService;
9899

99100
public abstract class BaseCmd {
@@ -484,4 +485,14 @@ public Map<String, String> convertDetailsToMap(Map details) {
484485
}
485486
return detailsMap;
486487
}
488+
489+
public Map<String, String> convertExternalDetailsToMap(Map externalDetails) {
490+
Map<String, String> customparameterMap = convertDetailsToMap(externalDetails);
491+
Map<String, String> details = new HashMap<>();
492+
for (String key : customparameterMap.keySet()) {
493+
String value = customparameterMap.get(key);
494+
details.put(VmDetailConstants.EXTERNAL_DETAIL_PREFIX + key, value);
495+
}
496+
return details;
497+
}
487498
}

api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/AddClusterCmd.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public class AddClusterCmd extends BaseCmd {
134134

135135
@Parameter(name = ApiConstants.EXTERNAL_DETAILS,
136136
type = CommandType.MAP,
137-
description = "Details in key/value pairs using format externaldetails[i].keyname=keyvalue. Example: externaldetails[0].endpoint.url=urlvalue",
137+
description = "Details in key/value pairs to be added to the extension-resource mapping. Use the format externaldetails[i].<key>=<value>. Example: externaldetails[0].endpoint.url=https://example.com",
138138
since = "4.21.0")
139139
protected Map externalDetails;
140140

api/src/main/java/org/apache/cloudstack/api/command/admin/host/AddHostCmd.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.apache.cloudstack.api.command.admin.host;
1818

1919
import java.util.ArrayList;
20-
import java.util.HashMap;
2120
import java.util.List;
2221
import java.util.Map;
2322

@@ -36,7 +35,6 @@
3635
import com.cloud.exception.DiscoveryException;
3736
import com.cloud.host.Host;
3837
import com.cloud.user.Account;
39-
import com.cloud.vm.VmDetailConstants;
4038

4139
@APICommand(name = "addHost", description = "Adds a new host.", responseObject = HostResponse.class,
4240
requestHasSensitiveInfo = true, responseHasSensitiveInfo = false)
@@ -138,13 +136,7 @@ public String getAllocationState() {
138136
}
139137

140138
public Map<String, String> getExternalDetails() {
141-
Map<String, String> customparameterMap = convertDetailsToMap(externalDetails);
142-
Map<String, String> details = new HashMap<>();
143-
for (String key : customparameterMap.keySet()) {
144-
String value = customparameterMap.get(key);
145-
details.put(VmDetailConstants.EXTERNAL_DETAIL_PREFIX + key, value);
146-
}
147-
return details;
139+
return convertExternalDetailsToMap(externalDetails);
148140
}
149141

150142
/////////////////////////////////////////////////////

api/src/main/java/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
// under the License.
1717
package org.apache.cloudstack.api.command.admin.host;
1818

19-
import com.cloud.host.Host;
20-
import com.cloud.user.Account;
21-
import com.cloud.vm.VmDetailConstants;
19+
import java.util.List;
20+
import java.util.Map;
21+
2222
import org.apache.cloudstack.acl.RoleType;
2323
import org.apache.cloudstack.api.APICommand;
2424
import org.apache.cloudstack.api.ApiConstants;
@@ -29,9 +29,8 @@
2929
import org.apache.cloudstack.api.response.GuestOSCategoryResponse;
3030
import org.apache.cloudstack.api.response.HostResponse;
3131

32-
import java.util.HashMap;
33-
import java.util.List;
34-
import java.util.Map;
32+
import com.cloud.host.Host;
33+
import com.cloud.user.Account;
3534

3635
@APICommand(name = "updateHost", description = "Updates a host.", responseObject = HostResponse.class,
3736
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -110,13 +109,7 @@ public String getAnnotation() {
110109
}
111110

112111
public Map<String, String> getExternalDetails() {
113-
Map<String, String> customparameterMap = convertDetailsToMap(externalDetails);
114-
Map<String, String> details = new HashMap<>();
115-
for (String key : customparameterMap.keySet()) {
116-
String value = customparameterMap.get(key);
117-
details.put(VmDetailConstants.EXTERNAL_DETAIL_PREFIX + key, value);
118-
}
119-
return details;
112+
return convertExternalDetailsToMap(externalDetails);
120113
}
121114

122115
/////////////////////////////////////////////////////

api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import com.cloud.offering.ServiceOffering;
4545
import com.cloud.storage.Storage;
4646
import com.cloud.user.Account;
47-
import com.cloud.vm.VmDetailConstants;
4847

4948
@APICommand(name = "createServiceOffering", description = "Creates a service offering.", responseObject = ServiceOfferingResponse.class,
5049
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -382,13 +381,7 @@ public Map<String, String> getDetails() {
382381
}
383382

384383
public Map<String, String> getExternalDetails() {
385-
Map<String, String> customparameterMap = convertDetailsToMap(externalDetails);
386-
Map<String, String> details = new HashMap<>();
387-
for (String key : customparameterMap.keySet()) {
388-
String value = customparameterMap.get(key);
389-
details.put(VmDetailConstants.EXTERNAL_DETAIL_PREFIX + key, value);
390-
}
391-
return details;
384+
return convertExternalDetailsToMap(externalDetails);
392385
}
393386

394387
public Long getRootDiskSize() {

api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.net.URISyntaxException;
2020
import java.util.ArrayList;
2121
import java.util.Collection;
22-
import java.util.HashMap;
2322
import java.util.List;
2423
import java.util.Map;
2524

@@ -47,7 +46,6 @@
4746
import com.cloud.hypervisor.Hypervisor;
4847
import com.cloud.hypervisor.HypervisorGuru;
4948
import com.cloud.template.VirtualMachineTemplate;
50-
import com.cloud.vm.VmDetailConstants;
5149

5250
@APICommand(name = "registerTemplate", description = "Registers an existing template into the CloudStack cloud. ", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted,
5351
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -328,13 +326,7 @@ public Long getExtensionId() {
328326
}
329327

330328
public Map<String, String> getExternalDetails() {
331-
Map<String, String> customparameterMap = convertDetailsToMap(externalDetails);
332-
Map<String, String> details = new HashMap<>();
333-
for (String key : customparameterMap.keySet()) {
334-
String value = customparameterMap.get(key);
335-
details.put(VmDetailConstants.EXTERNAL_DETAIL_PREFIX + key, value);
336-
}
337-
return details;
329+
return convertExternalDetailsToMap(externalDetails);
338330
}
339331

340332
/////////////////////////////////////////////////////

api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -386,13 +386,7 @@ public Map<String, String> getDetails() {
386386
}
387387

388388
public Map<String, String> getExternalDetails() {
389-
Map<String, String> customparameterMap = convertDetailsToMap(externalDetails);
390-
Map<String, String> details = new HashMap<>();
391-
for (String key : customparameterMap.keySet()) {
392-
String value = customparameterMap.get(key);
393-
details.put(VmDetailConstants.EXTERNAL_DETAIL_PREFIX + key, value);
394-
}
395-
return details;
389+
return convertExternalDetailsToMap(externalDetails);
396390
}
397391

398392
public ApiConstants.BootMode getBootMode() {

engine/schema/src/main/java/com/cloud/host/dao/HostDetailsDao.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ public interface HostDetailsDao extends GenericDao<DetailVO, Long> {
3333

3434
List<DetailVO> findByName(String name);
3535

36-
List<DetailVO> findByNameAndValue(String name, String value);
36+
void replaceExternalDetails(long hostId, Map<String, String> details);
37+
3738
}

engine/schema/src/main/java/com/cloud/host/dao/HostDetailsDaoImpl.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.sql.PreparedStatement;
2020
import java.sql.SQLException;
21+
import java.util.ArrayList;
2122
import java.util.HashMap;
2223
import java.util.List;
2324
import java.util.Map;
@@ -31,6 +32,7 @@
3132
import com.cloud.utils.db.SearchCriteria;
3233
import com.cloud.utils.db.TransactionLegacy;
3334
import com.cloud.utils.exception.CloudRuntimeException;
35+
import com.cloud.vm.VmDetailConstants;
3436

3537
@Component
3638
public class HostDetailsDaoImpl extends GenericDaoBase<DetailVO, Long> implements HostDetailsDao {
@@ -50,7 +52,6 @@ public HostDetailsDaoImpl() {
5052

5153
DetailNameSearch = createSearchBuilder();
5254
DetailNameSearch.and("name", DetailNameSearch.entity().getName(), SearchCriteria.Op.EQ);
53-
DetailNameSearch.and("value", DetailNameSearch.entity().getValue(), SearchCriteria.Op.EQ);
5455
DetailNameSearch.done();
5556
}
5657

@@ -133,10 +134,32 @@ public List<DetailVO> findByName(String name) {
133134
}
134135

135136
@Override
136-
public List<DetailVO> findByNameAndValue(String name, String value) {
137-
SearchCriteria<DetailVO> sc = DetailNameSearch.create();
138-
sc.setParameters("name", name);
139-
sc.setParameters("value", value);
140-
return listBy(sc);
137+
public void replaceExternalDetails(long hostId, Map<String, String> details) {
138+
if (details.isEmpty()) {
139+
return;
140+
}
141+
TransactionLegacy txn = TransactionLegacy.currentTxn();
142+
txn.start();
143+
List<DetailVO> detailVOs = new ArrayList<>();
144+
for (Map.Entry<String, String> entry : details.entrySet()) {
145+
String name = entry.getKey();
146+
String value = entry.getValue();
147+
if ("password".equals(entry.getKey())) {
148+
value = DBEncryptionUtil.encrypt(value);
149+
}
150+
detailVOs.add(new DetailVO(hostId, name, value));
151+
}
152+
SearchBuilder<DetailVO> sb = createSearchBuilder();
153+
sb.and("hostId", sb.entity().getHostId(), SearchCriteria.Op.EQ);
154+
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
155+
sb.done();
156+
SearchCriteria<DetailVO> sc = sb.create();
157+
sc.setParameters("resourceId", hostId);
158+
sc.setParameters("name", VmDetailConstants.EXTERNAL_DETAIL_PREFIX + "%");
159+
remove(sc);
160+
for (DetailVO detail : detailVOs) {
161+
persist(detail);
162+
}
163+
txn.commit();
141164
}
142165
}

server/src/main/java/com/cloud/resource/ResourceManagerImpl.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2791,7 +2791,7 @@ private Host updateHost(Long hostId, String name, Long guestOSCategoryId, String
27912791
}
27922792

27932793
if (MapUtils.isNotEmpty(externalDetails)) {
2794-
updateExternalHypervisorDetails(hostId, externalDetails);
2794+
_hostDetailsDao.replaceExternalDetails(hostId, externalDetails);
27952795
}
27962796

27972797
if (url != null) {
@@ -2811,16 +2811,6 @@ private Host updateHost(Long hostId, String name, Long guestOSCategoryId, String
28112811
return updatedHost;
28122812
}
28132813

2814-
private void updateExternalHypervisorDetails(long hostId, Map<String, String> externalDetails) {
2815-
HostVO host = _hostDao.findById(hostId);
2816-
_hostDao.loadDetails(host);
2817-
for (Map.Entry<String, String> entry : externalDetails.entrySet()) {
2818-
host.getDetails().put(entry.getKey(), entry.getValue());
2819-
}
2820-
2821-
_hostDao.saveDetails(host);
2822-
}
2823-
28242814
private void sendAlertAndAnnotationForAutoEnableDisableKVMHostFeature(HostVO host, String allocationState,
28252815
boolean isUpdateFromHostHealthCheck,
28262816
boolean isUpdateHostAllocation, String annotation) {

0 commit comments

Comments
 (0)