diff --git a/api/src/main/java/com/cloud/network/VNF.java b/api/src/main/java/com/cloud/network/VNF.java index ebc11c1f39b..e7a7fb01cb9 100644 --- a/api/src/main/java/com/cloud/network/VNF.java +++ b/api/src/main/java/com/cloud/network/VNF.java @@ -68,7 +68,6 @@ public class VNF { } public enum VnfDetail { - ICON, VERSION, VENDOR, MAINTAINER diff --git a/api/src/main/java/com/cloud/server/ResourceTag.java b/api/src/main/java/com/cloud/server/ResourceTag.java index 89ec5b905c9..2304241f7e5 100644 --- a/api/src/main/java/com/cloud/server/ResourceTag.java +++ b/api/src/main/java/com/cloud/server/ResourceTag.java @@ -30,7 +30,7 @@ public interface ResourceTag extends ControlledEntity, Identity, InternalIdentit public enum ResourceObjectType { UserVm(true, true, true), Template(true, true, true), - VnfTemplate(true, true, true), + VnfTemplate(false, false, true), ISO(true, false, true), Volume(true, true), Snapshot(true, false), diff --git a/server/src/main/java/com/cloud/tags/ResourceManagerUtilImpl.java b/server/src/main/java/com/cloud/tags/ResourceManagerUtilImpl.java index 928e54227a9..c02f4136863 100644 --- a/server/src/main/java/com/cloud/tags/ResourceManagerUtilImpl.java +++ b/server/src/main/java/com/cloud/tags/ResourceManagerUtilImpl.java @@ -81,6 +81,7 @@ public class ResourceManagerUtilImpl implements ResourceManagerUtil { s_typeMap.put(ResourceTag.ResourceObjectType.UserVm, UserVmVO.class); s_typeMap.put(ResourceTag.ResourceObjectType.Volume, VolumeVO.class); s_typeMap.put(ResourceTag.ResourceObjectType.Template, VMTemplateVO.class); + s_typeMap.put(ResourceTag.ResourceObjectType.VnfTemplate, VMTemplateVO.class); s_typeMap.put(ResourceTag.ResourceObjectType.ISO, VMTemplateVO.class); s_typeMap.put(ResourceTag.ResourceObjectType.Snapshot, SnapshotVO.class); s_typeMap.put(ResourceTag.ResourceObjectType.Network, NetworkVO.class); diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index cd71e8d06b5..199437c8033 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -2208,7 +2208,7 @@ "label.vnf.appliance": "VNF Appliance", "label.vnf.appliances": "VNF appliances", "label.vnf.appliance.add": "Add VNF Appliance", -"label.vnf.appliance.access.methods": "Management access information of this VNF appliance", +"label.vnf.appliance.access.methods": "Management access information for this VNF appliance", "label.vnf.app.action.destroy": "Destroy VNF appliance", "label.vnf.app.action.edit": "Edit VNF appliance", "label.vnf.app.action.expunge": "Expunge VNF appliance", @@ -2220,24 +2220,25 @@ "label.vnf.app.action.stop": "Stop VNF appliance", "label.vnf.app.action.reboot": "Reboot VNF appliance", "label.vnf.app.action.reinstall": "Reinstall VNF appliance", -"label.vnf.cidr.list": "Source cidr list of rules", +"label.vnf.cidr.list": "CIDR from which access to the VNF appliance’s Management interface should be allowed from", "label.vnf.cidr.list.tooltip": "the CIDR list to forward traffic from to the VNF management interface. Multiple entries must be separated by a single comma character (,). The default value is 0.0.0.0/0.", -"label.vnf.configure.management": "Configure rules for VNF management interfaces", -"label.vnf.configure.management.tooltip": "True by default, security group or network rules (source nat and firewall rules) will be configured for VNF management interfaces. False otherwise.", +"label.vnf.configure.management": "Configure Firewall and Port Forwarding rules for VNF's management interfaces", +"label.vnf.configure.management.tooltip": "True by default, security group or network rules (source nat and firewall rules) will be configured for VNF management interfaces. False otherwise. Learn what rules are configured at http://docs.cloudstack.apache.org/en/latest/adminguide/networking/vnf_templates_appliances.html#deploying-vnf-appliances", "label.vnf.detail.add": "Add VNF detail", "label.vnf.detail.remove": "Remove VNF detail", -"label.vnf.details": "VNF details", +"label.vnf.details": "VNF Details", "label.vnf.nic.add": "Add VNF nic", "label.vnf.nic.delete": "Delete VNF nic", "label.vnf.nic.description": "Description of VNF nic", -"label.vnf.nic.deviceid": "Device ID of VNF nic. It starts with 0", +"label.vnf.nic.deviceid": "Device ID of VNF nic. It starts with 0. The NIC with deviceid as 0 for VNF appliance will be the default NIC.", "label.vnf.nic.edit": "Edit VNF nic", "label.vnf.nic.management": "Management NIC", "label.vnf.nic.management.description": "True if the VNF nic is a management interface. False otherwise", +"label.vnf.nic.mappings": "VNF NIC mappings", "label.vnf.nic.name": "Name of VNF nic", "label.vnf.nic.remove": "Remove VNF nic", "label.vnf.nic.required": "True if VNF nic is required. Otherwise optional", -"label.vnf.nics": "VNF nics", +"label.vnf.nics": "VNF Nics", "label.vnf.settings": "VNF settings", "label.vnf.templates": "VNF templates", "label.vnf.template.register": "Register VNF template", @@ -2494,6 +2495,8 @@ "message.config.health.monitor.failed": "Configure Health Monitor failed", "message.config.sticky.policy.failed": "Failed to configure sticky policy.", "message.config.sticky.policy.processing": "Updating sticky policy...", +"message.configure.network.ip.and.mac": "Please configure the IP address and mac address of networks if needed.", +"message.configure.network.select.default.network": "Please configure the IP address and mac address of networks if needed. Please select a network as the default network.", "message.configuring.guest.traffic": "Configuring guest traffic", "message.configuring.physical.networks": "Configuring physical Networks", "message.configuring.public.traffic": "Configuring public traffic", @@ -3198,17 +3201,19 @@ "message.vm.state.stopped": "Instance is stopped.", "message.vm.state.stopping": "Instance is being stopped.", "message.vm.state.unknown": "Instance state is unknown.", -"message.vnf.appliance.networks": "Please select Networks for the new VNF appliance.", +"message.vnf.appliance.networks": "Please select the networks for the new VNF appliance.", "message.vnf.credentials.change": "Please change the password(s) of the VNF appliance immediately.", "message.vnf.credentials.default": "The default credentials(s) of the VNF appliance", "message.vnf.credentials.in.template.vnf.details": "Please find the default credentials for this VNF in the details of the VNF template.", -"message.vnf.error.deviceid.should.be.continuous": "The deviceid of selected VNF NICs should be continuous.", +"message.vnf.error.deviceid.should.be.consecutive": "The deviceid of selected VNF NICs should be consecutive.", "message.vnf.error.network.is.already.used": "Network has been used by multiple NICs of the new VNF appliance.", -"message.vnf.error.no.networks": "Please select networks for NICs of the new VNF appliance.", +"message.vnf.error.network.should.be.used": "All selected networks should be used as VNF Nics", +"message.vnf.error.no.networks": "Please select the networks for the new VNF appliance.", "message.vnf.error.no.network.for.required.deviceid": "Please select a Network for required NIC of the new VNF appliance.", "message.vnf.nic.move.up.fail": "Failed to move up this NIC", "message.vnf.nic.move.down.fail": "Failed to move down this NIC", -"message.vnf.select.networks": "Please select a Network for each VNF nic. ", +"message.vnf.no.credentials": "No credentials found for the VNF appliance.", +"message.vnf.select.networks": "Please select the relevant network for each VNF NIC.", "message.volume.state.allocated": "The volume is allocated but has not been created yet.", "message.volume.state.attaching": "The volume is attaching to a volume from Ready state.", "message.volume.state.copying": "The volume is being copied from the image store to primary storage, in case it's an uploaded volume.", diff --git a/ui/src/components/header/CreateMenu.vue b/ui/src/components/header/CreateMenu.vue index a477c98b1a1..5ff6894c48c 100644 --- a/ui/src/components/header/CreateMenu.vue +++ b/ui/src/components/header/CreateMenu.vue @@ -133,6 +133,25 @@ + + + + + + + + + +

+ {{ $t('label.vnf.appliance') }} +

+ {{ $t('label.vnf.appliance.add') }} +
+
+
+
diff --git a/ui/src/components/view/DetailsTab.vue b/ui/src/components/view/DetailsTab.vue index ebdc459c439..b04830b3c3c 100644 --- a/ui/src/components/view/DetailsTab.vue +++ b/ui/src/components/view/DetailsTab.vue @@ -207,9 +207,11 @@ export default { } const managementDeviceIds = [] - for (const vnfnic of this.resource.vnfnics) { - if (vnfnic.management) { - managementDeviceIds.push(vnfnic.deviceid) + if (this.resource.vnfnics) { + for (const vnfnic of this.resource.vnfnics) { + if (vnfnic.management) { + managementDeviceIds.push(vnfnic.deviceid) + } } } const managementIps = [] diff --git a/ui/src/config/section/network.js b/ui/src/config/section/network.js index 5c78a4d0e68..0362b424d1d 100644 --- a/ui/src/config/section/network.js +++ b/ui/src/config/section/network.js @@ -325,6 +325,7 @@ export default { title: 'label.vnf.appliances', icon: 'gateway-outlined', permission: ['listVirtualMachinesMetrics'], + resourceType: 'UserVm', params: () => { return { details: 'servoff,tmpl,nics', isvnf: true } }, diff --git a/ui/src/views/compute/DeployVnfAppliance.vue b/ui/src/views/compute/DeployVnfAppliance.vue index e571f4e23c4..5e1baac3d8f 100644 --- a/ui/src/views/compute/DeployVnfAppliance.vue +++ b/ui/src/views/compute/DeployVnfAppliance.vue @@ -365,7 +365,7 @@