diff --git a/pkg/harvester/components/HarvesterNodeSelector.vue b/pkg/harvester/components/HarvesterNodeSelector.vue new file mode 100644 index 00000000..22bd742c --- /dev/null +++ b/pkg/harvester/components/HarvesterNodeSelector.vue @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/harvester/config/harvester-cluster.js b/pkg/harvester/config/harvester-cluster.js index 575c2c33..c97b2364 100644 --- a/pkg/harvester/config/harvester-cluster.js +++ b/pkg/harvester/config/harvester-cluster.js @@ -581,6 +581,7 @@ export function init($plugin, store) { [ HCI.CLUSTER_NETWORK, HCI.NETWORK_ATTACHMENT, + HCI.HOST_NETWORK_CONFIG, HCI.VPC, NETWORK_POLICY, HCI.LB, @@ -1141,4 +1142,24 @@ export function init($plugin, store) { ifHaveType: HCI.IP_POOL, }); headers(HCI.IP_POOL, IP_POOL_HEADERS); + + configureType(HCI.HOST_NETWORK_CONFIG, { + location: { + name: `${ PRODUCT_NAME }-c-cluster-resource`, + params: { resource: HCI.HOST_NETWORK_CONFIG } + }, + canYaml: false, + }); + virtualType({ + labelKey: 'harvester.hostNetworkConfig.label', + name: HCI.HOST_NETWORK_CONFIG, + namespaced: false, + weight: 183, + route: { + name: `${ PRODUCT_NAME }-c-cluster-resource`, + params: { resource: HCI.HOST_NETWORK_CONFIG } + }, + exact: false, + ifHaveType: HCI.HOST_NETWORK_CONFIG, + }); } diff --git a/pkg/harvester/edit/network.harvesterhci.io.hostnetworkconfig.vue b/pkg/harvester/edit/network.harvesterhci.io.hostnetworkconfig.vue new file mode 100644 index 00000000..e08be355 --- /dev/null +++ b/pkg/harvester/edit/network.harvesterhci.io.hostnetworkconfig.vue @@ -0,0 +1,419 @@ + + + + errors = e" + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ t('harvester.hostNetworkConfig.underlay.conflict', { name: underlayConflict.nameDisplay || underlayConflict.id }) }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ t('harvester.hostNetworkConfig.nodeSelector.addButton') }} + + + + + + + + diff --git a/pkg/harvester/formatters/HarvesterBoolean.vue b/pkg/harvester/formatters/HarvesterBoolean.vue new file mode 100644 index 00000000..aa4e2f39 --- /dev/null +++ b/pkg/harvester/formatters/HarvesterBoolean.vue @@ -0,0 +1,23 @@ + + + + + + + + — + + diff --git a/pkg/harvester/formatters/HarvesterHostNetworkConfigMode.vue b/pkg/harvester/formatters/HarvesterHostNetworkConfigMode.vue new file mode 100644 index 00000000..68588664 --- /dev/null +++ b/pkg/harvester/formatters/HarvesterHostNetworkConfigMode.vue @@ -0,0 +1,29 @@ + + + + {{ displayMode }} + diff --git a/pkg/harvester/l10n/en-us.yaml b/pkg/harvester/l10n/en-us.yaml index 29d5b04f..99be2aed 100644 --- a/pkg/harvester/l10n/en-us.yaml +++ b/pkg/harvester/l10n/en-us.yaml @@ -295,6 +295,12 @@ harvester: harvesterIpAddress: customIpTooltip: "Custom IP (set via annotation)" tableHeaders: + hostNetworkConfig: + underlay: Underlay + underlayTooltip: Allow this interface to act as the underlay for VM overlay networks. + vlanID: VLAN ID + mode: Mode + clusterNetwork: Cluster Network imageEncryption: Encryption size: Size virtualSize: Virtual Size @@ -1871,6 +1877,32 @@ harvester: addLabel: Add CIDR range: addLabel: Add Range + hostNetworkConfig: + label: Host Networks + mode: + label: Mode + tabs: + mode: Mode + nodeSelector: Node Selector + nodeSelector: + addButton: Add Node Selector + underlay: + label: Underlay + tooltip: Allow this interface to act as the underlay for VM overlay networks. + conflict: '`{name}` host network config already has underlay enabled. Only one underlay is allowed in the cluster.' + noKubeovn: + prefix: The kubeovn-operator add-on is not enabled. Click + middle: here + suffix: to enable the add-on for overlay networking. + vlanID: + label: VLAN ID + ipRange: + label: IP Range ({node}) + placeholder: e.g. 192.168.1.10/24 + ips: + nodeLabel: Node + label: IP + placeholder: 'e.g. 192.168.1.10/24' service: healthCheckPort: @@ -2194,6 +2226,11 @@ typeLabel: one { Cluster Network } other { Cluster Networks } } + network.harvesterhci.io.hostnetworkconfig: |- + {count, plural, + one { Host Network } + other { Host Networks } + } harvesterhci.io.addon: |- {count, plural, one { Add-on } diff --git a/pkg/harvester/list/network.harvesterhci.io.hostnetworkconfig.vue b/pkg/harvester/list/network.harvesterhci.io.hostnetworkconfig.vue new file mode 100644 index 00000000..c342a9bb --- /dev/null +++ b/pkg/harvester/list/network.harvesterhci.io.hostnetworkconfig.vue @@ -0,0 +1,86 @@ + + + + + + diff --git a/pkg/harvester/types.ts b/pkg/harvester/types.ts index 9f8f664d..ddb929c3 100644 --- a/pkg/harvester/types.ts +++ b/pkg/harvester/types.ts @@ -16,6 +16,7 @@ export const HCI = { RESTORE: 'harvesterhci.io.virtualmachinerestore', NODE_NETWORK: 'network.harvesterhci.io.nodenetwork', CLUSTER_NETWORK: 'network.harvesterhci.io.clusternetwork', + HOST_NETWORK_CONFIG: 'network.harvesterhci.io.hostnetworkconfig', SUBNET: 'kubeovn.io.subnet', VPC: 'kubeovn.io.vpc', IP: 'kubeovn.io.ip', @@ -62,6 +63,7 @@ export const HCI = { VMIMPORT_SOURCE_OVA: 'migration.harvesterhci.io.ovasource', VMIMPORT: 'migration.harvesterhci.io.virtualmachineimport', MIGRATION: 'migration.harvesterhci.io', + }; export const VOLUME_SNAPSHOT = 'snapshot.storage.k8s.io.volumesnapshot';