diff --git a/ui/src/views/extension/CreateExtension.vue b/ui/src/views/extension/CreateExtension.vue
index 11d0c776e4d..0dfde238279 100644
--- a/ui/src/views/extension/CreateExtension.vue
+++ b/ui/src/views/extension/CreateExtension.vue
@@ -135,7 +135,7 @@ export default {
if (!value || value.length === 0) {
return ''
}
- return value.replace(/[^a-zA-Z0-9._-]/g, '').toLowerCase()
+ return value.replace(/[^a-zA-Z0-9._-]/g, '_').toLowerCase()
},
extenstionBasePath () {
return (this.$store.getters.features.extensionspath || '[EXTENSIONS_PATH]') + '/' + this.safeName + '/'
diff --git a/ui/src/views/infra/network/ServiceProvidersTab.vue b/ui/src/views/infra/network/ServiceProvidersTab.vue
index 1aff9db5f32..f659ce1f016 100644
--- a/ui/src/views/infra/network/ServiceProvidersTab.vue
+++ b/ui/src/views/infra/network/ServiceProvidersTab.vue
@@ -535,65 +535,6 @@ export default {
],
details: ['name', 'state', 'id', 'servicelist', 'physicalnetworkid']
},
- {
- title: 'F5BigIp',
- actions: [
- {
- api: 'addF5LoadBalancer',
- listView: true,
- icon: 'plus-outlined',
- label: 'label.add.f5.device',
- component: shallowRef(defineAsyncComponent(() => import('@/views/infra/network/providers/AddF5LoadBalancer.vue')))
- },
- {
- api: 'updateNetworkServiceProvider',
- icon: 'stop-outlined',
- listView: true,
- label: 'label.disable.provider',
- confirm: 'message.confirm.disable.provider',
- show: (record) => { return record && record.id && record.state === 'Enabled' },
- mapping: {
- state: {
- value: (record) => { return 'Disabled' }
- }
- }
- },
- {
- api: 'updateNetworkServiceProvider',
- icon: 'play-circle-outlined',
- listView: true,
- label: 'label.enable.provider',
- confirm: 'message.confirm.enable.provider',
- show: (record) => { return record && record.id && record.state === 'Disabled' },
- mapping: {
- state: {
- value: (record) => { return 'Enabled' }
- }
- }
- },
- {
- api: 'deleteNetworkServiceProvider',
- listView: true,
- icon: 'poweroff-outlined',
- label: 'label.shutdown.provider',
- confirm: 'message.confirm.delete.provider',
- show: (record) => { return record && record.id }
- }
- ],
- details: ['name', 'state', 'id', 'servicelist'],
- lists: [
- {
- title: 'label.devices',
- api: 'listF5LoadBalancers',
- mapping: {
- physicalnetworkid: {
- value: (record) => { return record.physicalnetworkid }
- }
- },
- columns: ['ipaddress', 'lbdevicestate', 'actions']
- }
- ]
- },
{
title: 'GloboDns',
actions: [
diff --git a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue
index 79ee68c9124..0334b38515f 100644
--- a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue
+++ b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue
@@ -903,6 +903,17 @@ export default {
this.setStepStatus(STATUS_FAILED)
}
},
+ async stepNetworkingProviderOrStorageTraffic () {
+ if (this.stepData.isTungstenZone) {
+ await this.stepCreateTungstenFabricPublicNetwork()
+ } else if (this.stepData.isNsxZone) {
+ await this.stepAddNsxController()
+ } else if (this.stepData.isNetrisZone) {
+ await this.stepAddNetrisProvider()
+ } else {
+ await this.stepConfigureStorageTraffic()
+ }
+ },
async stepConfigurePublicTraffic (message, trafficType, idx) {
if (
(this.isBasicZone &&
@@ -997,17 +1008,11 @@ export default {
await this.stepConfigurePublicTraffic('message.configuring.nsx.public.traffic', 'nsxPublicTraffic', 1)
} else if (isolationMethods.includes('netris')) {
await this.stepConfigurePublicTraffic('message.configuring.netris.public.traffic', 'netrisPublicTraffic', 1)
+ } else {
+ await this.stepNetworkingProviderOrStorageTraffic()
}
} else {
- if (this.stepData.isTungstenZone) {
- await this.stepCreateTungstenFabricPublicNetwork()
- } else if (this.stepData.isNsxZone) {
- await this.stepAddNsxController()
- } else if (this.stepData.isNetrisZone) {
- await this.stepAddNetrisProvider()
- } else {
- await this.stepConfigureStorageTraffic()
- }
+ await this.stepNetworkingProviderOrStorageTraffic()
}
} else if (this.isAdvancedZone && this.sgEnabled) {
if (this.stepData.isTungstenZone) {
@@ -2206,7 +2211,11 @@ export default {
resolve(result)
}).catch(error => {
message = error.response.headers['x-description']
- reject(message)
+ if (message.includes('is already in the database')) {
+ resolve()
+ } else {
+ reject(message)
+ }
})
})
},
@@ -2218,11 +2227,7 @@ export default {
resolve()
}).catch(error => {
message = error.response.headers['x-description']
- if (message.includes('is already in the database')) {
- resolve()
- } else {
- reject(message)
- }
+ reject(message)
})
})
},
diff --git a/ui/src/views/network/CreateVpc.vue b/ui/src/views/network/CreateVpc.vue
index 0b251364a92..98e8bb408c1 100644
--- a/ui/src/views/network/CreateVpc.vue
+++ b/ui/src/views/network/CreateVpc.vue
@@ -72,7 +72,7 @@
:placeholder="apiParams.cidr.description"/>
@@ -276,6 +276,9 @@ export default {
return sourcenatService && sourcenatService.length === 1
}
return false
+ },
+ selectedVpcOfferingHavingRoutedNetworkMode () {
+ return this.selectedVpcOffering && this.selectedVpcOffering.networkmode === 'ROUTED'
}
},
methods: {
@@ -397,6 +400,7 @@ export default {
handleVpcOfferingChange (value) {
this.selectedVpcOffering = {}
if (!value) {
+ this.updateCidrRule()
return
}
for (var offering of this.vpcOfferings) {
@@ -406,9 +410,17 @@ export default {
if (this.isASNumberRequired()) {
this.fetchZoneASNumbers()
}
- return
+ break
}
}
+ this.updateCidrRule()
+ },
+ updateCidrRule () {
+ if (!this.selectedVpcOfferingHavingRoutedNetworkMode) {
+ this.rules.cidr = [{ required: true, message: this.$t('message.error.required.input') }]
+ } else {
+ delete this.rules.cidr
+ }
},
handleASNumberChange (selectedIndex) {
this.selectedAsNumber = this.asNumbersZone[selectedIndex].asnumber
diff --git a/usage/pom.xml b/usage/pom.xml
index cfc9317d597..632becca598 100644
--- a/usage/pom.xml
+++ b/usage/pom.xml
@@ -24,7 +24,7 @@
org.apache.cloudstack
cloudstack
- 4.21.0.0-SNAPSHOT
+ 4.22.0.0-SNAPSHOT
diff --git a/utils/pom.xml b/utils/pom.xml
index 1f7235ea97e..f38a1a58910 100755
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -24,7 +24,7 @@
org.apache.cloudstack
cloudstack
- 4.21.0.0-SNAPSHOT
+ 4.22.0.0-SNAPSHOT
../pom.xml
diff --git a/utils/src/main/java/com/cloud/utils/ConstantTimeComparator.java b/utils/src/main/java/com/cloud/utils/ConstantTimeComparator.java
index baf2bc2738f..48925097f70 100644
--- a/utils/src/main/java/com/cloud/utils/ConstantTimeComparator.java
+++ b/utils/src/main/java/com/cloud/utils/ConstantTimeComparator.java
@@ -19,8 +19,6 @@
package com.cloud.utils;
-import java.nio.charset.Charset;
-
public class ConstantTimeComparator {
public static boolean compareBytes(byte[] b1, byte[] b2) {
@@ -36,7 +34,6 @@ public class ConstantTimeComparator {
}
public static boolean compareStrings(String s1, String s2) {
- final Charset encoding = Charset.forName("UTF-8");
- return compareBytes(s1.getBytes(encoding), s2.getBytes(encoding));
+ return compareBytes(s1.getBytes(StringUtils.getPreferredCharset()), s2.getBytes(StringUtils.getPreferredCharset()));
}
}
diff --git a/utils/src/main/java/com/cloud/utils/UuidUtils.java b/utils/src/main/java/com/cloud/utils/UuidUtils.java
index 42604e5c8a0..6f62bd4a952 100644
--- a/utils/src/main/java/com/cloud/utils/UuidUtils.java
+++ b/utils/src/main/java/com/cloud/utils/UuidUtils.java
@@ -22,6 +22,8 @@ package com.cloud.utils;
import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.xerces.impl.xpath.regex.RegularExpression;
+import java.util.UUID;
+
public class UuidUtils {
private static final RegularExpression uuidRegex = new RegularExpression("[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}");
@@ -64,4 +66,9 @@ public class UuidUtils {
public static RegularExpression getUuidRegex() {
return uuidRegex;
}
+
+
+ public static UUID nameUUIDFromBytes(byte[] name) {
+ return UUID.nameUUIDFromBytes(name);
+ }
}
diff --git a/utils/src/main/java/com/cloud/utils/validation/ChecksumUtil.java b/utils/src/main/java/com/cloud/utils/validation/ChecksumUtil.java
index b1b675bca0a..298ab7ab78d 100644
--- a/utils/src/main/java/com/cloud/utils/validation/ChecksumUtil.java
+++ b/utils/src/main/java/com/cloud/utils/validation/ChecksumUtil.java
@@ -28,7 +28,6 @@ public class ChecksumUtil {
if (cloudScriptsPath == null) {
throw new CloudRuntimeException(String.format("Unable to find cloudScripts path, cannot update SystemVM %s", name));
}
- String md5sum = DigestHelper.calculateChecksum(new File(cloudScriptsPath));
- return md5sum;
+ return DigestHelper.calculateChecksum(new File(cloudScriptsPath));
}
}
diff --git a/utils/src/main/java/org/apache/cloudstack/utils/security/DigestHelper.java b/utils/src/main/java/org/apache/cloudstack/utils/security/DigestHelper.java
index e7219f1122b..4b57ec2dad0 100644
--- a/utils/src/main/java/org/apache/cloudstack/utils/security/DigestHelper.java
+++ b/utils/src/main/java/org/apache/cloudstack/utils/security/DigestHelper.java
@@ -43,9 +43,9 @@ public class DigestHelper {
while ((read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
- byte[] md5sum = digest.digest();
+ byte[] checksumValue = digest.digest();
// TODO make sure this is valid for all types of checksums !?!
- BigInteger bigInt = new BigInteger(1, md5sum);
+ BigInteger bigInt = new BigInteger(1, checksumValue);
checksum = new ChecksumValue(digest.getAlgorithm(), getPaddedDigestString(digest,bigInt));
return checksum;
}
@@ -141,9 +141,9 @@ public class DigestHelper {
public static String calculateChecksum(File file) {
try (InputStream is = Files.newInputStream(Paths.get(file.getPath()))) {
- return DigestUtils.md5Hex(is);
+ return DigestUtils.sha512Hex(is);
} catch (IOException e) {
- String errMsg = "Failed to calculate template checksum";
+ String errMsg = "Failed to calculate sha512 checksum of template";
LOGGER.error(errMsg);
throw new CloudRuntimeException(errMsg, e);
}
diff --git a/utils/src/test/java/org/apache/cloudstack/utils/security/DigestHelperTest.java b/utils/src/test/java/org/apache/cloudstack/utils/security/DigestHelperTest.java
index 17ed09572f5..d2f248363b6 100644
--- a/utils/src/test/java/org/apache/cloudstack/utils/security/DigestHelperTest.java
+++ b/utils/src/test/java/org/apache/cloudstack/utils/security/DigestHelperTest.java
@@ -21,6 +21,7 @@ import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import com.amazonaws.util.StringInputStream;
+import org.apache.commons.codec.digest.DigestUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -36,6 +37,8 @@ public class DigestHelperTest {
private final static String INPUT_STRING_NO3 = "01234567890123456789012345678901234567890123456789012345678901234567890123456789h\n";
private final static String SHA256_CHECKSUM = "{SHA-256}c6ab15af7842d23d3c06c138b53a7d09c5e351a79c4eb3c8ca8d65e5ce8900ab";
private final static String SHA256_NO_PREFIX_CHECKSUM = "c6ab15af7842d23d3c06c138b53a7d09c5e351a79c4eb3c8ca8d65e5ce8900ab";
+ private final static String SHA512_CHECKSUM_NO_PREFIX = "e34efddea0cb6bfc960f902ffc16596aaaaff4b12999f720361a0b27e68932b5a73995ccffcf7418fabc4a684c4add13f8bb379f80cabf01220dd0a31cdc28eb";
+ private final static String SHA512_CHECKSUM = "{SHA-512}" + SHA512_CHECKSUM_NO_PREFIX;
private final static String SHA1_CHECKSUM = "{SHA-1}49e4b2f4292b63e88597c127d11bc2cc0f2ca0ff";
private final static String MD5_CHECKSUM = "{MD5}d141a8eeaf6bba779d1d1dc5102a81c5";
private final static String MD5_NO_PREFIX_CHECKSUM = "d141a8eeaf6bba779d1d1dc5102a81c5";
@@ -43,6 +46,7 @@ public class DigestHelperTest {
private final static String ZERO_PADDED_SHA256_CHECKSUM = "{SHA-256}08b5ae0c7d7d45d8ed406d7c3c7da695b81187903694314d97f8a37752a6b241";
private static final String MD5 = "MD5";
private static final String SHA_256 = "SHA-256";
+ private static final String SHA_512 = "SHA-512";
private static InputStream inputStream;
private InputStream inputStream2;
@@ -68,6 +72,13 @@ public class DigestHelperTest {
Assert.assertEquals(SHA256_CHECKSUM, result);
}
+ @Test
+ public void testDigestSHA512() throws Exception {
+ String result = DigestHelper.digest(SHA_512, inputStream).toString();
+ Assert.assertEquals(SHA512_CHECKSUM, result);
+ Assert.assertEquals(SHA512_CHECKSUM_NO_PREFIX, DigestUtils.sha512Hex(INPUT_STRING));
+ }
+
@Test
public void testDigestSHA1() throws Exception {
String result = DigestHelper.digest("SHA-1", inputStream).toString();
diff --git a/vmware-base/pom.xml b/vmware-base/pom.xml
index 0cf3dbf78dc..11f6d4e5bdb 100644
--- a/vmware-base/pom.xml
+++ b/vmware-base/pom.xml
@@ -24,7 +24,7 @@
org.apache.cloudstack
cloudstack
- 4.21.0.0-SNAPSHOT
+ 4.22.0.0-SNAPSHOT
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
index 1dc6ab64f0a..6c941f8012a 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
@@ -65,6 +65,7 @@ import com.cloud.utils.ActionDelegate;
import com.cloud.utils.LogUtils;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
+import com.cloud.utils.UuidUtils;
import com.cloud.utils.cisco.n1kv.vsm.NetconfHelper;
import com.cloud.utils.cisco.n1kv.vsm.PolicyMap;
import com.cloud.utils.cisco.n1kv.vsm.PortProfile;
@@ -249,7 +250,7 @@ public class HypervisorHostHelper {
}
public static String getSecondaryDatastoreUUID(String storeUrl) {
- return UUID.nameUUIDFromBytes(storeUrl.getBytes()).toString();
+ return UuidUtils.nameUUIDFromBytes(storeUrl.getBytes()).toString();
}
public static DatastoreMO getHyperHostDatastoreMO(VmwareHypervisorHost hyperHost, String datastoreName) throws Exception {