From 0b58177635ea7ca9ad816423d62bd402b5de2592 Mon Sep 17 00:00:00 2001 From: Alexandre Mattioli Date: Wed, 22 Oct 2025 18:39:52 +0200 Subject: [PATCH 1/3] Apply Codex update to ui/public/locales/en.json --- ui/public/locales/en.json | 84 +++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 4f450e940fc0..e6740dbf178e 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -67,7 +67,7 @@ "label.action.bulk.delete.routing.firewall.rules": "Bulk remove IPv4 Routing firewall rules", "label.action.bulk.delete.snapshots": "Bulk delete Snapshots", "label.action.bulk.delete.templates": "Bulk delete Templates", -"label.action.bulk.release.public.ip.address": "Bulk release public IP addresses", +"label.action.bulk.release.public.ip.address": "Bulk release external IP addresses", "label.action.cancel.maintenance.mode": "Cancel maintenance mode", "label.action.change.password": "Change password", "label.action.clear.webhook.deliveries": "Clear deliveries", @@ -203,7 +203,7 @@ "label.action.remove.router.table.from.interface": "Remove Tungsten Fabric route table from interface", "label.action.remove.tungsten.routing.policy": "Remove Tungsten-Fabric routing policy from Network", "label.action.remove.nic": "Remove NIC", -"label.action.reserve.ip": "Reserve Public IP", +"label.action.reserve.ip": "Reserve External IP", "label.action.reset.network.permissions": "Reset Network permissions", "label.action.reset.password": "Reset password", "label.action.resize.volume": "Resize Volume", @@ -479,7 +479,7 @@ "label.basic": "Basic", "label.bcfdeviceid": "ID", "label.bgp.peers": "BGP Peers", -"label.bgp.peer.set.reservation.desc": "You can make the BGP peer public, or you can dedicate/reserve it for either a Domain or an Account", +"label.bgp.peer.set.reservation.desc": "You can make the BGP peer external, or you can dedicate/reserve it for either a Domain or an Account", "label.bigswitch.controller.address": "BigSwitch BCF controller address", "label.bladeid": "Blade ID", "label.blades": "Blades", @@ -615,7 +615,7 @@ "label.confirm.delete.tungsten.service.group": "Please confirm that you would like to delete this Service Group", "label.confirm.delete.tungsten.tag": "Please confirm that you would like to delete this Tag", "label.confirm.delete.tungsten.tag.type": "Please confirm that you would like to delete this Tag Type", -"label.confirm.release.public.ip.addresses": "Please confirm you wish to release the selected public IP addresses.", +"label.confirm.release.public.ip.addresses": "Please confirm you wish to release the selected external IP addresses.", "label.confirm.remove.logical.router": "Please confirm that you would like to delete this Logical Router", "label.confirm.remove.network.route.table": "Please confirm that you would like to delete this Network Route Table", "label.confirm.remove.route.table": "Please confirm that you would like to delete this Interface Route Table", @@ -856,7 +856,7 @@ "label.devicename": "Device Name", "label.devices": "Devices", "label.dhcp": "DHCP", -"label.direct.attached.public.ip": "Direct attached public IP", +"label.direct.attached.public.ip": "Direct attached external IP", "label.direct.ips": "Shared Network IPs", "label.directdownload": "Direct download", "label.direction": "Direction", @@ -1149,10 +1149,10 @@ "label.gslb": "GSLB", "label.gslb.service": "GSLB service", "label.gslb.service.private.ip": "GSLB service private IP", -"label.gslb.service.public.ip": "GSLB service public IP", +"label.gslb.service.public.ip": "GSLB service external IP", "label.gslbprovider": "GSLB service", "label.gslbproviderprivateip": "GSLB service private IP", -"label.gslbproviderpublicip": "GSLB service public IP", +"label.gslbproviderpublicip": "GSLB service external IP", "label.guest": "Guest", "label.guest.cidr": "Guest CIDR", "label.guest.end.ip": "Guest end IP", @@ -1321,7 +1321,7 @@ "label.ip6dns2": "IPv6 DNS2", "label.ip6gateway": "IPv6 Gateway", "label.ipaddress": "IP Address", -"label.iplimit": "Public IP Limits", +"label.iplimit": "External IP Limits", "label.ipprefix": "IP Prefix", "label.ipprefixlen": "IP Prefix Length", "label.ips": "IPs", @@ -1372,7 +1372,7 @@ "label.isos": "ISOs", "label.isostate": "ISO state", "label.ispersistent": "Persistent ", -"label.ispublic": "Public", +"label.ispublic": "External", "label.isready": "Ready", "label.isredundantrouter": "Redundant router", "label.isrouting": "Routing", @@ -1395,7 +1395,7 @@ "label.keypairs": "SSH key pair(s)", "label.kubeconfig.cluster": "Kubernetes Cluster config", "label.kubernetes": "Kubernetes", -"label.kubernetes.access.details": "The kubernetes nodes can be accessed via ssh using:
ssh -i [ssh_key] -p [port_number] cloud@[public_ip_address]

where,
ssh_key: points to the ssh private key file corresponding to the key that was associated while creating the Kubernetes Cluster. If no ssh key was provided during Kubernetes cluster creation, use the ssh private key of the management server.
port_number: can be obtained from the Port Forwarding Tab (Public Port column)", +"label.kubernetes.access.details": "The kubernetes nodes can be accessed via ssh using:
ssh -i [ssh_key] -p [port_number] cloud@[external_ip_address]

where,
ssh_key: points to the ssh private key file corresponding to the key that was associated while creating the Kubernetes Cluster. If no ssh key was provided during Kubernetes cluster creation, use the ssh private key of the management server.
port_number: can be obtained from the Port Forwarding Tab (External Port column)", "label.kubernetes.cluster.add.nodes.to.cluster": "Add nodes to Kubernetes cluster", "label.kubernetes.cluster.remove.nodes.from.cluster": "Remove nodes from Kubernetes cluster", "label.kubernetes.cluster": "Kubernetes Cluster", @@ -1543,7 +1543,7 @@ "label.maxobjectstorage": "Max. Object Storage (GiB)", "label.maxprimarystorage": "Max. primary storage (GiB)", "label.maxproject": "Max. Projects", -"label.maxpublicip": "Max. public IPs", +"label.maxpublicip": "Max. external IPs", "label.maxresolutionx": "Max. resolution X", "label.maxresolutiony": "Max. resolution Y", "label.maxsecondarystorage": "Max. secondary storage (GiB)", @@ -1801,10 +1801,10 @@ "label.outofbandmanagement.enable": "Enable out-of-band management", "label.overprovisionfactor": "Overprovisioning factor", "label.override.guest.traffic": "Override guest-traffic", -"label.override.public.traffic": "Override public-traffic", +"label.override.public.traffic": "Override external-traffic", "label.override.rootdisk.size": "Override root disk size", "label.overrideguesttraffic": "Override guest-traffic", -"label.overridepublictraffic": "Override public-traffic", +"label.overridepublictraffic": "Override external-traffic", "label.override.root.diskoffering": "Override root disk offering", "label.ovf.properties": "vApp properties", "label.ovm3": "OVM3", @@ -1942,22 +1942,22 @@ "label.provisioningtype.fat": "Fat provisioning", "label.provisioningtype.sparse": "Sparse provisioning", "label.provisioningtype.thin": "Thin provisioning", -"label.public": "Public", -"label.publicmtu": "Public Interface MTU", -"label.public.interface": "Public interface", -"label.public.ip": "Public IP address", -"label.public.ip.addresses": "Public IP Addresses", -"label.public.ips": "Public IP addresses", -"label.public.lb": "Public LB", -"label.public.traffic": "Public traffic", -"label.public.traffic.netris": "Netris Public IP Pool", -"label.public.traffic.nsx": "NSX Public traffic", -"label.publicinterface": "Public interface", +"label.public": "External", +"label.publicmtu": "External Interface MTU", +"label.public.interface": "External interface", +"label.public.ip": "External IP address", +"label.public.ip.addresses": "External IP Addresses", +"label.public.ips": "External IP addresses", +"label.public.lb": "External LB", +"label.public.traffic": "External traffic", +"label.public.traffic.netris": "Netris External IP Pool", +"label.public.traffic.nsx": "NSX External traffic", +"label.publicinterface": "External interface", "label.publicip": "IP address", "label.publicipid": "IP address ID", -"label.publickey": "Public key", -"label.publicnetwork": "Public Network", -"label.publicport": "Public port", +"label.publickey": "External key", +"label.publicnetwork": "External Network", +"label.publicport": "External port", "label.purgeresources": "Purge Resources", "label.purge.usage.records.success": "Successfuly purged usage records", "label.purge.usage.records.error": "Failed while purging usage records", @@ -2255,7 +2255,7 @@ "label.service.offering.etcdnodes": "Compute offering for etcd Nodes", "label.service.offering.workernodes": "Compute offering for Worker Nodes", "label.service.offering": "Service Offering", -"label.service.staticnat.associatepublicip": "Associate public IP", +"label.service.staticnat.associatepublicip": "Associate external IP", "label.service.staticnat.elasticipcheckbox": "Elastic IP", "label.servicegroupuuid": "Service Group", "label.servicelist": "Services", @@ -2264,9 +2264,9 @@ "label.sessions": "Active client sessions", "label.set.default.nic": "Set default NIC", "label.set.reservation": "Set reservation", -"label.set.reservation.desc": "You can make Public IP range public, or you can dedicate/reserve it for either an Account or for System VMs", +"label.set.reservation.desc": "You can make External IP range external, or you can dedicate/reserve it for either an Account or for System VMs", "label.set.reservation.account.desc": "Please specify an Account to be associated with this IP range.", -"label.set.reservation.systemvm.desc": "Enable dedication of public IP range for SSVM and CPVM. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'.", +"label.set.reservation.systemvm.desc": "Enable dedication of external IP range for SSVM and CPVM. Reservation strictness defined on 'system.vm.external.ip.reservation.mode.strictness'.", "label.setting": "Setting", "label.settings": "Settings", "label.setup": "Setup", @@ -2441,7 +2441,7 @@ "label.supportedservices": "Supported services", "label.supportsautoscaling": "Supports auto scaling", "label.supportsha": "Supports HA", -"label.supportspublicaccess": "Supports public access", +"label.supportspublicaccess": "Supports external access", "label.supportsstrechedl2subnet": "Supports stretched L2 subnet", "label.supportsvmautoscaling": "Supports auto scaling", "label.suspend.project": "Suspend Project", @@ -2500,7 +2500,7 @@ "label.test": "Test", "label.test.webhook.delivery": "Test Webhook Delivery", "label.tftpdir": "TFTP root directory", -"label.theme.alert": "The setting is only visible to the current browser. To apply the setting, please download the JSON file and replace its content in the `theme` section of the `config.json` file under the path: `/public/config.json`", +"label.theme.alert": "The setting is only visible to the current browser. To apply the setting, please download the JSON file and replace its content in the `theme` section of the `config.json` file under the path: `/external/config.json`", "label.theme.color": "Theme color", "label.theme.navigation.bgColor": "Background color", "label.theme.navigation.setting": "Navigation setting", @@ -3136,10 +3136,10 @@ "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", -"message.configuring.netris.public.traffic": "Configuring Netris public traffic", +"message.configuring.public.traffic": "Configuring external traffic", +"message.configuring.netris.public.traffic": "Configuring Netris external traffic", "message.configuring.storage.access.failed": "Configuring storage access failed", -"message.configuring.nsx.public.traffic": "Configuring NSX public traffic", +"message.configuring.nsx.public.traffic": "Configuring NSX external traffic", "message.configuring.storage.traffic": "Configuring storage traffic", "message.confirm.action.force.reconnect": "Please confirm that you want to force reconnect this host.", "message.confirm.add.router.table.to.instance": "Please confirm that you want to add Route Table to this NIC", @@ -3213,7 +3213,7 @@ "message.create.compute.offering": "Compute Offering created", "message.create.sharedfs.failed": "Failed to create Shared FileSystem.", "message.create.sharedfs.processing": "Shared FileSystem creation in progress.", -"message.create.tungsten.public.network": "Create Tungsten-Fabric public Network", +"message.create.tungsten.public.network": "Create Tungsten-Fabric external Network", "message.create.instance.from.backup.prefill": "Data is prefilled using the configurations stored in the backup. Edit to change individual fields.", "message.create.internallb": "Creating internal LB", "message.create.internallb.failed": "Failed to create internal LB.", @@ -3292,7 +3292,7 @@ "message.desc.core.zone": "Core Zones are intended for Datacenter based deployments and allow the full range of Networking and other functionality in Apache CloudStack. Core Zones have a number of prerequisites and rely on the presence of shared storage and helper Instances.", "message.desc.edge.zone": "Edge Zones are lightweight Zones, designed for deploying in edge computing scenarios. They are limited in functionality but have far fewer prerequisites than core zones.

Please refer to the Apache CloudStack documentation for more information on Zone Types
http://docs.cloudstack.apache.org/en/latest/installguide/configuration.html#adding-a-zone", "message.desc.cluster": "Each Pod must contain one or more Clusters. We will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers.", -"message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.

(1) If public key is set, CloudStack will register the public key. You can use it through your private key.

(2) If public key is not set, CloudStack will create a new SSH key pair. In this case, please copy and save the private key. CloudStack will not keep it.
", +"message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.

(1) If external key is set, CloudStack will register the external key. You can use it through your private key.

(2) If external key is not set, CloudStack will create a new SSH key pair. In this case, please copy and save the private key. CloudStack will not keep it.
", "message.desc.created.ssh.key.pair": "Created a SSH key pair.", "message.desc.host": "Each Cluster must contain at least one host (computer) for guest Instances to run on. We will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.

Give the host's DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts.", "message.desc.import.ext.kvm.wizard": "Import libvirt domain from External KVM Host not managed by CloudStack", @@ -3424,7 +3424,7 @@ "message.error.macaddress": "Please enter a valid MAC Address.", "message.error.max.members.less.than.min.members": "The value of Max members must be larger than the value of Min members", "message.error.mtu.below.min": "MTU is below the minimum supported value of %x", -"message.error.mtu.public.max.exceed": "The value entered exceeds the maximum allowed public MTU for this Zone, your value will be automatically lowered to match it.", +"message.error.mtu.public.max.exceed": "The value entered exceeds the maximum allowed external MTU for this Zone, your value will be automatically lowered to match it.", "message.error.mtu.private.max.exceed": "The value entered exceeds the maximum allowed private MTU for this Zone, your value will be automatically lowered to match it.", "message.error.name": "Please enter name.", "message.error.netmask": "Please enter Netmask.", @@ -3543,7 +3543,7 @@ "message.installwizard.cloudstack.helptext.mailinglists": " * Join mailing lists:\t ", "message.installwizard.cloudstack.helptext.releasenotes": " * Release notes:\t ", "message.installwizard.cloudstack.helptext.survey": " * Take the survey:\t ", -"message.installwizard.copy.whatiscloudstack": "CloudStack™ is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack™ manages the Network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack™ to deploy, manage, and configure cloud computing environments.\n\nExtending beyond individual Instance images running on commodity hardware, CloudStack™ provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications.", +"message.installwizard.copy.whatiscloudstack": "CloudStack™ is a software platform that pools computing resources to build external, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack™ manages the Network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack™ to deploy, manage, and configure cloud computing environments.\n\nExtending beyond individual Instance images running on commodity hardware, CloudStack™ provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications.", "message.installwizard.tooltip.addpod.name": "A name for the Pod.", "message.installwizard.tooltip.addpod.reservedsystemendip": "This is the IP range in the private Network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.", "message.installwizard.tooltip.addpod.reservedsystemgateway": "The gateway for the hosts in that Pod.", @@ -3639,7 +3639,7 @@ "message.network.description": "Setup Network and traffic.", "message.network.error": "Network Error", "message.network.error.description": "Unable to reach the management server or a browser extension may be blocking the Network request.", -"message.network.hint": "Configure Network components and public/guest/management traffic including IP addresses.", +"message.network.hint": "Configure Network components and external/guest/management traffic including IP addresses.", "message.network.offering.change.warning": "WARNING: Changing the offering will cause connectivity downtime for the Instances with NICs in the Network.", "message.network.offering.forged.transmits": "Applicable for guest Networks on VMware hypervisor only.\nReject - The switch drops any outbound frame from a Instance adapter with a source MAC address that is different from the one in the .vmx configuration file.\nAccept - The switch does not perform filtering, and permits all outbound frames.\nNone - Default to value from global setting.", "message.network.offering.mac.address.changes": "Applicable for guest Networks on VMware hypervisor only.\nReject - If the guest OS changes the effective MAC address of the Instance to a value that is different from the MAC address of the Instance Network adapter (set in the .vmx configuration file), the switch drops all inbound frames to the adapter.\nIf the guest OS changes the effective MAC address of the Instance back to the MAC address of the Instance Network adapter, the virtual machine receives frames again.\nAccept - If the guest OS changes the effective MAC address of the virtual machine to a value that is different from the MAC address of the Instance Network adapter, the switch allows frames to the new address to pass.\nNone - Default to value from global setting.", @@ -3680,8 +3680,8 @@ "message.primary.storage.invalid.state": "Primary storage is not in Up state", "message.processing.complete": "Processing complete!", "message.protocol.description": "For XenServer, choose NFS, iSCSI, or PreSetup. For KVM, choose NFS, SharedMountPoint, RDB, CLVM or Gluster. For vSphere, choose NFS, PreSetup (VMFS or iSCSI or FiberChannel or vSAN or vVols) or DatastoreCluster. For Hyper-V, choose SMB/CIFS. For LXC, choose NFS or SharedMountPoint. For OVM, choose NFS or OCFS2.", -"message.public.traffic.in.advanced.zone": "Public traffic is generated when Instances in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End Users can use the CloudStack UI to acquire these IPs to implement NAT between their guest Network and their public Network.

Provide at least one range of IP addresses for internet traffic.", -"message.public.traffic.in.basic.zone": "Public traffic is generated when Instances in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a Instance is created, an IP from this set of Public IPs will be allocated to the Instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End Users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their Instances and the public IP.", +"message.public.traffic.in.advanced.zone": "External traffic is generated when Instances in the cloud access the internet. Externally-accessible IPs must be allocated for this purpose. End Users can use the CloudStack UI to acquire these IPs to implement NAT between their guest Network and their external Network.

Provide at least one range of IP addresses for internet traffic.", +"message.public.traffic.in.basic.zone": "External traffic is generated when Instances in the cloud access the Internet or provide services to clients over the Internet. Externally accessible IPs must be allocated for this purpose. When a Instance is created, an IP from this set of External IPs will be allocated to the Instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the external IP and the guest IP. End Users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their Instances and the external IP.", "message.quota.tariff.create.success": "Successfully created quota tariff \"{quotaTariff}\"", "message.quota.tariff.update.success": "Successfully updated quota tariff \"{quotaTariff}\"", "message.read.accept.license.agreements": "Please read and accept the terms for the license agreements.", From 65512e9255ee885d13c84301cd84707c4f71729c Mon Sep 17 00:00:00 2001 From: Alexandre Mattioli Date: Sat, 25 Oct 2025 02:44:32 +0200 Subject: [PATCH 2/3] Add VNF network scaffolding --- .../user/vnf/AttachVnfTemplateCmd.java | 20 +++++ .../command/user/vnf/CreateVnfNetworkCmd.java | 31 +++++++ .../user/vnf/GetVnfNetworkStatusCmd.java | 17 ++++ .../user/vnf/UploadVnfDictionaryCmd.java | 22 +++++ .../schema-42100to42200/42110-vnf-network.xml | 59 +++++++++++++ .../db/schema-42100to42200/upgrade.xml | 7 ++ .../cloudstack/vnf/VnfNetworkService.java | 11 +++ .../cloudstack/vnf/VnfNetworkServiceImpl.java | 40 +++++++++ .../cloudstack/vnf/VnfTemplateRenderer.java | 16 ++++ .../apache/cloudstack/vnf/VnfTransport.java | 12 +++ ui/public/locales/en.json | 84 +++++++++---------- 11 files changed, 277 insertions(+), 42 deletions(-) create mode 100644 api/src/main/java/org/apache/cloudstack/api/command/user/vnf/AttachVnfTemplateCmd.java create mode 100644 api/src/main/java/org/apache/cloudstack/api/command/user/vnf/CreateVnfNetworkCmd.java create mode 100644 api/src/main/java/org/apache/cloudstack/api/command/user/vnf/GetVnfNetworkStatusCmd.java create mode 100644 api/src/main/java/org/apache/cloudstack/api/command/user/vnf/UploadVnfDictionaryCmd.java create mode 100644 engine/schema/src/main/resources/META-INF/db/schema-42100to42200/42110-vnf-network.xml create mode 100644 engine/schema/src/main/resources/META-INF/db/schema-42100to42200/upgrade.xml create mode 100644 server/src/main/java/org/apache/cloudstack/vnf/VnfNetworkService.java create mode 100644 server/src/main/java/org/apache/cloudstack/vnf/VnfNetworkServiceImpl.java create mode 100644 server/src/main/java/org/apache/cloudstack/vnf/VnfTemplateRenderer.java create mode 100644 server/src/main/java/org/apache/cloudstack/vnf/VnfTransport.java diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/AttachVnfTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/AttachVnfTemplateCmd.java new file mode 100644 index 000000000000..013bdccb5f5a --- /dev/null +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/AttachVnfTemplateCmd.java @@ -0,0 +1,20 @@ +package org.apache.cloudstack.api.command.user.vnf; + +import org.apache.cloudstack.api.*; +import org.apache.cloudstack.api.response.*; +import javax.inject.Inject; + +@APICommand(name="attachVnfTemplate", responseObject=SuccessResponse.class, + description="Bind an existing VM as the VNF for the network") +public class AttachVnfTemplateCmd extends BaseAsyncCmd { + @Parameter(name="networkid", type=CommandType.UUID, entityType=NetworkResponse.class, required=true) private Long networkId; + @Parameter(name="vmid", type=CommandType.UUID, entityType=UserVmResponse.class, required=true) private Long vmId; + + @Inject private org.apache.cloudstack.vnf.VnfNetworkService vnfSvc; + @Override public void execute() { + vnfSvc.attachVnfVm(networkId, vmId, getEntityOwnerId()); + setResponseObject(new SuccessResponse(getCommandName())); + } + @Override public String getCommandName(){return "attachvnftemplateresponse";} + @Override public long getEntityOwnerId(){return CallContext.current().getCallingAccountId();} +} diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/CreateVnfNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/CreateVnfNetworkCmd.java new file mode 100644 index 000000000000..c00199163271 --- /dev/null +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/CreateVnfNetworkCmd.java @@ -0,0 +1,31 @@ +package org.apache.cloudstack.api.command.user.vnf; + +import org.apache.cloudstack.api.*; +import org.apache.cloudstack.api.response.*; +import javax.inject.Inject; + +@APICommand(name = "createVnfNetwork", + description = "Create a VNF network (deploy VR broker + VNF VM)", + responseObject = CreateNetworkResponse.class) +public class CreateVnfNetworkCmd extends BaseAsyncCreateCmd { + @Parameter(name="name", type=CommandType.STRING, required=true) private String name; + @Parameter(name="displaytext", type=CommandType.STRING) private String displayText; + @Parameter(name="zoneid", type=CommandType.UUID, entityType=ZoneResponse.class, required=true) private Long zoneId; + @Parameter(name="vnftemplateid", type=CommandType.UUID, entityType=TemplateResponse.class, required=true) private Long vnfTemplateId; + @Parameter(name="servicehelpers", type=CommandType.STRING) private String serviceHelpers; + @Parameter(name="dictionaryyaml", type=CommandType.STRING) private String dictionaryYaml; + + @Inject private org.apache.cloudstack.vnf.VnfNetworkService vnfSvc; + + @Override public void execute() { + CreateNetworkResponse resp = vnfSvc.createVnfNetwork(this); + setResponseObject(resp); resp.setResponseName(getCommandName()); + } + @Override public String getCommandName() { return "createvnfnetworkresponse"; } + @Override public long getEntityOwnerId() { return CallContext.current().getCallingAccountId(); } + + // getters... + public String getName(){return name;} public String getDisplayText(){return displayText;} + public Long getZoneId(){return zoneId;} public Long getVnfTemplateId(){return vnfTemplateId;} + public String getServiceHelpers(){return serviceHelpers;} public String getDictionaryYaml(){return dictionaryYaml;} +} diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/GetVnfNetworkStatusCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/GetVnfNetworkStatusCmd.java new file mode 100644 index 000000000000..994b7f7918ec --- /dev/null +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/GetVnfNetworkStatusCmd.java @@ -0,0 +1,17 @@ +package org.apache.cloudstack.api.command.user.vnf; + +import org.apache.cloudstack.api.*; +import org.apache.cloudstack.api.response.*; +import javax.inject.Inject; + +@APICommand(name="getVnfNetworkStatus", + description="Return broker/VNF/dictionary status for a VNF network", + responseObject=org.apache.cloudstack.api.response.SuccessResponse.class) +public class GetVnfNetworkStatusCmd extends BaseCmd { + @Parameter(name="networkid", type=CommandType.UUID, entityType=NetworkResponse.class, required=true) private Long networkId; + @Inject private org.apache.cloudstack.vnf.VnfNetworkService vnfSvc; + @Override public void execute() { + setResponseObject(vnfSvc.getStatus(networkId)); + } + @Override public String getCommandName(){ return "getvnfnetworkstatusresponse"; } +} diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/UploadVnfDictionaryCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/UploadVnfDictionaryCmd.java new file mode 100644 index 000000000000..d545f66b8aa4 --- /dev/null +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/UploadVnfDictionaryCmd.java @@ -0,0 +1,22 @@ +package org.apache.cloudstack.api.command.user.vnf; + +import org.apache.cloudstack.api.*; +import org.apache.cloudstack.api.response.*; +import javax.inject.Inject; + +@APICommand(name="uploadVnfDictionary", responseObject=SuccessResponse.class, + description="Upload/replace a dictionary YAML for a VNF network") +public class UploadVnfDictionaryCmd extends BaseAsyncCmd { + @Parameter(name="networkid", type=CommandType.UUID, entityType=NetworkResponse.class, required=true) private Long networkId; + @Parameter(name="name", type=CommandType.STRING) private String name; + @Parameter(name="yaml", type=CommandType.STRING, required=true) private String yaml; + + @Inject private org.apache.cloudstack.vnf.VnfNetworkService vnfSvc; + + @Override public void execute() { + vnfSvc.uploadDictionary(networkId, name, yaml, getEntityOwnerId()); + setResponseObject(new SuccessResponse(getCommandName())); + } + @Override public String getCommandName() { return "uploadvnfdictionaryresponse"; } + @Override public long getEntityOwnerId() { return CallContext.current().getCallingAccountId(); } +} diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/42110-vnf-network.xml b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/42110-vnf-network.xml new file mode 100644 index 000000000000..bb402c92e5b3 --- /dev/null +++ b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/42110-vnf-network.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/upgrade.xml b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/upgrade.xml new file mode 100644 index 000000000000..9dfe85800c77 --- /dev/null +++ b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/upgrade.xml @@ -0,0 +1,7 @@ + + + + diff --git a/server/src/main/java/org/apache/cloudstack/vnf/VnfNetworkService.java b/server/src/main/java/org/apache/cloudstack/vnf/VnfNetworkService.java new file mode 100644 index 000000000000..144e81ee6635 --- /dev/null +++ b/server/src/main/java/org/apache/cloudstack/vnf/VnfNetworkService.java @@ -0,0 +1,11 @@ +package org.apache.cloudstack.vnf; + +import org.apache.cloudstack.api.command.user.vnf.*; +import org.apache.cloudstack.api.response.CreateNetworkResponse; + +public interface VnfNetworkService { + CreateNetworkResponse createVnfNetwork(CreateVnfNetworkCmd cmd); + void uploadDictionary(long networkId, String name, String yaml, long ownerId); + void attachVnfVm(long networkId, long vmId, long ownerId); + org.apache.cloudstack.api.response.SuccessResponse getStatus(long networkId); +} diff --git a/server/src/main/java/org/apache/cloudstack/vnf/VnfNetworkServiceImpl.java b/server/src/main/java/org/apache/cloudstack/vnf/VnfNetworkServiceImpl.java new file mode 100644 index 000000000000..abd42b5b2db0 --- /dev/null +++ b/server/src/main/java/org/apache/cloudstack/vnf/VnfNetworkServiceImpl.java @@ -0,0 +1,40 @@ +package org.apache.cloudstack.vnf; + +import com.cloud.network.Network; +import com.cloud.user.Account; +import org.apache.cloudstack.api.response.CreateNetworkResponse; +import javax.inject.Inject; +import javax.ejb.Local; + +@Local(value=VnfNetworkService.class) +public class VnfNetworkServiceImpl implements VnfNetworkService { + + @Inject private dao.VnfDictionaryDao dictDao; + @Inject private dao.VnfNetworkBindingDao bindingDao; + @Inject private dao.VnfRuleMapDao ruleDao; + @Inject private VnfTemplateRenderer renderer; + @Inject private VnfTransport transport; + + @Override + public CreateNetworkResponse createVnfNetwork(org.apache.cloudstack.api.command.user.vnf.CreateVnfNetworkCmd cmd) { + // TODO: create network record (like Isolated), deploy VR broker + VNF VM from template, + // persist binding + optional dictionary, return response with IDs + return new CreateNetworkResponse(); + } + + @Override + public void uploadDictionary(long networkId, String name, String yaml, long ownerId) { + // TODO: validate YAML placeholders; persist versioned dictionary + } + + @Override + public void attachVnfVm(long networkId, long vmId, long ownerId) { + // TODO: bind a VM as the VNF; update egress allowlist for broker + } + + @Override + public org.apache.cloudstack.api.response.SuccessResponse getStatus(long networkId) { + // TODO: query broker health + VNF reachability + dict version + return new org.apache.cloudstack.api.response.SuccessResponse("getvnfnetworkstatus"); + } +} diff --git a/server/src/main/java/org/apache/cloudstack/vnf/VnfTemplateRenderer.java b/server/src/main/java/org/apache/cloudstack/vnf/VnfTemplateRenderer.java new file mode 100644 index 000000000000..ae3efa97721a --- /dev/null +++ b/server/src/main/java/org/apache/cloudstack/vnf/VnfTemplateRenderer.java @@ -0,0 +1,16 @@ +package org.apache.cloudstack.vnf; + +import java.util.Map; + +public class VnfTemplateRenderer { + public RenderedRequest render(Dictionary dict, String key, Map inputs, Map injectedHeaders) { + // TODO: SnakeYAML load -> map; replace ${...}; build method/path/body/headers; return RenderedRequest + return new RenderedRequest("POST", "/api/v2/firewall/rule", Map.of(), injectedHeaders); + } + + public static class Dictionary { public Map root; } + public static class RenderedRequest { + public final String method, path; public final Object body; public final Map headers; + public RenderedRequest(String m, String p, Object b, Map h){ method=m; path=p; body=b; headers=h; } + } +} diff --git a/server/src/main/java/org/apache/cloudstack/vnf/VnfTransport.java b/server/src/main/java/org/apache/cloudstack/vnf/VnfTransport.java new file mode 100644 index 000000000000..e83c7ad8d3e6 --- /dev/null +++ b/server/src/main/java/org/apache/cloudstack/vnf/VnfTransport.java @@ -0,0 +1,12 @@ +package org.apache.cloudstack.vnf; + +public class VnfTransport { + public static class VnfResponse { public final int status; public final String body; + public VnfResponse(int s, String b){ status=s; body=b; } } + + public VnfResponse forward(long networkId, String vnfIp, int port, + VnfTemplateRenderer.RenderedRequest req, String idemKey) { + // TODO: POST https://:8443/v1/forward with mTLS + JWT; return status/body + return new VnfResponse(200, "{}"); + } +} diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index e6740dbf178e..4f450e940fc0 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -67,7 +67,7 @@ "label.action.bulk.delete.routing.firewall.rules": "Bulk remove IPv4 Routing firewall rules", "label.action.bulk.delete.snapshots": "Bulk delete Snapshots", "label.action.bulk.delete.templates": "Bulk delete Templates", -"label.action.bulk.release.public.ip.address": "Bulk release external IP addresses", +"label.action.bulk.release.public.ip.address": "Bulk release public IP addresses", "label.action.cancel.maintenance.mode": "Cancel maintenance mode", "label.action.change.password": "Change password", "label.action.clear.webhook.deliveries": "Clear deliveries", @@ -203,7 +203,7 @@ "label.action.remove.router.table.from.interface": "Remove Tungsten Fabric route table from interface", "label.action.remove.tungsten.routing.policy": "Remove Tungsten-Fabric routing policy from Network", "label.action.remove.nic": "Remove NIC", -"label.action.reserve.ip": "Reserve External IP", +"label.action.reserve.ip": "Reserve Public IP", "label.action.reset.network.permissions": "Reset Network permissions", "label.action.reset.password": "Reset password", "label.action.resize.volume": "Resize Volume", @@ -479,7 +479,7 @@ "label.basic": "Basic", "label.bcfdeviceid": "ID", "label.bgp.peers": "BGP Peers", -"label.bgp.peer.set.reservation.desc": "You can make the BGP peer external, or you can dedicate/reserve it for either a Domain or an Account", +"label.bgp.peer.set.reservation.desc": "You can make the BGP peer public, or you can dedicate/reserve it for either a Domain or an Account", "label.bigswitch.controller.address": "BigSwitch BCF controller address", "label.bladeid": "Blade ID", "label.blades": "Blades", @@ -615,7 +615,7 @@ "label.confirm.delete.tungsten.service.group": "Please confirm that you would like to delete this Service Group", "label.confirm.delete.tungsten.tag": "Please confirm that you would like to delete this Tag", "label.confirm.delete.tungsten.tag.type": "Please confirm that you would like to delete this Tag Type", -"label.confirm.release.public.ip.addresses": "Please confirm you wish to release the selected external IP addresses.", +"label.confirm.release.public.ip.addresses": "Please confirm you wish to release the selected public IP addresses.", "label.confirm.remove.logical.router": "Please confirm that you would like to delete this Logical Router", "label.confirm.remove.network.route.table": "Please confirm that you would like to delete this Network Route Table", "label.confirm.remove.route.table": "Please confirm that you would like to delete this Interface Route Table", @@ -856,7 +856,7 @@ "label.devicename": "Device Name", "label.devices": "Devices", "label.dhcp": "DHCP", -"label.direct.attached.public.ip": "Direct attached external IP", +"label.direct.attached.public.ip": "Direct attached public IP", "label.direct.ips": "Shared Network IPs", "label.directdownload": "Direct download", "label.direction": "Direction", @@ -1149,10 +1149,10 @@ "label.gslb": "GSLB", "label.gslb.service": "GSLB service", "label.gslb.service.private.ip": "GSLB service private IP", -"label.gslb.service.public.ip": "GSLB service external IP", +"label.gslb.service.public.ip": "GSLB service public IP", "label.gslbprovider": "GSLB service", "label.gslbproviderprivateip": "GSLB service private IP", -"label.gslbproviderpublicip": "GSLB service external IP", +"label.gslbproviderpublicip": "GSLB service public IP", "label.guest": "Guest", "label.guest.cidr": "Guest CIDR", "label.guest.end.ip": "Guest end IP", @@ -1321,7 +1321,7 @@ "label.ip6dns2": "IPv6 DNS2", "label.ip6gateway": "IPv6 Gateway", "label.ipaddress": "IP Address", -"label.iplimit": "External IP Limits", +"label.iplimit": "Public IP Limits", "label.ipprefix": "IP Prefix", "label.ipprefixlen": "IP Prefix Length", "label.ips": "IPs", @@ -1372,7 +1372,7 @@ "label.isos": "ISOs", "label.isostate": "ISO state", "label.ispersistent": "Persistent ", -"label.ispublic": "External", +"label.ispublic": "Public", "label.isready": "Ready", "label.isredundantrouter": "Redundant router", "label.isrouting": "Routing", @@ -1395,7 +1395,7 @@ "label.keypairs": "SSH key pair(s)", "label.kubeconfig.cluster": "Kubernetes Cluster config", "label.kubernetes": "Kubernetes", -"label.kubernetes.access.details": "The kubernetes nodes can be accessed via ssh using:
ssh -i [ssh_key] -p [port_number] cloud@[external_ip_address]

where,
ssh_key: points to the ssh private key file corresponding to the key that was associated while creating the Kubernetes Cluster. If no ssh key was provided during Kubernetes cluster creation, use the ssh private key of the management server.
port_number: can be obtained from the Port Forwarding Tab (External Port column)", +"label.kubernetes.access.details": "The kubernetes nodes can be accessed via ssh using:
ssh -i [ssh_key] -p [port_number] cloud@[public_ip_address]

where,
ssh_key: points to the ssh private key file corresponding to the key that was associated while creating the Kubernetes Cluster. If no ssh key was provided during Kubernetes cluster creation, use the ssh private key of the management server.
port_number: can be obtained from the Port Forwarding Tab (Public Port column)", "label.kubernetes.cluster.add.nodes.to.cluster": "Add nodes to Kubernetes cluster", "label.kubernetes.cluster.remove.nodes.from.cluster": "Remove nodes from Kubernetes cluster", "label.kubernetes.cluster": "Kubernetes Cluster", @@ -1543,7 +1543,7 @@ "label.maxobjectstorage": "Max. Object Storage (GiB)", "label.maxprimarystorage": "Max. primary storage (GiB)", "label.maxproject": "Max. Projects", -"label.maxpublicip": "Max. external IPs", +"label.maxpublicip": "Max. public IPs", "label.maxresolutionx": "Max. resolution X", "label.maxresolutiony": "Max. resolution Y", "label.maxsecondarystorage": "Max. secondary storage (GiB)", @@ -1801,10 +1801,10 @@ "label.outofbandmanagement.enable": "Enable out-of-band management", "label.overprovisionfactor": "Overprovisioning factor", "label.override.guest.traffic": "Override guest-traffic", -"label.override.public.traffic": "Override external-traffic", +"label.override.public.traffic": "Override public-traffic", "label.override.rootdisk.size": "Override root disk size", "label.overrideguesttraffic": "Override guest-traffic", -"label.overridepublictraffic": "Override external-traffic", +"label.overridepublictraffic": "Override public-traffic", "label.override.root.diskoffering": "Override root disk offering", "label.ovf.properties": "vApp properties", "label.ovm3": "OVM3", @@ -1942,22 +1942,22 @@ "label.provisioningtype.fat": "Fat provisioning", "label.provisioningtype.sparse": "Sparse provisioning", "label.provisioningtype.thin": "Thin provisioning", -"label.public": "External", -"label.publicmtu": "External Interface MTU", -"label.public.interface": "External interface", -"label.public.ip": "External IP address", -"label.public.ip.addresses": "External IP Addresses", -"label.public.ips": "External IP addresses", -"label.public.lb": "External LB", -"label.public.traffic": "External traffic", -"label.public.traffic.netris": "Netris External IP Pool", -"label.public.traffic.nsx": "NSX External traffic", -"label.publicinterface": "External interface", +"label.public": "Public", +"label.publicmtu": "Public Interface MTU", +"label.public.interface": "Public interface", +"label.public.ip": "Public IP address", +"label.public.ip.addresses": "Public IP Addresses", +"label.public.ips": "Public IP addresses", +"label.public.lb": "Public LB", +"label.public.traffic": "Public traffic", +"label.public.traffic.netris": "Netris Public IP Pool", +"label.public.traffic.nsx": "NSX Public traffic", +"label.publicinterface": "Public interface", "label.publicip": "IP address", "label.publicipid": "IP address ID", -"label.publickey": "External key", -"label.publicnetwork": "External Network", -"label.publicport": "External port", +"label.publickey": "Public key", +"label.publicnetwork": "Public Network", +"label.publicport": "Public port", "label.purgeresources": "Purge Resources", "label.purge.usage.records.success": "Successfuly purged usage records", "label.purge.usage.records.error": "Failed while purging usage records", @@ -2255,7 +2255,7 @@ "label.service.offering.etcdnodes": "Compute offering for etcd Nodes", "label.service.offering.workernodes": "Compute offering for Worker Nodes", "label.service.offering": "Service Offering", -"label.service.staticnat.associatepublicip": "Associate external IP", +"label.service.staticnat.associatepublicip": "Associate public IP", "label.service.staticnat.elasticipcheckbox": "Elastic IP", "label.servicegroupuuid": "Service Group", "label.servicelist": "Services", @@ -2264,9 +2264,9 @@ "label.sessions": "Active client sessions", "label.set.default.nic": "Set default NIC", "label.set.reservation": "Set reservation", -"label.set.reservation.desc": "You can make External IP range external, or you can dedicate/reserve it for either an Account or for System VMs", +"label.set.reservation.desc": "You can make Public IP range public, or you can dedicate/reserve it for either an Account or for System VMs", "label.set.reservation.account.desc": "Please specify an Account to be associated with this IP range.", -"label.set.reservation.systemvm.desc": "Enable dedication of external IP range for SSVM and CPVM. Reservation strictness defined on 'system.vm.external.ip.reservation.mode.strictness'.", +"label.set.reservation.systemvm.desc": "Enable dedication of public IP range for SSVM and CPVM. Reservation strictness defined on 'system.vm.public.ip.reservation.mode.strictness'.", "label.setting": "Setting", "label.settings": "Settings", "label.setup": "Setup", @@ -2441,7 +2441,7 @@ "label.supportedservices": "Supported services", "label.supportsautoscaling": "Supports auto scaling", "label.supportsha": "Supports HA", -"label.supportspublicaccess": "Supports external access", +"label.supportspublicaccess": "Supports public access", "label.supportsstrechedl2subnet": "Supports stretched L2 subnet", "label.supportsvmautoscaling": "Supports auto scaling", "label.suspend.project": "Suspend Project", @@ -2500,7 +2500,7 @@ "label.test": "Test", "label.test.webhook.delivery": "Test Webhook Delivery", "label.tftpdir": "TFTP root directory", -"label.theme.alert": "The setting is only visible to the current browser. To apply the setting, please download the JSON file and replace its content in the `theme` section of the `config.json` file under the path: `/external/config.json`", +"label.theme.alert": "The setting is only visible to the current browser. To apply the setting, please download the JSON file and replace its content in the `theme` section of the `config.json` file under the path: `/public/config.json`", "label.theme.color": "Theme color", "label.theme.navigation.bgColor": "Background color", "label.theme.navigation.setting": "Navigation setting", @@ -3136,10 +3136,10 @@ "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 external traffic", -"message.configuring.netris.public.traffic": "Configuring Netris external traffic", +"message.configuring.public.traffic": "Configuring public traffic", +"message.configuring.netris.public.traffic": "Configuring Netris public traffic", "message.configuring.storage.access.failed": "Configuring storage access failed", -"message.configuring.nsx.public.traffic": "Configuring NSX external traffic", +"message.configuring.nsx.public.traffic": "Configuring NSX public traffic", "message.configuring.storage.traffic": "Configuring storage traffic", "message.confirm.action.force.reconnect": "Please confirm that you want to force reconnect this host.", "message.confirm.add.router.table.to.instance": "Please confirm that you want to add Route Table to this NIC", @@ -3213,7 +3213,7 @@ "message.create.compute.offering": "Compute Offering created", "message.create.sharedfs.failed": "Failed to create Shared FileSystem.", "message.create.sharedfs.processing": "Shared FileSystem creation in progress.", -"message.create.tungsten.public.network": "Create Tungsten-Fabric external Network", +"message.create.tungsten.public.network": "Create Tungsten-Fabric public Network", "message.create.instance.from.backup.prefill": "Data is prefilled using the configurations stored in the backup. Edit to change individual fields.", "message.create.internallb": "Creating internal LB", "message.create.internallb.failed": "Failed to create internal LB.", @@ -3292,7 +3292,7 @@ "message.desc.core.zone": "Core Zones are intended for Datacenter based deployments and allow the full range of Networking and other functionality in Apache CloudStack. Core Zones have a number of prerequisites and rely on the presence of shared storage and helper Instances.", "message.desc.edge.zone": "Edge Zones are lightweight Zones, designed for deploying in edge computing scenarios. They are limited in functionality but have far fewer prerequisites than core zones.

Please refer to the Apache CloudStack documentation for more information on Zone Types
http://docs.cloudstack.apache.org/en/latest/installguide/configuration.html#adding-a-zone", "message.desc.cluster": "Each Pod must contain one or more Clusters. We will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers.", -"message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.

(1) If external key is set, CloudStack will register the external key. You can use it through your private key.

(2) If external key is not set, CloudStack will create a new SSH key pair. In this case, please copy and save the private key. CloudStack will not keep it.
", +"message.desc.create.ssh.key.pair": "Please fill in the following data to create or register a ssh key pair.

(1) If public key is set, CloudStack will register the public key. You can use it through your private key.

(2) If public key is not set, CloudStack will create a new SSH key pair. In this case, please copy and save the private key. CloudStack will not keep it.
", "message.desc.created.ssh.key.pair": "Created a SSH key pair.", "message.desc.host": "Each Cluster must contain at least one host (computer) for guest Instances to run on. We will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.

Give the host's DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts.", "message.desc.import.ext.kvm.wizard": "Import libvirt domain from External KVM Host not managed by CloudStack", @@ -3424,7 +3424,7 @@ "message.error.macaddress": "Please enter a valid MAC Address.", "message.error.max.members.less.than.min.members": "The value of Max members must be larger than the value of Min members", "message.error.mtu.below.min": "MTU is below the minimum supported value of %x", -"message.error.mtu.public.max.exceed": "The value entered exceeds the maximum allowed external MTU for this Zone, your value will be automatically lowered to match it.", +"message.error.mtu.public.max.exceed": "The value entered exceeds the maximum allowed public MTU for this Zone, your value will be automatically lowered to match it.", "message.error.mtu.private.max.exceed": "The value entered exceeds the maximum allowed private MTU for this Zone, your value will be automatically lowered to match it.", "message.error.name": "Please enter name.", "message.error.netmask": "Please enter Netmask.", @@ -3543,7 +3543,7 @@ "message.installwizard.cloudstack.helptext.mailinglists": " * Join mailing lists:\t ", "message.installwizard.cloudstack.helptext.releasenotes": " * Release notes:\t ", "message.installwizard.cloudstack.helptext.survey": " * Take the survey:\t ", -"message.installwizard.copy.whatiscloudstack": "CloudStack™ is a software platform that pools computing resources to build external, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack™ manages the Network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack™ to deploy, manage, and configure cloud computing environments.\n\nExtending beyond individual Instance images running on commodity hardware, CloudStack™ provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications.", +"message.installwizard.copy.whatiscloudstack": "CloudStack™ is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack™ manages the Network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack™ to deploy, manage, and configure cloud computing environments.\n\nExtending beyond individual Instance images running on commodity hardware, CloudStack™ provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications.", "message.installwizard.tooltip.addpod.name": "A name for the Pod.", "message.installwizard.tooltip.addpod.reservedsystemendip": "This is the IP range in the private Network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers.", "message.installwizard.tooltip.addpod.reservedsystemgateway": "The gateway for the hosts in that Pod.", @@ -3639,7 +3639,7 @@ "message.network.description": "Setup Network and traffic.", "message.network.error": "Network Error", "message.network.error.description": "Unable to reach the management server or a browser extension may be blocking the Network request.", -"message.network.hint": "Configure Network components and external/guest/management traffic including IP addresses.", +"message.network.hint": "Configure Network components and public/guest/management traffic including IP addresses.", "message.network.offering.change.warning": "WARNING: Changing the offering will cause connectivity downtime for the Instances with NICs in the Network.", "message.network.offering.forged.transmits": "Applicable for guest Networks on VMware hypervisor only.\nReject - The switch drops any outbound frame from a Instance adapter with a source MAC address that is different from the one in the .vmx configuration file.\nAccept - The switch does not perform filtering, and permits all outbound frames.\nNone - Default to value from global setting.", "message.network.offering.mac.address.changes": "Applicable for guest Networks on VMware hypervisor only.\nReject - If the guest OS changes the effective MAC address of the Instance to a value that is different from the MAC address of the Instance Network adapter (set in the .vmx configuration file), the switch drops all inbound frames to the adapter.\nIf the guest OS changes the effective MAC address of the Instance back to the MAC address of the Instance Network adapter, the virtual machine receives frames again.\nAccept - If the guest OS changes the effective MAC address of the virtual machine to a value that is different from the MAC address of the Instance Network adapter, the switch allows frames to the new address to pass.\nNone - Default to value from global setting.", @@ -3680,8 +3680,8 @@ "message.primary.storage.invalid.state": "Primary storage is not in Up state", "message.processing.complete": "Processing complete!", "message.protocol.description": "For XenServer, choose NFS, iSCSI, or PreSetup. For KVM, choose NFS, SharedMountPoint, RDB, CLVM or Gluster. For vSphere, choose NFS, PreSetup (VMFS or iSCSI or FiberChannel or vSAN or vVols) or DatastoreCluster. For Hyper-V, choose SMB/CIFS. For LXC, choose NFS or SharedMountPoint. For OVM, choose NFS or OCFS2.", -"message.public.traffic.in.advanced.zone": "External traffic is generated when Instances in the cloud access the internet. Externally-accessible IPs must be allocated for this purpose. End Users can use the CloudStack UI to acquire these IPs to implement NAT between their guest Network and their external Network.

Provide at least one range of IP addresses for internet traffic.", -"message.public.traffic.in.basic.zone": "External traffic is generated when Instances in the cloud access the Internet or provide services to clients over the Internet. Externally accessible IPs must be allocated for this purpose. When a Instance is created, an IP from this set of External IPs will be allocated to the Instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the external IP and the guest IP. End Users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their Instances and the external IP.", +"message.public.traffic.in.advanced.zone": "Public traffic is generated when Instances in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End Users can use the CloudStack UI to acquire these IPs to implement NAT between their guest Network and their public Network.

Provide at least one range of IP addresses for internet traffic.", +"message.public.traffic.in.basic.zone": "Public traffic is generated when Instances in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a Instance is created, an IP from this set of Public IPs will be allocated to the Instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End Users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their Instances and the public IP.", "message.quota.tariff.create.success": "Successfully created quota tariff \"{quotaTariff}\"", "message.quota.tariff.update.success": "Successfully updated quota tariff \"{quotaTariff}\"", "message.read.accept.license.agreements": "Please read and accept the terms for the license agreements.", From 1eaa23f78ecd404ee0fb997e11ab114a5b2eec34 Mon Sep 17 00:00:00 2001 From: Alexandre Mattioli Date: Sat, 25 Oct 2025 02:56:07 +0200 Subject: [PATCH 3/3] Add license headers to VNF scaffolding --- .../command/user/vnf/AttachVnfTemplateCmd.java | 18 ++++++++++++++++++ .../command/user/vnf/CreateVnfNetworkCmd.java | 18 ++++++++++++++++++ .../user/vnf/GetVnfNetworkStatusCmd.java | 18 ++++++++++++++++++ .../user/vnf/UploadVnfDictionaryCmd.java | 18 ++++++++++++++++++ .../schema-42100to42200/42110-vnf-network.xml | 18 ++++++++++++++++++ .../db/schema-42100to42200/upgrade.xml | 18 ++++++++++++++++++ .../cloudstack/vnf/VnfNetworkService.java | 18 ++++++++++++++++++ .../cloudstack/vnf/VnfNetworkServiceImpl.java | 18 ++++++++++++++++++ .../cloudstack/vnf/VnfTemplateRenderer.java | 18 ++++++++++++++++++ .../apache/cloudstack/vnf/VnfTransport.java | 18 ++++++++++++++++++ 10 files changed, 180 insertions(+) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/AttachVnfTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/AttachVnfTemplateCmd.java index 013bdccb5f5a..8cb389ca6b8b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/AttachVnfTemplateCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/AttachVnfTemplateCmd.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.cloudstack.api.command.user.vnf; import org.apache.cloudstack.api.*; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/CreateVnfNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/CreateVnfNetworkCmd.java index c00199163271..1a779d9020c3 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/CreateVnfNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/CreateVnfNetworkCmd.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.cloudstack.api.command.user.vnf; import org.apache.cloudstack.api.*; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/GetVnfNetworkStatusCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/GetVnfNetworkStatusCmd.java index 994b7f7918ec..9a5537b5708e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/GetVnfNetworkStatusCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/GetVnfNetworkStatusCmd.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.cloudstack.api.command.user.vnf; import org.apache.cloudstack.api.*; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/UploadVnfDictionaryCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/UploadVnfDictionaryCmd.java index d545f66b8aa4..34370d41044f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/UploadVnfDictionaryCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vnf/UploadVnfDictionaryCmd.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.cloudstack.api.command.user.vnf; import org.apache.cloudstack.api.*; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/42110-vnf-network.xml b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/42110-vnf-network.xml index bb402c92e5b3..2f25b3f0f4f9 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/42110-vnf-network.xml +++ b/engine/schema/src/main/resources/META-INF/db/schema-42100to42200/42110-vnf-network.xml @@ -1,4 +1,22 @@ + +