From 03a172cf2a05dc1c0621cbc8e87da12d62effaa6 Mon Sep 17 00:00:00 2001 From: utchoang Date: Thu, 7 Oct 2021 08:39:37 +0700 Subject: [PATCH 01/44] add tungsten fabric --- ui/.env.local.example | 1 - ui/public/locales/en.json | 139 +++- ui/src/assets/icons/tungsten.svg | 26 + ui/src/components/view/ListView.vue | 7 +- ui/src/config/section/network.js | 145 ++++ ui/src/style/vars.less | 18 + ui/src/views/infra/zone/ZoneWizard.vue | 2 +- .../views/infra/zone/ZoneWizardLaunchZone.vue | 116 ++- .../infra/zone/ZoneWizardNetworkSetupStep.vue | 70 ++ .../ZoneWizardPhysicalNetworkSetupStep.vue | 76 +- .../AddTungstenInterfaceStaticRoute.vue | 147 ++++ .../AddTungstenNetworkStaticRoute.vue | 168 ++++ .../views/network/tungsten/TungstenFabric.vue | 753 ++++++++++++++++++ .../tungsten/TungstenFabricPolicyRule.vue | 437 ++++++++++ .../tungsten/TungstenFabricPolicyTag.vue | 310 +++++++ .../tungsten/TungstenFabricRouting.vue | 218 +++++ .../tungsten/TungstenFabricTableView.vue | 385 +++++++++ .../tungsten/TungstenInterfaceStaticRoute.vue | 196 +++++ .../tungsten/TungstenNetworkAction.vue | 86 ++ .../tungsten/TungstenNetworkRouterTable.vue | 286 +++++++ .../tungsten/TungstenNetworkStaticRoute.vue | 206 +++++ .../network/tungsten/TungstenNetworkTable.vue | 181 +++++ 22 files changed, 3955 insertions(+), 18 deletions(-) delete mode 100644 ui/.env.local.example create mode 100644 ui/src/assets/icons/tungsten.svg create mode 100644 ui/src/views/network/tungsten/AddTungstenInterfaceStaticRoute.vue create mode 100644 ui/src/views/network/tungsten/AddTungstenNetworkStaticRoute.vue create mode 100644 ui/src/views/network/tungsten/TungstenFabric.vue create mode 100644 ui/src/views/network/tungsten/TungstenFabricPolicyRule.vue create mode 100644 ui/src/views/network/tungsten/TungstenFabricPolicyTag.vue create mode 100644 ui/src/views/network/tungsten/TungstenFabricRouting.vue create mode 100644 ui/src/views/network/tungsten/TungstenFabricTableView.vue create mode 100644 ui/src/views/network/tungsten/TungstenInterfaceStaticRoute.vue create mode 100644 ui/src/views/network/tungsten/TungstenNetworkAction.vue create mode 100644 ui/src/views/network/tungsten/TungstenNetworkRouterTable.vue create mode 100644 ui/src/views/network/tungsten/TungstenNetworkStaticRoute.vue create mode 100644 ui/src/views/network/tungsten/TungstenNetworkTable.vue diff --git a/ui/.env.local.example b/ui/.env.local.example deleted file mode 100644 index 0cd7d31af54b..000000000000 --- a/ui/.env.local.example +++ /dev/null @@ -1 +0,0 @@ -CS_URL=http://localhost:8080 diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 372cd3166d6c..bb348c578e3d 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -111,6 +111,7 @@ "label.action.delete.firewall.processing": "Deleting Firewall....", "label.action.delete.ingress.rule": "Delete Ingress Rule", "label.action.delete.ingress.rule.processing": "Deleting Ingress Rule....", +"label.action.delete.interface.static.route": "Remove Tungsten Fabric interface static route", "label.action.delete.ip.range": "Delete IP Range", "label.action.delete.ip.range.processing": "Deleting IP Range....", "label.action.delete.iso": "Delete ISO", @@ -119,6 +120,7 @@ "label.action.delete.load.balancer.processing": "Deleting Load Balancer....", "label.action.delete.network": "Delete Network", "label.action.delete.network.processing": "Deleting Network....", +"label.action.delete.network.static.route": "Remove Tungsten Fabric network static route", "label.action.delete.nexusvswitch": "Delete Nexus 1000v", "label.action.delete.nic": "Remove NIC", "label.action.delete.node": "Delete node", @@ -138,6 +140,7 @@ "label.action.delete.system.service.offering": "Delete System Service Offering", "label.action.delete.template": "Delete Template", "label.action.delete.template.processing": "Deleting Template....", +"label.action.delete.tungsten.router.table": "Remove Tungsten Fabric route table from network", "label.action.delete.user": "Delete User", "label.action.delete.user.processing": "Deleting User....", "label.action.delete.volume": "Delete Volume", @@ -213,7 +216,7 @@ "label.action.get.diagnostics": "Get Diagnostics Data", "label.action.image.store.read.only": "Make Image store read-only", "label.action.image.store.read.write": "Make Image store read-write", -"label.action.import.export.instances":"Import-Export Instances", +"label.action.import.export.instances": "Import-Export Instances", "label.action.iso.permission": "Update ISO Permissions", "label.action.iso.share": "Update ISO Sharing", "label.action.list.nexusvswitch": "List Nexus 1000v", @@ -333,6 +336,7 @@ "label.add.ldap.list.users": "List LDAP users", "label.add.list.name": "ACL List Name", "label.add.load.balancer": "Add Load Balancer", +"label.add.logical.network": "Add Network to Logical router", "label.add.management.ip.range": "Add Management IP Range", "label.add.more": "Add More", "label.add.netscaler.device": "Add Netscaler device", @@ -379,6 +383,19 @@ "label.add.to.group": "Add to group", "label.add.traffic": "Add Traffic", "label.add.traffic.type": "Add Traffic Type", +"label.add.tungsten.address.group": "Add Address Group", +"label.add.tungsten.fabric.route": "Add Tungsten Fabric network routing table", +"label.add.tungsten.firewall.policy": "Add Firewall Policy", +"label.add.tungsten.firewall.rule": "Add Firewall Rule", +"label.add.tungsten.interface.route": "Add Tungsten Fabric interface routing table", +"label.add.tungsten.interface.static.route": "Add Tungsten Fabric interface static route", +"label.add.tungsten.logical.route": "Add Logical Router", +"label.add.tungsten.network.static.route": "Add Tungsten Fabric network static route", +"label.add.tungsten.policy": "Add Policy", +"label.add.tungsten.policy.set": "Add Application Policy Set", +"label.add.tungsten.router.table": "Add route table to this network", +"label.add.tungsten.service.group": "Add Service Group", +"label.add.tungsten.tag.type": "Add Tag Type", "label.add.ucs.manager": "Add UCS Manager", "label.add.user": "Add User", "label.add.vlan": "Add VLAN", @@ -414,6 +431,7 @@ "label.additional.networks": "Additional Networks", "label.addnewnetworks": "Add new networks", "label.address": "Address", +"label.address.group": "Address Group", "label.admin": "Domain Admin", "label.admin.accounts": "Admin Accounts", "label.advanced": "Advanced", @@ -454,7 +472,11 @@ "label.apikey": "API Key", "label.app.cookie": "AppCookie", "label.app.name": "CloudStack", +"label.application.policy.set": "Application Policy Set", "label.apply": "Apply", +"label.apply.tungsten.firewall.policy": "Apply Firewall Policy", +"label.apply.tungsten.network.policy": "Apply Network Policy", +"label.apply.tungsten.tag": "Apply tag", "label.archive": "Archive", "label.archive.alerts": "Archive alerts", "label.archive.events": "Archive events", @@ -592,6 +614,7 @@ "label.code": "Code", "label.comma.separated.list.description": "Enter comma-separated list of commands", "label.comments": "Comments", +"label.communities": "Communities", "label.community": "Community", "label.complete": "Complete", "label.compute": "Compute", @@ -611,7 +634,17 @@ "label.confirm.delete.loadbalancer.rules": "Please confirm you wish to delete the selected load balancing rules", "label.confirm.delete.portforward.rules": "Please confirm you wish to delete the selected port-forward rules", "label.confirm.delete.templates": "Please confirm you wish to delete the selected templates", +"label.confirm.delete.tungsten.address.group": "Please confirm that you would like to delete this Address Group", +"label.confirm.delete.tungsten.firewall.policy": "Please confirm that you would like to delete this Firewall Policy", +"label.confirm.delete.tungsten.policy": "Please confirm that you would like to delete this Policy", +"label.confirm.delete.tungsten.policy.set": "Please confirm that you would like to delete this Application Policy Set", +"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.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", "label.confirmacceptinvitation": "Please confirm you wish to join this project", "label.confirmation": "Confirmation", "label.confirmdeclineinvitation": "Are you sure you want to decline this project invitation?", @@ -742,6 +775,14 @@ "label.delete.snapshot.policy": "Delete Snapshot Policy", "label.delete.srx": "Delete SRX", "label.delete.sslcertificate": "Delete SSL Certificate", +"label.delete.tag": "Remove tag", +"label.delete.tungsten.address.group": "Delete Address Group", +"label.delete.tungsten.fabric.tag": "Delete Tag", +"label.delete.tungsten.fabric.tag.type": "Delete Tag type", +"label.delete.tungsten.firewall.policy": "Delete Firewall Policy", +"label.delete.tungsten.policy": "Delete Policy", +"label.delete.tungsten.policy.set": "Delete Policy Set", +"label.delete.tungsten.service.group": "Delete Service Group", "label.delete.ucs.manager": "Delete UCS Manager", "label.delete.volumes": "Data Volumes to be deleted", "label.delete.vpn.connection": "Delete VPN connection", @@ -763,13 +804,19 @@ "label.desc.importexportinstancewizard": "Import and export instances to/from an existing VMware cluster.", "label.description": "Description", "label.destcidr": "Destination CIDR", +"label.destendport": "Destination End Port", "label.destination": "Destination", "label.destinationphysicalnetworkid": "Destination physical network ID", "label.destinationzoneid": "Destination Zone", +"label.destipprefix": "Destination Network Address", +"label.destipprefixlen": "Destination Prefix Length", +"label.destnetwork": "Destination Network", +"label.destport": "Destination Ports", "label.destroy": "Destroy", "label.destroy.kubernetes.cluster": "Destroy Kubernetes cluster", "label.destroy.router": "Destroy router", "label.destroyvmgraceperiod": "Destroy VM Grace Period", +"label.deststartport": "Destination Start Port", "label.detaching.disk": "Detaching Disk", "label.details": "Details", "label.deviceid": "Device ID", @@ -779,6 +826,7 @@ "label.direct.attached.public.ip": "Direct Attached Public IP", "label.direct.ips": "Shared Network IPs", "label.directdownload": "Direct Download", +"label.direction": "Direction", "label.disable.autoscale": "Disable Autoscale", "label.disable.host": "Disable Host", "label.disable.network.offering": "Disable network offering", @@ -950,7 +998,11 @@ "label.filterby": "Filter by", "label.fingerprint": "FingerPrint", "label.firewall": "Firewall", +"label.firewall.policy": "Firewall Policy", +"label.firewallpolicy": "Firewall Policy", +"label.firewallpolicyuuid": "Apply Firewall Policy", "label.firewallrule": "Firewall Rule", +"label.firewallruleuuid": "Firewall Rule", "label.firstname": "First Name", "label.firstname.lower": "firstname", "label.fix.errors": "Fix errors", @@ -1124,6 +1176,7 @@ "label.instanceport": "Instance Port", "label.instances": "Instances", "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade", +"label.interface.route.table": "Interface Route Table", "label.intermediate.certificate": "Intermediate certificate", "label.internal.dns.1": "Internal DNS 1", "label.internal.dns.2": "Internal DNS 2", @@ -1162,6 +1215,8 @@ "label.ipaddress1": "IP Address", "label.ipaddress2": "IP Address", "label.iplimit": "Public IP Limits", +"label.ipprefix": "IP Prefix", +"label.ipprefixlength": "IP Prefix Length", "label.ips": "IPs", "label.ipsec.splitconnections": "Split Connections", "label.ipsecpsk": "IPsec Preshared-Key", @@ -1316,6 +1371,7 @@ "label.local.storage.enabled.system.vms": "Enable local storage for System VMs", "label.localstorageenabled": "Enable local storage for User VMs", "label.localstorageenabledforsystemvm": "Enable local storage for System VMs", +"label.logical.router": "Logical Router", "label.login": "Login", "label.login.portal": "Portal Login", "label.login.single.signon": "Single Sign-On", @@ -1492,6 +1548,8 @@ "label.network.offering.display.text": "Network Offering Display Text", "label.network.offering.name": "Network Offering Name", "label.network.offerings": "Network Offerings", +"label.network.policy": "Network Policy", +"label.network.route.table": "Network Route Table", "label.network.selection": "Network Selection", "label.network.service.providers": "Network Service Providers", "label.networkcidr": "Network CIDR", @@ -1513,6 +1571,7 @@ "label.networks": "Networks", "label.networkspeed": "Network Speed", "label.networktype": "Network Type", +"label.networkuuid": "Network", "label.networkwrite": "Network Write", "label.new": "New", "label.new.instance.group": "New Instance Group", @@ -1657,6 +1716,7 @@ "label.podid": "Pod", "label.podname": "Pod name", "label.pods": "Pods", +"label.policy": "Policy", "label.port": "Port", "label.port.forwarding.policies": "Port forwarding policies", "label.port.range": "Port Range", @@ -1823,10 +1883,14 @@ "label.remove.egress.rule": "Remove egress rule", "label.remove.from.load.balancer": "Removing instance from load balancer", "label.remove.ingress.rule": "Remove ingress rule", +"label.remove.interface.route.table": "Remove Tungsten Interface route table", "label.remove.ip.range": "Remove IP range", "label.remove.ldap": "Remove LDAP", +"label.remove.logical.network": "Remove Network from Logical router", +"label.remove.logical.router": "Remove Logical Router", "label.remove.management.ip.range": "Remove Management IP Range", "label.remove.network.offering": "Remove network offering", +"label.remove.network.route.table": "Remove Tungsten Fabric network routing table", "label.remove.pf": "Remove port forwarding rule", "label.remove.project.account": "Remove account from project", "label.remove.project.role": "Remove project role", @@ -1838,6 +1902,10 @@ "label.remove.static.route": "Remove static route", "label.remove.this.physical.network": "Remove this physical network", "label.remove.tier": "Remove tier", +"label.remove.tungsten.firewall.policy": "Remove Firewall Policy", +"label.remove.tungsten.firewall.rule": "Remove Firewall Rule", +"label.remove.tungsten.network.policy": "Remove Network Policy", +"label.remove.tungsten.tag": "Remove Tag", "label.remove.vm.from.lb": "Remove VM from load balancer rule", "label.remove.vm.load.balancer": "Remove VM from load balancer", "label.remove.vmware.datacenter": "Remove VMware Datacenter", @@ -1894,6 +1962,9 @@ "label.rootdiskcontrollertype": "Root disk controller", "label.rootdiskcontrollertypekvm": "Root disk controller", "label.rootdisksize": "Root disk size (GB)", +"label.routenexthop": "Route next hop", +"label.routenexthoptype": "Route next hop type", +"label.routeprefix": "Route prefix", "label.router.health.check.last.updated": "Last updated", "label.router.health.check.name": "Check name", "label.router.health.check.success": "Success", @@ -1986,10 +2057,12 @@ "label.semanticversion": "Semantic version", "label.sent": "Date", "label.sentbytes": "Bytes Sent", +"label.sequence": "Sequence", "label.server": "Server", "label.server.certificate": "Server certificate", "label.service.connectivity.distributedroutercapabilitycheckbox": "Distributed Router", "label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC", +"label.service.group": "Service Group", "label.service.lb.elasticlbcheckbox": "Elastic LB", "label.service.lb.inlinemodedropdown": "Mode", "label.service.lb.lbisolationdropdown": "LB isolation", @@ -2057,6 +2130,11 @@ "label.specifyvlan": "Specify VLAN", "label.splitconnections": "Split Connections", "label.sr.name": "SR Name-Label", +"label.srcendport": "Source End Port", +"label.srcipprefix": "Source Network Address", +"label.srcipprefixlen": "Source Prefix Length", +"label.srcnetwork": "Source Network", +"label.srcstartport": "Source Start Port", "label.srx": "SRX", "label.srx.details": "SRX details", "label.srx.firewall": "Juniper SRX Firewall", @@ -2158,10 +2236,13 @@ "label.system.vms": "System VMs", "label.system.wide.capacity": "System-wide capacity", "label.systemvmtype": "System VM Type", +"label.tag": "Tag", "label.tag.key": "Tag Key", +"label.tag.type": "Tag Type", "label.tag.value": "Tag Value", "label.tagged": "Tagged", "label.tags": "Tags", +"label.taguuid": "Tag", "label.target.iqn": "Target IQN", "label.tariffactions": "Actions", "label.tariffvalue": "Tariff Value", @@ -2235,6 +2316,21 @@ "label.transportzoneuuid": "Transport Zone Uuid", "label.try.again": "Try Again", "label.tuesday": "Tuesday", +"label.tungsten.fabric": "Tungsten Fabric", +"label.tungsten.fabric.provider": "Tungsten Fabric Provider", +"label.tungsten.fabric.routing": "Tungsten Fabric Routing", +"label.tungsten.interface.router.table": "Interface route table", +"label.tungsten.network.router.table": "Network route table", +"label.tungsten.provider": "Tungsten provider", +"label.tungsten.provider.gateway": "Tungsten provider gateway", +"label.tungsten.provider.hostname": "Tungsten provider hostname", +"label.tungsten.provider.introspectport": "Tungsten provider introspect port", +"label.tungsten.provider.name": "Tungsten provider name", +"label.tungsten.provider.port": "Tungsten provider port", +"label.tungsten.provider.vrouterport": "Tungsten provider vrouter port", +"label.tungsten.router.table": "Router Table", +"label.tungsten.static.routes": "Static Routes", +"label.tungstenvms": "VMs", "label.type": "Type", "label.type.id": "Type ID", "label.ucs": "UCS", @@ -2498,9 +2594,11 @@ "message.action.delete.external.load.balancer": "Please confirm that you would like to remove this external load balancer. Warning: If you are planning to add back the same external load balancer, you must reset usage data on the device.", "message.action.delete.ingress.rule": "Please confirm that you want to delete this ingress rule.", "message.action.delete.instance.group": "Please confirm that you want to delete the instance group", +"message.action.delete.interface.static.route": "Please confirm that you want to remove this interface Static Route", "message.action.delete.iso": "Please confirm that you want to delete this ISO.", "message.action.delete.iso.for.all.zones": "The ISO is used by all zones. Please confirm that you want to delete it from all zones.", "message.action.delete.network": "Please confirm that you want to delete this network.", +"message.action.delete.network.static.route": "Please confirm that you want to remove this network Static Route", "message.action.delete.nexusvswitch": "Please confirm that you want to delete this nexus 1000v", "message.action.delete.node": "Please confirm that you want to delete this node.", "message.action.delete.physical.network": "Please confirm that you want to delete this physical network", @@ -2513,6 +2611,7 @@ "message.action.delete.system.service.offering": "Please confirm that you want to delete this system service offering.", "message.action.delete.template": "Please confirm that you want to delete this template.", "message.action.delete.template.for.all.zones": "The template is used by all zones. Please confirm that you want to delete it from all zones.", +"message.action.delete.tungsten.router.table": "Please confirm that you want to remove Route Table from this network", "message.action.delete.volume": "Please confirm that you want to delete this volume.", "message.action.delete.vpn.user": "Please confirm that you want to delete the VPN user.", "message.action.delete.zone": "Please confirm that you want to delete this zone.", @@ -2804,6 +2903,8 @@ "message.delete.tag.failed": "Failed to delete tag", "message.delete.tag.for.networkacl": "Remove tag for NetworkACL", "message.delete.tag.processing": "Deleting tag...", +"message.delete.tungsten.policy.rule": "Please confirm that you want to delete Policy Rule?", +"message.delete.tungsten.tag": "Are you sure you want to remove this Tag from this Policy", "message.delete.user": "Please confirm that you would like to delete this user.", "message.delete.vpn.connection": "Please confirm that you want to delete VPN connection", "message.delete.vpn.customer.gateway": "Please confirm that you want to delete this VPN Customer Gateway", @@ -2874,9 +2975,14 @@ "message.enter.valid.nic.ip": "Please enter a valid IP address for NIC", "message.error.access.key": "Please enter Access Key", "message.error.add.guest.network": "Either IPv4 fields or IPv6 fields need to be filled when adding a guest network", +"message.error.add.interface.static.route": "Adding interface Static Route failed", +"message.error.add.network.static.route": "Adding network Static Route failed", +"message.error.add.policy.rule": "Adding Policy rule failed", "message.error.add.secondary.ipaddress": "There was an error adding the secondary IP Address", +"message.error.add.tungsten.router.table": "Adding Router Table failed", "message.error.agent.password": "Please enter Agent password", "message.error.agent.username": "Please enter Agent username", +"message.error.apply.tungsten.tag": "Applying Tag failed", "message.error.binaries.iso.url": "Please enter binaries ISO URL", "message.error.bucket": "Please enter Bucket", "message.error.cloudian.console": "Single-Sign-On failed for Cloudian Management Console. Please ask your administrator to fix integration issues.", @@ -2886,6 +2992,11 @@ "message.error.current.password": "Please enter current password", "message.error.custom.disk.size": "Please enter custom disk size", "message.error.date": "Please select a date", +"message.error.delete.interface.static.route": "Removing interface Static Route failed", +"message.error.delete.network.static.route": "Removing network Static Route failed", +"message.error.delete.tungsten.policy.rule": "Deleting Policy rule failed", +"message.error.delete.tungsten.router.table": "Removing Router Table failed", +"message.error.delete.tungsten.tag": "Removing Tag failed", "message.error.description": "Please enter description", "message.error.discovering.feature": "Exception caught while discovering features", "message.error.display.text": "Please enter display text", @@ -3039,6 +3150,12 @@ "message.installwizard.tooltip.configureguesttraffic.guestnetmask": "The netmask in use on the subnet that the guests should use", "message.installwizard.tooltip.configureguesttraffic.gueststartip": "The range of IP addresses that will be available for allocation to guests in this zone. If one NIC is used, these IPs should be in the same CIDR as the pod CIDR.", "message.installwizard.tooltip.configureguesttraffic.name": "A name for your network", +"message.installwizard.tooltip.tungsten.provider.gateway": "Tungsten provider gateway is required", +"message.installwizard.tooltip.tungsten.provider.hostname": "Tungsten provider hostname is required", +"message.installwizard.tooltip.tungsten.provider.introspectport": "Tungsten provider introspect port is required", +"message.installwizard.tooltip.tungsten.provider.name": "Tungsten provider name is required", +"message.installwizard.tooltip.tungsten.provider.port": "Tungsten provider port is required", +"message.installwizard.tooltip.tungsten.provider.vrouterport": "Tungsten provider vrouter port is required", "message.instances.managed": "Instances or VMs controlled by CloudStack", "message.instances.scaled.up.confirm": "Do you really want to scale Up your instance ?", "message.instances.unmanaged": "Instances or VMs not controlled by CloudStack", @@ -3065,6 +3182,16 @@ "message.listnsp.not.return.providerid": "error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID", "message.listview.subselect.multi": "(Ctrl/Cmd-click)", "message.load.host.failed": "Failed to load hosts", +"message.loading.add.interface.static.route": "Adding interface Static Route...", +"message.loading.add.network.static.route": "Adding network Static Route...", +"message.loading.add.policy.rule": "Adding Policy rule...", +"message.loading.add.tungsten.router.table": "Adding Router Table...", +"message.loading.apply.tungsten.tag": "Applying Tag...", +"message.loading.delete.interface.static.route": "Removing interface Static Route...", +"message.loading.delete.network.static.route": "Removing network Static Route...", +"message.loading.delete.tungsten.policy.rule": "Deleting Policy rule...", +"message.loading.delete.tungsten.router.table": "Removing Router Table...", +"message.loading.delete.tungsten.tag": "Removing Tag...", "message.lock.account": "Please confirm that you want to lock this account. By locking the account, all users for this account will no longer be able to manage their cloud resources. Existing resources can still be accessed.", "message.login.failed": "Login Failed", "message.migrate.instance.confirm": "Please confirm the host you wish to migrate the virtual instance to.", @@ -3243,19 +3370,24 @@ "message.success.add.egress.rule": "Successfully added new Egress rule", "message.success.add.firewall.rule": "Successfully added new Firewall rule", "message.success.add.guest.network": "Successfully created guest network", +"message.success.add.interface.static.route": "Successfully added interface Static Route", "message.success.add.iprange": "Successfully added IP Range", "message.success.add.kuberversion": "Successfully added Kubernetes version", "message.success.add.network": "Successfully added network", "message.success.add.network.acl": "Successfully added Network ACL List", +"message.success.add.network.static.route": "Successfully added network Static Route", +"message.success.add.policy.rule": "Successfully added Policy rule", "message.success.add.port.forward": "Successfully added new Port Forwarding rule", "message.success.add.private.gateway": "Successfully added Private Gateway", "message.success.add.rule": "Successfully added new rule", "message.success.add.secondary.ipaddress": "Successfully added secondary IP Address", "message.success.add.static.route": "Successfully added static route", "message.success.add.tag": "Successfully added new tag", +"message.success.add.tungsten.router.table": "Successfully added Router Table", "message.success.add.vpc.network": "Successfully added VPC Network", "message.success.add.vpn.customer.gateway": "Successfully added VPN customer gateway", "message.success.add.vpn.gateway": "Successfully added VPN Gateway", +"message.success.apply.tungsten.tag": "Successfully applied Tag", "message.success.asign.vm": "Successfully assigned VM", "message.success.assigned.vms": "Successfully assigned VMs", "message.success.certificate.upload": "Certificate successfully uploaded", @@ -3278,10 +3410,15 @@ "message.success.delete.acl.rule": "Successfully removed ACL rule", "message.success.delete.backup.schedule": "Successfully deleted Configure VM backup schedule", "message.success.delete.icon": "Successfully deleted icon of", +"message.success.delete.interface.static.route": "Successfully removed interface Static Route", "message.success.delete.node": "Successfully Deleted Node", +"message.success.delete.network.static.route": "Successfully removed network Static Route", "message.success.delete.snapshot.policy": "Successfully deleted snapshot policy", "message.success.delete.static.route": "Successfully deleted static route", "message.success.delete.tag": "Successfully deleted tag", +"message.success.delete.tungsten.policy.rule": "Successfully deledted Policy rule", +"message.success.delete.tungsten.router.table": "Successfully removed Router Table", +"message.success.delete.tungsten.tag": "Successfully removed Tag", "message.success.delete.vm": "Successfully Deleted VM", "message.success.disable.saml.auth": "Successfully disabled SAML Authorization", "message.success.disable.vpn": "Successfully disabled VPN", diff --git a/ui/src/assets/icons/tungsten.svg b/ui/src/assets/icons/tungsten.svg new file mode 100644 index 000000000000..5f127bad83e7 --- /dev/null +++ b/ui/src/assets/icons/tungsten.svg @@ -0,0 +1,26 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + + + diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue index 7ea3e39a13d1..3ad5431185d1 100644 --- a/ui/src/components/view/ListView.vue +++ b/ui/src/components/view/ListView.vue @@ -99,6 +99,10 @@ {{ $t(text.toLowerCase()) }} {{ $t(text.toLowerCase()) }} + + {{ $t(text.toLowerCase()) }} + {{ $t(text.toLowerCase()) }} + {{ text }} {{ text }} @@ -464,7 +468,8 @@ export default { '/template', '/iso', '/project', '/account', '/zone', '/pod', '/cluster', '/host', '/storagepool', '/imagestore', '/systemvm', '/router', '/ilbvm', '/annotation', - '/computeoffering', '/systemoffering', '/diskoffering', '/backupoffering', '/networkoffering', '/vpcoffering'].join('|')) + '/computeoffering', '/systemoffering', '/diskoffering', '/backupoffering', '/networkoffering', '/vpcoffering', + '/tungstenfabric'].join('|')) .test(this.$route.path) }, enableGroupAction () { diff --git a/ui/src/config/section/network.js b/ui/src/config/section/network.js index a91e6b5e1454..88abe43c9f6f 100644 --- a/ui/src/config/section/network.js +++ b/ui/src/config/section/network.js @@ -16,6 +16,7 @@ // under the License. import store from '@/store' +import tungsten from '@/assets/icons/tungsten.svg?inline' export default { name: 'network', @@ -57,6 +58,9 @@ export default { name: 'guest.ip.range', component: () => import('@/views/network/GuestIpRanges.vue'), show: (record) => { return 'listVlanIpRanges' in store.getters.apis && (record.type === 'Shared' || (record.service && record.service.filter(x => x.name === 'SourceNat').count === 0)) } + }, { + name: 'tungsten.router.table', + component: () => import('@/views/network/tungsten/TungstenNetworkRouterTable.vue') }, { name: 'comments', @@ -672,6 +676,147 @@ export default { groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] + }, + { + name: 'tungstenfabric', + title: 'label.tungsten.fabric', + icon: tungsten, + permission: ['listTungstenFabricProviders'], + columns: [ + { + field: 'name', + customTitle: 'tungsten.fabric.provider' + }, + 'zonename' + ], + tabs: [ + { + name: 'tungsten.fabric', + component: () => import('@/views/network/tungsten/TungstenFabric.vue') + }, + { + name: 'tungsten.fabric.routing', + component: () => import('@/views/network/tungsten/TungstenFabricRouting.vue') + } + ] + }, + { + name: 'tungstennetworkroutertable', + title: 'label.tungsten.network.router.table', + icon: tungsten, + hidden: true, + permission: ['listTungstenFabricNetworkRouteTable'], + details: ['uuid', 'name'], + tabs: [ + { + name: 'details', + component: () => import('@/components/view/DetailsTab.vue') + }, + { + name: 'tungsten.static.routes', + component: () => import('@/views/network/tungsten/TungstenNetworkStaticRoute.vue') + } + ], + actions: [ + { + api: 'addTungstenFabricNetworkStaticRoute', + icon: 'plus', + label: 'label.add.tungsten.network.static.route', + dataView: true, + popup: true, + component: () => import('@/views/network/tungsten/AddTungstenNetworkStaticRoute.vue') + }, + { + api: 'removeTungstenFabricNetworkRouteTable', + icon: 'delete', + label: 'label.remove.network.route.table', + message: 'label.confirm.remove.network.route.table', + dataView: true + } + ] + }, + { + name: 'tungsteninterfaceroutertable', + title: 'label.tungsten.interface.router.table', + icon: tungsten, + hidden: true, + permission: ['listTungstenFabricInterfaceRouteTable'], + details: ['uuid', 'name'], + tabs: [ + { + name: 'details', + component: () => import('@/components/view/DetailsTab.vue') + }, + { + name: 'tungsten.static.routes', + component: () => import('@/views/network/tungsten/TungstenInterfaceStaticRoute.vue') + } + ], + actions: [ + { + api: 'addTungstenFabricInterfaceStaticRoute', + icon: 'plus', + label: 'label.add.tungsten.interface.static.route', + dataView: true, + popup: true, + component: () => import('@/views/network/tungsten/AddTungstenInterfaceStaticRoute.vue') + }, + { + api: 'removeTungstenFabricInterfaceRouteTable', + icon: 'delete', + label: 'label.remove.interface.route.table', + message: 'label.confirm.remove.interface.route.table', + dataView: true + } + ] + }, + { + name: 'tungstenpolicy', + title: 'label.network.policy', + icon: tungsten, + hidden: true, + permission: ['listTungstenFabricPolicy'], + details: ['name'], + tabs: [ + { + name: 'details', + component: () => import('@/components/view/DetailsTab.vue') + }, + { + name: 'rule', + component: () => import('@/views/network/tungsten/TungstenFabricPolicyRule.vue') + }, + { + name: 'tag', + component: () => import('@/views/network/tungsten/TungstenFabricPolicyTag.vue') + } + ], + actions: [ + { + api: 'applyTungstenFabricPolicy', + icon: 'form', + label: 'label.apply.tungsten.network.policy', + dataView: true, + args: ['networkuuid', 'majorsequence', 'minorsequence'] + }, + { + api: 'removeTungstenFabricPolicy', + icon: 'close', + label: 'label.remove.tungsten.network.policy', + dataView: true, + args: ['networkuuid'] + }, + { + api: 'deleteTungstenFabricPolicy', + icon: 'delete', + label: 'label.delete.tungsten.policy', + message: 'label.confirm.delete.tungsten.policy', + dataView: true, + mapping: { + policyuuid: (record) => record.uuid + } + } + ] } ] } diff --git a/ui/src/style/vars.less b/ui/src/style/vars.less index 5422b2233d78..8b82cbb8d1e5 100644 --- a/ui/src/style/vars.less +++ b/ui/src/style/vars.less @@ -120,6 +120,22 @@ a { color: @primary-color; } +.custom-icon path { + fill: @navigation-text-color; +} + +.ant-menu-light { + .ant-menu-item:hover > a, + .ant-menu-submenu-title:hover > a, + .ant-menu-submenu-title:hover, + .ant-menu-item:hover, + .ant-menu-submenu-title:hover { + .custom-icon path { + fill: @primary-color; + } + } +} + .ant-menu-vertical .ant-menu-item, .ant-menu-vertical-left .ant-menu-item, .ant-menu-vertical-right .ant-menu-item, @@ -206,6 +222,7 @@ a { .custom-icon path { color: @primary-color; + fill: @primary-color; } } @@ -238,6 +255,7 @@ a { .custom-icon path { color: @primary-color; + fill: @primary-color; } } diff --git a/ui/src/views/infra/zone/ZoneWizard.vue b/ui/src/views/infra/zone/ZoneWizard.vue index 862b1f841f8a..417aa1ab6198 100644 --- a/ui/src/views/infra/zone/ZoneWizard.vue +++ b/ui/src/views/infra/zone/ZoneWizard.vue @@ -119,7 +119,7 @@ export default { }, { title: 'label.network', - step: ['physicalNetwork', 'netscaler', 'pod', 'guestTraffic', 'storageTraffic', 'publicTraffic'], + step: ['physicalNetwork', 'tungsten', 'netscaler', 'pod', 'guestTraffic', 'storageTraffic', 'publicTraffic'], description: this.$t('message.network.description'), hint: this.$t('message.network.hint') }, diff --git a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue index 95c3be7d8cd4..4506d7d3d2d3 100644 --- a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue +++ b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue @@ -172,6 +172,14 @@ export default { }, selectedBaremetalProviders () { return this.prefillContent.networkOfferingSelected ? this.prefillContent.networkOfferingSelected.selectedBaremetalProviders : [] + }, + physicalNetworks () { + const tungstenNetworks = this.prefillContent.physicalNetworks.filter(network => network.isolationMethod === 'TF') + if (tungstenNetworks && tungstenNetworks.length > 0) { + return tungstenNetworks + } + + return this.prefillContent.physicalNetworks } }, mounted () { @@ -458,6 +466,12 @@ export default { this.stepData.physicalNetworkReturned = physicalNetworkReturned this.stepData.physicalNetworkItem['createPhysicalNetwork' + index] = physicalNetworkReturned this.stepData.stepMove.push('createPhysicalNetwork' + index) + + if (physicalNetwork.isolationMethod === 'TF' && + physicalNetwork.traffics.findIndex(traffic => traffic.type === 'public') > -1) { + this.stepData.isTungstenZone = true + this.stepData.tungstenPhysicalNetworkId = physicalNetworkReturned.id + } } else { this.stepData.physicalNetworkReturned = this.stepData.physicalNetworkItem['createPhysicalNetwork' + index] } @@ -935,9 +949,17 @@ export default { return } - await this.stepConfigureStorageTraffic() + if (this.stepData.isTungstenZone) { + await this.stepCreateTungstenPublicNetwork() + } else { + await this.stepConfigureStorageTraffic() + } } else if (this.isAdvancedZone && this.sgEnabled) { - await this.stepConfigureStorageTraffic() + if (this.stepData.isTungstenZone) { + await this.stepCreateTungstenPublicNetwork() + } else { + await this.stepConfigureStorageTraffic() + } } else { if (this.prefillContent.physicalNetworks) { const storageExists = this.prefillContent.physicalNetworks[0].traffics.filter(traffic => traffic.type === 'storage') @@ -949,6 +971,56 @@ export default { } } }, + async stepCreateTungstenPublicNetwork () { + this.setStepStatus(STATUS_FINISH) + this.currentStep++ + this.addStep('message.create.tungsten.public.network', 'tungsten') + if (this.stepData.stepMove.includes('tungsten')) { + await this.stepConfigureStorageTraffic() + return + } + try { + if (!this.stepData.stepMove.includes('createTungstenFabricProvider')) { + const providerParams = {} + providerParams.tungstenproviderhostname = this.prefillContent?.tungstenHostname?.value || null + providerParams.name = this.prefillContent?.tungstenName?.value || null + providerParams.zoneid = this.stepData.zoneReturned.id + providerParams.tungstenproviderport = this.prefillContent?.tungstenPort?.value || null + providerParams.tungstengateway = this.prefillContent?.tungstenGateway?.value || null + providerParams.tungstenprovidervrouterport = this.prefillContent?.tungstenVrouter?.value || null + providerParams.tungstenproviderintrospectport = this.prefillContent?.tungstenIntrospectPort?.value || null + await this.createTungstenFabricProvider(providerParams) + this.stepData.stepMove.push('createTungstenFabricProvider') + } + if (!this.stepData.stepMove.includes('configTungstenFabricService')) { + const configParams = {} + configParams.zoneid = this.stepData.zoneReturned.id + configParams.physicalnetworkid = this.stepData.tungstenPhysicalNetworkId + await this.configTungstenFabricService(configParams) + this.stepData.stepMove.push('configTungstenFabricService') + } + if (!this.stepData.stepMove.includes('createTungstenFabricManagementNetwork')) { + const networkParams = {} + networkParams.podId = this.stepData.podReturned.id + await this.createTungstenFabricManagementNetwork(networkParams) + this.stepData.stepMove.push('createTungstenFabricManagementNetwork') + } + if (!this.sgEnabled) { + if (!this.stepData.stepMove.includes('createTungstenFabricPublicNetwork')) { + const publicParams = {} + publicParams.zoneId = this.stepData.zoneReturned.id + await this.createTungstenPublicNetwork(publicParams) + this.stepData.stepMove.push('createTungstenFabricPublicNetwork') + } + } + this.stepData.stepMove.push('tungsten') + await this.stepConfigureStorageTraffic() + } catch (e) { + this.messageError = e + this.processStatus = STATUS_FAILED + this.setStepStatus(STATUS_FAILED) + } + }, async stepConfigureStorageTraffic () { let targetNetwork = false this.prefillContent.physicalNetworks.forEach(physicalNetwork => { @@ -2047,6 +2119,46 @@ export default { }) }) }, + createTungstenFabricProvider (args) { + return new Promise((resolve, reject) => { + api('createTungstenFabricProvider', {}, 'POST', args).then(json => { + resolve() + }).catch(error => { + const message = error.response.headers['x-description'] + reject(message) + }) + }) + }, + configTungstenFabricService (args) { + return new Promise((resolve, reject) => { + api('configTungstenFabricService', {}, 'POST', args).then(json => { + resolve() + }).catch(error => { + const message = error.response.headers['x-description'] + reject(message) + }) + }) + }, + createTungstenFabricManagementNetwork (args) { + return new Promise((resolve, reject) => { + api('createTungstenFabricManagementNetwork', args).then(json => { + resolve() + }).catch(error => { + const message = error.response.headers['x-description'] + reject(message) + }) + }) + }, + createTungstenPublicNetwork (args) { + return new Promise((resolve, reject) => { + api('createTungstenPublicNetwork', args).then(json => { + resolve() + }).catch(error => { + const message = error.response.headers['x-description'] + reject(message) + }) + }) + }, nfsURL (server, path) { let url = null if (path.substring(0, 1) !== '/') { diff --git a/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue b/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue index 4addd94fca6a..cd8e28fba963 100644 --- a/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue +++ b/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue @@ -62,6 +62,18 @@ :isFixError="isFixError" /> + + network.isolationMethod === 'TF') + isTungsten = tungstenIdx > -1 + } + return isTungsten + }, allSteps () { const steps = [] steps.push({ title: 'label.physical.network', formKey: 'physicalNetwork' }) + if (this.isTungstenZone) { + steps.push({ + title: 'label.tungsten.provider', + formKey: 'tungsten' + }) + } if (this.havingNetscaler) { steps.push({ title: 'label.netScaler', @@ -200,6 +228,47 @@ export default { } return {} }, + tungstenFields () { + const fields = [ + { + title: 'label.tungsten.provider.name', + key: 'tungstenName', + placeHolder: 'message.installwizard.tooltip.tungsten.provider.name', + required: true + }, + { + title: 'label.tungsten.provider.hostname', + key: 'tungstenHostname', + placeHolder: 'message.installwizard.tooltip.tungsten.provider.hostname', + required: true + }, + { + title: 'label.tungsten.provider.port', + key: 'tungstenPort', + placeHolder: 'message.installwizard.tooltip.tungsten.provider.port', + required: true + }, + { + title: 'label.tungsten.provider.gateway', + key: 'tungstenGateway', + placeHolder: 'message.installwizard.tooltip.tungsten.provider.gateway', + required: true + }, + { + title: 'label.tungsten.provider.vrouterport', + key: 'tungstenVrouterport', + placeHolder: 'message.installwizard.tooltip.tungsten.provider.vrouterport', + required: false + }, + { + title: 'label.tungsten.provider.introspectport', + key: 'tungstenIntrospectPort', + placeHolder: 'message.installwizard.tooltip.tungsten.provider.introspectport', + required: false + } + ] + return fields + }, netscalerFields () { return [ { @@ -329,6 +398,7 @@ export default { basic: 'message.guest.traffic.in.basic.zone' }, podSetupDescription: 'message.add.pod.during.zone.creation', + tungstenSetupDescription: 'message.infra.setup.tungsten.description', netscalerSetupDescription: 'label.please.specify.netscaler.info', storageTrafficDescription: 'label.zonewizard.traffictype.storage', podFields: [ diff --git a/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue index 52f891a15158..ddec4552cddd 100644 --- a/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue +++ b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue @@ -29,11 +29,23 @@ :columns="columns" :pagination="false" style="margin-bottom: 24px; width: 100%"> -