[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 |