vorteil/vorteil

View on GitHub
pkg/ova/ovf.go

Summary

Maintainability
A
0 mins
Test Coverage
package ova

import (
    "fmt"
    "io/ioutil"
    "strings"
    "time"

    "github.com/vorteil/vorteil/pkg/vcfg"
    "github.com/vorteil/vorteil/pkg/vio"
)

// GenerateOVF A OVF File to be used in the creation of a OVA image.
// This OVF will created with the name {imageName}.ovf and will have
// one image configured named {imageName}.vmdk
func GenerateOVF(imageName string, cfg *vcfg.VCFG, capacity int) vio.File {

    var networkSection, networkItems string
    for i := range cfg.Networks {
        n := i + 1
        networkSection += fmt.Sprintf("\n\t\t<Network ovf:name=\"network%d\"/>", n)
        networkItems += fmt.Sprintf(`
            <Item>
                <rasd:AddressOnParent>%d</rasd:AddressOnParent>
                <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
                <rasd:Connection>network%d</rasd:Connection>
                <rasd:Description>VmxNet3 ethernet adapter on &quot;network%d&quot;</rasd:Description>
                <rasd:ElementName>ethernet%d</rasd:ElementName>
                <rasd:InstanceID>%d</rasd:InstanceID>
                <rasd:ResourceSubType>VmxNet3</rasd:ResourceSubType>
                <rasd:ResourceType>10</rasd:ResourceType>
                <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="false"/>
            </Item>`, 1+i, n, n, i, 7+i)
    }

    machineName := strings.TrimSuffix(imageName, ".vmdk")

    ovf := fmt.Sprintf(ovfTemplate, imageName, capacity,
        networkSection, machineName, machineName,
        cfg.VM.Kernel, machineName,
        cfg.Info.Author, cfg.Info.Version, cfg.Info.Version,
        cfg.Info.URL, cfg.Info.URL, cfg.VM.CPUs, cfg.VM.CPUs,
        cfg.VM.RAM.String(), cfg.VM.RAM.Units(vcfg.MiB), networkItems)

    return vio.CustomFile(vio.CustomFileArgs{
        Name:       machineName + ".ovf",
        Size:       len(ovf),
        ModTime:    time.Now(),
        ReadCloser: ioutil.NopCloser(strings.NewReader(ovf)),
    })
}

const ovfTemplate = `<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Vorteil-->
<Envelope xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <References>
                <File ovf:href="%s" ovf:id="file1"/>
        </References>
    <DiskSection>
        <Info>Virtual disk information</Info>
                <Disk ovf:capacity="%d" ovf:diskId="disk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized"/>
        </DiskSection>
    <NetworkSection>
        <Info>List of logical networks used in the package</Info>%s
        </NetworkSection>
    <VirtualSystem ovf:id="%s">
        <Info>A virtual machine</Info>
                <Name>%s</Name>
        <OperatingSystemSection ovf:id="102">
            <Info>The kind of installed guest operating system</Info>
                        <Description>Vorteil %s</Description>
                </OperatingSystemSection> 
        <ProductSection ovf:class="com.mycrm.myservice" ovf:instance="1">
            <Info>Describes product information for the service</Info>
                        <Product>%s</Product>
                        <Vendor>%s</Vendor>
                        <Version>%s</Version>
                        <FullVersion>%s</FullVersion>
                        <ProductUrl>%s</ProductUrl>
                        <VendorUrl>%s</VendorUrl>
                </ProductSection> 
        <VirtualHardwareSection>
            <Info>Virtual hardware requirements</Info>
                        <System>
                                <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
                                <vssd:InstanceID>0</vssd:InstanceID>
                                <vssd:VirtualSystemIdentifier>Vorteil</vssd:VirtualSystemIdentifier>
                                <vssd:VirtualSystemType>vmx-11</vssd:VirtualSystemType>
                        </System>
                        <Item>
                                <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
                                <rasd:Description>Number of Virtual CPUs</rasd:Description>
                                <rasd:ElementName>%d virtual CPU(s)</rasd:ElementName>
                                <rasd:InstanceID>1</rasd:InstanceID>
                                <rasd:ResourceType>3</rasd:ResourceType>
                                <rasd:VirtualQuantity>%d</rasd:VirtualQuantity>
                        </Item>
                        <Item>
                                <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
                                <rasd:Description>Memory Size</rasd:Description>
                                <rasd:ElementName>%s of memory</rasd:ElementName>
                                <rasd:InstanceID>2</rasd:InstanceID>
                                <rasd:ResourceType>4</rasd:ResourceType>
                                <rasd:VirtualQuantity>%d</rasd:VirtualQuantity>
                        </Item>
                        <Item>
                                <rasd:Address>0</rasd:Address>
                                <rasd:Description>SCSI Controller</rasd:Description>
                                <rasd:ElementName>scsiController0</rasd:ElementName>
                                <rasd:InstanceID>3</rasd:InstanceID>
                                <rasd:ResourceSubType ovf:required="true">VirtualSCSI</rasd:ResourceSubType>
                                <rasd:ResourceType>6</rasd:ResourceType>
                        </Item>
                        <Item ovf:required="false">
                                <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
                                <rasd:ElementName>serial0</rasd:ElementName>
                                <rasd:InstanceID>4</rasd:InstanceID>
                                <rasd:ResourceType>21</rasd:ResourceType>
                                <vmw:Config ovf:required="false" vmw:key="yieldOnPoll" vmw:value="true"/>
                        </Item>
                        <Item>
                                <rasd:AddressOnParent>0</rasd:AddressOnParent>
                                <rasd:ElementName>Hard disk 1</rasd:ElementName>
                                <rasd:HostResource>ovf:/disk/disk1</rasd:HostResource>
                                <rasd:InstanceID>6</rasd:InstanceID>
                                <rasd:Parent>3</rasd:Parent>
                                <rasd:ResourceType>17</rasd:ResourceType>
                                <vmw:Config ovf:required="false" vmw:key="backing.writeThrough" vmw:value="false"/>
                        </Item>%s
                        <vmw:Config ovf:required="false" vmw:key="firmware" vmw:value="bios"/>
                </VirtualHardwareSection>
        </VirtualSystem>
</Envelope>`