From 2a4e42a29aac0ac5ce962a5376141ed3c8f4e537 Mon Sep 17 00:00:00 2001 From: Kostiantyn Kalynovskyi Date: Fri, 28 May 2021 20:20:33 +0000 Subject: [PATCH] Change ViNO networking model Now vino has one special network for pxe booting and provisioning this network is not connected anywhere and requests for boot source are proxied to a URL specified in ViNO CR. Other networks can be directly connected to the physical interface specified in ViNO CR. Change-Id: I7a3d98bbfc17b1fad9b425dbbb9051a850237be0 --- config/manager/flavor-templates.yaml | 71 ++++++++------- config/manager/network-templates.yaml | 14 ++- config/samples/network-template-secret.yaml | 10 +- config/samples/vino_cr.yaml | 24 +---- config/samples/vino_cr_4_workers_1_cp.yaml | 32 ++----- pkg/api/v1/vino_builder.go | 21 +++-- pkg/api/v1/vino_types.go | 6 ++ pkg/api/v1/zz_generated.deepcopy.go | 13 +-- pkg/managers/bmh.go | 91 +++++++++---------- tools/deployment/configure-bridges.sh | 10 +- .../roles/libvirt/tasks/create-domain.yaml | 37 ++++---- .../roles/libvirt/tasks/create-network.yaml | 11 +-- .../playbooks/roles/libvirt/tasks/main.yml | 12 ++- 13 files changed, 161 insertions(+), 191 deletions(-) diff --git a/config/manager/flavor-templates.yaml b/config/manager/flavor-templates.yaml index b8f100a..d5e8c23 100644 --- a/config/manager/flavor-templates.yaml +++ b/config/manager/flavor-templates.yaml @@ -1,18 +1,16 @@ flavorTemplates: master: domainTemplate: | - {% set nodename = 'master-' + item|string %} - {% if domains[nodename] is defined %} - {% set domain = domains[nodename] %} + {% if domain is defined %} - {{ nodename }} - {{ nodename | hash('md5') }} + {{ domain.name }} + {{ domain.name | hash('md5') }} master {{ ansible_date_time.date }} {{ flavors.master.memory }} - {% if flavors.worker.hugepages is defined and flavors.worker.hugepages == true %} + {% if flavors.master.hugepages is defined and flavors.master.hugepages == true %} @@ -20,14 +18,14 @@ flavorTemplates: {% endif %} {{ flavors.master.vcpus }} - {% if node_core_map[nodename] is defined %} + {% if node_core_map[domain.name] is defined %} # function to produce list of cpus, in same numa (controled by bool), state will need to be tracked via file on hypervisor host. gotpl psudo: 8192 - {% for core in node_core_map[nodename] %} + {% for core in node_core_map[domain.name] %} {% endfor %} - + {% endif %} @@ -56,7 +54,7 @@ flavorTemplates: # for each disk requested - + @@ -70,22 +68,27 @@ flavorTemplates: + + + + + # for each interface defined in vino, e.g. - {% for if_name, if_values in domain.interfaces.items() %} + {% for interface in domain.interfaces %} - - + + {% endfor %} - + - + @@ -107,9 +110,8 @@ flavorTemplates: {% endif %} volumeTemplate: | - {% set nodename = 'master-' + item|string %} - {{ nodename }} + {{ domain.name }} 0 {{ flavors.master.rootSize }} @@ -118,12 +120,10 @@ flavorTemplates: worker: domainTemplate: | - {% set nodename = 'worker-' + item|string %} - {% if domains[nodename] is defined %} - {% set domain = domains[nodename] %} + {% if domain is defined %} - {{ nodename }} - {{ nodename | hash('md5') }} + {{ domain.name }} + {{ domain.name | hash('md5') }} worker {{ ansible_date_time.date }} @@ -137,14 +137,14 @@ flavorTemplates: {% endif %} {{ flavors.worker.vcpus }} - {% if node_core_map[nodename] is defined %} + {% if node_core_map[domain.name] is defined %} # function to produce list of cpus, in same numa (controled by bool), state will need to be tracked via file on hypervisor host. gotpl psudo: 8192 - {% for core in node_core_map[nodename] %} + {% for core in node_core_map[domain.name] %} {% endfor %} - + {% endif %} @@ -173,7 +173,7 @@ flavorTemplates: # for each disk requested - + @@ -187,21 +187,27 @@ flavorTemplates: - {% for if_name, if_values in domain.interfaces.items() %} + + + + + + # for each interface defined in vino, e.g. + {% for interface in domain.interfaces %} - - + + {% endfor %} - + - + @@ -223,9 +229,8 @@ flavorTemplates: {% endif %} volumeTemplate: | - {% set nodename = 'worker-' + item|string %} - {{ nodename }} + {{ domain.name }} 0 {{ flavors.worker.rootSize }} diff --git a/config/manager/network-templates.yaml b/config/manager/network-templates.yaml index ee11bb6..fa81bdc 100644 --- a/config/manager/network-templates.yaml +++ b/config/manager/network-templates.yaml @@ -1,17 +1,15 @@ libvirtNetworks: - - name: management + - name: pxe libvirtTemplate: | - management + pxe - - + + - - + + -# - name: mobility-gn -# libvirtTemplate: \ No newline at end of file diff --git a/config/samples/network-template-secret.yaml b/config/samples/network-template-secret.yaml index 384de24..f8b04c3 100644 --- a/config/samples/network-template-secret.yaml +++ b/config/samples/network-template-secret.yaml @@ -13,13 +13,14 @@ type: Opaque stringData: template: | {{ $netToIface := dict }} + {{ $netToIp := dict }} links: - {{- range .Node.NetworkInterfaces }} + {{- range .BuilderDomain.Interfaces }} - id: {{ .Name }} name: {{ .Name }} - type: {{ .Type }} + type: phy mtu: {{ .MTU }} - ethernet_mac_address: {{ index $.Generated.MACAddresses .Name }} + ethernet_mac_address: {{ .MACAddress }} {{- if .Options -}} {{ range $key, $val := .Options }} {{ $key }}: {{ $val }} @@ -27,13 +28,14 @@ stringData: {{- end }} {{- /* Save the network->interface mapping, needed below */ -}} {{- $_ := set $netToIface .NetworkName .Name }} + {{- $_ := set $netToIp .NetworkName .IPAddress }} {{- end }} networks: {{- range .Networks }} - id: {{ .Name }} type: {{ .Type }} link: {{ index $netToIface .Name }} - ip_address: {{ index $.Generated.IPAddresses .Name }} + ip_address: {{ index $netToIp .Name }} #netmask: "TODO - see if needed when ip has CIDR range" dns_nameservers: {{ .DNSServers }} {{- if .Routes }} diff --git a/config/samples/vino_cr.yaml b/config/samples/vino_cr.yaml index b8f5322..00f0636 100644 --- a/config/samples/vino_cr.yaml +++ b/config/samples/vino_cr.yaml @@ -14,7 +14,7 @@ spec: configuration: cpuExclude: 0-1 networks: - - name: management + - name: vm-infra subnet: 192.168.2.0/20 type: ipv4 allocationStart: 192.168.2.10 @@ -25,16 +25,6 @@ spec: gateway: $vinobridge # vino will need to populate this from the nodelabel value `airshipit.org/vino.nodebridgegw` dns_servers: ["135.188.34.124"] macPrefix: "52:54:00:06:00:00" - - name: pxe - subnet: 172.3.3.0/24 - type: ipv4 - routes: - - network: 0.0.0.0 - netmask: 0.0.0.0 - gateway: 172.3.3.1 - allocationStart: 172.3.3.10 - allocationStop: 172.3.3.199 - macPrefix: "52:54:00:09:00:00" nodes: - name: master count: 1 @@ -43,15 +33,11 @@ spec: networkDataTemplate: name: "test-template" namespace: "default" - bootInterfaceName: pxe + bootInterfaceName: management networkInterfaces: - - name: vm-infra - type: bridge - network: management - mtu: 1500 - - name: pxe - type: bridge - network: pxe + - name: management + type: network + network: vm-infra mtu: 1500 bmcCredentials: username: admin diff --git a/config/samples/vino_cr_4_workers_1_cp.yaml b/config/samples/vino_cr_4_workers_1_cp.yaml index 8f8d518..0b174a6 100644 --- a/config/samples/vino_cr_4_workers_1_cp.yaml +++ b/config/samples/vino_cr_4_workers_1_cp.yaml @@ -14,7 +14,7 @@ spec: configuration: cpuExclude: 0-1 networks: - - name: management + - name: vm-infra subnet: 192.168.2.0/20 type: ipv4 allocationStart: 192.168.2.10 @@ -25,16 +25,6 @@ spec: gateway: $vinobridge # vino will need to populate this from the nodelabel value `airshipit.org/vino.nodebridgegw` dns_servers: ["135.188.34.124"] macPrefix: "52:54:00:06:00:00" - - name: pxe - subnet: 172.3.3.0/24 - type: ipv4 - routes: - - network: 0.0.0.0 - netmask: 0.0.0.0 - gateway: 172.3.3.1 - allocationStart: 172.3.3.10 - allocationStop: 172.3.3.199 - macPrefix: "52:54:00:09:00:00" nodes: - name: master count: 1 @@ -45,13 +35,9 @@ spec: namespace: "default" bootInterfaceName: pxe networkInterfaces: - - name: vm-infra - type: bridge - network: management - mtu: 1500 - - name: pxe - type: bridge - network: pxe + - name: management + type: network + network: vm-infra mtu: 1500 - name: worker count: 4 @@ -62,13 +48,9 @@ spec: namespace: "default" bootInterfaceName: pxe networkInterfaces: - - name: vm-infra - type: bridge - network: management - mtu: 1500 - - name: pxe - type: bridge - network: pxe + - name: management + type: network + network: vm-infra mtu: 1500 bmcCredentials: username: admin diff --git a/pkg/api/v1/vino_builder.go b/pkg/api/v1/vino_builder.go index 07a6d74..9b3cb8d 100644 --- a/pkg/api/v1/vino_builder.go +++ b/pkg/api/v1/vino_builder.go @@ -18,19 +18,28 @@ package v1 // TODO (kkalynovskyi) create an API object for this, and refactor vino-builder to read it from kubernetes. type Builder struct { - GWIPBridge string `json:"gwIPBridge,omitempty"` - Networks []Network `json:"networks,omitempty"` - Nodes []NodeSet `json:"nodes,omitempty"` + GWIPBridge string `json:"gwIPBridge,omitempty"` + ManagementPhysicalInterfaceName string `json:"managementPhysicalInterfaceName,omitempty"` + PXEBootImageHost string `json:"pxeBootImageHost,omitempty"` + PXEBootImageHostPort int `json:"pxeBootImageHostPort,omitempty"` + + Networks []Network `json:"networks,omitempty"` + Nodes []NodeSet `json:"nodes,omitempty"` // (TODO) change json tag to cpuConfiguration when vino-builder has these chanages as well - CPUConfiguration CPUConfiguration `json:"configuration,omitempty"` - Domains map[string]BuilderDomain `json:"domains,omitempty"` + CPUConfiguration CPUConfiguration `json:"configuration,omitempty"` + Domains []BuilderDomain `json:"domains,omitempty"` } type BuilderNetworkInterface struct { + IPAddress string `json:"ipAddress,omitempty"` MACAddress string `json:"macAddress,omitempty"` + NetworkInterface } // BuilderDomain represents a VINO libvirt domain type BuilderDomain struct { - Interfaces map[string]BuilderNetworkInterface `json:"interfaces,omitempty"` + Name string `json:"name,omitempty"` + Role string `json:"role,omitempty"` + + Interfaces []BuilderNetworkInterface `json:"interfaces,omitempty"` } diff --git a/pkg/api/v1/vino_types.go b/pkg/api/v1/vino_types.go index 6ad0cf9..20ce2e3 100644 --- a/pkg/api/v1/vino_types.go +++ b/pkg/api/v1/vino_types.go @@ -69,6 +69,12 @@ type VinoSpec struct { // NodeLabelKeysToCopy vino controller will get these labels from k8s nodes // and place them on BMHs that correspond to this node NodeLabelKeysToCopy []string `json:"nodeLabelKeysToCopy,omitempty"` + // ManagementPhysicalInterfaceName will be used to connect to libvirt network + ManagementPhysicalInterfaceName string `json:"managementPhysicalInterfaceName,omitempty"` + // PXEBootImageHost will be used to download the PXE boot image + PXEBootImageHost string `json:"pxeBootImageHost,omitempty"` + // PXEBootImageHostPort will be used to download the PXE boot image + PXEBootImageHostPort int `json:"pxeBootImageHostPort,omitempty"` } // BMCCredentials contain credentials that will be used to create BMH nodes diff --git a/pkg/api/v1/zz_generated.deepcopy.go b/pkg/api/v1/zz_generated.deepcopy.go index b01298d..e9c3571 100644 --- a/pkg/api/v1/zz_generated.deepcopy.go +++ b/pkg/api/v1/zz_generated.deepcopy.go @@ -75,9 +75,9 @@ func (in *Builder) DeepCopyInto(out *Builder) { out.CPUConfiguration = in.CPUConfiguration if in.Domains != nil { in, out := &in.Domains, &out.Domains - *out = make(map[string]BuilderDomain, len(*in)) - for key, val := range *in { - (*out)[key] = *val.DeepCopy() + *out = make([]BuilderDomain, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) } } } @@ -97,9 +97,9 @@ func (in *BuilderDomain) DeepCopyInto(out *BuilderDomain) { *out = *in if in.Interfaces != nil { in, out := &in.Interfaces, &out.Interfaces - *out = make(map[string]BuilderNetworkInterface, len(*in)) - for key, val := range *in { - (*out)[key] = val + *out = make([]BuilderNetworkInterface, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) } } } @@ -117,6 +117,7 @@ func (in *BuilderDomain) DeepCopy() *BuilderDomain { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BuilderNetworkInterface) DeepCopyInto(out *BuilderNetworkInterface) { *out = *in + in.NetworkInterface.DeepCopyInto(&out.NetworkInterface) } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuilderNetworkInterface. diff --git a/pkg/managers/bmh.go b/pkg/managers/bmh.go index d09a4a9..ef61505 100644 --- a/pkg/managers/bmh.go +++ b/pkg/managers/bmh.go @@ -42,16 +42,12 @@ const ( ) type networkTemplateValues struct { - Node vinov1.NodeSet // the specific node type to be templated - BMHName string - Networks []vinov1.Network - Generated generatedValues // Host-specific values calculated by ViNO: IP, etc -} + BMHName string + BootMACAddress string -type generatedValues struct { - IPAddresses map[string]string - MACAddresses map[string]string - BootMACAdress string + Node vinov1.NodeSet // the specific node type to be templated + Networks []vinov1.Network + vinov1.BuilderDomain } type BMHManager struct { @@ -184,7 +180,7 @@ func (r *BMHManager) createIpamNetworks(ctx context.Context, vino *vinov1.Vino) } func (r *BMHManager) setBMHs(ctx context.Context, pod corev1.Pod) error { - nodeNetworkValues := map[string]generatedValues{} + domains := []vinov1.BuilderDomain{} k8sNode, err := r.getNode(ctx, pod) if err != nil { @@ -203,14 +199,17 @@ func (r *BMHManager) setBMHs(ctx context.Context, pod corev1.Pod) error { roleSuffix := fmt.Sprintf("%s-%d", node.Name, i) bmhName := fmt.Sprintf("%s-%s", prefix, roleSuffix) - domainNetValues, nodeErr := r.domainSpecificNetValues(ctx, bmhName, node, nodeNetworks) + domainValues, nodeErr := r.domainSpecificNetValues(ctx, bmhName, node, nodeNetworks) if nodeErr != nil { return nodeErr } - // save domain specific generated values to a map - nodeNetworkValues[roleSuffix] = domainNetValues.Generated + domainValues.Name = roleSuffix + domainValues.Role = node.Name - netData, netDataNs, nodeErr := r.setBMHNetworkSecret(ctx, node, domainNetValues) + // Append a specific domain to the list + domains = append(domains, domainValues.BuilderDomain) + + netData, netDataNs, nodeErr := r.setBMHNetworkSecret(ctx, node, domainValues) if nodeErr != nil { return nodeErr } @@ -241,7 +240,7 @@ func (r *BMHManager) setBMHs(ctx context.Context, pod corev1.Pod) error { CredentialsName: credentialSecretName, DisableCertificateVerification: true, }, - BootMACAddress: domainNetValues.Generated.BootMACAdress, + BootMACAddress: domainValues.BootMACAddress, }, } r.bmhList = append(r.bmhList, bmh) @@ -249,7 +248,16 @@ func (r *BMHManager) setBMHs(ctx context.Context, pod corev1.Pod) error { } r.Logger.Info("annotating node", "node", k8sNode.Name) - return r.annotateNode(ctx, k8sNode, nodeNetworkValues) + vinoBuilder := vinov1.Builder{ + PXEBootImageHost: r.ViNO.Spec.PXEBootImageHost, + PXEBootImageHostPort: r.ViNO.Spec.PXEBootImageHostPort, + ManagementPhysicalInterfaceName: r.ViNO.Spec.ManagementPhysicalInterfaceName, + Networks: r.ViNO.Spec.Networks, + Nodes: r.ViNO.Spec.Nodes, + CPUConfiguration: r.ViNO.Spec.CPUConfiguration, + Domains: domains, + } + return r.annotateNode(ctx, k8sNode, vinoBuilder) } // nodeNetworks returns a copy of node network with a unique per node values @@ -259,6 +267,7 @@ func (r *BMHManager) nodeNetworks(ctx context.Context, for netIndex, network := range globalNetworks { for routeIndex, route := range network.Routes { if route.Gateway == "$vinobridge" { + r.Logger.Info("Getting GW bridge IP from node", "node", k8sNode.Name) bridgeIP, err := r.getBridgeIP(ctx, k8sNode) if err != nil { return []vinov1.Network{}, err @@ -276,8 +285,9 @@ func (r *BMHManager) domainSpecificNetValues( node vinov1.NodeSet, networks []vinov1.Network) (networkTemplateValues, error) { // Allocate an IP for each of this BMH's network interfaces - ipAddresses := map[string]string{} - macAddresses := map[string]string{} + + domainInterfaces := []vinov1.BuilderNetworkInterface{} + var bootMAC string for _, iface := range node.NetworkInterfaces { networkName := iface.NetworkName @@ -303,8 +313,11 @@ func (r *BMHManager) domainSpecificNetValues( if err != nil { return networkTemplateValues{}, err } - ipAddresses[networkName] = ipAddress - macAddresses[iface.Name] = macAddress + domainInterfaces = append(domainInterfaces, vinov1.BuilderNetworkInterface{ + IPAddress: ipAddress, + MACAddress: macAddress, + NetworkInterface: iface, + }) if iface.Name == node.BootInterfaceName { bootMAC = macAddress } @@ -312,40 +325,18 @@ func (r *BMHManager) domainSpecificNetValues( "MAC", macAddress, "IP", ipAddress, "bmh name", bmhName, "bootMAC", bootMAC) } return networkTemplateValues{ - Node: node, - BMHName: bmhName, - Networks: networks, - Generated: generatedValues{ - IPAddresses: ipAddresses, - MACAddresses: macAddresses, - BootMACAdress: bootMAC, + Node: node, + BMHName: bmhName, + Networks: networks, + BootMACAddress: bootMAC, + BuilderDomain: vinov1.BuilderDomain{ + Interfaces: domainInterfaces, }, }, nil } -func (r *BMHManager) annotateNode(ctx context.Context, - k8sNode *corev1.Node, - domainInterfaceValues map[string]generatedValues) error { - r.Logger.Info("Getting GW bridge IP from node", "node", k8sNode.Name) - builderValues := vinov1.Builder{ - Domains: make(map[string]vinov1.BuilderDomain), - Networks: r.ViNO.Spec.Networks, - Nodes: r.ViNO.Spec.Nodes, - CPUConfiguration: r.ViNO.Spec.CPUConfiguration, - } - for domainName, domain := range domainInterfaceValues { - builderDomain := vinov1.BuilderDomain{ - Interfaces: make(map[string]vinov1.BuilderNetworkInterface), - } - for ifName, ifMAC := range domain.MACAddresses { - builderDomain.Interfaces[ifName] = vinov1.BuilderNetworkInterface{ - MACAddress: ifMAC, - } - } - builderValues.Domains[domainName] = builderDomain - } - - b, err := yaml.Marshal(builderValues) +func (r *BMHManager) annotateNode(ctx context.Context, k8sNode *corev1.Node, vinoBuilder vinov1.Builder) error { + b, err := yaml.Marshal(vinoBuilder) if err != nil { return err } diff --git a/tools/deployment/configure-bridges.sh b/tools/deployment/configure-bridges.sh index 3406b93..c6c634d 100755 --- a/tools/deployment/configure-bridges.sh +++ b/tools/deployment/configure-bridges.sh @@ -13,7 +13,7 @@ function create_bridge () { VM_INFRA_BRIDGE=${VM_INFRA_BRIDGE:-"vm-infra"} VM_INFRA_BRIDGE_IP=${VM_INFRA_BRIDGE_IP:-"192.168.2.1/24"} -VM_PXE_BRIDGE=${VM_PXE_BRIDGE:-"pxe"} +VM_PXE_BRIDGE=${VM_PXE_BRIDGE:-"ironic-bridge"} VM_PXE_BRIDGE_IP=${VM_PXE_BRIDGE_IP:-"172.3.3.1/24"} PXE_NET="172.3.3.0/24" @@ -27,11 +27,3 @@ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward create_bridge ${VM_INFRA_BRIDGE} ${VM_INFRA_BRIDGE_IP} create_bridge ${VM_PXE_BRIDGE} ${VM_PXE_BRIDGE_IP} - -sudo iptables -A FORWARD -d ${PXE_NET} -o ${VM_PXE_BRIDGE} -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT - -sudo iptables -t nat -A POSTROUTING -s ${PXE_NET} -d 224.0.0.0/24 -j RETURN -sudo iptables -t nat -A POSTROUTING -s ${PXE_NET} -d 255.255.255.255/32 -j RETURN -sudo iptables -t nat -A POSTROUTING -s ${PXE_NET} ! -d ${PXE_NET} -p tcp -j MASQUERADE --to-ports 1024-65535 -sudo iptables -t nat -A POSTROUTING -s ${PXE_NET} ! -d ${PXE_NET} -p udp -j MASQUERADE --to-ports 1024-65535 -sudo iptables -t nat -A POSTROUTING -s ${PXE_NET} ! -d ${PXE_NET} -j MASQUERADE diff --git a/vino-builder/assets/playbooks/roles/libvirt/tasks/create-domain.yaml b/vino-builder/assets/playbooks/roles/libvirt/tasks/create-domain.yaml index f6768f5..872bb94 100644 --- a/vino-builder/assets/playbooks/roles/libvirt/tasks/create-domain.yaml +++ b/vino-builder/assets/playbooks/roles/libvirt/tasks/create-domain.yaml @@ -1,27 +1,26 @@ -- name: debug print loop - debug: - msg: "outer item={{ node }} inner item={{item}}" - loop: "{{ range(0,node.count)|list }}" - -- name: debug print virsh xml domain - debug: - msg: "{{ flavorTemplates[node['bmhLabels']['airshipit.org/k8s-role']]['domainTemplate'] }}" - loop: "{{ range(0,node.count)|list }}" - - name: get state of existing volumes shell: | virsh vol-list vino-default register: vol_list +- name: DEBUG domain.interfaces + debug: + var: domain.interfaces + + +- name: DEBUG domain + debug: + var: domain + - name: write out domain volume request xml - copy: content="{{ flavorTemplates[node['bmhLabels']['airshipit.org/k8s-role']]['volumeTemplate'] }}" dest=/tmp/vol-{{item}}.xml - loop: "{{ range(0,node.count)|list }}" + copy: + content: "{{ flavorTemplates[domain.role]['volumeTemplate'] }}" + dest: /tmp/vol-{{ domain.name }}.xml - name: create domain volume if it doesn't exist shell: | - virsh vol-create vino-default /tmp/vol-{{item}}.xml - loop: "{{ range(0,node.count)|list }}" - when: "node.name + '-' + item|string not in vol_list.stdout" + virsh vol-create vino-default /tmp/vol-{{ domain.name }}.xml + when: "domain.name |string not in vol_list.stdout" - name: ensure vino instance state directory exists file: @@ -34,14 +33,12 @@ # the virt community plugin does not handle pushing out updates # to domains, so we must shell out here instead -- name: write out domain volume request xml - copy: content="{{ flavorTemplates[node['bmhLabels']['airshipit.org/k8s-role']]['domainTemplate'] }}" dest=/tmp/domain-{{item}}.xml - loop: "{{ range(0,node.count)|list }}" +- name: write out domain xml + copy: content="{{ flavorTemplates[domain.role]['domainTemplate'] }}" dest=/tmp/{{ domain.name }}.xml - name: virsh define domain shell: | - virsh define /tmp/domain-{{item}}.xml - loop: "{{ range(0,node.count)|list }}" + virsh define /tmp/{{ domain.name }}.xml #- name: set vm to running # virt: diff --git a/vino-builder/assets/playbooks/roles/libvirt/tasks/create-network.yaml b/vino-builder/assets/playbooks/roles/libvirt/tasks/create-network.yaml index d3e7b3d..91e19d8 100644 --- a/vino-builder/assets/playbooks/roles/libvirt/tasks/create-network.yaml +++ b/vino-builder/assets/playbooks/roles/libvirt/tasks/create-network.yaml @@ -16,21 +16,20 @@ virt_net: state: present # looks like setting name here is a redundant, the name is anyways taken from the template xml file, but should set it to make virt_pool module happy. - name: "{{ item.name }}" - xml: "{{ item.libvirtTemplate }}" + name: "{{ network.name }}" + xml: "{{ network.libvirtTemplate }}" uri: "{{ libvirt_uri }}" - vars: - nodebridgegw: ipam.bridge_ip + when: "network.name not in ansible_libvirt_networks" - name: activate the network virt_net: state: active - name: "{{ item.name }}" + name: "{{ network.name }}" uri: "{{ libvirt_uri }}" # these are idempotent so require no conditional checks - name: autostart the network virt_net: autostart: yes - name: "{{ item.name }}" + name: "{{ network.name }}" uri: "{{ libvirt_uri }}" diff --git a/vino-builder/assets/playbooks/roles/libvirt/tasks/main.yml b/vino-builder/assets/playbooks/roles/libvirt/tasks/main.yml index 7e28516..b99b198 100644 --- a/vino-builder/assets/playbooks/roles/libvirt/tasks/main.yml +++ b/vino-builder/assets/playbooks/roles/libvirt/tasks/main.yml @@ -10,9 +10,11 @@ # configure networks # ########################################## -# - name: create network -# include_tasks: create-network.yaml -# loop: "{{ libvirtNetworks }}" +- name: create network + include_tasks: create-network.yaml + loop: "{{ libvirtNetworks }}" + loop_control: + loop_var: network ########################################## # configure domains # @@ -32,8 +34,8 @@ - name: define domain outer loop include_tasks: create-domain.yaml - loop: "{{ nodes }}" + loop: "{{ domains }}" loop_control: - loop_var: node + loop_var: domain