|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 8/8] RFC: Sketch constructors, DomainCreateNew
On 1/17/20 3:57 PM, George Dunlap wrote:
> This is a sketch of functionality suitable for creating a basic
> domain, with a disk and a vif. DomainConfig, DeviceDisk, and
> DeviceNic types are all created using constructor functions, which
> initialize them with libxl's defaults.
>
> DomainCreateNew takes the config and calls without any updates.
>
> Obviously some of these will need to be changed it we switch to
> passing references to .toC() rather than passing back by value.
>
> The main purpose of this is to allow testing of creating a hard-coded
> domain.
>
> Creating a domain would look like this:
>
> // type = "pv"
> dconf, err := xl.NewDomainConfig(xl.DomainTypePv)
> if err != nil {
> fmt.Printf("NewDomainConfig: %v\n", err)
> return
> }
> dconf.CInfo.Type = xl.DomainTypePv
> // name = "c6-01"
> dconf.CInfo.Name = "c6-01"
> // vcpus=4
> dconf.BInfo.MaxVcpus = 4
> // memory = "2048"
> dconf.BInfo.MaxMemkb = 2048 * 1024
> dconf.BInfo.TargetMemkb = 2048 * 1024
> // on_crash = 'destroy'
> dconf.OnCrash = xl.ActionOnShutdownDestroy
> // bootloader = "pygrub"
> dconf.BInfo.Bootloader = "pygrub"
> // disk = [ 'vdev=hda,format=raw,target=/images/c6-01.raw']
> {
> disk, err := xl.NewDeviceDisk()
> if err != nil {
> fmt.Printf("NewDeviceDisk: %v\n", err)
> return
> }
> disk.Vdev = "hda"
> //disk.DiskBackend = xl.DiskBackendPhy
> disk.Format = xl.DiskFormatRaw
> disk.Readwrite = 1
> disk.PdevPath = "/images/c6-01.raw"
> dconf.Disks = append(dconf.Disks, *disk)
> }
> // vif = [ 'mac=5a:5b:d6:f1:d6:b4' ]
> {
> vif, err := xl.NewDeviceNic()
> if err != nil {
> fmt.Printf("NewDeviceNic: %v\n", err)
> return
> }
> vif.Mac = xl.Mac{ 0x5a, 0x5b, 0xd6, 0x31, 0xd6, 0xb4 }
> dconf.Nics = append(dconf.Nics, *vif)
> }
> // serial='pty' # HVM only
>
> did, err := ctx.DomainCreateNew(dconf)
>
> if err != nil {
> fmt.Printf("Creating domain: %v\n", err)
> return
> }
>
> fmt.Printf("Domain %s(%d) created successfully", dconf.CInfo.Name, did)
>
>
> Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx>
> ---
> CC: Nick Rosbrook <rosbrookn@xxxxxxxxxxxx>
> ---
> tools/golang/xenlight/xenlight.go | 66 +++++++++++++++++++++++++++++++
> 1 file changed, 66 insertions(+)
>
> diff --git a/tools/golang/xenlight/xenlight.go
> b/tools/golang/xenlight/xenlight.go
> index c462e4bb42..5a21a2b9b8 100644
> --- a/tools/golang/xenlight/xenlight.go
> +++ b/tools/golang/xenlight/xenlight.go
> @@ -1113,3 +1113,69 @@ func (Ctx *Context) PrimaryConsoleGetTty(domid uint32)
> (path string, err error)
> path = C.GoString(cpath)
> return
> }
> +
> +func NewDomainConfig(t DomainType) (*DomainConfig, error) {
> + var cconfig C.libxl_domain_config
> +
> + C.libxl_domain_config_init(&cconfig)
> + C.libxl_domain_build_info_init_type(&cconfig.b_info,
> C.libxl_domain_type(t))
> +
> + gconfig := &DomainConfig{}
> + err := gconfig.fromC(&cconfig)
> + if err != nil {
> + return nil, err
> + }
> +
> + return gconfig, nil
> +}
> +
> +func NewDeviceDisk() (*DeviceDisk, error) {
> + var ctype C.libxl_device_disk
> +
> + C.libxl_device_disk_init(&ctype)
> +
> + gtype := &DeviceDisk{}
> + err := gtype.fromC(&ctype)
> +
> + if err != nil {
> + return nil, err
> + }
> +
> + return gtype, nil
> +}
> +
> +func NewDeviceNic() (*DeviceNic, error) {
> + var ctype C.libxl_device_nic
> +
> + C.libxl_device_nic_init(&ctype)
> +
> + gtype := &DeviceNic{}
> + err := gtype.fromC(&ctype)
> +
> + if err != nil {
> + return nil, err
> + }
> +
> + return gtype, nil
> +}
> +
> +// int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config,
> +// uint32_t *domid,
> +// const libxl_asyncop_how *ao_how,
> +// const libxl_asyncprogress_how
> *aop_console_how)
> +func (Ctx *Context) DomainCreateNew(config *DomainConfig) (Domid, error) {
> + var cdomid C.uint32_t
> + var cconfig C.libxl_domain_config
> + err := config.toC(&cconfig)
> + if err != nil {
> + return Domid(0), fmt.Errorf("converting domain config to C:
> %v", err)
> + }
> + defer C.libxl_domain_config_dispose(&cconfig)
> +
> + ret := C.libxl_domain_create_new(Ctx.ctx, &cconfig, &cdomid, nil, nil)
> + if ret != 0 {
> + return Domid(0), Error(ret)
> + }
> +
> + return Domid(cdomid), nil
> +}
An alternate way to do this would be something like this:
---
func NewDomainConfig(t DomainType, populate func(*DomainConfig))
*DomainConfig {
var ctype C.libxl_domain_config
C.libxl_domain_config_init(&ctype)
C.libxl_domain_build_info_init_type(&ctype.b_info,
C.libxl_domain_type(t))
gtype := &DomainConfig{}
err := gtype.fromC(&ctype)
if err != nil {
panic("internal error: Can't convert empty DomainConfig")
}
if populate != nil {
populate(gtype)
}
return gtype
}
func NewDeviceDisk(populate func(*DeviceDisk)) *DeviceDisk {
var ctype C.libxl_device_disk
C.libxl_device_disk_init(&ctype)
gtype := &DeviceDisk{}
err := gtype.fromC(&ctype)
if err != nil {
panic("internal error: Can't convert empty DeviceDisk")
}
if populate != nil {
populate(gtype)
}
return gtype
}
func NewDeviceNic(populate func(*DeviceNic)) *DeviceNic {
var ctype C.libxl_device_nic
C.libxl_device_nic_init(&ctype)
gtype := &DeviceNic{}
err := gtype.fromC(&ctype)
if err != nil {
panic("internal error: Can't convert empty DeviceNic")
}
if populate != nil {
populate(gtype)
}
return gtype
}
---
And then code to populate a domain config might look like this:
dconf := xl.NewDomainConfig(xl.DomainTypePv, func(dconf
*xl.DomainConfig) {
dconf.CInfo.Type = xl.DomainTypePv
// name = "c6-01"
dconf.CInfo.Name = "c6-01"
// vcpus=4
dconf.BInfo.MaxVcpus = 4
// memory = "2048"
dconf.BInfo.MaxMemkb = 2048 * 1024
dconf.BInfo.TargetMemkb = 2048 * 1024
// on_crash = 'destroy'
dconf.OnCrash = xl.ActionOnShutdownDestroy
// bootloader = "pygrub"
dconf.BInfo.Bootloader = "pygrub"
})
dconf.Disks = []xl.DeviceDisk{*xl.NewDeviceDisk(func(disk
*xl.DeviceDisk) {
disk.Vdev = "hda"
//disk.DiskBackend = xl.DiskBackendPhy
disk.Format = xl.DiskFormatRaw
disk.Readwrite = 1
disk.PdevPath = "/images/c6-01.raw"
dconf.Disks = append(dconf.Disks, *disk)
})}
dconf.Nics = []xl.DeviceNic{*xl.NewDeviceNic(func(vif *xl.DeviceNic) {
vif.Mac = xl.Mac{0x5a, 0x5b, 0xd6, 0x31, 0xd6, 0xb4}
})}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |